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

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

№1310105-02-2019 13:41:05

Alex_one
Участник
 
Группа: Members
Зарегистрирован: 27-09-2015
Сообщений: 151
UA: Firefox 62.0

Re: Custom Buttons

func4ptch4
Спасибо, пригодится.
А можно шрифт по крупней сделать?

скрытый текст
4OUYY.png

Отсутствует

 

№1310205-02-2019 17:05:38

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

Re: Custom Buttons

Alex_one можно но я не знаю как)... он в 65 не копирует, в 62 пашет как я вижу?

Отредактировано func4ptch4 (05-02-2019 17:09:35)

Отсутствует

 

№1310306-02-2019 12:36:55

Alex_one
Участник
 
Группа: Members
Зарегистрирован: 27-09-2015
Сообщений: 151
UA: Firefox 62.0

Re: Custom Buttons

func4ptch4 пишет

в 62 пашет как я вижу?

Пашет, но только в панели поиска.
Вчера не тестировал, увидел, что копирует и слава богу, а оно вон чего)
А так очень полезная кнопка. имхо.

Отсутствует

 

№1310406-02-2019 14:09:36

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

Re: Custom Buttons

В последних  63-65 заманала сессия ...постоянно сохраняет новую вкладку.

Отсутствует

 

№1310507-02-2019 15:45:30

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 322
UA: Firefox 50.0

Re: Custom Buttons

Приветствую, друзья!
Был вынужден обновиться с 47 FF до последней версии, так как старый добрый ФФ47 начал плохо работать
Сейчас ФФ65 но почти все мои дополнения не работают в том числе  Custom Buttons
С офсайта скачивается но не устанавливается
http://custombuttons.mozdev.org/installation.html
custombuttons-0.0.5.5-20110628 пытался установить эту версию

Дайте пожалуйста живую ссылку на  Custom Buttons для ФФ65

===

Судя по каментам в последних версиях ФФ custom buttons плохо работает.
Может быть мне стоит скачать одну из последних ФФ где custom buttons работает без проблем
Не подскажете ли какую ФФ установить чтобы все хорошо работало в связке FF CB и Stylish?

Отредактировано leex (07-02-2019 15:56:11)

Отсутствует

 

№1310607-02-2019 16:32:15

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

Re: Custom Buttons

leex пишет

Не подскажете ли какую ФФ установить чтобы все хорошо работало в связке FF CB и Stylish?

Ну по вашим критериям это 56-я версия FF.

Отсутствует

 

№1310707-02-2019 16:58:10

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 322
UA: Firefox 50.0

Re: Custom Buttons

Установил ФФ56 кнопки отображаются но не не работают
CB 0.0.5.8.9 от Yan
Обновить не дает. Блокирует установку с офсайта

Отсутствует

 

№1310807-02-2019 22:21:13

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 322
UA: Firefox 50.0

Re: Custom Buttons

ФФ 56.  СВ установил из файла с раб стола Работает. Всем спасибо

Отредактировано leex (07-02-2019 22:21:38)

Отсутствует

 

№1310908-02-2019 09:55:35

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

Re: Custom Buttons

leex пишет

Не подскажете ли какую ФФ установить

Установи лучше Waterfox. Он тоже 56, но поддерживает обновления безопасности. По сути это ФФ56 ESR

Отсутствует

 

№1311008-02-2019 17:27:48

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 322
UA: Firefox 50.0

Re: Custom Buttons

Остановился на 56 FF

Закинул в корень пару скриптов чтобы отключить проверку подписей приложений, но приложение для новой вкладки " New Tab King" работает криво.
Не отображается список с недавно закрытыми вкладками.
Альтернатив ему не нашел
В Waterfox приложение "New Tab King" работает также криво

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

Отредактировано leex (08-02-2019 17:29:47)

Отсутствует

 

№1311109-02-2019 17:55:14

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 65.0

Re: Custom Buttons

func4ptch4 пишет

Вопрос у вас в Clipboard такой код?

у меня на 65 вот такой код работает

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

Выделить код

Код:

