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

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№1672602-03-2023 12:10:30

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

Re: Custom Buttons

Garalf пишет

Где у меня косяк?

Везде.


Посты 16655 и 16695 писал не я.


Последние, на данный момент, версии:
расширения — здесь, антиподписячего кода — здесь.
После установки, startupCache всё ещё нуждается в добросовестной очистке.

Отредактировано Dumby (02-03-2023 13:14:15)

Отсутствует

 

№1672702-03-2023 12:36:16

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 101
UA: Firefox 78.0

Re: Custom Buttons

Dumby пишет

Убрал @-moz-document

Так вид кнопок ломает:
Addons.1677746999.png
с включенным layout.css.moz-document.content.enabled. А отключить нельзя - заблокировано. Посмотрел на версиях с 78 по текущую,  везде эта настройка залочена в about:config.
Это только у меня так, или надо куда-нибудь лезть типа omni.ja, чтобы включить и проверить..?

Отсутствует

 

№1672802-03-2023 13:43:40

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

Re: Custom Buttons

LGS пишет

Так вид кнопок ломает
с включенным layout.css.moz-document.content.enabled.

Да, вроде, не должно ломать, никаким образом.

А отключить нельзя - заблокировано.

StyloaiX?


В любом случае — «работало? не трогай!».

Отсутствует

 

№1672902-03-2023 14:33:30

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 101
UA: Firefox 78.0

Re: Custom Buttons

Dumby пишет

StyloaiX?

Такого нет... вообщем, не нашел, что блокирует. Да и не надо, ибо

Dumby пишет

«работало? не трогай!»

истина глаголется.

Отсутствует

 

№1673004-03-2023 19:29:20

Oakwood
Участник
 
Группа: Members
Зарегистрирован: 01-01-2023
Сообщений: 15
UA: Firefox 108.0

Re: Custom Buttons

Подскажите пожалуйста, по какой причине могла отвалиться кнопка сохранения изображений по двойному ПКМ, после перехода на Windows 10 с 8.1? Профиль тот же, и версия браузера.

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

Выделить код

Код:

addEventListener("contextmenu", {
	handleEvent(e) {
		if (e.detail != 2 || !gContextMenu?.onImage) return;

		var pl = "browser.download.folderList";
		var pu = "browser.download.useDownloadDir";

		var cl = Services.prefs.getIntPref(pl), sl = cl == 2;
		var cu = Services.prefs.getBoolPref(pu);

		sl || Services.prefs.setIntPref(pl, 2);
		cu || Services.prefs.setBoolPref(pu, true);
		try {
			this.save(); e.preventDefault(); this.hide();
		} finally {
			sl || Services.prefs.setIntPref(pl, cl);
			cu || Services.prefs.setBoolPref(pu, cu);
		}
	},
	get hide() {
		delete this.hide;
		var popup = document.getElementById("contentAreaContextMenu");
		return this.hide = popup.hidePopup.bind(popup);
	},
	get save() {
		var func = eval(`(function ${gContextMenu.saveMedia})`.replace(
			/^(        )(?:false, \/\/ don't)( skip prompt for where to save)/m, "$1true, //$2"
		));
		delete this.save;
		return this.save = () => func.call(gContextMenu);
	}
}, false, gBrowser.tabpanels || 1);

Отсутствует

 

№1673104-03-2023 23:20:37

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

Re: Custom Buttons

Dumby нашел старый код со времен гороха, подскажи пожалуйста чем заменить в этом коде var btn = document.popupNode;

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

Выделить код

Код:

/////////////////////////////// Сохранить кнопку в HTML файл ///////////////////////////////

this.saveToHTMLCode = function saveToHTMLCode() {
  var btn = document.popupNode;
  var xml = '<html xmlns="' + xhtmlns + '">\n';
      xml += '<head>\n';
      xml += '<meta http-equiv = "Content-Type" content = "text/html; charset=utf-8"/>\n';
      xml += '<title> ' + btn.name + '  для Custom Buttons </title>\n';
      xml += '<link rel="icon" type="image/vnd.microsoft.icon" href = "'+ btn.image +'" />\n';
      xml += '<style type="text/css">\n';
      xml += '.button a{ \n';
      xml += 'background-color: rgb(85, 168, 2); \n';
      xml += 'background-image: linear-gradient(to bottom, rgb(147, 200, 94), rgb(85, 168, 2)); \n';
      xml += 'background-image: -moz-linear-gradient(top, rgb(147, 200, 94), rgb(85, 168, 2)); \n';
      xml += 'border: 1px solid rgb(58, 116, 4); \n';
      xml += 'border-radius: .5em; \n';
      xml += ' -webkit-border-radius: .5em; \n';
      xml += 'padding: 0; \n';
      xml += 'margin-bottom: 1em; \n';
      xml += 'box-shadow: 1px 2px 3px rgba(0, 0, 0, .25); \n';
      xml += ' -o-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25); \n';
      xml += ' -webkit-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25); \n';
      xml += ' color: #000; \n';
      xml += ' text-shadow: -1pt -1px 0pt rgba(255, 255, 255, .5); \n';
      xml += ' padding: 0.5em; \n';
      xml += ' text-decoration: none; \n';
      xml += '} ';
      xml += 'pre { border: 1px inset rgb(170, 170, 170); \n';
      xml += 'background-color: rgb(255, 255, 255);} \n';
      xml += 'body { background-color: rgb(245, 245, 220);} \n';
      xml += '</style> \n';
      xml += '</head>\n';
      xml += '<body>\n';
      xml += '<section id="install"><h1> ' + btn.name + ' </h1> \n';
      xml += '</section>\n';
      xml += '<div class="button"><a href = "' + btn.URI + '">Установить кнопку</a></div> \n';
      xml += '<section id="init"><h2>Инициализация</h2><pre>' + e4xConv_encodeHTML(btn.cbInitCode) + '</pre></section>\n';
      xml += '<section id="code"><h2>Код</h2><pre>' + e4xConv_encodeHTML(btn.cbCommand) + '</pre></section> \n';
      xml += '<section id="help"><h2>Справка</h2><pre>' + e4xConv_encodeHTML(btn.Help) + '</pre></section> \n';
      xml += '</body> \n';
      xml += '</html> ';
  var html = '<!DOCTYPE html>\n' + xml;
  var name = btn.name + ".HTML";
  saveToFile(html, name);
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "сохранена в HTML файл", false, "", null);
}