/*Initialization Code*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Блок инициализации глоб. переменных и функций
// срок существования - один сеанс браузера
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
bbBBCodeStat=true                                                   // разрешить/включить BBCode
window.arycb_BBCodeClipboardStrings = this.clipboardStrings = [];   // Массив буфера обмена

//
//********************************************************
//--------Общие функции для вставки BBCode----------------
//*********************************************************

//++++++++++++++++++BEGIN DEF++++++++++++++++++++++++++++++
//--------------------------------------------------------
// Функция lb_BBCodePrim 
// [bbCode]выделенный[/bbCode]
//  по умолчанию от ЛКМ)
lb_BBCodePrim = function (open,close){
var theBox = document.commandDispatcher.focusedElement;
var startPos = theBox.selectionStart;
var endPos = theBox.selectionEnd;
var oPosition = theBox.scrollTop;
var oHeight = theBox.scrollHeight;
var text=theBox.value.substring(0,startPos);
text +=open+theBox.value.substring(startPos, endPos)+close;
text +=theBox.value.substring(endPos, theBox.value.length);
theBox.value = text;
var nHeight = theBox.scrollHeight - oHeight;
theBox.scrollTop = oPosition + nHeight;
};

//---------------------------------------------------------
// Функция mb_BBCodePrim 
// Резерв
// по умолчанию от CКМ
mb_BBCodePrim = function (open,close) {};

// -------------------------------------------------------
// Функция rb_BBCodePrim 
// [bbCode]параметр PASTE по умолчанию из буфер обмена[/bbCode]
// по умолчанию от ПКМ
rb_BBCodePrim = function (open,close,paste){
if (paste == undefined)  { open +=close;} //буфер обмена пуст
   else                 { open +=paste+close;}
   
var theBox = document.commandDispatcher.focusedElement;
var startPos = theBox.selectionStart;
var endPos = theBox.selectionEnd;
var selectionLen = endPos - startPos
var oPosition = theBox.scrollTop;
var oHeight = theBox.scrollHeight;
var text=theBox.value.substring(0,startPos); 
var nHeight = theBox.scrollHeight - oHeight;
text +=open;
text +=theBox.value.substring(endPos, theBox.value.length);
theBox.value = text; 
theBox.selectionStart = endPos + open.length;
theBox.selectionEnd = endPos + open.length - selectionLen;
theBox.scrollTop = oPosition + nHeight;
};

// -------------------------------------------------------
// Функция fHLD_Get_ListClipboardPrim 
// получить список сохранёного буфера обмена
//
fnHLD_Get_ListClipboardPrim = function (){
var cs = arycb_BBCodeClipboardStrings; 
return (cs.slice(0)); 
}; 
//++++++++++++++++++END DEF+++++++++++++++++++++++++++++++++++
//Список сохранёного буфера обмена
//Не вызываем это, обработка по таймеру или по событию ЛКМ
//-----Обработчики буфера обмена

this.MAX_ENTRIES = 16;               //Максимальное число записей 16
this.CHECK_INTERVAL = 1000;      //Время опроса буфера 1000 миллисекунд
this.type = "menu";
this.orient = "horizontal";
this._menupopup = this.appendChild(document.createElement("menupopup"));
this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);");

this.checkClipboard = function() {
    var clipStr = readFromClipboard();
    if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1)
        this.storeString(clipStr);
};

this.storeString = function(str) {
    var cs = this.clipboardStrings;
    cs.push(str);
    while(cs.length > this.MAX_ENTRIES)
        cs.shift(); 

    var mi = document.createElement("menuitem");
    mi.setAttribute("label", str);
   
    
    this._menupopup.appendChild(mi);
    while(this._menupopup.childNodes.length > this.MAX_ENTRIES)
        this._menupopup.removeChild(this._menupopup.firstChild);
};

this.handleCommand = function(mi) {
    var indx = Array.indexOf(mi.parentNode.childNodes, mi);
    if(indx != -1)
        this.insertText(this.clipboardStrings[indx]);
};

this.insertText = function(str) {
    var cmd = "cmd_insertText";
    var controller = document.commandDispatcher.getControllerForCommand(cmd);
    if(controller && controller.isCommandEnabled(cmd)) {
        controller = controller.QueryInterface(Components.interfaces.nsICommandController);
        var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"]
                        .createInstance(Components.interfaces.nsICommandParams);;
        params.setStringValue("state_data", str);
        controller.doCommandWithParams(cmd, params);
    }
};

setInterval(function(button) {
    button.checkClipboard();
}, this.CHECK_INTERVAL, this);

this.setAttribute("onpopupshowing", "this.checkClipboard();");



var ios = Components.classes["@mozilla.org/network/io-service;1"].
  getService(Components.interfaces.nsIIOService);
var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].
  getService(Components.interfaces.nsIStyleSheetService);
  
var css = new String();
css = css + '@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");';
css = css + 'tooltip[label^="' + this.label + '\\000a\\000a"] {';
css = css + "-moz-appearance: none !important;";
css = css + "border: 1px solid silver !important;";
css = css + "max-width: none !important;";
css = css + "background: black !important;";
css = css + "color: silver !important;";
css = css + "font-family: monospace !important;";
css = css + "}";
var uss = ios.newURI("data:text/css," + encodeURIComponent(css), null, null);


if (!sss.sheetRegistered(uss, sss.AGENT_SHEET)) sss.loadAndRegisterSheet(uss, sss.AGENT_SHEET);
this.onDestroy = function(reason) {
  if (reason == "update") {
    if (sss.sheetRegistered(uss, sss.AGENT_SHEET)) sss.unregisterSheet(uss, sss.AGENT_SHEET);
  }
  if (reason == "delete") {
    if (sss.sheetRegistered(uss, sss.AGENT_SHEET)) sss.unregisterSheet(uss, sss.AGENT_SHEET);
  }
}

this.showClipboard = function() {
  var code = custombuttons.cbService.readFromClipboard();
 this.tooltipText = code ? this.label + "\n\n" + code: this.label;
}
this.setAttribute("onmouseover", "this.showClipboard()");


еще одна кнопка работы с буфером - просмотр и редактирование последнего скопированного текста внешним текстовым редактором.
Если не вылезет сообщение назначить редактор, то во вкладке справка найти и заменить почти в самом конце
var editor = getEditor();
// var editor = "C:\\AkelPad\\AkelPad.exe";
на
// var editor = getEditor();
var editor = "C:\\AkelPad\\AkelPad.exe"; (т.е. прописать путь до вашего редактора)
скрытый текст

Выделить код

Код:

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%3EClipboard%20Viewer%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArdJREFUeNpsU11IU2EYfs/Zt+Vy7sfKEZEp2pxmF2uKUVhq2VKwTB0FmT8FCUbgpTddBWFBICJRgVleRC5GUeRNpPZj+bfMrJZhajeWRTPa2mTnr/c77Iyj9cLD2fd97/PsOc/7HQawytMQW0AuhoF49a+rzmQYZp+yliTpSclP74yybh6QgHTuhdV1DeGkP6zPvNAyNONUDtp3Z/pgW7zPh2hiRQlADUEE5373SafVnu888eCtUxBYMBiMQJ90TffpOe2jKoQX/nEAtuYumOjthZHRp2A0GsGQmAgcx0EwGIQNpa1gq6qCR7dvyL1E+I9AKBKBEpcLvi0sANFoQMOywCJopaWno1MJFB6J8iu4DA3x+9ISrDebIctmkzcpQRRFWYRHJouinCLA8Wo2FG+0O/TJJhPf4/WOdns8U5i8VFdTk9vgdheggpbFJoLgYzyCYajrWPHZtk2evr6Rx2P+F1cvX8+gmxeudL7UaO+LtZWVeyLoQK9ywFIHKmRt3r7T8LC/f+xIZUPq5x98AkXt0VMZjwYHx3FIEF5eBh5fR3G+OgOgTSaLhUvS60hOqnkN3fsaCILRYokKSPyDAScmJYHCW+1gen5iOOQuK8t///GVP4FI4lotML6pockql2tHMByGZRyngKHGHYTCqIIT0hI5xPEv/g+HDzSeKdTqXgudd3ue0xALHY5d+dnZJfM41hSrFTSEwK9gTIDePpaRBSoKqutbXadbUu51tC+mZufkna+rK6JN/pHh0MXy0k+zkxMR5VXxT32ygDxnERodh+rPHb90M72rpWGur/tWW+A35OFRVqx/GnFHw8IAQooTaeXqAWpMME6tdjTVzxYZoMKuwxsHK2FWBZ2MjrcS+esE8g5D1fHgPahjYBHA84aDOeyxI6IILvaMqtZ8AC9mIBbiXwEGADy0Lb/f2n5rAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%20%0A%20%0A%20%0A%20%0AgCBClipboardViewer%20%3D%20this%3B%20//%20global%20obj%0A%0Athis.toString%20%3D%20function%20toString%28%29%20%7Breturn%20this.name%3B%7D%0A//this.xurl%20%3D%20%22chrome%3A//chromedir/content/clipboard-viewer.xul%22%3B%0Athis.xurl%20%3D%20%22data%3Aapplication/vnd.mozilla.xul+xml%3Bbase64%2C%22%20+%20%0A//encodeURIComponent%28btoa%28this.Help%29%29%3B%0AencodeURIComponent%28btoa%28unescape%28encodeURIComponent%28this.Help%29%29%29%29%3B%0A//encodeURIComponent%28btoa%28unescape%28encodeURIComponent%28this.xurl%29%29%29%29%3B%0A%20%20this.icon%20%3D%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArdJREFUeNpsU11IU2EYfs/Zt+Vy7sfKEZEp2pxmF2uKUVhq2VKwTB0FmT8FCUbgpTddBWFBICJRgVleRC5GUeRNpPZj+bfMrJZhajeWRTPa2mTnr/c77Iyj9cLD2fd97/PsOc/7HQawytMQW0AuhoF49a+rzmQYZp+yliTpSclP74yybh6QgHTuhdV1DeGkP6zPvNAyNONUDtp3Z/pgW7zPh2hiRQlADUEE5373SafVnu888eCtUxBYMBiMQJ90TffpOe2jKoQX/nEAtuYumOjthZHRp2A0GsGQmAgcx0EwGIQNpa1gq6qCR7dvyL1E+I9AKBKBEpcLvi0sANFoQMOywCJopaWno1MJFB6J8iu4DA3x+9ISrDebIctmkzcpQRRFWYRHJouinCLA8Wo2FG+0O/TJJhPf4/WOdns8U5i8VFdTk9vgdheggpbFJoLgYzyCYajrWPHZtk2evr6Rx2P+F1cvX8+gmxeudL7UaO+LtZWVeyLoQK9ywFIHKmRt3r7T8LC/f+xIZUPq5x98AkXt0VMZjwYHx3FIEF5eBh5fR3G+OgOgTSaLhUvS60hOqnkN3fsaCILRYokKSPyDAScmJYHCW+1gen5iOOQuK8t///GVP4FI4lotML6pockql2tHMByGZRyngKHGHYTCqIIT0hI5xPEv/g+HDzSeKdTqXgudd3ue0xALHY5d+dnZJfM41hSrFTSEwK9gTIDePpaRBSoKqutbXadbUu51tC+mZufkna+rK6JN/pHh0MXy0k+zkxMR5VXxT32ygDxnERodh+rPHb90M72rpWGur/tWW+A35OFRVqx/GnFHw8IAQooTaeXqAWpMME6tdjTVzxYZoMKuwxsHK2FWBZ2MjrcS+esE8g5D1fHgPahjYBHA84aDOeyxI6IILvaMqtZ8AC9mIBbiXwEGADy0Lb/f2n5rAAAAAElFTkSuQmCC%22%3B%0Athis.panel%20%3D%20false%3B%0A%20%0Athis.onclick%20%3D%20function%28aEvent%29%20%7B%0A%20%20if%20%28aEvent.button%20%3D%3D%201%29%20%7B%20//%20Middle%20click%0A%20%20%20%20this.togglePanel%28%29%3B%20%20%20%20%20//%20open%20in%20bottom%20panel%0A%0A%20%20%7D%0A%20%0A%20%20//%20This%20won%27t%20work%20for%20data%3AURI%20XUL%20on%20Firefox%204%0A%20%20else%20if%20%28aEvent.ctrlKey%20%20%7C%7C%20aEvent.metaKey%29%7B%0A%20%20%20%20aEvent.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20gBrowser.loadOneTab%28this.xurl%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20open%20in%20new%20tab%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20null%2C%20null%2C%20null%2C%20false%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.info%20%3D%20%22%5Cn%5C%0A%u041B%u041A%u041C%3A%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043E%u043A%u043D%u0435%5Cn%5Cn%5C%0A%u0421%u041A%u041C%3A%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u0438%u0436%u043D%u0435%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%5Cn%5Cn%5C%0ACtrl+click%3A%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%5Cn%5Cn%22%3B%0A%0A%0Afunction%20%24%28aId%29%20%7B%0A%20%20return%20document.getElementById%28aId%29%3B%0A%7D%0A%0Athis.togglePanel%20%3D%20function%28%29%20%7B%0A%20%20this.panel%20%3D%20%21this.panel%3B%0A%20%20%24%28%22SClipboard-splitter%22%29.hidden%20%3D%20%21this.panel%3B%0A%20%20%24%28%22SClipboard-panel%22%29.hidden%20%3D%20%21this.panel%3B%0A%20%20%24%28%22SClipboard-iframe%22%29.setAttribute%28%22src%22%2C%20this.panel%20%3F%20this.xurl%20%3A%20%22%22%29%3B%0A%7D%0A%0A%0Athis.checkForCBWindow%20%3D%20function%28%29%20%7B%0A%20%20var%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%20%20var%20em%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20winName%20%3D%20%22clipview%22%3B%0A%20%20var%20index%20%3D%201%3B%0A%20%20while%20%28em.hasMoreElements%28%29%29%20%7B%0A%20%20%20%20let%20win%20%3D%20em.getNext%28%29%3B%0A%20%20%20%20if%28win.name%20%3D%3D%20winName%29%20%7B%0A%20%20%20%20%20%20win.focus%28%29%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20index++%0A%20%20%7D%0A%20%20return%20false%3B%0A%7D%0A%0Athis.showTooltip%20%3D%20function%28aNode%29%20%7B%0A%20%20var%20win%20%3D%20this.checkForCBWindow%28%29%3B%0A%20%20if%20%28win%20%7C%7C%20this.opened%29%20%7B%0A%20%20%20%20aNode.label%20%3D%20this.info%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%20%20aNode.label%20%3D%20readFromClipboard%28%29%20%3F%20readFromClipboard%28%29%20%3A%20this.info%3B%0A%7D%0A%0Afunction%20makeXML%28aXMLString%29%20%7B%0A%20%20return%20%28new%20DOMParser%29.parseFromString%28aXMLString%2C%20%22application/xml%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.documentElement%3B%0A%7D%0A%0Afunction%20%24xml%28aNode%2C%20aId%2C%20aXML%29%20%7B%0A%20%20var%20node%20%3D%20%24%28aId%29%3B%0A%20%20node%20%26%26%20node.parentNode.removeChild%28node%29%3B%0A%20%20aNode%20%26%26%20aNode.appendChild%28makeXML%28aXML%29%29%0A%7D%0A%0A%0A%0A%24xml%28%24%28%22appcontent%22%29%2C%0A%20%20%20%20%20%22SClipboard-splitter%22%2C%0A%20%20%20%20%20%27%3Csplitter%20xmlns%3D%22%27%20+%20xulns%20+%20%27%22%20id%3D%22SClipboard-splitter%22%27%0A%20%20%20+%20%27%20orient%3D%22vertical%22%20hidden%3D%22true%22%3E%27%0A%20%20%20+%20%27%3Cgrippy%20oncommand%3D%22this.parentNode.nextSibling.collapsed%20%3D%27%0A%20%20%20+%20%27%20%21this.parentNode.nextSibling.collapsed%3B%22/%3E%3C/splitter%3E%27%29%3B%0A%0A%24xml%28%24%28%22appcontent%22%29%2C%0A%20%20%20%20%20%22SClipboard-panel%22%2C%0A%20%20%20%20%20%27%3Cvbox%20xmlns%3D%22%27%20+%20xulns%20+%20%27%22%20id%3D%22SClipboard-panel%22%27%0A%20%20%20+%20%27%20height%3D%22300%22%20hidden%3D%22true%22%3E%27%0A%20%20%20+%20%27%3Ctoolbox%3E%3Ctoolbar%20align%3D%22center%22%3E%27%0A%20%20%20+%20%27%3Clabel%20value%3D%22%27%20+%20this.label%20+%20%27%22%20flex%3D%221%22%20crop%3D%22end%22/%3E%27%0A%20%20%20+%20%27%3Ctoolbarbutton%20class%3D%22tabs-closebutton%22%27%0A%20%20%20+%20%27%20image%3D%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACt0lEQVQ4jaWSzUtUYRTGn/fcGZ25H+m9Iyne8fpFq4lGCsFFIW21NiKKuHIn4qpazDraabnMTVEh+Af0B0QIIohBowhlkM1MMTre+VLngzv3PW1SKWvVWR0eOL/zcM4jmBn/U4G/iTuzsyK7unoLUl4HABDtdExNbV1fXr60Tfzp4J1h3Dd1/ak1OHhN7+kBiHCaTsPd2NgrlMsP7x4fv/0nYE3XH9ix2GLbzIwQmvYbmCsVHL16xd+3tx/dOTl5dqbTWfPeMIavOs6COT0tmBmyWAS1toJaWyGLRbCUMKemxFXHWXhvGMOXACrw2BwdJYUITX190MbG4O/twf/yBdrYGJr6+6EQwbx3j1QhHv8GWDfNNjUavR3u6ACyWQRjMQRsG+rkJNSJCQRsG8FYDDKbRbi9Harj3F43zbYLB41Gr2bbRIUCFACnS0vwMhkEbBsB24aXyaCcSEDJZiFyOWidnYRGo/f8jQpQp9NTiFwOACCJACEuDsgMeXAAuC7YMECeBwWonwOaLOtT/evXMhTlSs00oS8vI2jbqGcyADOau7pgvHiB8vg4tMND1F233GRZn87pzIwtXX9eiEb5uLubC2/ecC2V4qOhIT4aGuJqKsX516/52HG4EI3ylq4/P5s7z8FHy2qXnvehOxTqDBGhFongiusCAMqWhVA+j5qU+Far/RDB4M2BfP7gUpCSLS03qr7/NiyEExEC6i+9AsBlRpU5FVaU+zdKpeSlHCSTSazOzW0XNW2gCjzZ9/3Pu77Pu77P+77/uQo8cTVt4OXMzM7a2tpFlBOJhFhZWWkulUphz/NUKWWYmUPM3GwCKgBRAKoA6kRUI6JKIBCo6rpeGRkZqQlmRjqdxuLiIm1ublIul6NKpaI0Gg3yfV8AABFxMBiUoVBIRiIRPx6Py/n5eRmPx/ETBvM/dPD/rBwAAAAASUVORK5CYII%3D%22%27%0A%20%20%20+%20%27%20oncommand%3D%22gCBClipboardViewer.togglePanel%28%29%3B%22/%3E%27%0A%20%20%20+%20%27%3C/toolbar%3E%3C/toolbox%3E%27%0A%20%20%20+%20%27%3Ciframe%20id%3D%22SClipboard-iframe%22%20src%3D%22%22%20flex%3D%221%22/%3E%27%0A%20%20%20+%20%27%3C/vbox%3E%27%29%3B%0A%20%20%20%0A%0A//%20Custom%20Tooltip%0A//%20http%3A//custombuttons.mozdev.org/drupal/node/645%0A%0Avar%20tooltip%20%3D%20this.appendChild%28document.createElement%28%22tooltip%22%29%29%3B%0Atooltip.style.MozAppearance%20%3D%20%22none%22%3B%0Atooltip.style.background%20%3D%20%22menu%22%3B%0Atooltip.style.color%20%3D%20%22menutext%22%3B%0Atooltip.style.opacity%20%3D%20%22.9%22%3B%0Atooltip.style.border%20%3D%20%221px%20solid%20menutext%22%3B%0Atooltip.style.borderRadius%20%3D%20%225px%22%3B%0Atooltip.style.MozBorderRadius%20%3D%20%225px%22%3B%0Atooltip.style.fontFamily%20%3D%20%22monospace%22%3B%0Atooltip.style.fontSize%20%3D%20%22medium%22%3B%0Atooltip.style.maxWidth%20%3D%20%28screen.width%20/%202%29%20+%20%22px%22%3B%0Atooltip.style.maxHeight%20%3D%20%28screen.height%20/%202%29%20+%20%22px%22%3B%20//%20not%20working%0Atooltip.style.padding%20%3D%20%221em%22%3B%0Atooltip.setAttribute%28%22onpopupshowing%22%2C%20%22this.parentNode.showTooltip%28this%29%3B%22%29%3B%0A%0Athis.removeAttribute%28%22tooltiptext%22%29%3B%0Athis.tooltip%20%3D%20%22_child%22%3B%0A%0A%0A%20%20%20%20%20%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0Avar%20em%20%3D%20ww.getWindowEnumerator%28%29%3B%0Avar%20winName%20%3D%20%22clipview%22%3B%0Avar%20index%20%3D%201%3B%0Awhile%20%28em.hasMoreElements%28%29%29%20%7B%0A%20%20let%20win%20%3D%20em.getNext%28%29%3B%0A%20%20if%28win.name%20%3D%3D%20winName%29%20%7B%0A%20%20%20%20win.focus%28%29%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%20%20index++%0A%7D%0A%0AopenDialog%28this.xurl%2C%20winName%2C%20%22chrome%2C%20dialog%3Dno%2C%20centerscreen%2C%20minimizable%2C%20resizable%22%29%3B%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%26lt%3B%3Fxml%20version%3D%221.0%22%3F%26gt%3B%0A%26lt%3B%3Fxml-stylesheet%20type%3D%22text/css%22%20href%3D%22chrome%3A//global/skin/%22%3F%26gt%3B%0A%26lt%3Bdialog%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%20%20%20%20%20%20%20%20xmlns%3Ahtml%3D%22http%3A//www.w3.org/1999/xhtml%22%0A%20%20%20%20%20%20%20%20id%3D%22clipboard-viewer%22%0A%20%20%20%20%20%20%20%20width%3D%22800%22%20height%3D%22600%22%0A%20%20%20%20%20%20%20%20title%3D%22Clipboard%20viewer%22%0A%20%20%20%20%20%20%20%20buttons%3D%22extra1%2C%20extra2%2C%20cancel%22%0A%20%20%20%20%20%20%20%20buttonlabelextra1%3D%22%u041F%u0440%u0430%u0432%u043A%u0430%22%0A%20%20%20%20%20%20%20%20buttonlabelextra2%3D%22%u041E%u0447%u0438%u0441%u0442%u0438%u0442%u044C%22%0A%20%20%20%20%20%20%20%20buttonlabelcancel%3D%22%u0417%u0430%u043A%u0440%u044B%u0442%u044C%22%0A%20%20%20%20%20%20%20%20buttonaccesskeyextra1%3D%22E%22%0A%20%20%20%20%20%20%20%20buttonaccesskeyextra2%3D%22r%22%0A%20%20%20%20%20%20%20%20buttonaccesskeycancel%3D%22C%22%0A%20%20%20%20%20%20%20%20ondialogextra1%3D%22edit%28%29%3B%22%0A%20%20%20%20%20%20%20%20ondialogextra2%3D%22clearClipboard%28%29%3B%22%0A%20%20%20%20%20%20%20%20ondialogcancel%3D%22closeDialog%28%29%3B%22%0A%20%20%20%20%20%20%20%20onfocus%3D%22loadFromClipboard%28%29%3B%22%26gt%3B%0A%0A%20%20%26lt%3Bhtml%3Ahead%26gt%3B%0A%20%20%20%20%20%26lt%3Bhtml%3Astyle%20type%3D%22text/css%22%26gt%3B%0A%20%20%20%20%26lt%3B%21%5BCDATA%5B%23textbox%20%7B%0A%20%20%20%20%20%20font-family%3A%20monospace%3B%20font-size%3A%20medium%3B%20white-space%3A%20pre-wrap%3B%0A%20%20%20%20%7D%5D%5D%26gt%3B%0A%20%20%20%20%26lt%3B/html%3Astyle%26gt%3B%0A%20%20%26lt%3B/html%3Ahead%26gt%3B%0A%0A%20%20%26lt%3Bkeyset%26gt%3B%26lt%3Bkey%20keycode%3D%22VK_F5%22%20oncommand%3D%22loadFromClipboard%28%29%3B%22%20/%26gt%3B%26lt%3B/keyset%26gt%3B%0A%0A%20%20%26lt%3Bpopupset%26gt%3B%0A%20%20%20%20%26lt%3Bmenupopup%20id%3D%22contextmenu%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onpopupshowing%3D%22popupShowing%28event%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onpopuphiding%3D%22loadFromClipboard%28%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%22var%20cmd%20%3D%20event.originalTarget.getAttribute%28%27cmd%27%29%3B%0A%20if%20%28cmd%29%20document.popupNode.parentNode.doCommand%28cmd%29%3B%22%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bmenuitem%20id%3D%22edit-copy%22%20label%3D%22%u041A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%22%20accesskey%3D%22c%22%20cmd%3D%22cmd_copy%22%20/%26gt%3B%0A%20%20%20%20%20%20%26lt%3B%21--menuitem%20id%3D%22edit-delete%22%20label%3D%22%u0423%u0434%u0430%u043B%u0438%u0442%u044C%22%20accesskey%3D%22d%22%20cmd%3D%22cmd_delete%22%20/--%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bmenuseparator%20/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bmenuitem%20id%3D%22edit-selectAll%22%20label%3D%22%u0412%u044B%u0431%u0440%u0430%u0442%u044C%20%u0432%u0441%u0435%22%20accesskey%3D%22a%22%20cmd%3D%22cmd_selectAll%22%20/%26gt%3B%0A%20%20%20%20%26lt%3B/menupopup%26gt%3B%0A%20%20%26lt%3B/popupset%26gt%3B%0A%0A%20%20%26lt%3Btextbox%20id%3D%22textbox%22%20multiline%3D%22true%22%20flex%3D%221%22%0A%20%20%20%20%20%20%20%20%20%20%20onclick%3D%22gmon_edit_mouseclick%28event%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20context%3D%22contextmenu%22%20readonly%3D%22%22%20/%26gt%3B%0A%0A%20%20%26lt%3Bscript%20type%3D%22application/x-javascript%22%26gt%3B%26lt%3B%21%5BCDATA%5B%0Aconst%20Cc%20%3D%20Components.classes%3B%0Aconst%20Ci%20%3D%20Components.interfaces%3B%0A%0Aconst%20gTextbox%20%3D%20document.getElementById%28%22textbox%22%29%3B%0A%0Afunction%20getMainwin%28%29%20%7B%0A%20%20if%20%28window.frameElement%29%20%7B%0A%20%20%20%20return%20window.frameElement.ownerDocument.defaultView%3B%0A%20%20%7D%20else%20if%20%28window.opener%29%20%7B%0A%20%20%20%20return%20window.opener%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20return%20Cc%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20getService%28%29.QueryInterface%28Ci.nsIWindowMediator%29.%0A%20%20%20%20%20%20%20%20%20%20%20getMostRecentWindow%28%22navigator%3Abrowser%22%29%0A%20%20%7D%0A%7D%0A%0Afunction%20readFromClipboard%28%29%20%7B%0A%20%20var%20string%3B%0A%20%20try%20%7B%0A%20%20%20%20%20%20var%20clipboard%20%3D%20Cc%5B%22@mozilla.org/widget/clipboard%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIClipboard%29%3B%0A%20%20%20%20%20%20var%20trans%20%3D%20Cc%5B%22@mozilla.org/widget/transferable%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsITransferable%29%3B%0A%20%20%20%20%20%20trans.addDataFlavor%28%22text/unicode%22%29%3B%0A%20%20%20%20%20%20if%20%28clipboard.supportsSelectionClipboard%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20clipboard.getData%28trans%2C%20clipboard.kSelectionClipboard%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20clipboard.getData%28trans%2C%20clipboard.kGlobalClipboard%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20data%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20var%20dataLen%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20trans.getTransferData%28%22text/unicode%22%2C%20data%2C%20dataLen%29%3B%0A%20%20%20%20%20%20if%20%28data%29%20%7B%0A%20%20%20%20%20%20%20%20data%20%3D%20data.value.QueryInterface%28Ci.nsISupportsString%29%3B%0A%20%20%20%20%20%20%20%20string%20%3D%20trans.getTransferData.length%20%3D%3D%202%0A%20%20%20%20%20%20%20%20%20%20%3F%20data.data%20%3A%20data.data.substring%280%2C%20dataLen.value%20/%202%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%7D%20catch%20%28ex%29%20%7B%0A%20%20%7D%0A%20%20return%20string%3B%0A%7D%0A%0Afunction%20loadFromClipboard%28%29%20%7B%0A%20%20var%20string%20%3D%20readFromClipboard%28%29%3B%0A%20%20if%20%28gTextbox.value%20%21%3D%20string%29%20%7B%0A%20%20%20%20if%20%28%21string%29%20%7B%0A%20%20%20%20%20%20gTextbox.value%20%3D%20%22%22%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20gTextbox.value%20%3D%20string%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20gTextbox.selectionStart%20%3D%200%3B%0A%20%20gTextbox.selectionEnd%20%3D%200%3B%0A%7D%0A%0Afunction%20copyToClipboard%28aString%29%20%7B%0A%20%20let%20clipboardHelper%20%3D%20Cc%5B%22@mozilla.org/widget/clipboardhelper%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIClipboardHelper%29%3B%0A%20%20clipboardHelper.copyString%28aString%29%3B%0A%7D%0A%0Afunction%20clearClipboard%28%29%20%7B%0A%20%20copyToClipboard%28%22%22%29%3B%0A%20%20gTextbox.value%20%3D%20%22%22%3B%0A%7D%0A%0Afunction%20edit%28%29%20%7B%0A%20%20edittarget%28gTextbox%29%3B%0A%7D%0A%0Afunction%20closeDialog%28%29%20%7B%0A%20%20getMainwin%28%29.gCBClipboardViewer.opened%20%3D%20false%3B%0A%20%20if%20%28window.frameElement%29%20%7B%0A%20%20%20%20switch%20%28window.frameElement.id%29%20%7B%0A%20%20%20%20case%20%22sidebar%22%3A%0A%20%20%20%20%20%20getMainwin%28%29.gCBClipboardViewer.toggleSidebar%28%29%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20default%3A%0A%20%20%20%20%20%20getMainwin%28%29.gCBClipboardViewer.togglePanel%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%20else%20%7B%0A%20%20%20%20window.close%28%29%3B%0A%20%20%7D%0A%7D%0A%0Afunction%20popupShowing%28aEvent%29%20%7B%0A%20%20var%20children%20%3D%20aEvent.target.childNodes%3B%0A%20%20for%20%28var%20i%20%3D%200%3B%20i%20%26lt%3B%20children.length%3B%20i++%29%20%7B%0A%20%20%20%20var%20command%20%3D%20children%5Bi%5D.getAttribute%28%22cmd%22%29%3B%0A%20%20%20%20if%20%28command%29%20%7B%0A%20%20%20%20%20%20var%20controller%20%3D%20document.commandDispatcher%0A%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.getControllerForCommand%28command%29%3B%0A%20%20%20%20%20%20var%20enabled%20%3D%20controller.isCommandEnabled%28command%29%3B%0A%20%20%20%20%20%20if%20%28enabled%29%20%7B%0A%20%20%20%20%20%20%20%20children%5Bi%5D.removeAttribute%28%22disabled%22%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20children%5Bi%5D.setAttribute%28%22disabled%22%2C%20%22true%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0A/////////////////////////////////////////////////////////////////////////////%0A//////////////////////////////%20External%20Editor%20//////////////////////////////%0A/////////////////////////////////////////////////////////////////////////////%0A%0Avar%20_tmpdir%3Dnull%2C_dir_separator%2C_os%3B%0Avar%20_ext%2C_encode%2C_target%3D%5B%5D%3B%0A%0Afunction%20editinit%28%29%20%7B%0A%20%20if%20%28window.navigator.platform.toLowerCase%28%29.indexOf%28%22win%22%29%20%21%3D%20-1%29%20%7B%0A%20%20%20%20//%20Windows%20OS%0A%20%20%20%20_dir_separator%20%3D%20%22%5C%5C%22%3B%0A%20%20%20%20_os%20%3D%20%22win%22%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20//%20UNIX/Linux%20OS%0A%20%20%20%20_dir_separator%20%3D%20%22/%22%3B%0A%20%20%20%20_os%20%3D%20%22unix%22%3B%0A%20%20%7D%0A%0A%20%20_ext%20%3D%20%22txt%22%3B%0A%20%20_encode%20%3D%20%22UTF-8%22%3B%0A%20%20_target%20%3D%20%5B%5D%3B%0A%0A%20%20window.addEventListener%28%22unload%22%2C%20edituninit%2C%20false%29%3B%0A%20%20window.addEventListener%28%22unload%22%2C%20function%28%29%20%7B%0A%20%20%20%20document.removeEventListener%28%22focus%22%2C%20checkfocus_window%2C%20true%29%3B%0A%20%20%7D%2C%20false%29%3B%0A%7D%0A%0Afunction%20getEditor%28%29%20%7B%0A%20%20let%20pref%20%3D%20Cc%5B%22@mozilla.org/preferences-service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIPrefService%29.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20getBranch%28%22custombuttons.ClipboardViewer.%22%29%3B%0A%20%20let%20editor%20%3D%20null%3B%0A%20%20try%20%7B%0A%20%20%20%20editor%20%3D%20pref.getCharPref%28%22external_editor%22%29%3B%0A%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20let%20prompts%20%3D%20Cc%5B%22@mozilla.org/embedcomp/prompt-service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIPromptService%29%3B%0A%0A%20%20%20%20let%20ask%20%3D%20prompts.confirm%28null%2C%20%22Clipboard%20Viewer%22%2C%0A%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%22%u0412%u044B%20%u0434%u043E%u043B%u0436%u043D%u044B%20%u0441%u043D%u0430%u0447%u0430%u043B%u0430%20%u0432%u044B%u0431%u0440%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440.%5Cn%u041D%u0430%u0436%u043C%u0438%u0442%u0435%20OK%20%u0434%u043B%u044F%20%u043F%u0440%u043E%u0434%u043E%u043B%u0436%u0435%u043D%u0438%u044F.%22%29%3B%0A%20%20%20%20if%20%28%21ask%29%20return%20false%3B%0A%0A%20%20%20%20let%20nsIFilePicker%20%3D%20Ci.nsIFilePicker%3B%0A%20%20%20%20let%20filePicker%20%3D%20Cc%5B%22@mozilla.org/filepicker%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28nsIFilePicker%29%3B%0A%20%20%20%20filePicker.init%28window%2C%20%22Select%20editor%22%2C%20nsIFilePicker.modeOpen%29%3B%0A%20%20%20%20filePicker.appendFilters%28nsIFilePicker.filterApplication%29%3B%0A%20%20%20%20filePicker.appendFilters%28nsIFilePicker.filterAll%29%3B%0A%20%20%20%20filePicker.open%28res%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28res%20%3D%3D%20nsIFilePicker.returnOK%29%20%0A%20%20%20%20%20%20if%20%28filePicker.file.exists%28%29%20%26amp%3B%26amp%3B%20filePicker.file.isExecutable%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20pref.setCharPref%28%22external_editor%22%2C%20filePicker.file.path%29%3B%0A%20%20%20%20%20%20%20%20editor%20%3D%20filePicker.file.path%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%20%20return%20editor%3B%0A%7D%0A%0Afunction%20edituninit%28%29%20%7B%0A%20%20if%20%28_tmpdir%20%3D%3D%20null%29%20return%3B%0A%20%20var%20windowType%20%3D%20%22navigator%3Abrowser%22%3B%0A%20%20var%20windowManager%20%3D%20Cc%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28%29%3B%0A%20%20var%20windowManagerInterface%20%3D%20windowManager.%0A%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%20QueryInterface%28Ci.nsIWindowMediator%29%3B%0A%20%20var%20enumerator%20%3D%20windowManagerInterface.getEnumerator%28windowType%29%3B%0A%20%20if%20%28enumerator.hasMoreElements%28%29%29%20%7B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%0A%20%20var%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsIFile%29%3B%0A%20%20file.initWithPath%28_tmpdir%29%3B%0A%20%20var%20entries%20%3D%20file.directoryEntries%3B%0A%20%20while%20%28entries.hasMoreElements%28%29%29%20%7B%0A%20%20%20%20var%20entry%20%3D%20entries.getNext%28%29.QueryInterface%28Ci.nsIFile%29%3B%0A%20%20%20%20if%20%28/%5Ecustombuttons%5C./i.test%28entry.leafName%29%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20entry.remove%28false%29%3B%0A%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20try%20%7B%0A%20%20%20%20if%20%28file.exists%28%29%20%3D%3D%20true%20%29%20%7B%0A%20%20%20%20%20%20file.remove%28false%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%20catch%28e%29%20%7B%0A%20%20%7D%0A%0A%20%20_tmpdir%20%3D%20null%3B%0A%7D%0A%0Afunction%20gmon_edit_mouseclick%28e%29%20%7B%0A%20%20if%20%28e.button%20%21%3D%201%29%20return%3B%0A%20%20var%20target%20%3D%20e.target%3B%0A%20%20edittarget%28target%29%3B%0A%7D%0A%0Afunction%20checkfocus_window%28%29%20%7B%0A%20%20var%20target%2C%20filename%2C%20timestamp%2C%20encode%2C%0A%20%20%20%20%20%20file%2C%20inst%2C%20sstream%2C%20utf%2C%20textBoxText%3B%0A%0A%20%20if%20%28_target.length%26lt%3B%3D0%29%20return%3B%0A%0A%20%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20istr%20%3D%20Cc%5B%22@mozilla.org/network/file-input-stream%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsIFileInputStream%29%3B%0A%0A%20%20//%20FileInputStream%27s%20read%20is%20%5Bnoscript%5D.%0A%20%20sstream%20%3D%20Cc%5B%22@mozilla.org/scriptableinputstream%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsIScriptableInputStream%29%3B%0A%20%20utf%20%3D%20Cc%5B%22@mozilla.org/intl/utf8converterservice%3B1%22%5D.%0A%20%20%20%20%20%20%20%20createInstance%28Ci.nsIUTF8ConverterService%29%3B%0A%0A%20%20for%20%28var%20i%3D0%3B%20i%20%26lt%3B%20_target.length%3Bi++%29%20%7B%0A%20%20%20%20target%20%3D%20_target%5Bi%5D%3B%0A%20%20%20%20if%20%28%21target.hasAttribute%28%22filename%22%29%29%20continue%3B%0A%20%20%20%20filename%20%3D%20target.getAttribute%28%22filename%22%29%3B%0A%20%20%20%20timestamp%20%3D%20target.getAttribute%28%22timestamp%22%29%3B%0A%20%20%20%20file.initWithPath%28filename%29%3B%0A%20%20%20%20if%20%28%21file.exists%28%29%20%7C%7C%20%21file.isReadable%28%29%29%20continue%3B%0A%20%20%20%20if%20%28file.lastModifiedTime%20%26lt%3B%3D%20timestamp%29%20continue%3B%0A%0A%20%20%20%20target.setAttribute%28%22timestamp%22%2C%20file.lastModifiedTime%29%3B%0A%0A%20%20%20%20istr.init%28file%2C%201%2C%200x400%2C%20false%29%3B%0A%20%20%20%20sstream.init%28istr%29%3B%0A%0A%20%20%20%20textBoxText%20%20%3D%20sstream.read%28sstream.available%28%29%29%3B%0A%20%20%20%20encode%20%3D%20target.getAttribute%28%22encode%22%29%3B%0A%20%20%20%20if%20%28textBoxText.length%29%20%7B%0A%20%20%20%20%20%20copyToClipboard%28utf.convertStringToUTF8%28textBoxText%2C%20encode%2C%20true%2C%20false%29%29%3B%0A%20%20%20%20%20%20target.value%20%3D%20utf.convertStringToUTF8%28textBoxText%2C%20encode%2C%20true%2C%20false%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20clearClipboard%28%29%3B%0A%20%20%20%20%20%20target.value%20%3D%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20sstream.close%28%29%3B%0A%20%20%20%20istr.close%28%29%3B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20file.remove%28false%29%3B%0A%20%20%20%20%7D%20catch%28e%29%20%7B%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0Afunction%20editfile%28target%2Cfilename%29%20%7B%0A%20%20//%20Figure%20out%20what%20editor%20to%20use.%0A%20%20var%20editor%20%3D%20getEditor%28%29%3B%0A%20//%20var%20editor%20%3D%20%22C%3A%5C%5CAkelPad%5C%5CAkelPad.exe%22%3B%0A%20%20if%20%28%21editor%29%20return%20false%3B%0A%0A%20%20var%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20file.initWithPath%28editor%29%3B%0A%20%20if%20%28%21file.exists%28%29%29%20%7B%0A%20%20%20%20alert%28%22Error_invalid_Editor_file%22%29%3B%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%20%20if%20%28%21file.isExecutable%28%29%29%20%7B%0A%20%20%20%20alert%28%22Error_Editor_not_executable%22%29%3B%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%20%20target.setAttribute%28%22filename%22%2C%20filename%29%3B%0A%20%20target.setAttribute%28%22timestamp%22%2C%20file.lastModifiedTime%29%3B%0A%0A%20%20//%20Run%20the%20editor.%0A%20%20var%20process%20%3D%20Cc%5B%22@mozilla.org/process/util%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsIProcess%29%3B%0A%20%20process.init%28file%29%3B%0A%20%20var%20args%20%3D%20%5Bfilename%5D%3B%0A%20%20process.run%28false%2C%20args%2C%20args.length%29%3B%20%20//%20don%27t%20block%0A%20%20document.addEventListener%28%22focus%22%2C%20checkfocus_window%2C%20true%29%3B%0A%20%20return%20true%3B%0A%7D%0A%0Afunction%20edittarget%28target%29%20%7B%0A%20%20var%20textBoxText%20%3D%20target.value%3B%0A%20%20//%20Get%20filename.%0A%20%20var%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20if%20%28target.hasAttribute%28%22filename%22%29%29%20%7B%0A%20%20%20%20var%20filename%20%3D%20target.getAttribute%28%22filename%22%29%3B%0A%20%20%20%20file.initWithPath%28filename%29%3B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20if%28file.exists%28%29%29%20file.remove%28false%29%3B%0A%20%20%20%20%7D%20catch%28e%29%20%7B%0A%20%20%20%20%7D%0A%20%20%7D%20else%20%7B%0A%20%20%20%20var%20filename%20%3D%20TmpFilenameTextarea%28%29%3B%0A%20%20%7D%0A%20%20file.initWithPath%28filename%29%3B%20%20%20%20%0A%20%20file.create%28file.NORMAL_FILE_TYPE%2C%200x180%29%3B%0A%0A%20%20//%20Write%20the%20data%20to%20the%20file.%0A%20%20var%20ostr%20%3D%20Cc%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsIFileOutputStream%29%3B%0A%20%20ostr.init%28file%2C%202%2C%200x200%2C%20false%29%3B%0A%0A%20%20if%28navigator.platform%20%3D%3D%20%22Win32%22%29%20%7B%0A%20%20%20%20//%20Convert%20Unix%20newlines%20to%20standard%20network%20newlines%0A%20%20%20%20textBoxText%20%3D%20textBoxText.replace%28/%5Cn/g%2C%20%22%5Cr%5Cn%22%29%3B%0A%20%20%7D%0A%20%20var%20conv%20%3D%20Components.classes%5B%27@mozilla.org/intl/scriptableunicodeconverter%27%5D.createInstance%28Components.interfaces.nsIScriptableUnicodeConverter%29%3B%0A%20%20try%20%7B%0A%20%20%20%20%20%20%20%20conv.charset%20%3D%20%27utf-8%27%3B%0A%09textBoxText%20%3D%20conv.ConvertFromUnicode%28textBoxText%29%3B%0A%20%20%20%20%0A%20%20%7D%20catch%28e%29%20%7B%0A%20%20%20%20textBoxText%20%3D%20%22%22%3B%0A%20%20%7D%0A%20%20ostr.write%28textBoxText%2C%20textBoxText.length%29%3B%0A%0A%20%20ostr.flush%28%29%3B%0A%20%20ostr.close%28%29%3B%0A%0A%20%20//%20setup%20target%20info%0A%20%20target.setAttribute%28%22encode%22%2C%20_encode%29%3B%0A%0A%20%20//%20Edit%20the%20file.%0A%20%20if%20%28editfile%28target%2Cfile.path%29%29%20%7B%0A%20%20%20%20_target.push%28target%29%3B%20%20//%20Editting%20target%20array%0A%20%20%7D%0A%7D%0A%0A//Compose%20temporary%20filename%20out%20of%0A//%20%20%20%20-%20tmpdir%20setting%0A//%20%20%20%20-%20document%20url%0A//%20%20%20%20-%20textarea%20name%0A//%20%20%20%20-%20ext%20suffix%0Afunction%20TmpFilenameTextarea%28%29%20%7B%0A%20%20var%20TmpFilename%3B%0A%20%20_tmpdir%20%3D%20gettmpDir%28%29%3B%0A%20%20do%20%7B%0A%20%20%20%20TmpFilename%20%3D%20_tmpdir%20+%20_dir_separator%20+%20%22clipboard.%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math.floor%28Math.random%28%29%20*%20100000%29%20+%20%22.%22%20+%20_ext%3B%0A%20%20%7D%20while%20%28%21ExistsFile%28TmpFilename%29%29%0A%20%20%20%20return%20TmpFilename%3B%0A%7D%0A%0A//Function%20returns%20true%20if%20given%20filename%20exists%0Afunction%20ExistsFile%28filename%29%20%7B%0A%20%20try%20%7B%0A%20%20%20%20var%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsIFile%29%3B%0A%20%20%20%20file.initWithPath%28filename%29%3B%0A%20%20%20%20return%20true%3B%0A%20%20%7D%20catch%28e%29%20%7B%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%7D%0A%0A/**%0A*%20Returns%20the%20directory%20where%20we%20put%20files%20to%20edit.%0A*%20@returns%20nsILocalFile%20The%20location%20where%20we%20should%20write%20editable%20files.%0A*/%0Afunction%20gettmpDir%28%29%20%7B%0A%20%20/*%20Where%20is%20the%20directory%20that%20we%20use.%20*/%0A%20%20var%20fobj%20%3D%20Cc%5B%22@mozilla.org/file/directory_service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIProperties%29.get%28%22TmpD%22%2C%20Ci.nsIFile%29%3B%0A%20%20fobj.append%28%22Clipboard_Viewer%22%29%3B%0A%20%20if%20%28%21fobj.exists%28%29%29%20%7B%0A%20%20%20%20fobj.create%28Ci.nsIFile.DIRECTORY_TYPE%2C%20parseInt%28%220700%22%2C%208%29%29%3B%0A%20%20%7D%0A%20%20if%20%28%21fobj.isDirectory%28%29%29%20%7B%0A%20%20%20%20alert%28%22Having%20a%20problem%20finding%20or%20creating%20directory%3A%20%22+%20fobj.path%29%3B%0A%20%20%7D%0A%20%20return%20fobj.path%3B%0A%7D%0A%0A//////////////////////////////////////////////%0A%0Afunction%20onLoad%28%29%20%7B%0A%20%20getMainwin%28%29.gCBClipboardViewer.opened%20%3D%20true%3B%0A%20%20editinit%28%29%3B%0A%7D%0A%0Awindow.addEventListener%28%22load%22%2C%20onLoad%2C%20false%29%3B%0Awindow.removeEventListener%28%22unload%22%2C%20onLoad%2C%20false%29%3B%0A%0A%20%20%5D%5D%26gt%3B%26lt%3B/script%26gt%3B%0A%0A%26lt%3B/dialog%26gt%3B%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано Andrey_Krropotkin (09-02-2019 19:15:04)