function e4xConv_encodeHTML(s, isAttr) {
	s = String(s)
		.replace(/&/g, "&amp;")
		.replace(/</g, "&lt;")
		.replace(/>/g, "&gt;")
		.replace(/"/g, "&quot;");
	if(isAttr) {
		s = s
			.replace(/\t/g, "&#x9;")
			.replace(/\n/g, "&#xA;")
			.replace(/\r/g, "&#xD;");
	}
	return s;
};

Отсутствует

 

№1673205-03-2023 11:50:55

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

Re: Custom Buttons

Andrey_Krropotkin пишет

подскажи пожалуйста чем заменить в этом коде var btn = document.popupNode;

Откуда же мне знать как «этот код» используется?
Наверно XULPopupElement.triggerNode подойдёт.

Отсутствует

 

№1673305-03-2023 13:28:29

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

Re: Custom Buttons

Dumby Вот полностью код

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

Выделить код

Код:

/*Initialization Code*/ 

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

function $(aId) {
  return document.getElementById(aId);
};

function addMenuItem(aNewIDs, aNodeIDs, aLabel, aIcon, aCommand) {
  for (var i = 0; i < aNewIDs.length; i++) {
    
    if ($(aNewIDs[i])) $(aNewIDs[i]).parentNode.removeChild($(aNewIDs[i]));

  var mi = document.createXULElement("menuitem");
           mi.setAttribute("id", aNewIDs[i]);
           mi.setAttribute("class", "menuitem-iconic");
           mi.setAttribute("image", aIcon);
           mi.setAttribute("label", aLabel);
           mi.setAttribute("oncommand", aCommand);
        
    if (i == 0)
      mi.setAttribute("observes", "custombuttons-contextbroadcaster-primary");

    if ($(aNodeIDs[i])) {
      if ($(aNodeIDs[i]).nextSibling) {
        $(aNodeIDs[i]).parentNode.insertBefore(mi, $(aNodeIDs[i]).nextSibling);
      } else {
        $(aNodeIDs[i]).parentNode.appendChild(mi);
      }
    }
  }
};

var saveImg1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAnUlEQVQ4jc3RPQ4BURTF8Z+PgrAPtUJnIxZgBZagkolVqDWWIliARCFR6GSq0Twyw2SemcpJTnPzzv/edy//ohOymj7mARl6NRoOQ6YAiGmNFAm6TQBpePdAJwYYYIF+rpaE8CoGaGEbarsw7qfaVYCl4rY3mOOGaQwwU326O8Zhyi/AJPwxdv8rRmWAyw/hl89lgCZ+69AgvPcXegKfOWlGgoA/rgAAAABJRU5ErkJggg==";
var saveImg2 = "data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAADbAAADpcAAA//AAANVwAAD/8AAAKsAAAD/AAAP//AAAP8AAAD/AAAD/8AAAwDAAAP/wAAA/wAAAP8AAA";
var saveImg3 = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf//rEH4j6xB8IesQeHDrEHD4axBh/CsQYf4rEGH8KxBw+GsQeHDrEHwh6xB+I+sQf//rEH//6xB//+sQQ==";
var saveImg4 = "data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAA/wAAAP8AAA";
var saveImg5 = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1FQr1FRT7BRUU+wUVFPsFFRT7BRUU+wUVFPsFFRT7BRUU+wUVFPsFFRT7BRUU+wU1FQrwAAAAAAAAAAAAAAAHd0cpz//////////////////////////////////////////////////////////3d0cpwAAAAAAAAAAAAAAAB4d3Sc/////+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg//////94d3ScAAAAAAAAAAAAAAAAenh3nP/////i4uL/4uLi/5yiz/9HYcT/PWrR/1qQ3P+nuNr/4uLi/+Li4v//////enh3nAAAAAAAAAAAAAAAAH18eJz/////5OTk/2FluP8IJ6r/D1TU/wli4v8FZeb/D3He/4y+5f/k5OT/+/v7/318eJwAAAAAAAAAAAAAAACBfXyc/////5Wc0v8JKq//E2Pd/yFTrv9EKTn/LjVZ/xaF2/8OdNP/zNnm//z8/P+BfXycAAAAAAAAAAAAAAAAhIGBnP////89Xc7/Dk7N/wpQ0/8zVp//TGCK/4U2Cf9DW2b/Eqj7/5C+5//8/Pz/hIGBnAAAAAAAAAAAAAAAAIaEgZz/////Kmnf/wlFzf8gPZ7/uXcl/8OAK/+UTBL/b1Az/zfG9f9srdX/+fn5/4aEgZwAAAAAAAAAAAAAAACJhoac/////0iN6P8HQtH/EVzd/2mCqf/dqkz/0pY6/6FnKv9Nvt7/kMfs//X19f+JhoacAAAAAAAAAAAAAAAAiomJnP////+Mr+r/FFnU/xVRyv+LorL/8Oqh//nXbP+5omH/Urvf/8bj7v/s7Oz/iomJnAAAAAAAAAAAAAAAAI6Kipz/////2+n3/5aSm/+hcEn/4uXC////2P/25KD/rqSD/7HR5//o6Oj/4eHh/46KipwAAAAAAAAAAAAAAACPjo6c//////j4+P/4+Pj/3s/F/9i/n//p27n/5NG0/+7r6f/r6+v/3t7e/9LS0v+Pjo6cAAAAAAAAAAAAAAAAk4+PnP/////6+vr/+vr6//r6+v/6+vr/+vr6//j4+P/19fX/r66t/62sq/ObmprrkI2NpgAAAAAAAAAAAAAAAJOTk5z//////Pz8//z8/P/8/Pz/+/v7//r6+v/4+Pj/9fX1/66trfHs7Ozrp6emp4aGhhMAAAAAAAAAAAAAAACWlpOc/////////////////v7+//39/f/6+vr/9/f3//Pz8/+bmprrp6enp3NzcxYAAAAAAAAAAAAAAAAAAAAAmJiWnJiYlpyYmJacmJiWnJeTk52SkZGemJiWnJeTk52SkZGej4+LpIaGhhMAAAAAAAAAAAAAAAAAAAAAgAMAAIADAACAAwAAgAMAAIADAACAAwAAgAMAAIADAACAAwAAgAMAAIADAACAAwAAgAMAAIADAACABwAAgA8AAA==";
var saveImg6 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABKklEQVR42mNkQAMNDAxCQMoTiB2BWAEq/ACI9wPxdqD8O2T1jGiao4HUEgb8IAaobimGAUDBGiDVzEAcqAWqb4EbQKTNWF3CCPXzW5ho/f//YDqHkZFhCpQNA7lAMV4gzY4QEmZEtx1mgCtQ8W4o2xLIPg5lJwDZUghDYkAGzAEyktENMAQqPA9l6wDZEkB6D6Yhc0EG7AGynfEZYAxkawHpxVC+A5CvC6RFGBj2Em2AIZCeg8Q3BtLSUAMIegGkwQBIz8U0YC7OQEQ2wAjIPoekGRQTUC/E4IxGkMKzaNEI8jso4chDbGdgA0UjekJ6A8S3gRikFWQyKOF/higGR50UFLPBEhLM9AZoUv4F1cAA1QTi/2SAJFkQnxdCoyZlJEPIz0xIhpCUnQFx83abgfUZOQAAAABJRU5ErkJggg==";
var saveImg7 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAASUlEQVR42mNkoBAw0s6ABob/aHxGkg1I8zEGM2dtOTskDED3MxCgGIBpASOGATANhACyi6hrAGVeoDgQB6UB2PxMvAFEAooNAAC7izYR2pQ0nAAAAABJRU5ErkJggg==";
var saveImg8 = "data:application/file;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AESqAABHpgAASKAAAEukAQxMpQMYR6MAAEepAQ9MpgOLRKgACUenAABHpgAARKoAAP///wD///8A////AP///wBEqgAARaIAAFS2FVBj0jS3Y9AzyVG0EUROrwt8TKcDs0ikAANInwAAR6YAAESqAAD///8A////AP///wD///8ARKQAAVvJKJtj0jX/SaAJ/0abCv9UtSH/U7QX8lW5IMddwyfQW8Iii0mqBQ1DqQAA////AP///wD///8A////AEWlAAFYwB6YXsYc5F7GFt9bwA+vVbgWvU6rAKBRrgf0RZgA/02oDP9ezCzJR6UBA////wD///8A////AP///wBFrAAASKIAADiGNQAeYIIpF1iJHVa4GKEve0tFLHl1Pla7J51exRnUWL8VjEetAAP///8A////AP///wD///8AC0WuAAk/tAAANdpIAFD6/wA+7f8gd6jqBlPX+QBE9PIGS8uDLnZLADqNJwAzjDMA////AP///wD///8A////AAAw0QAALc0AAEPdegBI4f8AK8P/ADHX/wAwzf8AL8b/AEno/gAz2zYALtEQAC3VAP///wD///8A////AP///wAAMssAADjSMwBA2pIATen/ADG9/wBe1v8ATcz/ADHK/wBN5/4ASeH/AEvl6wA10DP///8A////AP///wD///8AADnTSQBO5/8ANc7/ADnR/xC+9/8C0f//AMj//wCP8P8ALcX/ACrC/wBE3f8ASeOf////AP///wD///8A////AABI4Z4ARN3/ACvG/wJAxP8Z5v//AMT//wDE//8Axv7/AETM/wA51P8AUervADjSPP///wD///8A////AP///wAAOdRiAFry+QBS6/QATOP/H+P8/xDe//8J1///E9H4/wFE2f8AReC6ADTOEwAyywD///8A////AP///wD///8AADDNAAAyzCcARN7WACvG/wVfzf8d0vf/HM30/whf0/8AI7n/ADzV+AA40kUAMswA////AP///wD///8A////AAAwywAAPNdTAEfg/wAsw/8AOdb/ADLP/wAswv8AReP/AC7H/wA40f8AR+GfADDKAP///wD///8A////AP///wAAMswAADfRQgBY8f8AT+j/AE7o7AA+1/8AK8T/AE7o/wBN5f8AVe7/AD/ZbAAwywD///8A////AP///wD///8AADPMAAAyywAANM4vADjSUQA0zikAU+z3AEff/wBJ4sMAN9EtADjROQAyywAAM8wA////AP///wD///8A////AAAzzAAAM8wAADHLAAAwywAAMcsAAD/YXQBK4pYAN9AxAC/KAAAwygAAM8wAADPMAP///wD///8A+R8AAPAfAADABwAAwAMAAPgDAADwHwAA8AcAAOADAADAAwAAwAMAAMAHAADgBwAA4AcAAOAHAADwDwAA/j8AAA==";
var saveImg9 = "data:application/file;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAFwAAAGkAAABzAAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAADkAAAAP////AQAAAIdgZmj/YWlt/2FobP9haGz/YGhr/2Boa/9fZ2v/X2dr/15mav9dZWn/XGRo/0ZNUP8AAACdAAAAFf///wEAAACr2tzc/9ve4P/a3t//1dnZ/7S2tf+foJz/m5ya/6apqP/O0tP/09fZ/9DV1v+hqq//AAAAuQAAABX///8BAAAAq+3u7//e4eL/ub29/2hnXv9oVUX/U0As/zgxGf83Lx3/YWBX/7a5uv/S1tj/o6yx/wAAALkAAAAV////AQAAAKv29/f/19na/1dUQf9jXDv/dmtJ/4FoSP9VQiL/V0Ek/008Iv9HQTP/yc3P/6Wus/8AAAC5AAAAFf///wEAAACr+Pj4/5uamP9tY0L/g31b/6GLa/+McVH/eFY5/4xwUv9yXkD/RTki/4uMiv+nsLT/AAAAuQAAABX///8BAAAAq/n6+v+FfXL/waSM/8qznf/DrZP/ooFi/7WfhP+qh2//blk9/1A+Iv9aWlH/pK2x/wAAALkAAAAV////AQAAAKv6+/v/d3Rr/9zCsP/RxbH/z8Wu/9fJt//Qvab/qItv/5iOb/9tYUH/VVJK/6Wtsf8AAAC5AAAAFf///wEAAACr+/z8/4mHff+3pI//3NK//+HXxf/m3Mz/5trJ/9rMuf+bgWT/d14//2hnYP+osbX/AAAAuQAAABX///8BAAAAq/z9/f/FxL7/j4l+//Xw5f/29ez/8/Dl/+DMuv/VuaP/poZn/2dFKv+srav/oamt/wAAALkAAAAV////AQAAAKv+/v7/+/z8/5iZjf+5uqr/6+PW/+3i1P/kzL3/vZR+/4NhSf+Qh3z/z9HS/4qQkv8AAAC1AAAAFf///wEAAACr/v7+//7+/v/u7u3/tbiv/5WSgP+DfGj/e25Z/29gTv+sppz/vr6+/5aYmP90eHr/AAAApwAAABP///8BAAAAq/////////////////7+/v/9/f3//f39//v8/P/5+fn/1dXV/2pqav9TU1P/QUFB/wEBAYkAAAAJ////AQAAAKv7+/v//////////////////v7+//7+/v/+/v7/+vr6/9fY2P/V1tb/7Ozs/4KCgv8EBAQrAAAAA////wEAAACFlJSU/6ioqP+qqqr/qqqq/6qqqv+qqqr/qKio/6anp/2kpaX9o6Oj/4qKitUZGRk9////Af///wH///8BAAAAFQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABTBAQEUx8fH1dfX18z////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w==";
var loadImg = "data:image/x-icon;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////AQAAAB+yg2l71ZRt+daTa//Wk2v/1pNr/9aTa//Wk2v/v4NlywYEAycAAAAX////Af///wH///8B////Af///wHdo4M53Zx3/+Sgef/innb/4p52/+Kedv/lo3r/5aR6/+mqgfvPj27N////Af///wH///8B////Af///wH///8B4KSD8+mmff/opH3/56N6/+Whef/no3r/66qB/8KBXf/Fg1//0Y5s78+Pbqn///8B////Af///wH///8B////AeGlg//trIX/7ayE/+6thP/urIX/9bWL/8eFYf/GhF//yYZh/9SPa/nkn3j/////Af///wH///8B////Af///wHkn3j/76+G/+6uh//vrob/76+G//W3jP/GhF//y4di/9ONZ//XkWr/5J94/////wH///8B////Af///wH///8B5J94/++wif/wsIj/8LGJ//CxiP/0toz/y4di/8+KZf/vroP/766D/+SfeP////8B////Af///wH///8B////AeSfeP/xs4v/8bOL//Cziv/ws4v/87WL/9CNa+3QjWvt3p96/96fev/en3r/////Af///wH///8B////Af///wHkn3j/8rWN//K2jf/ytY3/8rWN//O2jvfdo4Lj0I5sJdCObCXQjmwl0I5sJf///wH///8B////Af///wH///8B5J94//O3j//zuI//87iP//O4j//zuZDx3aOD7////wH///8B////Af///wHdo4M/5J94/+SfeP/kn3j/5J94/++2j//zupH/9LqR//O6kv/0upL/87qR/+SfeP/kn3j/5J94/+SfeP////8B////Af///wHkoXr/9cCY//W8k//0vJT/9L2T//S8lP/0vZT/9LyU//S8lP/1vJT/9cCY/+Shev////8B////Af///wH///8B9b+WC+SjfP/2yqP/9b+W//a/lf/2v5X/9b6V//W+lv/1vpX/9sqj/+SjfP////8B////Af///wH///8B////Af///wH2wZgX5aZ+//fTrP/2wJj/9sCY//bAmP/2wZj/99Os/+Smf/////8B////Af///wH///8B////Af///wH///8B////Af///wHkqYH/99ax//fCmv/3wpn/99aw/+Sogf////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AeWrhP/317L/99ey/+WrhP////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B5a2F/+Wthf////8B////Af///wH///8B////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w==";
var moveToMenu = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABKElEQVR42o3TMUvDQBQH8P+7tLlEwaW4ugl+iU6CCA4i0tbdqavgZ/ErCE79DsVBkYpKLR2kuApOatG297zLJWkqXnIPwrsk937cveQIJXHZBZt8cgFyzaEqYGuTvl7feM2FVAIHR8Bj341UAu1T4PPdjXgBJgzyPKDFy4SDIkJZo1yRASZ+FDB5Itzfct7YBGjuBBBh6oT6ed2OazGjsV3wQ2Cu64bXUKM7FgZJgPaufinTSVFhrDPFheVIe01nwLgfq9HNVCRAaw8Q6USWS4B05mgVIH2/qG+ABh+46im7heP9EELOLRDZpVqAQev8ZwUS/DBLivMtlDWxc7Ycs6yBhyov9vqMGcBBDB5/rxT7/Qfntjn/FXsDrmIvoHUonMVegMllx/kXlvSRMQ0GPE4AAAAASUVORK5CYII=";
var removeFromToolbar = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACMElEQVR42p3Sz2/SUBwA8G9pgQJd6QYZQQkOjUFdXMCLMn9B4l3myRgXhydPZgcTY2KyLfGiF/wT9GTmhfIXjMQ4NP5YD5qZTGdVdEx+9FVKSwttrTV4QD3AN3mH9837fr7v+/Kww1e4ic2HiSYMRGxufcHjxs87nQ5GN0zodnXQNLVomvCAL6ZR/xxmAS9VsX1umz1pJ/dfKGeD4+58OERNYQQO7Y4BWs8E3XCAqvRAEkWkdpTcNptm+4DpMVUOtboZl4tY2reXWmTGvbDTVKFnALicTrvYsFqbpgEOBw6tpgiigOb4Yoa1gTMzY1B+XUexKM1gLid8a3QgQHtBklQQBJm3RuAxDBiPl0z4aMq+eu1rFYmiFLOBowd8QJEEiLIBlbpV7PdArdZCApJX3j9O3e/Pe/Di0zTpJgvB8CSjSG1o7O7mbCA04QIHjoGsGuAfI6FRk0D8ISe3VlPc4OPGL61nab+/QDE0VD9/+T1CKOCCtqoDQRBAe0n4yH/nZUVLVtjTCP4R8cvPN8LRSKL6qVKygUjIC0rXAAMw6+EI6GkmoGaDM0DP8KuzfyHx+WfLe6KRpdpOlbMB+E9oWof78OhEcjB/5OqLbHAyUEB1oYTBCDFz7VWaYZg11BTYkYBj17lFyu3Lo5aYGwk4fuNNHgd8QVHk2EjA7K3NDVM3iuV708tDA2dXtqb0rr5mrWT57jQaGjh1+13eKio+uXOo9Gs/NJC6+TZhdf7zQ38Ceg0HgF1MCP0AAAAASUVORK5CYII=";
var iconADD = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAMAAABl5a5YAAAAkFBMVEWsFBSfERGYExOPDw8jEBCwFBRJICDXICBCGRnELCwUDg5BDg6XDg7AFhbAGBjVKyvHHBzIKyuJGBiDGRm7FxeiOTmMMDASDg5PExM1Dg4TDg4xEBBaIyMvExMsExMbDw9GDg4AAAC5Dw/JDg7MDg7QDw++Dg60Dg7DDg6sDg61FRWNDg7YGRmwDg7WKyvEGhojAnMyAAAAInRSTlP7+/TzTfst/k/9J4T85N/16PFfWgljXR15BRU7HQ8MMIsAJl/uYAAAAINJREFUeF6Nz8cSgzAMBFDSGx1Cc4wdSy6Q9v9/F4Y2Hk7sTe+iXee5yFqokzhOqAWPr5QtsyFAOMxQ0voYIDokTcsestALTwjK8/2ih/tbSkQwSjd8BEDobjFB9hPCGNVuXHeAipBzpMR2z1g+vaWR1rvc7nFpPq+rXb3g/FatXrvIH9eGIuNzLuIwAAAAAElFTkSuQmCC";
var customBtn = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjVJREFUeNqcUkuIUmEUPl4fML6bBsFRacRF2EaCcRO48bFLEIJcBIJLxb2b2UWLkIEgQQjauVFaKmgYuclUTMUHKoaKE4GPxnxh5r3ezh0QHJFmmA/OPZfDfx7fdw7AfojQ7qGx4QawdgMymeyRyWR6IZVKucFg8N10Ov0Ot4VGozmNRCLx5XL5F/HHbrefYZh7m1yWWq0+TafTn2kEdqXr9TrtcDje3JR4xRHH1QYCgXOz2Wzs9/sQj8dBIpEATtGrVqu9yWSywmdLNGq3AAeNsFgsz202mxk7QzKZBK1WCzqdjtHjKUmSx41Go4L+slQqpYvF4keKoibXpnA6nWfY+VehUKBSqRTJ0Oh2u3Qul6MHgwE9Ho9pLMD4H16v95zD4RxuU6BbrdYlPh5g8tfFYvET9XiIiRylUsnQgPl8DtgVhsOheL1eS6LRaGy1Wg02FAA5VmKxWB1/yUQioWOxWHKXy2XEYsDQEggEgKJCJpOBcrnMbOliW4MNSOaDCbVKpVISCoVGHBnQQygUgnK1AkeH9z+Ew+HX2xoQezZDjUaj3ygDiMViaLfbV8kK+TGw2WysJzzafry3QK1W+9Lr9RpIDbLZLEhE4vedTsdvMBieuN3ulwRBPLh2B7uYzWYXzWZzjBoc5PP5MJ70K1xfEsVc4cpNeDcnuLFvzM3978gILpcrRy/w+XybGE+v1z/z+/2frFarG9d5AHeBSqUyeDyetwqF4jHcFXw+/4TH44n+CTAA3Ccog288LRAAAAAASUVORK5CYII=";
var saveAll = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOElEQVR42mNkwAJ+7xf7//3tKwZeIUELRqf3JxnwAEZkzrtlwnv/MzE6/WfkWCwS/iTu7RLO/wzMPAwc/z4Lc0f/eIfTgP/7BM0PXDY5ofB9N8M/EB8k+BcoyQw1mEWd4SurLIO97lkUFzX9b/oPNmBznc7/////MbAzfIdoBoI/P77Abfnzn4XhH9A0kOLA7icQV88HKn0EdcH6Ss3/yM76/f0jg2vTXYZ/f39j9fdUgQkMdTp1DNFXoiEGrCzFNMCj6SrD/79/MDQzsbAzCEfyMTBwADkbGBjBBiwrRDXgF9AAz6ZLWF1QIlHCsFRnKdj2pYxLIQYsytPAMMC75SLYBVMkpzDkPM+By0lFSTEwCDAwvJ79eouoqKgv2IB5WWgGfPvI4N95kUEyQQwcJVXbq8CGeEp6MlzUuQi2fcKbCQgDZqWhG/CJIaDrLIPMf0kGBjeggAoDw5YNWxh8rHwYGMQZGB5PfszAysq6RUJCAmLAtCR1DAMCu08zzJSZxtDm0cbA8AQoyAxJGyDbWx+2MrCwsGyRkZGBGDApDpsBx8FhME95HkObfhtYM4MqA8OdnjtgNSAXyMvLQwzoi8JmwGF4NGoc12Bg6IHYXnuzFm6AsrIyxIAJ+UHXfj27oomIhc9AA/ajpAOdPToMV1yuwPnMzMxbNDU14QaEAqnGH28fqYGywt/fP5i8q5czYUtIMABygY6ODsSAJUuWOKMrUFHT2PPvzy90YZhX/79//36dt7d3KACPfPJHOU7GxAAAAABJRU5ErkJggg==";

let cIDs = ["custombuttons-contextpopup-exportXML",
            "custombuttons-contextpopup-exportXML-sub"];
let bIDs = ["custombuttons-contextpopup-bookmarkButton",
            "custombuttons-contextpopup-bookmarkButton-sub"];
addMenuItem(cIDs, bIDs, "Сохранить код кнопки в XML файл", saveImg9,
            "document.getElementById('" + this.id
          + "').saveXML(('triggerNode' in this.parentNode) "
          + "? this.parentNode.triggerNode.URI "
          + ": document.popupNode.URI);", "X");
let xIDs = ["custombuttons-contextpopup-importnewbutton",
            "custombuttons-contextpopup-importnewbutton-sub"];
let aIDs = ["custombuttons-contextpopup-addnewbutton",
            "custombuttons-contextpopup-addnewbutton-sub"];
addMenuItem(xIDs, aIDs, "Добавить кнопку из XML файла\u2026", loadImg,
            "document.getElementById('" + this.id +
            "').loadXML();");          
let fIDs = ["custombuttons-contextpopup-copyImageURI",
            "custombuttons-contextpopup-copyImageURI-sub"];
let b2IDs = ["custombuttons-contextpopup-copyURI",
            "custombuttons-contextpopup-copyURI-sub"];            
addMenuItem(fIDs, b2IDs, "Копировать изображение кнопки в формате base64", saveImg1,
            "document.getElementById('" + this.id
          + "').copyImageURI();");
let f1IDs = ["custombuttons-contextpopup-saveButtonImage",
            "custombuttons-contextpopup-saveButtonImage-sub"];
addMenuItem(f1IDs, cIDs, "Сохранить изображение кнопки", saveImg8,
            "document.getElementById('" + this.id
          + "').saveImageURI();");  
let f2IDs = ["custombuttons-contextpopup-copyButtonsCodeText",
            "custombuttons-contextpopup-copyButtonsCodeText-sub"];
addMenuItem(f2IDs, b2IDs, "Копировать код кнопки как текст", saveImg2,
            "document.getElementById('" + this.id
          + "').copyButtonsCodeText();");                    
let f3IDs = ["custombuttons-contextpopup-copyAsHTML",
            "custombuttons-contextpopup-copyAsHTML-sub"];
addMenuItem(f3IDs, b2IDs, "Копировать код кнопки как HTML ссылку", saveImg3,
            "document.getElementById('" + this.id
          + "').copyToHTMLCode();");
let f4Ds = ["custombuttons-contextpopup-copyToBBCode",
            "custombuttons-contextpopup-copyToBBCode-sub"];
addMenuItem(f4Ds, b2IDs, "Копировать код кнопки как BBcode сылку", saveImg4,
            "document.getElementById('" + this.id
          + "').copyToBBCode();");          
let f5Ds = ["custombuttons-contextpopup-saveAsHTML",
            "custombuttons-contextpopup-saveAsHTML-sub"];
addMenuItem(f5Ds, bIDs, "Сохранить код кнопки в HTML файл", saveImg5,
            "document.getElementById('" + this.id
          + "').saveToHTMLCode();");
let f8Ds = ["custombuttons-contextpopup-saveAsHTMLAll",
            "custombuttons-contextpopup-AsHTMLAll-sub"];
addMenuItem(f8Ds, f5Ds, "Сохранить все кнопки в HTML файл", saveAll,
            "document.getElementById('" + this.id
          + "').saveToHTMLALLCode()");          
let f6Ds = ["custombuttons-contextpopup-getButtonId",
            "custombuttons-contextpopup-getButtonId-sub"];
let b1IDs = ["custombuttons-contextpopup-remove",
            "custombuttons-contextpopup-remove-sub"];            
addMenuItem(f6Ds, b1IDs, "Показать Id кнопки", saveImg6,
            "document.getElementById('" + this.id
          + "').idMIonclick(window.document);");
let f7Ds = ["custombuttons-contextpopup-addNextButton",
             "custombuttons-contextpopup-addNextButton-sub"];
   
                                        
var addMI = document.getElementById('custombuttons-contextpopup-addnewbutton');
addMI.setAttribute('image', iconADD);
var addMI1 = document.getElementById('custombuttons-contextpopup-addnewbutton-sub');
addMI1.setAttribute('image', iconADD);
var addMI2 = document.getElementById('custombuttons-contextpopup-move-moveToPanel');
addMI2.setAttribute('image', moveToMenu);
var addMI3 = document.getElementById('custombuttons-contextpopup-move-removeFromToolbar');
addMI3.setAttribute('image', removeFromToolbar);
var addMI4 = document.getElementById('custombuttons-contextpopup-customize');
addMI4.setAttribute('image', customBtn);
//var addMI5 = document.getElementById('custombuttons-contextpopup-remove');
//addMI5.setAttribute('label', 'Удалить...');

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Общие функци ////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

var options1 = {year: "numeric"};
var options2 = {day: "numeric", month: "long"};
var cDate = new Date().toLocaleDateString("ru-RU", options1);
var dDate = new Date().toLocaleDateString("ru-RU", options2);
var aDate = cDate + "г" + " " + dDate;

var options3 = {weekday: "long", year: "numeric", month: "long", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric", hour12: false};
var bDate = new Date().toLocaleDateString("ru-RU", options3);

var saveToFile = function (fileContent, fileName) {
	var uc = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
	uc.charset = 'utf-8';
	fileContent = uc.ConvertFromUnicode(fileContent);

	var nsIFilePicker = Components.interfaces.nsIFilePicker;
	var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
	fp.init(window, '', fp.modeSave);
	fp.defaultString = fileName;
	fp.appendFilters(fp.filterHTML);
	fp.appendFilters(fp.filterAll);
        fp.open(function (rv) {
        if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
              var stream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
              stream.init(fp.file, 0x02|0x20|0x08, 0666, 0);
              stream.write(fileContent, fileContent.length);
             stream.close();
             }
         });
};

function  mostRecentWindow(windowType) {
  return Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow(windowType);
};
/////////////////////////////////////////////////////////////////////////////
////////////////////////////Остальные функци ////////////////////////////////
/////////////////////////////////////////////////////////////////////////////


/////////////////////////////// Показать Id кнопки ///////////////////////////////

this.idMIonclick = function idMIonclick() {
  var btn = document.popupNode.id;
  var box = custombuttons.confirmBox("Копировать в буфер", btn, "Да", "Нет");
  if (box) {
    custombuttons.cbService.writeToClipboard(btn);
    custombuttons.alertSlide(btn, "Скопирована в буфер");
} }


/////////////////////////////// Копировать изображение кнопки в формате base64 ///////////////////////////////

this.copyImageURI = function copyImageURI() {
	var btn = document.popupNode;
	if (!btn) return;
	cbu.gClipboard.write(btn.image);
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "Изображение кнопки скопировано в буфер", false, "", null);
}

/////////////////////////////// Копировать код кнопки как текст ///////////////////////////////

this.copyButtonsCodeText = function copyButtonsCodeText() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = ((btn.cbCommand == "") || (btn.Command == "/*CODE*/"))
              ? ""
              : ("\n/*CODE*/\n" + btn.cbCommand + "\n");
	var init = ((btn.cbInitCode == "") || (btn.cbInitCode == "/*Initialization Code*/"))
              ? ""
              : ("\n/*Initialization Code*/\n" + btn.cbInitCode);
	cbu.gClipboard.write(code + init);
	//custombuttons.alertSlide(btn.name, "Код скопирван в буфер");
	var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
        as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "Код скопирван в буфер", false, "", null);

}

/////////////////////////////// Копировать код кнопки как HTML ссылку ///////////////////////////////

this.copyToHTMLCode = function copyToHTMLCode() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = "<p><div id=\"install\" style=\"background: transparent -moz-linear-gradient(center top , rgb(224, 102, 255) 30%, rgb(125, 38, 205) 55%); text-shadow: 0pt -1px 0pt rgb(122, 55, 139); border: 1px outset rgb(85, 26, 139); border-radius: 1em; padding: 0; width: 240px; text-align: center;\"><a href=\"" + btn.URI + "\" style=\"display: block; padding: 1em; color: #ffffff; text-decoration: none;\" title=\"Click here to install " + btn.name + "\" rel=\"nofollow\"><img src=\"" + btn.image + "\" alt=\"" + btn.name + "\" style=\"vertical-align: middle; float: left;\"/>" + btn.name + "</a></div></p>";
  cbu.gClipboard.write(code);
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "HTML кнопки скопирован в буфер", false, "", null);

}