Отсутствует

 

№1311211-02-2019 11:27:08

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 689
UA: Firefox 54.0

Re: Custom Buttons

Уважаемые форумчане и спецы! Долгое время пользовался отличным расширением lazarus.
Но недавно вынужден был все таки, перейти на FF 54 и lazarus перестал работать. Хороших аналогов на замену нет.
Может кто сподобиться написать кнопку с максимально близким функционалом?
Думаю не только я был бы признателен вам за это.

Отсутствует

 

№1311311-02-2019 13:36:03

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

Re: Custom Buttons

Dumby
Не в курсе, что опять натворили в 63-65 ? Пустая страница сохраняется в  сессии ...Выход с закрытыми вкладками, а сессия сохранилась с пустотой...

Отредактировано drage2 (11-02-2019 13:36:27)

Отсутствует

 

№1311416-02-2019 20:42:28

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 65.0

Re: Custom Buttons

drage2 у меня есть очень старая кнопка - ручная работа с сессиями, устанавливается в главное меню (AppMenu), посмотри повторяется этот глюк или нет.

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

Выделить код

Код:

// Добавить восстановление сессии в Appmenu ....

(function () {
var overwrite = 1, //Если восстановление сессии устанавливается для покрытия открытых страниц, 0 при отсутствии покрытия, чтобы покрыть 2 охвата и восстановления сессию в новом окне
Cc = Components.classes,
Ci = Components.interfaces,
Cu = Components.utils; 
//SS = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
     var SS = "nsISessionStore" in Components.interfaces
                            ? (
                                Components.classes["@mozilla.org/browser/sessionstore;1"]
                                || Components.classes["@mozilla.org/suite/sessionstore;1"]
                            ).getService(Components.interfaces.nsISessionStore)
                            : SessionStore;

if (!window.Services) {
Cu.import("resource://gre/modules/Services.jsm");
}

//Сохранить функцию чтения файла, взятые из Griever из UserScriptLoader.uc.js
function saveFile(data) {
var file = Services.dirsvc.get('UChrm', Ci.nsIFile);
file.append("simple_session_manager.json");

var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
suConverter.charset = 'UTF-8';
data = suConverter.ConvertFromUnicode(data);

var foStream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
foStream.init(file, 0x02 | 0x08 | 0x20, 0x1B4, 0);
foStream.write(data, data.length);
foStream.close();
}

function loadFile() {
var file = Services.dirsvc.get('UChrm', Ci.nsIFile);
file.append("simple_session_manager.json");
if (file.exists() === false) return false;
var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
fstream.init(file, -1, 0, 0);
sstream.init(fstream);

var data = sstream.read(sstream.available());
try {
data = decodeURIComponent(escape(data));
} catch (e) {}
sstream.close();
fstream.close();
if (data === "undefined") return false;
data = JSON.parse(data);
return data;
}

//Получить текущее время
function getTime() {
var d = new Date();

function addzero(t) {
(t < 10) ? t = "0" + t : t;
return t;
}
var t = addzero(d.getDate()) + "." + addzero(d.getMonth()+1) + "." + d.getFullYear() + "-" + addzero(d.getHours()) + ":" + addzero(d.getMinutes());
return t;
}

//Сохранить сессию
function saveSession(ssdata) {
var name = prompt("Сохранить",getTime());
if (name != null) {
if (loadFile() === false) {
var data = {};
} else {
var data = loadFile();
}
if (data[name]) {
alert("Сессия с тем же именем уже существует")
return;
}
data[name] = JSON.parse(ssdata);
saveFile(JSON.stringify(data));
makeitems(name);
}
}

//Сохранить все окна сессии
function saveCurrentSession() {
var ssdata = SS.getBrowserState();
saveSession(ssdata);
}

//Сохранение текущей сессии окне
function saveCurrentWindowSession() {
var ssdata = SS.getWindowState(window);
saveSession(ssdata);
}

//Удаление сессии
function remove() {
var node = this.parentNode.parentNode;
var name = node.getAttribute("label");
var cf = confirm("Вы уверены, что хотите удалить " + name + " ?");
if (cf === true) {
node.style.display = "none";
var data = loadFile();
delete data[name];
saveFile(JSON.stringify(data));
}
}

//Переименовать
function rename() {
var node = this.parentNode.parentNode;
var name = node.getAttribute("label");
var newname = prompt("Переименовать " + name + " in", null);
if (!newname) return;
this.parentNode.parentNode.setAttribute("label", newname);
var data = loadFile();
var value = data[name];
data[newname] = value;
delete data[name];
saveFile(JSON.stringify(data));
}

//Восстановление сессий
function restoreSession(stateString) {
if (typeof stateString === "string") {
var state = stateString;
} else {
var name = this.parentNode.parentNode.getAttribute("label");
var data = loadFile();
var state = JSON.stringify(data[name]);
}
switch (overwrite) {
case 0:
SS.setWindowState(window, state, false);
break;
case 1:
SS.setBrowserState(state);
break;
case 2:
var watcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher);
var argstring = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
var w = watcher.openWindow(null, "chrome://browser/content/browser.xul", "name", "chrome,all,dialog=no", argstring);
w.addEventListener("load", function () {
SS.setWindowState(w, state, true);
}, true);
break;
}
}

function restoreSessionSelectively() {
var name = this.parentNode.parentNode.getAttribute("label");
var data = loadFile();
var sessionValue = JSON.stringify(data[name]);
var newTab = gBrowser.addTab("about:sessionrestore");
var newTabBrowser = gBrowser.getBrowserForTab(newTab);
newTabBrowser.addEventListener("load", function () {
var cDoc = newTabBrowser.contentDocument;
var sessionData = cDoc.getElementById("sessionData");
sessionData.value = sessionValue;
cDoc.getElementById("errorTitleText").innerHTML = "Выборочное восстановление";
cDoc.getElementById("errorShortDescText").hidden = true;
cDoc.getElementById("errorLongDesc").innerHTML = "Вы собираетесь восстановить " + name + " . Вы можете отключить ненужные окна или вкладки";
var stateStringContainer = cDoc.createElement("div");
stateStringContainer.id = "stateStringContainer";
stateStringContainer.style.display = "none";
cDoc.getElementById("errorPageContainer").appendChild(stateStringContainer);
var script = cDoc.createElement("script");
script.innerHTML = 'function restoreTwo() {\
document.getElementById("errorTryAgain").disabled = true;\
var ix = gStateObject.windows.length - 1;\
for (var t = gTreeData.length - 1; t >= 0; t--) {\
if (treeView.isContainer(t)) {\
if (gTreeData[t].checked === 0)\
gStateObject.windows[ix].tabs = gStateObject.windows[ix].tabs.filter(function (aTabData, aIx)\
gTreeData[t].tabs[aIx].checked);\
else if (!gTreeData[t].checked)\
gStateObject.windows.splice(ix, 1);\
ix--;\
}\
}\
var stateString = JSON.stringify(gStateObject);\
document.getElementById("stateStringContainer").setAttribute("stateString", encodeURIComponent(stateString));\
}';
stateStringContainer.addEventListener("DOMAttrModified", function () {
this.removeEventListener('DOMAttrModified', arguments.callee, false);
var stateString = decodeURIComponent(stateStringContainer.getAttribute("stateString"));
gBrowser.removeCurrentTab();
restoreSession(stateString);
}, false);
cDoc.head.appendChild(script);
var restoreBtn = cDoc.getElementById("errorTryAgain");
restoreBtn.setAttribute("oncommand", "restoreTwo();");
}, true);
gBrowser.selectedTab = newTab;
}

//Создание меню для пункта сохраненного сеанса
function makeitems(name) {
var ss = document.createElement("menu");
ss.setAttribute("label", name);
ss.setAttribute("class", "savedSessions");
menuItem2.insertBefore(ss, null);

var ss_popup = document.createElement("menupopup");
var rs = document.createElement("toolbarbutton");
rs.setAttribute("label", "Восстановление");
rs.addEventListener("command", restoreSession, false);

var rss = document.createElement("toolbarbutton");
rss.setAttribute("label", "Выборочное восстановление");
rss.addEventListener("command", restoreSessionSelectively, false)

var rn = document.createElement("toolbarbutton");
rn.setAttribute("label", "Переименовать");
rn.addEventListener("command", rename, false);

var rm = document.createElement("toolbarbutton");
rm.setAttribute("label", "Удалить");
rm.addEventListener("command", remove, false);

ss_popup.appendChild(rs);
ss_popup.appendChild(rss);
ss_popup.appendChild(rn);
ss_popup.appendChild(rm);
ss.appendChild(ss_popup);
//menupopup.appendChild(ss);
}


//Создание меню в appmenu 

var menuItem2 = document.createElement("panelview");
menuItem2.setAttribute("id", "appMenu-Seans");               
menuItem2.setAttribute("title", "Сеанс");
menuItem2.setAttribute("class", "PanelUI-subView");
var it1 = document.getElementById("PanelUI-bookmarkingTools");
it1.parentNode.insertBefore(menuItem2, it1);   

var menu = document.createElement("toolbarbutton"); //Главное меню
menu.id = "ssm_menu";
var it = document.getElementById("appMenuRestoreLastSession");
menu.setAttribute("label", "Сохранить сессию"); //Всплывающие меню
menu.setAttribute("class", "subviewbutton subviewbutton-nav");
menu.setAttribute("closemenu", "none");
menu.setAttribute("oncommand", "PanelUI.showSubView('appMenu-Seans', this)"); 
it.parentNode.insertBefore(menu, it);
addDestructor(()=> menuItem2.remove());
 
var scs = document.createElement("toolbarbutton"); //Сохранение текущей сессии
scs.setAttribute("label", "Сохранить сеанс");
scs.setAttribute("class", "subviewbutton");
scs.addEventListener("command", saveCurrentSession, false);
menuItem2.insertBefore(scs, null);

var scws = document.createElement("toolbarbutton"); //Сохранение текущей сессии окне
scws.setAttribute("label", "Сохранить в новом окне");
scws.setAttribute("class", "subviewbutton");
scws.addEventListener("command", saveCurrentWindowSession, false);
menuItem2.insertBefore(scws, null);

var menusep = document.createElement("toolbarseparator"); //Меню сепаратор
menuItem2.insertBefore(menusep, null);
    
var savedSessions = loadFile(); //Сохраненный список
for (name in savedSessions) {
makeitems(name);
}
}());