/////////////////////////////// Копировать код кнопки как BBcode сылку ///////////////////////////////

this.copyToBBCode = function copyToBBCode() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = "[url=" + btn.URI + "][B]" + btn.name + "[/B][/url]";
  cbu.gClipboard.write(code); //.toXMLString());
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "BBCode кнопки скопирован в буфер", false, "", null);
}

/////////////////////////////// Сохранить изображение кнопки ///////////////////////////////

this.saveImageURI = function saveImageURI(btn) {
 
  var remove = gBrowser.removeCurrentTab.bind(gBrowser);
    var promiseTargetFile = async (...args) => {
        var res = await window.promiseTargetFile(...args);
        setTimeout(remove, 0);
        return res;
    }
    var internalSave = eval(`(${window.internalSave})`);
    var save = eval(`(${window.saveDocument})`);
     
     var btn = document.popupNode;
  if (!btn) return;
  
  (saveButtonImage = btn => {
        if (btn.image != "") {
            var tab = gBrowser.selectedTab;
            gBrowser.selectedTab = gBrowser.addTab(btn.image, {
                triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
            });
            setTimeout(function() {
                window.content.document.title = btn.name;
                save(window.content.document);
            }, 2000);
        } else
            custombuttons.alertBox("Эта кнопка не имееет изображения!");
    })(btn);
 
}



/////////////////////////////// Сохранить кнопку в XML файл ///////////////////////////////

this.saveXML = function saveXML(aStrURI) {
  var cbURI = (aStrURI != undefined) ? aStrURI : readFromClipboard();
  if (!cbURI || !/^custombutton\:\/\//.test(cbURI)) {
    custombuttons.uChelpButton(this);
    return;
  }
var topicURL = "http://forum.mozilla-russia.org/viewforum.php?id=34"
  var cbXML = cbURI.replace(/^custombutton\:\/\//, "");
  var decodeXML = unescape(cbXML);
  var btnName = decodeXML.match(/\<name\/?.+/).toString();
  var name = "untitled";
  if (!/\<name\/\>/.test(btnName)) {
    name = btnName.replace(/\<\/?\w+\>/g, "").toString();
  }
  var image = decodeXML.match(/\<image\/?.+/).toString();
  var icon = "";
  if (!/\<\image.*\[\].*\>$/.test(image)) {
    icon = image.match(/[^\[\]]+/g)[2].toString()
                .replace(/custombuttons\-stdicon\-\d/, "").toString();
  }

  function htmlEntities(str) {
      return str.replace(/&/g, "&amp;").replace(/</g, "&lt;")
                .replace(/>/g, "&gt;").replace(/"/g, "&quot;");
  }

  var xmlTemplate = "custombuttons/\"\n\
              xmlns:html=\"http://www.w3.org/1999/xhtml\">\n\
  <html:head>\n\
    <html:title><![CDATA[" + name + "]]></html:title>\n\
    <html:link rel=\"shortcut icon\" href=\"" + icon + "\"/>\n\
    <html:style type=\"text/css\"><![CDATA[\n\
body { font-size: medium; margin: 0; }\n\
body, code:before, help:before, initcode:before {\n\
  font-family: \"Verdana\", sans-serif;\n\
}\n\
#wrapper { position: fixed; top: 1em; right: 1em; text-align: center; }\n\
p { font-size: small; text-align: center; }\n\
#button {\n\
  background-color: rgb(85, 168, 2);\n\
  background-image: linear-gradient(to bottom, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -moz-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -o-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -webkit-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  border: 1px solid rgb(58, 116, 4);\n\
  border-radius: .5em;\n\
  -moz-border-radius: .5em;\n\
  -webkit-border-radius: .5em;\n\
  padding: 0;\n\
  margin-bottom: 1em;\n\
  box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -moz-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -o-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -webkit-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
}\n\
#button a {\n\
  color: #000;\n\
  text-shadow: -1pt -1px 0pt rgba(255, 255, 255, .5);\n\
  padding: 1em;\n\
  text-decoration: none;\n\
}\n\
:-moz-any-link:focus {\n\
  color: white;\n\
  outline-color: transparent;\n\
  text-decoration: none;\n\
}\n\
#button a, code, code:before, initcode, initcode:before, help, help:before {\
\n  display: block;\n\
}\n\
#credits { position: fixed; bottom: 1em; right: 1em; font-size: small; }\n\
custombutton { background-color: rgb(171, 171, 171); margin: 1em; }\n\
date, image, mode, accelkey { display: none; }\n\
name { font-weight: bold; font-size: x-large; }\n\
code:before, help:before, initcode:before {\n\
  font-weight: bold;\n\
  font-size: large;\n\
  margin: 0 0 1em;\n\
  padding: .5em;\n\
}\n\
code:before { content: \"Код\"; }\n\
help:before { content: \"Справка\"; }\n\
initcode:before { content: \"Инициализация\"; }\n\
code, initcode, help {\n\
  background-color: rgb(255, 255, 255);\n\
  border: 1px inset rgb(170, 170, 170);\n\
  font: medium monospace;\n\
  margin: 1em 1em 2em 0;\n\
  padding: 1em;\n\
  text-align: left;\n\
  width: 840px;\n\
  white-space: pre-wrap;\n\
  word-wrap: break-word;\n\
}\n\
.clear { clear: both; }\n\
]]></html:style>\n\
  </html:head>\n\
  <html:body>\n\
    <html:div id=\"wrapper\">\n\
      <html:div id=\"button\">\n\
        <html:a href=\"" + cbURI + "\" rel=\"nofollow\" title=\"Установить " +
        htmlEntities(name, "ENT_COMPAT") +"\">\n\
        <![CDATA[Установить кнопку]]>\n\
        </html:a>\n\
      </html:div>\n\
      <html:div id=\"credits\">\n\
        <html:a href=\"" + topicURL +"\">\n\
          <![CDATA[Другие кнопки]]><html:br/>\
<![CDATA[на форуме Mozilla Россия]]>\n\
        </html:a>\n\
      </html:div>\n\
    </html:div>\n\
  </html:body>";

  decodeXML = decodeXML.replace(/custombuttons\/\"\>/, xmlTemplate);

  name += ".xml";
  saveToFile(decodeXML, name);
 var btn = document.popupNode;
 var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
 as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "сохранена в XML файл", false, "", null);
}
var mrw = mostRecentWindow('navigator:browser');
var css = '@-moz-document url("chrome://browser/content/browser.xhtml"){' + this.Help + '}';
var uri = makeURI('data:text/css,' + encodeURIComponent(css));
var sss = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService);
if (!sss.sheetRegistered(uri, sss.USER_SHEET)) sss.loadAndRegisterSheet(uri, sss.USER_SHEET);

/////////////////////////////// Добавить кнопку из XML файл ///////////////////////////////

this.loadXML = function loadXML() {
  var nsIFilePicker = Ci.nsIFilePicker;
  var fp = window.makeFilePicker();
  fp.init(window, "Установить кнопку из XML файла",
          nsIFilePicker.modeOpen);
  fp.appendFilters(fp.filterXML);
  fp.appendFilter("Все файлы", "*.*");
  fp.open(re=> { 
      if ( re == fp.returnOK ) gBrowser.selectedTab = gBrowser.addTrustedTab(fp.file.path);
   })

}


/////////////////////////////// Сохранить все кнопки в HTML файл ///////////////////////////////