Отредактировано Andrey_Krropotkin (16-02-2019 20:43:23)

Отсутствует

 

№1311517-02-2019 15:46:19

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

Re: Custom Buttons

Andrey_Krropotkin
А у вас нет случайно работающей кнопки about:config

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

Выделить код

Код:

// Настройка функций кликов мыши(Mouse Click settings) .......................................................
this.onclick = function(e) {
     if ( e.button == 0 ) getBrowser (). selectedTab = getBrowser (). addTab ("about:config");  
     
     if ( e.button == 1 ) { 
          // запомнить текст из буфера обмена и скопировать текст на странице ....
          var clip = gClipboard.read();
          window.content.focus();
          goDoCommand("cmd_copy");            

          gBrowser.selectedTab = gBrowser.addTab( 'about:config' ); 
          
          // oбработчик ждет пока откроется "about:config", вставит текст из буфера обмена и удаляет себя ....
          gBrowser.addEventListener("pageshow", function(e) {               
               this.removeEventListener("pageshow", arguments.callee, true);
                
               content.document.getElementById("textbox").value = gClipboard.read(); 
               content.document.getElementById("textbox").doCommand();               
                                  
               if ( clip ) gClipboard.write( clip ); // вернуть текст в буфер обмена
          }, true);
          }   
};

 
// Создать меню ..............................................................................................
this.ss = [
     { label:"Все about:", value: 'about:about'},
     { label:"О плагинах", value: 'about:plugins'},
     { label:"Новая вкладка", value: 'about:newtab'},
     { label:"Настройки как таб", value: 'about:preferences'},
     { label:"Информация о кэше", value: 'about:cache'},   
     { label:"Восстановление сессии", value: 'about:sessionrestore'},
     { label:"Управление разрешениями", value: 'about:permissions'},
     { label:"Информация для решения проблем", value: 'about:support'},
     { label:"Показать исплъзование памяти подробно", value: 'about:memory'}
          ];
             
this.mObj = custombuttons.getCbContextObj(this);
this.init = function(x) {
   x.mObj.setSub();
   var nItem = {}, mItem = {};
   document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
   for ( var i in x.ss ) {
         nItem = new x.mObj.getItem();
         nItem.label = x.ss[i].label;
         if ( nItem.label == "separator" ) var nItem = document.createElement("menuseparator");
         var mItem = x.mObj.insertBefore(nItem, x.mObj.oMenu.lastChild);
         mItem.setAttribute('onclick', 'getBrowser().selectedTab = getBrowser().addTab("' + x.ss[i].value + '")');           
         };   
   x.mObj.getItem();
   nItem = x.mObj.getItem();
   this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
};
this.init(this);

// Подсказка кнопки ............................................................................................
this.tooltipText = "Л: Открыть 'about:config'\nС: Открыть 'about:config' с настройкой ( выделенной или из буфера )\nП: Показать все about:";


Или аналогичной - Открыть в нижней панели

Отсутствует

 

№1311617-02-2019 16:41:38

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 65.0

Re: Custom Buttons

Garalf это уже раньше обсуждалось. https://forum.mozilla-russia.org/viewto … 86#p761786
Замени везде addTab на  addTrustedTab

В нижней панели - пример

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

Выделить код

Код:

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%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u0438%u0436%u043D%u0435%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABxUlEQVR4XqWRP2oVURSHvztzXyZg/ENiZ2NjOsUtCHYuQndh4QIs3YCbsLBRwQUIgpViIQQFQdTE5M2bNzPnj+cy7zGFgRT+4OM7d5hzONybbj89enVwrbkngzO0wtBpEF7N9bgOr5SxG5HesF5wWePd0dt0//nP9d3D/ebkBJan0LZwVhwsC2ewCrpgHWdrAQcMaF/2eX83jbf2aE6BdRNcDq5Ctw534dXGhRaGHsyhwvn8IY/58MB5dAfcAcK2MYDPtRmoGmqKidMs4OGTilwDi4o5NefG3RFxzILsNDXkysmYclFKk4iFDdVpSAWohvWCfndH1cIW3g5RrOBGFjF+LwcS6fy1tWBTg3kxGl7UMIqSv/5oefbiGHX+SUrz0Lmciku7Fcetkm9c3+Xxg5uMNk9wKxjmHiZsQVgddwvgyo7x7s1Hcq5gr6mYA5ijmhDV0oSaIhIm8Onb2AcG2efdcWd704EhYrgXl/OMmYNPVME2mG1/sOLtC2ybwrZxYIYDuQ5Nceo6SAZiaA6JYmlaXcxY4NMTVrCTy0sk8uv3v+Tb9z/Sr0ZkEKQfkHEMK1o8FAQVAQdnSl0lPn05keTu/E/+ApLnoYXyGb2zAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0411%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043F%u043E%u0432%u0442%u043E%u0440%u043D%u044B%u0439%20%u0437%u0430%u043F%u0443%u0441%u043A%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u0438%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u043E%u0432%20%u043F%u0440%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0438%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0430%u043D%u0435%u043B%u0435%u0439%20........................%0A%0A%0Avar%20icon%20%3D%20document.getAnonymousElementByAttribute%28%20this%2C%20%27class%27%2C%20%27toolbarbutton-icon%27%29%3B%0Aicon.style.width%20%3D%20%2716px%27%2C%20icon.style.height%20%3D%20%2716px%27%3B%0A%0Athis.bottomPanel%20%3D%20function%28aURL%29%20%7B%0A%20%20var%20prefBranch%20%3D%20%22custombuttons.bottomPanel.%22%0A%0A%20%20if%28%21aURL%20%26%26%20aURL%20%21%3D%20%22%22%29%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20aURL%20%3D%20gPrefService.getCharPref%28prefBranch%20+%20%22url%22%29%3B%0A%20%20%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20%20%20aURL%20%3D%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20if%28aURL%20%3D%3D%20%22%22%29%20return%3B%0A%0A%20%20if%28aURL%20%3D%3D%20gURLBar.value%20%26%26%20%21aURL.match%28/%5E%5Cw+%3F%5C%3A/%29%29%20aURL%20%3D%20%22http%3A//%22%20+%20aURL%3B%0A%0A%20%20var%20panelID%20%3D%20%22bottom-panel%22%3B%0A%20%20var%20gPanel%20%3D%20document.getElementById%28panelID%29%3B%0A%20%20var%20height%3B%0A%20%20try%20%7B%0A%20%20%20%20height%20%3D%20gPrefService.getIntPref%28prefBranch%20+%20%22height%22%29%3B%0A%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20height%20%3D%20400%3B%0A%20%20%7D%0A%0A%20%20if%28gPanel%29%20%7B%0A%0A%20%20%20%20var%20src%20%3D%20gPanel.firstChild.nextSibling.getAttribute%28%22src%22%29%3B%0A%20%20%20%20if%28aURL%20%21%3D%20src%29%20%7B%0A%20%20%20%20%20%20gPanel.firstChild.nextSibling.setAttribute%28%22src%22%2C%20aURL%29%3B%0A%20%20%20%20%20%20//gPanel.firstChild.nextSibling.loadURI%28aURL%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20gPrefService.setIntPref%28prefBranch%20+%20%22height%22%2C%20gPanel.height%29%3B%0A%20%20%20%20%20%20gPanel.parentNode.removeChild%28gPanel.previousSibling%29%3B%0A%20%20%20%20%20%20gPanel.parentNode.removeChild%28gPanel%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%7D%20else%20%7B%0A%0A%20%20%20%20var%20appContent%20%3D%20document.getElementById%28%22appcontent%22%29%3B%0A%0A%20%20%20%20var%20spl%20%3D%20appContent.appendChild%28document.createElement%28%22splitter%22%29%29%3B%0A%20%20%20%20%20%20%20%20spl.setAttribute%28%22collapse%22%2C%20%22after%22%29%3B%0A%20%20%20%20%20%20%20%20spl.style.border%20%3D%20%22none%22%3B%0A%20%20%20%20%20%20%20%20spl.style.borderTop%20%3D%20%221px%20solid%20threedhighlight%22%3B%0A%20%20%20%20%20%20%20%20spl.setAttribute%28%22onclick%22%2C%20%22this.setAttribute%28%27state%27%2C%20%27%27%29%3B%22%29%3B%0A%0A%20%20%20%20var%20box%20%3D%20appContent.appendChild%28document.createElement%28%22hbox%22%29%29%3B%0A%20%20%20%20%20%20%20%20box.id%20%3D%20panelID%3B%0A%20%20%20%20%20%20%20%20box.height%20%3D%20height%3B%0A%20%20%20%20%20%20%20%20box.orient%20%3D%20%22vertical%22%3B%0A%0A%20%20%20%20var%20tbr%20%3D%20box.appendChild%28document.createElement%28%22toolbar%22%29%29%3B%0A%20%20%20%20%20%20%20%20tbr.setAttribute%28%22fullscreentoolbar%22%2C%20true%29%3B%0A%0A%20%20%20%20var%20spr%20%3D%20tbr.appendChild%28document.createElement%28%22spacer%22%29%29%3B%0A%20%20%20%20%20%20%20%20spr.setAttribute%28%22flex%22%2C%201%29%3B%0A%0A%20%20%20%20var%20btn%20%3D%20tbr.appendChild%28document.createElement%28%22toolbarbutton%22%29%29%3B%0A%20%20%20%20%20%20%20%20btn.style.listStyleImage%20%3D%20%22url%28chrome%3A//global/skin/icons/Minimize.gif%29%22%3B%0A%20%20%20%20%20%20%20%20btn.minimize%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20gPanel%20%3D%20document.getElementById%28%22bottom-panel%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20gPanel.previousSibling.setAttribute%28%22state%22%2C%20%22collapsed%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20btn.setAttribute%28%22oncommand%22%2C%20%22this.minimize%28%29%22%29%3B%0A%0A%20%20%20%20var%20btc%20%3D%20tbr.appendChild%28document.createElement%28%22toolbarbutton%22%29%29%3B%0A%20%20%20%20%20%20%20%20btc.className%20%3D%20%22tabs-closebutton%22%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20btc.closePanel%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20gPanel%20%3D%20document.getElementById%28%22bottom-panel%22%29%3B%0A%20%20%20%20%20%20%20%20%20//%20gPrefService.setIntPref%28prefBranch%20+%20%22height%22%2C%20gPanel.height%29%3B%0A%20%20%20%20%20%20%20%20%20%20gPanel.parentNode.removeChild%28gPanel.previousSibling%29%3B%0A%20%20%20%20%20%20%20%20%20%20gPanel.parentNode.removeChild%28gPanel%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20btc.setAttribute%28%22id%22%2C%20%22closeBottomPanel%22%29%3B%0A%20%20%20%20%20%20%20%20btc.style.listStyleImage%20%3D%20%22url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACt0lEQVQ4jaWSzUtUYRTGn/fcGZ25H+m9Iyne8fpFq4lGCsFFIW21NiKKuHIn4qpazDraabnMTVEh+Af0B0QIIohBowhlkM1MMTre+VLngzv3PW1SKWvVWR0eOL/zcM4jmBn/U4G/iTuzsyK7unoLUl4HABDtdExNbV1fXr60Tfzp4J1h3Dd1/ak1OHhN7+kBiHCaTsPd2NgrlMsP7x4fv/0nYE3XH9ix2GLbzIwQmvYbmCsVHL16xd+3tx/dOTl5dqbTWfPeMIavOs6COT0tmBmyWAS1toJaWyGLRbCUMKemxFXHWXhvGMOXACrw2BwdJYUITX190MbG4O/twf/yBdrYGJr6+6EQwbx3j1QhHv8GWDfNNjUavR3u6ACyWQRjMQRsG+rkJNSJCQRsG8FYDDKbRbi9Harj3F43zbYLB41Gr2bbRIUCFACnS0vwMhkEbBsB24aXyaCcSEDJZiFyOWidnYRGo/f8jQpQp9NTiFwOACCJACEuDsgMeXAAuC7YMECeBwWonwOaLOtT/evXMhTlSs00oS8vI2jbqGcyADOau7pgvHiB8vg4tMND1F233GRZn87pzIwtXX9eiEb5uLubC2/ecC2V4qOhIT4aGuJqKsX516/52HG4EI3ylq4/P5s7z8FHy2qXnvehOxTqDBGhFongiusCAMqWhVA+j5qU+Far/RDB4M2BfP7gUpCSLS03qr7/NiyEExEC6i+9AsBlRpU5FVaU+zdKpeSlHCSTSazOzW0XNW2gCjzZ9/3Pu77Pu77P+77/uQo8cTVt4OXMzM7a2tpFlBOJhFhZWWkulUphz/NUKWWYmUPM3GwCKgBRAKoA6kRUI6JKIBCo6rpeGRkZqQlmRjqdxuLiIm1ublIul6NKpaI0Gg3yfV8AABFxMBiUoVBIRiIRPx6Py/n5eRmPx/ETBvM/dPD/rBwAAAAASUVORK5CYII%3D%29%22%3B%0A%20%20%20%20%20%20%20%20btc.setAttribute%28%22oncommand%22%2C%20%22this.closePanel%28%29%22%29%3B%0A%0A%20%20%20%20var%20ifr%20%3D%20box.appendChild%28document.createElement%28%22browser%22%29%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22type%22%2C%20%22content%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22flex%22%2C%201%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22src%22%2C%20aURL%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22tooltip%22%2C%20%22aHTMLTooltip%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22onclick%22%2C%20%22return%20contentAreaClick%28event%2C%20true%29%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22autocompletepopup%22%2C%20%22PopupAutoComplete%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22contextmenu%22%2C%20%22contentAreaContextMenu%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22contentcontextmenu%22%2C%20%22contentAreaContextMenu%22%29%3B%0A%20%20%7D%0A%0A%20%20gPrefService.setCharPref%28prefBranch%20+%20%22url%22%2C%20aURL%29%3B%0A%0A%7D%20%20%0A//------------------------------------%0A%0Afunction%20addMenuitem%28aLabel%2C%20aURL%2C%20aNode%2C%20aObjString%29%20%7B%0A%20%20var%20mItem%20%3D%20aNode.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20mItem.setAttribute%28%22label%22%2C%20aLabel%29%3B%0A%20%20mItem.setAttribute%28%22oncommand%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aObjString%20+%20%22.bottomPanel%28%27%22%20+%20aURL%20+%20%22%27%29%3B%22%29%3B%0A%7D%0A%0A%0Afunction%20addSeparator%28aNode%2C%20aNum%29%20%7B%0A%20%20var%20separator%20%3D%20aNode.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0A%20%20separator.id%20%3D%20%22bottom-panel-button-separator%22%20+%20aNum%3B%0A%7D%0A%0Avar%20mPopup%20%3D%20document.createElement%28%22menupopup%22%29%3B%0AmPopup.setAttribute%28%22oncommand%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0AmPopup.setAttribute%28%22onpopupshowing%22%2C%20%22this.parentNode.popupShowing%28this%29%22%29%3B%0A%0A%0A%0AobjString%20%3D%20%22this.parentNode.parentNode%22%3B%0AaddMenuitem%28%22about%3Aabout%22%2C%20%22about%3Aabout%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22about%3Aconfig%22%2C%20%22about%3Aconfig%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22about%3Asupport%22%2C%20%22about%3Asupport%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22about%3Amemory%22%2C%20%22about%3Amemory%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22about%3Adebugging%22%2C%20%22about%3Adebugging%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22about%3Acache%22%2C%20%22about%3Acache%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22about%3Anetworking%22%2C%20%22about%3Anetworking%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22about%3Aperformance%22%2C%20%22about%3Aperformance%22%2C%20mPopup%2C%20objString%29%3B%0AaddSeparator%28mPopup%2C%200%29%3B%0AaddMenuitem%28%22%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%22%2C%20%22about%3Apreferences%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0414%u043E%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u044F%22%2C%20%22chrome%3A//mozapps/content/extensions/extensions.xul%3Ftype%3Dextensions%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u041C%u0435%u043D%u0435%u0434%u0436%u0435%u0440%20%u041F%u0430%u0440%u043E%u043B%u0435%u0439%22%2C%20%22chrome%3A//passwordmgr/content/passwordManager.xul%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22DOM%20Inspector%22%2C%20%22chrome%3A//inspector/content/inspector.xul%22%2C%20mPopup%2C%20objString%29%3B%0AaddSeparator%28mPopup%2C%200%29%3B%0AaddMenuitem%28%22%u0417%u0430%u0433%u0440%u0443%u0437%u043A%u0438%22%2C%20%22about%3Adownloads%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0430%u043C%u0438%22%2C%20%22chrome%3A//browser/content/places/places.xul%22%2C%20mPopup%2C%20objString%29%3B%0AaddSeparator%28mPopup%2C%200%29%3B%0AaddMenuitem%28%22%u0414%u043E%u043C%u0430%u0448%u043D%u044F%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%22%2C%20%22about%3Ahome%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0422%u0435%u043A%u0443%u0449%u0430%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%22%2C%20%22%27%20+%20gBrowser.currentURI.spec%20+%20%27%22%2C%20mPopup%2C%20objString%29%3B%0A%0A%0A%0Athis.appendChild%28mPopup%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.orient%20%3D%20%22horizontal%22%3B%0A%0A%0Afunction%20handleKeydown%28e%29%20%7B%20%0A%20%20if%20%28%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.ctrlKey%20%26%26%20e.keyCode%20%3D%3D%2027%20%29%20%7B%0A%20%20%20%20%20%20%20if%20%28%20%21document.getElementById%28%27closeBottomPanel%27%29%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.getElementById%28%27closeBottomPanel%27%29.click%28%29%3B%0A%20%20%20%20%20%20%20%7D%3B%20%20%0A%7D%0Awindow.addEventListener%28%27keydown%27%2C%20handleKeydown%2C%20false%29%3B%0A%0A%0A%0A//%20%3D%3D%3D%3D%3D%20HIDE%20DROPMARKER%20IN%20BUTTON%20%3D%3D%3D%3D%3D%0A%0Avar%20that%20%3D%20this%3B%0Athis.hideDropMarker%20%3D%20function%28%29%20%7B%0A%20%20var%20dropMarker%20%3D%20document.getAnonymousElementByAttribute%28that%2C%20%22class%22%2C%20%22toolbarbutton-menu-dropmarker%22%29%3B%0A%20%20if%20%28dropMarker%29%20%7B%0A%20%20%20%20dropMarker.setAttribute%28%22hidden%22%2C%20%22true%22%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20setTimeout%28that.hideDropMarker%2C%2010%29%3B%0A%20%20%7D%0A%7D%0Athis.hideDropMarker%28%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.bottomPanel%28%29%3B%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%5Bnull%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано Andrey_Krropotkin (17-02-2019 17:31:48)