this.saveToHTMLALLCode = function saveToHTMLALLCode() {
 var visibleCBbuttons = [...document.querySelectorAll('[cb-mode]')];
   var paletteCBbuttons = [...custombuttons.palette.querySelectorAll('[cb-mode]')];
   var allCBbuttons = visibleCBbuttons.concat(paletteCBbuttons);

var gn = btn => btn.getAttribute("label") || "Без названия";
allCBbuttons.sort((a, b) => gn(a).localeCompare(gn(b)));

var array = [];
   allCBbuttons.forEach(but=> {
      var uri = but.URI ? but.URI : getPaleteButtonsURI(but);
      var name1 = but.getAttribute("label") || "Без названия";
      var image = but.getAttribute("image") || "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACNFBMVEXDRgDweQDnbwC0NgDCRQC7PQDtpTu+QQD78q3PUwDCRAD//8vbYQDLTgDocAD0iQX1jQbGSgD7iAD4gwDVaw7vdwDyegD+igDweQDlawDyhAXveADmZwDzmBbtcwDwkhHveADmhBTkgxbweADkfRH+igD7hADXZQX0gADyjA/tfgvveQDiawDQVADRXgfnbwD1jAb9iQD9z0PVZAbxpinykRHtdgD5mRbERQDDRgDOYArCRAD9iQD3ewDxegD3dwDFRgDAQAD+hgD4fQDucgDtgQftfwTISQDCRQDvdgD5lxb1kRb2qh7wnynkagD766LDRQDDRwDDRQDspjbtpzbuqDbvqzv//8DUZAbCRQD//83pjhvveQbvggW+QQDfcxLlmUb//8veYADMTwDHSADVVwC8PgDwixb78q3oZgDUWADRVADCRQD9iQDERwDBQQDYVQC+PgC0NgDbYQDWWgDUWADSVQDFSAC+QAC7PAC0NgD+wRL+/kD+/zb+7i3+8Cv+/DX+wBL/+DD/rwz+qgz+rwz/tAz+sQzfbAT+3iP/+jD//Dz1jwP+nwf5iwf7pBz2tRr4lwb/ogfsdQT+2R7/9ET+2iT8yyLmgBL5iQL2egLokhP7zzT60zv1zUr0gAL1ewP50yn9+UL++EXooyngaAH41EPzowzyySj+xxzlhhHvvyruwjXxvTnUag3+zxrwigP+swz86U/ZXwD75lHqegD6xzb//kn+uhPTXAG3OAD/+UC2vFeJAAAAe3RSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAACfnwAIaelpAAA2+wD7UQAAa3oArKzRzMysnwgAvPQA/gAAw3prw0oALr16vS4AACnF6bspAAAA/mIAADQAAAAAAI8AAEwA0vv7kd2yAuuvr+vKABL23U+8Sk/d9vUDIIAQAAAQgCAfvupHAAABB0lEQVR4Xi3IU3fDABgA0C+u26FdZ9u2bdu2vZSzbds2/tyac3IfLxjpGyA6MimqY6gHTNgiiNwkwRM1E7EhTrYyTfMzzsh0ZEPiH+D6+u5mV1jEhpe5haVCYW1T4suEvUOkk7PLpVJ5WFnl7hEUDN5LPvsHJ6cazdn13f3DYxu0B35+/Y2qVSr17NzGeUgohIVHLK/PMDa39qKieRATGxd/9cS4uU1MwnmQktqY/qGlaVr7/ZOVDTmQm5df8PwyNj4xOTVdjOM4kCRZOr+wWFa+srpWQVEU8PnV2zu7NbV19UfHDQRBAIfTdNHc0soVdnR2dfdgGAgEvW99/QNc4eDQ8O8Ihv0D77NPgbVLZ6kAAAAASUVORK5CYII=";
      
      array.push("<li>\n<img src=" + image + ">&nbsp\<a href=" + uri + ">" + name1 +"</a><br>\n");
   });
   
   var before = "<html>\n<head>\n<title>Custom Buttons</title>\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>\n";
   var before1 = "<style type='text/css'>\nbody {background: beige;} a:link {color: black; text-decoration: none;} img {border: 0; margin: 0px 10px;}\n</style>\n";
   var before2 = "</head>\n<body>\nCustom Buttons\n<p>\n";
   var info = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
   var before3 = info.vendor + " " + info.name + " " + info.version + " (build " + info.appBuildID + ")\n";
   var after = "\n</ol>\n</body>\n</html>";
	
   var text = before + before1 + before2 + before3 + "<p>\n" + bDate + "<p>\n" + "<ol>" + array.join("") + after;
   var name = "CB buttons " + aDate + ".html"
   saveToFile(text, name);

   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   alertsService.showAlertNotification(saveImg5, "Экспорт в HTML", "Экспортировал все CB кнопки как HTML");
   setTimeout(()=> alertsService.closeAlert(), 4000);
};


function getPaleteButtonsURI(but) {

   var uri = "chrome://custombuttons/content/nbftemplate.xml";
   var stream = NetUtil.newChannel({uri, loadUsingSystemPrincipal: true}).open();
   var doc = new DOMParser().parseFromStream(stream, null, stream.available(), "application/xml");
   stream.close();
 
["help,Help", "name,label", "image,image", "mode,cb-mode", "initcode,cb-init", "accelkey,cb-accelkey", "code,cb-oncommand"]
   .forEach(str=> {
      var arr = str.split(',');
      var value = but.getAttribute(arr[1]), name = arr[0];
      custombutton.buttonSetText(doc, name, value, true);
   });

   var ser = new XMLSerializer();
   return "custombutton://" + escape(ser.serializeToString(doc));
};


/////////////////////////////// Сохранить кнопку в HTML файл ///////////////////////////////

this.saveToHTMLCode = function saveToHTMLCode() {
  var btn = document.popupNode;
  var xml = '<html xmlns="' + xhtmlns + '">\n';
      xml += '<head>\n';
      xml += '<meta http-equiv = "Content-Type" content = "text/html; charset=utf-8"/>\n';
      xml += '<title> ' + btn.name + '  для Custom Buttons </title>\n';
      xml += '<link rel="icon" type="image/vnd.microsoft.icon" href = "'+ btn.image +'" />\n';
      xml += '<style type="text/css">\n';
      xml += '.button a{ \n';
      xml += 'background-color: rgb(85, 168, 2); \n';
      xml += 'background-image: linear-gradient(to bottom, rgb(147, 200, 94), rgb(85, 168, 2)); \n';
      xml += 'background-image: -moz-linear-gradient(top, rgb(147, 200, 94), rgb(85, 168, 2)); \n';
      xml += 'border: 1px solid rgb(58, 116, 4); \n';
      xml += 'border-radius: .5em; \n';
      xml += ' -webkit-border-radius: .5em; \n';
      xml += 'padding: 0; \n';
      xml += 'margin-bottom: 1em; \n';
      xml += 'box-shadow: 1px 2px 3px rgba(0, 0, 0, .25); \n';
      xml += ' -o-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25); \n';
      xml += ' -webkit-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25); \n';
      xml += ' color: #000; \n';
      xml += ' text-shadow: -1pt -1px 0pt rgba(255, 255, 255, .5); \n';
      xml += ' padding: 0.5em; \n';
      xml += ' text-decoration: none; \n';
      xml += '} ';
      xml += 'pre { border: 1px inset rgb(170, 170, 170); \n';
      xml += 'background-color: rgb(255, 255, 255);} \n';
      xml += 'body { background-color: rgb(245, 245, 220);} \n';
      xml += '</style> \n';
      xml += '</head>\n';
      xml += '<body>\n';
      xml += '<section id="install"><h1> ' + btn.name + ' </h1> \n';
      xml += '</section>\n';
      xml += '<div class="button"><a href = "' + btn.URI + '">Установить кнопку</a></div> \n';
      xml += '<section id="init"><h2>Инициализация</h2><pre>' + e4xConv_encodeHTML(btn.cbInitCode) + '</pre></section>\n';
      xml += '<section id="code"><h2>Код</h2><pre>' + e4xConv_encodeHTML(btn.cbCommand) + '</pre></section> \n';
      xml += '<section id="help"><h2>Справка</h2><pre>' + e4xConv_encodeHTML(btn.Help) + '</pre></section> \n';
      xml += '</body> \n';
      xml += '</html> ';
  var html = '<!DOCTYPE html>\n' + xml;
  var name = btn.name + ".HTML";
  saveToFile(html, name);
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "сохранена в HTML файл", false, "", null);
}