Отсутствует

 

№1311717-02-2019 20:43:46

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

Re: Custom Buttons

Andrey_Krropotkin
Это теперь не глюк. Новая вкладка , это новая фича и  всегда сохраняется  в сессии. Сама кнопка работает параллельно.
Мне сессии вообще не нужны, лишние тормоза...

Отсутствует

 

№1311818-02-2019 14:18:40

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

Re: Custom Buttons

Andrey_Krropotkin
Спасибо большое! И еще вопрос по кнопке Reload user{Chrome, Content}.
Есть работающая на 65-66 релизе?

Отсутствует

 

№1311918-02-2019 14:37:09

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 65.0

Re: Custom Buttons

Garalf не пользуюсь. Ее по моему Dumby делал. К нему обратитесь.

Отсутствует

 

№1312018-02-2019 18:15:57

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

Re: Custom Buttons

Dumby
Есть возможность реанимировать кнопку Reload user{Chrome, Content}?

Отсутствует

 

№1312118-02-2019 18:51:22

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 322
UA: Firefox 50.0

Re: Custom Buttons

Привет @bunda1!
Твоя замечательная кнопка переводчика теперь плохо работает в FF56
https://forum.mozilla-russia.org/viewto … 50#p486850
Переводит только всю страницу целиком по ЛКМ
Все остальные функции к сожалению не работают
Буду надеяться у тебя появится время, чтобы подправить.

Но у меня сохранилась другая твоя классная кнопка переводчика, которую ты сделал еще в 2012 году.
Она работает в связке с расширением Wiktionary and Google Translate 7.2.1
Единственная проблема: перестал переводиться выделенный текст на странице  (правый клик по кнопке "заменить текст переводом")
при нажатии ПКМ по кнопке не срабатывает этот  кусок кода

Выделить код

Код:

//правым кликом на кнопке...
        else if ( event.button ==2)
        {
        //отключать реакцию по умолчанию на правый клик
        event.preventDefault();
        event.stopPropagation();
        //Заменить текст переводом(google)

При ПКМ  на кнопке появляется стандартное контекстное меню.

Вот сам код (инициализация) для кнопки Wiktionary and Google Translate 7.2.1

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

Выделить код

Код:

//присваиваем атрибуты
var gButt = document.getElementById("gd12gtbutton");
gButt.setAttribute("onclick", "event.stopPropagation(); gButtClick(event);");

//подсказка для кнопки
gButt.setAttribute("tooltiptext", "L = Перевести страницу / выделенный текст \nM = Перевести текст из буфера обмена \nR = Заменить текст переводом");

//Объявляем 'clipboard' .................................................................
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);

//обрабатывать клики на кнопке..............
gButtClick = function(event)
    {
        //левым кликом на кнопке
        if ( event.button ==0)
          {
        t = document. commandDispatcher. focusedWindow. getSelection (). toString ();
        if (t.length > 0)
        {
        //отключать реакцию по умолчанию на левый клик
        event.preventDefault();
        event.stopPropagation();
        //...
        var x = gBrowser.mCurrentTab._tPos +1; 
        //Перевести текст в google
        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab("http://translate.google.com/translate_t?hl=ru#auto|ru|"+t), x);
        }
        else
        {
        //Перевести страницу в google
        gd12.gdButton.clickHandler();
        }
          }
        //средним кликом на кнопке..
        else if ( event.button ==1)
        {
        //Перевести текст в google из буфера обмена
        var x = gBrowser.mCurrentTab._tPos +1; 
        var t = readFromClipboard()
        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab("http://translate.google.com/translate_t?hl=ru#auto|ru|"+t), x);
        }
        //правым кликом на кнопке...
        else if ( event.button ==2)
        {
        //отключать реакцию по умолчанию на правый клик
        event.preventDefault();
        event.stopPropagation();
        //Заменить текст переводом(google)
        var doc = getBrowser (). contentDocument;
        sel = doc. defaultView. getSelection ();
        sel = escape (convertFromUnicode ("UTF-8", sel))
        var url='http://translate.google.ru/?q='+sel+"&hl=ru"+"&langpair=auto|ru&tbb=1"
        xmlhttp = new XMLHttpRequest()
        xmlhttp.open('GET',url, true);
        xmlhttp.onreadystatechange = function()
        {     
            if (xmlhttp.readyState != 4) return  
            if (xmlhttp.status == 200) 
            {
                var div_ = doc. createElement ('div');
                div_.innerHTML =xmlhttp.responseText
                var TBODY_= div_.getElementsByClassName ("almost_half_cell")[0]
                var TBODY_=TBODY_. getElementsByTagName ("span") [0].textContent;
                var range = content.getSelection().getRangeAt(0);
                        var ht=range.cloneContents();
                        range.deleteContents();
                        ht.textContent=TBODY_
                        range.insertNode(ht);
            }
        }
        xmlhttp.send(null);
        }         
     };