function e4xConv_encodeHTML(s, isAttr) {
	s = String(s)
		.replace(/&/g, "&amp;")
		.replace(/</g, "&lt;")
		.replace(/>/g, "&gt;")
		.replace(/"/g, "&quot;");
	if(isAttr) {
		s = s
			.replace(/\t/g, "&#x9;")
			.replace(/\n/g, "&#xA;")
			.replace(/\r/g, "&#xD;");
	}
	return s;
};

/////////////////////////////// Переместить кнопку ///////////////////////////////

this.MoveToolbarButtons = MTB = {
	// Start editable preferences
	MoveButtonMICBContext: true, // Add "Move button" menu item to Custom Buttons context menu?
	MoveButtonMITBarContext: false, // Add "Move button" menu item to toolbars context menu?
	ShowMoveAlert: false, // Show the alert with instructions when moving buttons?
	MoveBtnImage: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYklEQVQ4jWNgGJTgaAXHf2LEcGrGZQBBQ45WcPz/fZ0XpwG45FAUEDIAqzyyJLIiZIxNHqdmYvHRCo7/DLhsIEYziivQDcHnBawxgqyQUCzgjQlC6YCotEB2QkJWTIzY4AAAezv/caeCLKcAAAAASUVORK5CYII=",
	// End editable preferences

	_UID: "__cb_move_toolbar_buttons_" + custombuttons.getNumber(self.id),
	WindowIDs: ["main-window", "messengerWindow", "msgcomposeWindow"],
	ToolbarContexIDs: ["toolbar-context-menu", "aios-toolbar-contextmenu", "aios-sbhtoolbar-contextmenu"],
	Pref: "extensions.custombuttons.MoveToolbarButtons.Id" + custombuttons.getNumber(self.id) + ".MoveButtonID",
	SP: Services.prefs,

	Init: function() {
		if (!(MTB._UID in window)) {
			window[MTB._UID] = {
				Initialized: false
			};
		}

		if (!window[MTB._UID]["Initialized"]) {
			window[MTB._UID]["Initialized"] = true;
			custombuttons.isPref(MTB.Pref, "");

			if ("CustomizableUI" in window) {
				var originalFunction = custombuttons.persistCurrentSets.toString();
				eval("custombuttons.persistCurrentSets=" + originalFunction
					.replace(", newButtonId)", ", newButtonId, aToRight)")
					.replace("pos + 1", "aToRight ? pos : pos + 1"));
			}

			if (MTB.MoveButtonMICBContext) {
				var contextPops = document.getElementsByTagName("menupopup");
				let p = 0,
					pLen = contextPops.length;
				for (; p < pLen; p++) {
					var cPopID = contextPops[p].id;
					if (cPopID.substr(0, 26) === "custombuttons-contextpopup") {
						var cPopEl = document.getElementById(cPopID);
						var moveMIID = "custombuttons-contextpopup-moveButton" + cPopID.slice(26);
						var moveMIEl = document.getElementById(moveMIID);
						if (!moveMIEl)
							MTB.CreateMoveMI(moveMIID, cPopEl);
					}
				}
			}

			if (MTB.MoveButtonMITBarContext) {
				Array.prototype.slice.call(MTB.ToolbarContexIDs).forEach(function(aTBCtxID, aIndex) {
					let Ctx = document.getElementById(aTBCtxID);
					let tBarCtxMIID = MTB._UID + "moveButton" + aIndex;
					if (!document.getElementById(tBarCtxMIID)) {
						if (Ctx) {
							MTB.CreateMoveMI(tBarCtxMIID, Ctx);
							Ctx.addEventListener("popupshowing", function(aE) {
								document.getElementById(tBarCtxMIID).hidden = (document.popupNode.tagName !== "toolbarbutton");
							}, false);
						}
					}
				});
			}

			addDestructor(function(aReason) {
				if (aReason === "delete") {
					SP.resetUserPrefs(MTB.Pref);
					delete window[_UID];
				}
				if (aReason === "delete" || aReason === "update") {
					window[MTB._UID]["Initialized"] = false;
				}
			});
		}
	},

	getPopupNode: function(aEl) {
		if (custombuttons.popupNode)
			return custombuttons.popupNode;
		var popupNode = aEl;
		while (popupNode.tagName.toLowerCase() !== "toolbarbutton") {
			popupNode = popupNode.parentNode;
		}
		return popupNode;
	},

	CreateMoveMI: function(aMItemID, aPopupEl) {
		let moveMIEl = aPopupEl.appendChild(document.createElementNS(xulns, "menuitem"));
		moveMIEl.setAttribute("id", aMItemID);
		moveMIEl.setAttribute("label", "Переместить кнопку...");
		moveMIEl.setAttribute("class", "menuitem-iconic");
		moveMIEl.setAttribute("image", MTB.MoveBtnImage);
		moveMIEl.setAttribute("tooltip", MTB._UID + "moveButtonMI_tooltip");
		moveMIEl.setAttribute("onclick", "document.getElementById(\"" +
			self.id + "\").MoveToolbarButtons.MoveOnClick(event);");
	},

	MoveOnClick: function(aE) {
		var popupNode = MTB.getPopupNode(aE.target);
		if (!popupNode)
			return;
		aE.stopPropagation();
		aE.preventDefault();
		if (aE.button === 0 && !aE.shiftKey && !aE.ctrlKey && !aE.altKey) {
			MTB.SP.setCharPref(MTB.Pref, popupNode.id);
			window.addEventListener('click', MTB.MoveListener, true);
			window.addEventListener('mouseup', MTB.DefaultPrevention, true);
			window.addEventListener('mousedown', MTB.DefaultPrevention, true);
			window.addEventListener('contextmenu', MTB.DefaultPrevention, true);
			MTB.HidePopup(aE.target);
			MTB.ShowMoveAlert && Services.prompt.alert(null, self.name,
				"Now click ANY toolbarbutton element inside ANY toolbar.\n" +
				"Left click will position the button to the left of the target.\n" +
				"Right click will position the button to the right of the target.\n\n" +
				"To cancel the movement, just click ANY element inside the browser that IS NOT a toolbarbutton.\n");
		}
	},

	MoveListener: function(aE) {
		MTB.DefaultPrevention(aE);
		window.removeEventListener('click', MTB.MoveListener, true);
		window.removeEventListener('mouseup', MTB.DefaultPrevention, true);
		window.removeEventListener('mousedown', MTB.DefaultPrevention, true);
		window.removeEventListener('contextmenu', MTB.DefaultPrevention, true);
		var anchor = aE.target;
		if (anchor.tagName !== "toolbarbutton")
			return;
		var toolbar = anchor.parentNode;
		var BtnToMove = document.getElementById(MTB.SP.getCharPref(MTB.Pref));
		if (aE.button === 0 && !aE.shiftKey && !aE.ctrlKey && !aE.altKey)
			toolbar.insertBefore(BtnToMove, anchor);
		else if (aE.button === 2 && !aE.shiftKey && !aE.ctrlKey && !aE.altKey)
			toolbar.insertBefore(BtnToMove, anchor.nextSibling);
		if ("CustomizableUI" in window)
			custombuttons.persistCurrentSets(toolbar.id, anchor.id,
				BtnToMove.id || BtnToMove.getAttribute("id"), !(aE.button === 2));
		else {
			toolbar.setAttribute("currentset", toolbar.currentSet);
			document.persist(toolbar.id, "currentset");
		}
		MTB.SP.setCharPref(MTB.Pref, "");
	},

	DefaultPrevention: function(aE) {
		aE.preventDefault();
		aE.stopImmediatePropagation && aE.stopImmediatePropagation();
		aE.stopPropagation();
	},

	Tooltips: function(aRem) {
		var popSetID = MTB._UID + "popupset";
		var popSetEl = document.getElementById(popSetID);
		if (popSetEl)
			popSetEl.parentNode.removeChild(popSetEl);

		if (aRem)
			return;

		if (!popSetEl) {
			popSetEl = document.createElementNS(xulns, "popupset");
			popSetEl.setAttribute("id", popSetID);
		}

		popSetEl.appendChild(MTB.parseXML("<tooltip xmlns=\"" + xulns + "\" xmlns:html=\"" + xhtmlns +
			"\" id=\"" + MTB._UID + "moveButtonMI_tooltip" + "\">" +
			"<description><html:b>Instructions</html:b> : After clicking this menu item, you can " +
			"click ANY toolbarbutton element inside the application to place the currently " +
			"selected button to the left (with Left click) or to the right (with Right click) " +
			"of the targeted toolbarbutton.</description>" +
			"<separator/>" +
			"<description><html:b>Note</html:b> : It can be ANY toolbarbutton, not just " +
			"other Custom Buttons.</description>" +
			"</tooltip>"));

		setTimeout(function() {
			Array.prototype.slice.call(MTB.WindowIDs).forEach(function(aWinID) {
				let win = document.getElementById(aWinID);
				if (win)
					!document.getElementById(popSetID) && win.appendChild(popSetEl);
			});
		}, 100);
	},

	parseXML: function(aXML) { // Return parsed XML
		aXML = aXML.replace(/>\s+</g, "><"); // Linearize XML
		return (new DOMParser).parseFromString(aXML, "application/xml").documentElement;
	},

	HidePopup: function(aEl) {
		try {
			aEl.hidePopup();
		} catch (aError) {
			try {
				aEl.parentNode.hidePopup();
			} catch (aError) {
				try {
					aEl.parentNode.parentNode.hidePopup();
				} catch (aError) {
					try {
						aEl.parentNode.parentNode.parentNode.hidePopup();
					} catch (aError) {}
				}
			}
		}
	}
};

this.MoveToolbarButtons.Init();

Отсутствует

 

№1673405-03-2023 23:35:27

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

Re: Custom Buttons

Andrey_Krropotkin
Можно попробовать использовать custombuttons.popupNode

Отсутствует

 

№1673506-03-2023 00:32:33

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

Re: Custom Buttons

Dumby благодарю

Отсутствует

 

№1673607-03-2023 22:07:24

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

Re: Custom Buttons

Dumby посмотри еще вот это, что то на последней лисе перестал работать, ошибка - PlacesUtils.getConcreteItemId is not a function

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

Выделить код

Код:

// Двойным левым кликом на папке закладок добавлять закладку в папку закладок
addEventListener("dblclick", (e, targ = e.originalTarget)=> {     
   if ( e.button || !targ._placesNode || !PlacesUtils.nodeIsFolder(targ._placesNode) ) return;          
   
   var docTitle = gBrowser.selectedTab.label.substr(3, 50);
   var folderId = PlacesUtils.getConcreteItemId(targ._placesNode);
   var folderTitle = PlacesUtils.bookmarks.getItemTitle(folderId);
   var currentURI = Services.io.newURI(gBrowser.currentURI.spec, null, null);
   PlacesUtils.bookmarks.insertBookmark(folderId, currentURI, 0, docTitle);  

   // всплывающая подсказка ....
Components.utils.import('resource://gre/modules/PopupNotifications.jsm');
var notify  = new PopupNotifications(gBrowser,
                    document.getElementById("notification-popup"),
                    document.getElementById("notification-popup-box"));

var notification =  notify.show(
// browser
gBrowser.selectedBrowser,
// popup id
"PDES-popup",
// message
"Добавил в папку " + folderTitle + ":",
// anchor id
null,
// main action
null,
// secondary action
null,
// options
{ 
  // Alternative way to set the popup icon
  popupIconURL: gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png"
}
);

setTimeout(function(){
  notification.remove();
}, 2000); 
});

Отсутствует

 

№1673708-03-2023 17:45:49

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

Re: Custom Buttons

Andrey_Krropotkin пишет

getConcreteItemId

Ну какой id?
Решение постепенно отказаться от использования id в пользу guid'ов
было принято сто лет назад, и нам тоже следует придерживаться этой тенденции.

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

Выделить код

Код:

addEventListener("dblclick", async e => {
	if (e.button) return;
	var trg = e.target, node = trg._placesNode || trg._placesView?._resultNode;
	if (!node || !PlacesUtils.nodeIsFolder(node)) return;

	var parentGuid = PlacesUtils.getConcreteItemGuid(node);
	try {
		await PlacesTransactions.NewBookmark({
			//index: 0,
			parentGuid,
			url: gBrowser.currentURI.spec,
			title: gBrowser.selectedTab.label.substr(3, 50)
		}).transact();

		var msg = `Добавил в папку ${
			PlacesUtils.bookmarks.getLocalizedTitle({guid: parentGuid, title: node.title})
		}:`;
		var popupIconURL = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png"
	}
	catch(ex) {
		msg = "ERROR! " + ex.message;
		popupIconURL = "chrome://global/skin/icons/warning.svg";
	}
	var n = PopupNotifications.show(
		gBrowser.selectedBrowser, "PDES-popup", msg, null, null, null, {popupIconURL, hideClose: true}
	);
	setTimeout(() => n.remove(), 2e3);
});

Отсутствует

 

№1673813-03-2023 20:48:20

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 101.0

Re: Custom Buttons

Dumby
Не подскажите, откуда прет здесь Firefox , как бы сменить?

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

Выделить код

Код:

data:image/jpeg;charset=utf-8;base64,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VVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8Poor0PwtbaJ4rl1Wzbw7b6Xa29jNcjUYLid5LcouVMpdyjBiNpAVcluMV7MpWOWx55RW7o3hPV9Zt4ZrCK1ImcxQpLewwyTMMcRo7hn5IHyg88daqJoWpyWP2tLOVoftYscDBczkZEez72fw9utHMu4WZm0V0yeBfET3uoWkdikk+nKrXax3MTCAMcfOQ2Bg53ZPygEtgCq2oeFNYsH08TW0Uiag/lWs1vcxTxSvu27RIjFcgkZBORmjmj3CzMKirV/YXNhqVxp93H5d3bytBJHuB2upwRkHB5HUVvweAvEE2oXtgsFkl7ZMyzwS6jbRum1dzHDSAlQOSwyOvPBobS3BK+qOWorV1Dw/qFhZS3k6QPaRXAtWmguYpk8wpvChkYg/L3GR268VlU07gFFegeIF0bw/onhdo/Dem3s9/pq3U811Ndbi5kdeAkyqBhR2rMXw9ea1YeGoNH8P+Ve6gbkRzreBvtpRskBGP7vYARz973qFNNKT0T/AMrjtrY5Kit+HwhrM2ozWUUFu08EPnzkXkPlwIDg+bJv2RkHjDEEHjFdJ8PvBs//AAsC1stdtLRo4IWvDDNdxCOdfLZ4yrbsSISBnaSMZzwDTlNJNglc88orpZNC1rXNU1GVYNOzbbftM8Etrb2cecBR5ilYQT2APJz1OaiPg3Xf7XTTBZK15LAbqFVnjKzx7d26Jw22TjP3CScEdQafMu4jn6Kvz6RewaPbapNCI7G5keKF2dQZCv3sLncQM43YxnjOaoUwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKu6PNZ2+pwSapatd2QOJYVkMbMpGMqw6EZyO2QM5FdX/AMINH539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

Отсутствует

 

№1673913-03-2023 22:55:48

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

Re: Custom Buttons

ВВП пишет

откуда прет здесь Firefox , как бы сменить?

Насколько я понимаю, прёт прямо из Gecko.
Но, затем, проходит через chrome://mozapps/locale/profile/profileSelection.properties
Наверно, там и можно заменить некоторые %S на желаемое имя.

Отсутствует

 

№1674013-03-2023 23:25:41

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 106.0

Re: Custom Buttons

Dumby
Класс, в локали заделал. А сам %S где бы сменить,чтоб не париться ?

Отсутствует

 

№1674114-03-2023 00:35:53

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

Re: Custom Buttons

Dumby пишет

Custom Buttons 0.0.7.0.0.30, paxmod и bootstrap в zip-папке.

Что-то не работает на [firefox] 111. Само расширение в about:addons есть, включено, а кнопки все пропали. Тоже самое и с Add Toolbar Buttons, включено, а кнопок нет. Посмотри плиз.

Отредактировано voqabuhe (14-03-2023 00:38:39)

Отсутствует

 

№1674214-03-2023 05:15:16

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

Re: Custom Buttons

Здравствуйте!
Есть код, который вызывает гугловскую панель для перевода страницы.
Бывает так, что надо одновременно перевести кучу страниц, но панель только появляется и требует дальнейших действий (тыкать на кнопку перевести).
Можно ли попросить добавить в этот код автоматическое нажатие на кнопку "перевести"?

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

Выделить код

Код:

var vert = ` javascript:{var d, b, o, v, p; b = (d = document).body; o = d.createElement('script'); o.setAttribute('src', 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'); o.setAttribute('type', 'text/javascript'); b.appendChild(o); v = b.insertBefore(d.createElement('div'), b.firstChild); v.id = 'google_translate_element'; v.style.display = 'none'; p = d.createElement('script'); p.text = 'function googleTranslateElementInit(){new google.translate.TranslateElement({pageLanguage:""},"google_translate_element");}'; p.setAttribute('type', 'text/javascript'); b.appendChild(p)};void(0);` ;
gBrowser. loadURI(vert, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });

Отредактировано leex (14-03-2023 05:18:32)

Отсутствует

 

№1674314-03-2023 14:04:47

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

Re: Custom Buttons

ВВП пишет

А сам %S где бы сменить,чтоб не париться ?

Говорю же, в бинарниках,
то есть в скомпилированной части браузера, а точнее, в firefox.exe


Можно взять хекс-редактор, и заменить первое вхождение
байтовой последовательности, которая образует слово «Firefox».
Не знаю как сделать имя длиннее. Если короче, то остаток заполнить нулями.


Но так, у меня, в недрах AppData и LocalAppData
создалась одноимённая папка, то есть, пришлось ещё править тамошний profiles.ini
Так что — сам решай, где больше «париться».


voqabuhe пишет

Посмотри плиз.

Посмотри на что? На Firefox 111.0?


Видел RC build2. Хорошо, распаковал уже релиз,
поставил CB 0.0.7.0.0.30 и ATB 2021.9.5 — кнопки на месте.


Более того, и на бете 112.0b1 кнопки никуда не делись.
Разве что отображение некоторых пострадало от выпила -moz-image-region

Отсутствует

 

№1674414-03-2023 18:30:39

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

Re: Custom Buttons

Dumby пишет

поставил CB 0.0.7.0.0.30 и ATB 2021.9.5 — кнопки на месте.

Спасибо. И у меня получилось их вернуть. )

Отсутствует

 

№1674517-03-2023 09:56:56

dedfor
Участник
 
Группа: Members
Зарегистрирован: 22-12-2016
Сообщений: 62
UA: Yandex 23

Re: Custom Buttons

Здравствуйте! Помогите, пожалуйста, не работают обе команды?

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

Выделить код

Код:

content.scrollTo(0,content.scrollMaxY/2); //вниз до середины
document.body.innerText; //в консоли работает, а в СВ- нет


И ещё: поправьте, пожалуйста мою функцию удаления куков с текущего сайта.
Моя все пункты меню создаёт, а вот куки не удаляет.
скрытый текст

Выделить код

Код:

//3-Удалить куки с текущего сайта:
(contextMenu=>{
   //var menu = contextMenu.appendChild(document.createElement("menu"));
   var menu = contextMenu.appendChild(document.createXULElement("menu"));
   menu.id = "content-removeCookies."
   menu.setAttribute("label", "Удалить куки текущего сайта");
   menu.setAttribute("class", "menu-iconic");
   addEventListener("popupshowing", ()=> menu.setAttribute("image", gBrowser.mCurrentTab.image), false, contextMenu);
   addDestructor(()=> menu.remove() );
   //var menuPopup = menu.appendChild(document.createElement("menupopup"));
   var menuPopup = menu.appendChild(document.createXULElement("menupopup"));
   //var menuitem = menuPopup.appendChild(document.createElement("menuitem")); 
   var menuitem = menuPopup.appendChild(document.createXULElement("menuitem"));              
   menuitem.setAttribute("label", "Удалить");
   menuitem.onclick =()=> {
      var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);
      for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {
            var cookie = en.getNext().QueryInterface(Ci.nsICookie);
            ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false);            
            }   
      var reversedDomain = host.split("").reverse().join("") + ".";
      Cu.import("resource://gre/modules/FileUtils.jsm");
      var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
      var dbConn = Services.storage.openDatabase(file);
      dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");
      dbConn.close();
//setTimeout(function(){content.document.location.reload()},3000);       
   };
})(document.getElementById("contentAreaContextMenu"));


Чё молчим? Может мои вопросы трудные? Или совсем лёгкие? Или тупые. Хоть что-то ответьте.

Отредактировано dedfor (22-03-2023 13:33:16)

Отсутствует

 

№1674619-03-2023 13:50:57

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 111.0

Re: Custom Buttons

Можете подсказать, что делает 2код(последний) по ссылке https://forum.mozilla-russia.org/viewto … 43#p776143

Отредактировано b0ttle (19-03-2023 13:51:39)

Отсутствует

 

№1674719-03-2023 14:04:31

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 101
UA: Firefox 111.0

Re: Custom Buttons

b0ttle пишет

Можете подсказать, что делает 2код(последний) по ссылке https://forum.mozilla-russia.org/viewto … 43#p776143

Ответ в посте выше по ссылке под спойлером первая строка. Как мне кажется - чисто индивидуальная "хотелка".

Отсутствует

 

№1674824-03-2023 20:13:36

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 111.0

Re: Custom Buttons

Может кто-то знает, есть ли что-то, чтобы можно было сортировать закладки по домену?

Отсутствует

 

№1674931-03-2023 20:08:39

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

Re: Custom Buttons

del

Отредактировано Garalf (31-03-2023 22:30:59)

Отсутствует

 

№1675031-03-2023 22:13:34

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

Re: Custom Buttons

Garalf
При чём здесь Custom Buttons, с  этим сюда -> https://forum.mozilla-russia.org/viewto … 10#p804310


Win7

Отсутствует

 

Board footer

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