И если что, вот само расширение
https://yadi.sk/d/ve6bXzY_eCRQrw

Помоги пожалуйста наладить ПКМ на твоей старой кнопке от 2012

Отредактировано leex (18-02-2019 19:30:32)

Отсутствует

 

№1312219-02-2019 08:30:46

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

Re: Custom Buttons

Garalf

Выделить код

Код:

(obj => {
    this.onclick = obj.click.bind(obj);
    this.oncontextmenu = obj.contextmenu.bind(obj);
    this.tooltipText = "L: Reload userChrome.css\nM: CB Menu\nR: Reload userContent.css";
})({
    async click(e) {
        if (e.button == 1) return gShowPopup(self);
        if (e.button || !this.chromeSheet) return;
        await this.reload(this.chromeSheet);
        this.restyle(0);
    },
    async contextmenu(e) {
        if (e.ctrlKey || e.shiftKey || e.detail != 1 || !this.contentSheetURL) return;
        e.preventDefault();

        var count = Services.ppmm.childCount, one = count == 1;
        var data = await this.reloadTab("chrome://extensions/content/dummy.xul", one ? false : {});
        if (one) this.reloadTab();
        else if (data) {
            var url = "data:," + encodeURIComponent(
                self.Help + this.contentSheetURL + '", ' + JSON.stringify(data) + ");"
            );
            var types = ["web", "file", "extension"];
            for(var ind = 0; ind < count; ind++) {
                var child = Services.ppmm.getChildAt(ind);
                types.includes(child.remoteType) && child.loadProcessScript(url, false);
            }
        }
        this.restyle(250);
    },
    async reload(sheet, obj) {
        try {var style = await (await fetch(sheet.href)).text();}
        catch (ex) {return obj;}
        InspectorUtils.parseStyleSheet(sheet, style);
        if (obj) obj[sheet.href] = style;
        for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) {
            var rule = sheet.cssRules.item(ind);

            rule.type == rule.IMPORT_RULE
            && rule.styleSheet.href.startsWith("file:///")
            && await this.reload(rule.styleSheet, obj);
        }
        return obj;
    },
    reloadTab(url, obj) {
        var tab = gBrowser.addTab(url, {skipAnimation: true});
        tab.style.setProperty("display", "none", "important");
        return new Promise(resolve => {
            var result, stop, destroy = () => {
                if (!stop) resolve(result), gBrowser.removeTab(tab), stop = true;
            }
            setTimeout(destroy, 500);
            try {
                tab.linkedBrowser.addEventListener("DOMContentLoaded", async e => {
                    var sheet = this.getSheet(e.target, this.contentSheetURL);
                    if (sheet) result = await this.reload(sheet, obj);
                    destroy();
                }, {once: true});
            } catch(ex) {
                destroy();
            }
        });
    },
    getSheet(doc, href) {
        var sheets = InspectorUtils.getAllStyleSheets(doc);
        return sheets.find(sheet => sheet.href == href);
    },
    get contentSheetURL() {
        var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
        file.append("userContent.css");
        if (!file.exists()) return null;
        delete this.contentSheetURL;
        return this.contentSheetURL = Services.io.newFileURI(file).spec;
    },
    get restyle() {
        var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
        var uri = Services.io.newURI("data:text/css,:root{}"), type = sss.USER_SHEET;
        delete this.restyle; return this.restyle = delay => setTimeout(() => {
            sss.loadAndRegisterSheet(uri, type);
            sss.unregisterSheet(uri, type);
        }, delay);
    },
    get chromeSheet() {
        var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
        file.append("userChrome.css");
        if (!file.exists()) return null;

        var href = Services.io.newFileURI(file).spec;
        var sheet = this.getSheet(document, href);
        if (!sheet) return null;

        delete this.chromeSheet; return this.chromeSheet = sheet;
    }
});

эта вроде работает

Отсутствует

 

№1312319-02-2019 10:54:17

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

Re: Custom Buttons

momo2000
Спасибо!
Проверил. Кнопка работает на 64-66 релизах.

Отредактировано Garalf (19-02-2019 11:22:19)

Отсутствует

 

№1312420-02-2019 13:43:31

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

Re: Custom Buttons

Dumby
W7RdlAY.png
У всех так? и вообще у меня все время удаляются еще 10 расширений, может кастыли не
правильно поставил на [firefox] 65.0.1? ну которые дают работать с bootstrap и CB...

На чистом профиле тоже самое, CB пашет, зато расширения отваливаются.
Причина только в костылях config.js но что я не так сделал?

Отредактировано func4ptch4 (20-02-2019 13:46:08)

Отсутствует

 

№1312520-02-2019 17:09:22

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

Re: Custom Buttons

func4ptch4
Это ты задавал вопрос на руборде?
Я там выложил работающие костыли. Если не будут работать, ищи причину у себя

Отсутствует

 

Board footer

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