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

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

№1477615-06-2020 22:22:49

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

Re: Custom Buttons

Garalf пишет

А что там с 78b? Кнопки на панели не выводятся

Нормально всё с ней.
Собрал сейчас портабл 78.0b7, поставил CB 0.0.7.0.0.15a1,
насоздавал кнопок и рассовал по тулбарам.
На всякий случай пересобрал из en-US, выбросил startupCache,
даже e10s отключал, — все кнопки на своих местах.

Отсутствует

 

№1477716-06-2020 02:25:45

shulep22
Участник
 
Группа: Members
Зарегистрирован: 01-06-2020
Сообщений: 7
UA: Chrome 80.0

Re: Custom Buttons

Dumby пишет

Собрал сейчас портабл 78.0b7, поставил CB 0.0.7.0.0.15a1,
насоздавал кнопок и рассовал по тулбарам.

а можно ваш портабл с CB и кнопками?.......заранее спасибо

Отсутствует

 

№1477816-06-2020 10:23:21

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

Re: Custom Buttons

shulep22 пишет

а можно ваш портабл с CB и кнопками?

Вот уж нет. «Совсем обленились».
Если что-то делал и не получилось, то рассказывай что именно делал.
Только не точки гуськом, а подробно: цифры, ссылки, скрипты, пути, кодировки и т.п.,
чтобы был шанс понять где и что пошло не так, и, может, указать на это.

Отсутствует

 

№1477916-06-2020 12:16:28

shulep22
Участник
 
Группа: Members
Зарегистрирован: 01-06-2020
Сообщений: 7
UA: Chrome 80.0

Re: Custom Buttons

Dumby пишет

Если что-то делал и не получилось, то рассказывай что именно делал.

custom buttons я установил успешно только вот кнопка ,,видео в плеере,,не реагирует вообше никак,я ей пользуюсь часто просто.
https://anonfiles.com/LaLbxbA9o1/videovpleer_txt

Отсутствует

 

№1478017-06-2020 00:38:30

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

Re: Custom Buttons

Ребята, тут на форуме есть кнопка, от bunda1 которая открывает https://translate.google.com/  и вставляет выделенный текст или текст из буфера обмена по CКМ  https://forum.mozilla-russia.org/viewtopic.php?pid=486850#p486850


Сейчас есть своя кнопка, которая при нажатии ЛКМ переводит страницу гугловским виджетом.
Вот этот код

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

Выделить код

Код:

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() });

Хотел бы оставить свой код с вызовом Виджета по ЛКМ, а на правую кнопку мыши я хотел бы назначить из кода кнопки от bunda1 эту опцию:

перевод выделенного текста или текст из буфера обмена с помощью сервиса Google

 
Не поможете ли?

Отредактировано leex (17-06-2020 10:13:00)

Отсутствует

 

№1478119-06-2020 01:09:41

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

Re: Custom Buttons

Dumby пишет

shulep22 пишет: «а можно ваш портабл с CB и кнопками?»
Вот уж нет. «Совсем обленились»…

Могу предложить свой настроенный профиль (архив 8Мб) Basilisk CustomButtons + userChrome
В нём 4 новых кнопки, расширены возможности старых: Избранное, Звёздочка, Обновить, Загрузка, Печать, Закрыть…
Подробные подсказки есть на каждой кнопке, в описании на форуме и в прилагаемом скриншоте.
985fba95bcedt.jpg

Отсутствует

 

№1478220-06-2020 07:05:19

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

Re: Custom Buttons

Подмогните, как убить конт.меню на кнопке +(Новая вкладка) в браузере PaleMoon.
Сейчас сделал такую ф-цию:

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

Выделить код

Код:

// ---------  NewTab Button: CКМ - загрузить из буфера обмена -----------
// AttributeInspector выдал такие данные на кнопке +(NewTab):
//xul:toolbarbutton [30×31.200]
//namespaceURI: XUL
//margin: 0 0 0 -1px
//border: 1px
//padding: 3px 1px 4px 1px
//class = tabs-newtab-button
//command = cmd_newNavigatorTab
//onclick = checkForMiddleClick(this, event);
//oncommand = BrowserOpenTab();
//onmouseout = document.getBindingParent(this)._leaveNewTab();
//onmouseover = document.getBindingParent(this)._enterNewTab();
//tooltiptext = Открыть новую вкладку
//
(function() {
  const newTabBtn = document.getAnonymousElementByAttribute( gBrowser.mTabContainer, "class", "tabs-newtab-button");
        newTabBtn.setAttribute("oncommand", ""); // не помогает
        newTabBtn.setAttribute("onclick", "newTabAct(event);");

 this.newTabAct = function(e) {
        e.target.oncontextmenu =()=> {return false}; // не помогает
     switch(e.button) {
       case 0: BrowserOpenTab(); break;
       case 1: gBrowser.loadOneTab( 'about:newtab', null, null, null, false, false, false); break;
       case 2: gBrowser.loadOneTab( gClipboard.read(), null, null, null, false, false, false); break;
     };
  };     
       
      newTabBtn.setAttribute("tooltiptext", "· ЛКМ - Нов.Вкладка\n\· СКМ - NewTab страница с сайтами\n\· ПКМ - из Буфера обмена загрузить ссылку");

 })();


... всё работает как надо, но конт.меню появляется по ПКМ(когда из буфера ссылка открывается. ) Если вкладок много и они заполняют всё пространство, то меню не появляется.
Таким образом, меню выскакивает не самой кнопки + , а вкладки которая получается на месте клика. Т.е. по mouseup срабатывает на вкладке, которая появилась на месте клика, где только что была кнопка NewTab.


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№1478320-06-2020 16:16:04

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

Re: Custom Buttons

mokujin пишет

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

Какой неприятный глюк, воспроизводится, мягко говоря, не при каждом ПКМ.
Может просто чуть тормознуть открытие вкладки. Рестарт.

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

Выделить код

Код:

(btn => {
	var tab = arg => gBrowser.loadOneTab(
		arg ? gClipboard.read() : "about:newtab", null, null, null, false, false, false
	);
	var mod = e => e.ctrlKey || e.shiftKey;
	addEventListener("contextmenu", e => mod(e) || e.preventDefault(), false, btn);
	btn.checkForMiddleClick = (b, e) => {
		if (e.button) e.button == 1 ? tab() : mod(e) || requestAnimationFrame(tab);
	}
	addDestructor(() => delete btn.checkForMiddleClick);

})(document.getAnonymousElementByAttribute(gBrowser.mTabContainer, "class", "tabs-newtab-button"));

Отсутствует

 

№1478420-06-2020 18:14:24

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

Re: Custom Buttons

Dumby пишет

Какой неприятный глюк, воспроизводится, мягко говоря, не при каждом ПКМ.

Точно так, очень неприятный. По-моему разумению, жмакания мыша(клики) на Панели, должны бы обрабатываться Панелью. А уже дальше передаваться чему-то, что на этой панели нах-ся. А тут как-то не так.
Это дилетанта\любителя взгляд, так мне каж... а как дОлжно или принято у кодеров, яхз. Возможно ошибаюсь я.

Благодарю, О, великий, за помощь. Сработало и убит гад_ццкий клик. Очередной раз, буду несколько дней переводить с Высокого Эльфийского на доступный_человечий... , но это уже мои уроки и усилия. Несколько кнопок уже перевел, получилось. Выручаешь ты нас часто, слабачков, благодарю Dumby. Рукужму.


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№1478521-06-2020 03:22:56

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

Dumby, не поправите пару кнопок?


Первая кнопка работает на крайней версии [firefox] в однопроцессорном режиме, а вот в многопроцессорном отказывается. Консоль жалуется на "content".

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

Выделить код

Код:

this.onmousedown =e=> {

this.__defineGetter__("scroller", function() {
    var doc = content.document;
    var root = doc.documentElement;
    var body = doc.body || root;
    return body.scrollHeight > root.scrollHeight ? body : root;
});


this.onmouseup =e=>{                    // левый клик
  if ( e.button && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) return;
    clearTimeout(self.timer);
    var scroller = this.scroller;
    if(scroller.scrollTop !=0 )
        content.scrollTo(scroller.scrollHeight, 0);
    else
        content.scrollTo(0, scroller.scrollHeight);
}


if ( e.button == 0 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey )  // длинный левый клик
  self.timer = setTimeout(()=>{
  self.onmouseup = '';
    var scroller = this.scroller;
    content.scrollTo(0, (scroller.scrollHeight - scroller.clientHeight)/2);
}, 500);


this.onclick =e=> {                    // правый клик
  if ( e.button == 2 ) gShowPopup(this);
}

};
self.onclick =e=> e.preventDefault();


// Подсказка для кнопки ..........
this.onmouseover =()=> {
  this.tooltipText = "ЛКМ:    Вверх/Вниз по странице \nдЛКМ:  Центрирование страницы"
}


Вторая кнопка - "Сохранять изображение без запроса в указанную папку" - на 76 версии ещё работала нормально, а 77 версии при сохранении изображения стала постоянно открывать диалоговое окно с выбором папки сохранения.

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

Выделить код

Код:

// Сохранять изображение без запроса в указанную папку, из контекстного меню ..........
((contextMenu, viewimage) => {
   var path = 'E:\\Download';

   var menuItem = contextMenu.insertBefore(document.createElement("menuitem"), viewimage);
   menuItem.setAttribute("label", "Сохранить изображение в папку: " + path);
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABAnAAAQJwAAAAAAAAAAAAAAAAEGAQECKAABATsAAAAoAAAAFAAAAAkAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIjRRXUVtk8U+Y4TGKUBYrRgmNpcOFR91BQgMWAECBD8AAQEqAAAAGAAAAAwAAAAGAAAAAQAAAAAAAAAAAAAAAEVrp7Nws9//fcr6/3W+9f5wten5ZKHQ7lWGsedDaI7QL0hjtR4sQKERGSaBBgkOXgAAACoAAAAEAAAAAAAAAABKdrK+aqjY/4XO7P+AyfL/fcXy/4HL+/97xPT/eMHy/3e+8f9trt77YpvI8Ux0m98TGymTAAAAJQAAAAAAAAAAVIS7yGWh0/8yTVv/UniH/0htff+L0e//WIab/0x2i/9XiKL/RGp+/zNRYv9dkrP+S26S2QQGClwAAAAGAAAAAGeYxtFxrtr/IDA7/01mbf8sPkP/SWZw/zlSWv88Vl//LkRL/3Wsv/83UVr/XYqe/3+51PQaJDCWAAAAGwAAAAB5qtHajMXk/yY1Pf9fa23/GB8g/2yGjP8mMDL/Sl9k/0RYXP9wmKL/dZ+r/4i6y/+n4PD+TmV5yQECA0UAAAACh7bX46zh8/9tjZj/gpen/4GMk//G4Oj/kJ6f/52clf+svbz/f5id/3yXnv+gx9L/wez1/5u0xuwPExt+AAAAEJTA3ey/7vr/ve35/7Hf8v+w0ub/ubvE/8a4uf/NwLv/083I/9Pl6//T7ff/0O32/9fw9v/a6vL8P0ZYtAAAAC+iy+P2zvX8/831/P/K6e3/y7Kg/+GNZf/vlWr/6Zx3/9qegv/Ino7/t8TQ/7HM4/+itc3yu8ja52BtirQAAAEkqs/l9dv8/f/b/P3/1dzU/9qXcf/slmb/+aFr//+td//+rXb/+aRu/9+1k/+/2uL/RldrtiIrPU0ZITEoAAAAA46017zX8Pf85/7+/+X8+//g7+3+yryw+O6odPz/wYj/9bJ7/+KpgP/nqn3/0tPJ/kRTY6QAAQEYAAAAAAAAAAA6V3Yuboyqj6C81My50ubgo7zR1I92bLbzt3/3/tGZ/8aTZttfY2+PbX2Sn3GFm7EiLDtNAAAABQAAAAAAAAAAAgMEAAUHCgYYJDETIS4+LjMwNU+3e029/NGZ/vHHlPRrSSx/BQUFEAMFBwcEBQcJAQECAgAAAAAAAAAAAAAAAAAAAAAAAAAAEQgAA1wvElSsaz3B9LZ8+fC7gu6WZ0COFg0GGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcTAQrWbS+y7pdZ8eOVWMqUWy91IRIJFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AACf/wAAgH8AAIAfAACADwAAgA8AAIAHAACABwAAgA8AAIAPAADOHwAA/v8AAP//AAD//wAA//8AAA==");
   addDestructor(()=> menuItem.remove());
   addEventListener("popupshowing", e=> menuItem.hidden = viewimage.hidden, false, contextMenu);

   menuItem.onclick =()=> {
      var run = cbu.getPrefs("browser.download.folderList");
      var use = cbu.getPrefs("browser.download.useDownloadDir");
      try { var dir = Services.prefs.getComplexValue("browser.download.dir", Ci.nsISupportsString).data }
      catch(e) { var dir = Services.downloads.defaultDownloadsDirectory.path };

      cbu.setPrefs("browser.download.folderList", 2);
      cbu.setPrefs("browser.download.useDownloadDir", true);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", path));

      save();

      cbu.setPrefs("browser.download.folderList", run);
      cbu.setPrefs("browser.download.useDownloadDir", use);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", dir));
   };

   function save() {
      var func = eval(
         gContextMenu.saveMedia.toSource()
            .replace(/(false,\s+)false,/, "$1true,")
            .replace(/^s/, "0,function s")
         );
      (save = () => func.call(gContextMenu))();
   };

   function convertFromUnicode(charset, str) {
      var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
      converter.charset = charset;
      str = converter.ConvertFromUnicode(str);
      return str + converter.Finish();
   };
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-viewimageinfo"));


«The Truth Is Out There»

Отсутствует

 

№1478621-06-2020 08:11:44

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

Re: Custom Buttons

unter_officer пример - в начало страницы для многопроцессорного:
var tabMM = gBrowser.selectedBrowser.messageManager;
tabMM.loadFrameScript("data:, content.scrollTo(0,0)", false);

Отсутствует

 

№1478721-06-2020 11:08:13

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

Re: Custom Buttons

unter_officer пишет

не поправите пару кнопок?

OK, попробую.

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

Выделить код

Код:

(u => {
	var id, lfs = url => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false);
	var max = () => {
		var url = u([
			"var args = [scroller.scrollHeight, 0];",
			"scroller.scrollTop != 0 || args.reverse();",
			"content.scrollTo(...args);"
		].join("\n\t"));
		(max = () => lfs(url))();
	}
	var mid = () => {
		var url = u("content.scrollTo(0, (scroller.scrollHeight - scroller.clientHeight) / 2);");
		(mid = () => id = lfs(url))();
	}
	var obj = {
		mousedown: () => id = setTimeout(mid, 500),
		mouseup: () => id && max(id = clearTimeout(id))
	};
	this.onmousedown = this.onmouseup = e => e.button || obj[e.type]();
	this.tooltipText = "ЛКМ:    Вверх/Вниз по странице \nдЛКМ:  Центрирование страницы";

})(code => "data:," + encodeURIComponent(`(doc => {
	var root = doc.documentElement;
	var body = doc.body || root;
	var scroller = body.scrollHeight > root.scrollHeight ? body : root;
	${code}
})(content.document)`));
Выделить код

Код:

(viewimage => addEventListener("popupshowing", {
	path: "E:\\Download",
	handleEvent(e) {
		if (viewimage.hidden) return;
		var menuitem = document.createXULElement("menuitem");
		menuitem.className = "menuitem-iconic";
		menuitem.setAttribute("oncommand", "saveImg()");
		menuitem.setAttribute("label", "Сохранить изображение в папку: " + this.path);
		menuitem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABAnAAAQJwAAAAAAAAAAAAAAAAEGAQECKAABATsAAAAoAAAAFAAAAAkAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIjRRXUVtk8U+Y4TGKUBYrRgmNpcOFR91BQgMWAECBD8AAQEqAAAAGAAAAAwAAAAGAAAAAQAAAAAAAAAAAAAAAEVrp7Nws9//fcr6/3W+9f5wten5ZKHQ7lWGsedDaI7QL0hjtR4sQKERGSaBBgkOXgAAACoAAAAEAAAAAAAAAABKdrK+aqjY/4XO7P+AyfL/fcXy/4HL+/97xPT/eMHy/3e+8f9trt77YpvI8Ux0m98TGymTAAAAJQAAAAAAAAAAVIS7yGWh0/8yTVv/UniH/0htff+L0e//WIab/0x2i/9XiKL/RGp+/zNRYv9dkrP+S26S2QQGClwAAAAGAAAAAGeYxtFxrtr/IDA7/01mbf8sPkP/SWZw/zlSWv88Vl//LkRL/3Wsv/83UVr/XYqe/3+51PQaJDCWAAAAGwAAAAB5qtHajMXk/yY1Pf9fa23/GB8g/2yGjP8mMDL/Sl9k/0RYXP9wmKL/dZ+r/4i6y/+n4PD+TmV5yQECA0UAAAACh7bX46zh8/9tjZj/gpen/4GMk//G4Oj/kJ6f/52clf+svbz/f5id/3yXnv+gx9L/wez1/5u0xuwPExt+AAAAEJTA3ey/7vr/ve35/7Hf8v+w0ub/ubvE/8a4uf/NwLv/083I/9Pl6//T7ff/0O32/9fw9v/a6vL8P0ZYtAAAAC+iy+P2zvX8/831/P/K6e3/y7Kg/+GNZf/vlWr/6Zx3/9qegv/Ino7/t8TQ/7HM4/+itc3yu8ja52BtirQAAAEkqs/l9dv8/f/b/P3/1dzU/9qXcf/slmb/+aFr//+td//+rXb/+aRu/9+1k/+/2uL/RldrtiIrPU0ZITEoAAAAA46017zX8Pf85/7+/+X8+//g7+3+yryw+O6odPz/wYj/9bJ7/+KpgP/nqn3/0tPJ/kRTY6QAAQEYAAAAAAAAAAA6V3Yuboyqj6C81My50ubgo7zR1I92bLbzt3/3/tGZ/8aTZttfY2+PbX2Sn3GFm7EiLDtNAAAABQAAAAAAAAAAAgMEAAUHCgYYJDETIS4+LjMwNU+3e029/NGZ/vHHlPRrSSx/BQUFEAMFBwcEBQcJAQECAgAAAAAAAAAAAAAAAAAAAAAAAAAAEQgAA1wvElSsaz3B9LZ8+fC7gu6WZ0COFg0GGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcTAQrWbS+y7pdZ8eOVWMqUWy91IRIJFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AACf/wAAgH8AAIAfAACADwAAgA8AAIAHAACABwAAgA8AAIAPAADOHwAA/v8AAP//AAD//wAA//8AAA==");
		viewimage.before(menuitem);
		addDestructor(() => menuitem.remove());
		this.handleEvent = () => menuitem.hidden = viewimage.hidden;
		menuitem.saveImg = () => {
			var p = Services.prefs;
			var data = Object.assign(Object.create(null), {
				"browser.download.folderList": {type: "Int", set: 2},
				"browser.download.useDownloadDir": {type: "Bool", set: true},
				"browser.download.dir": {type: "String", set: this.path}
			});
			var save = eval(`(function ${gContextMenu.saveMedia})`.replace(
				"\n        false, // don't", "\n        true, //"
			));
			(menuitem.saveImg = () => {
				for(var pref in data) {
					var obj = data[pref], meth = `et${obj.type}Pref`;
					obj.val = p.prefHasUserValue(pref) ? p["g" + meth](pref) : null;
					p["s" + meth](pref, obj.set);
				}
				try {save.call(gContextMenu);} finally {
					for(var pref in data) data[pref].val === null
						? p.clearUserPref(pref)
						: p[`set${data[pref].type}Pref`](pref, data[pref].val);
				}
			})();
		}
	}
}, false, viewimage.parentNode || 1))(document.getElementById("context-viewimageinfo"));

Отсутствует

 

№1478821-06-2020 13:18:09

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 77.0

Re: Custom Buttons

Dumby
Поздрав! Перешел на десятку(пришлось)...Это нечто...Мало того шрифты в теме и цвета хрен знает как рихтовать (через реестр?). так теперь winrar падает поле рихтовки omni.ja . Надо выходить с него все время иначе виснет. И в реесте права не могу задать...ветвь не могу удалить. Macromedia adobe - выбросил из под dos загрузчика , а в реестре никак...

Отсутствует

 

№1478921-06-2020 14:04:17

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

Dumby пишет

OK, попробую.

Dumby, большое спасибо. Как всегда всё супер!


P.S. А вообще с этим многопроцессорным гемор какой-то. Пока правил эти кнопки, выплыло ещё несколько не работающих.
Переключился пока обратно, в однопроцессорный. Начну разбираться когда будет время.


«The Truth Is Out There»

Отсутствует

 

№1479022-06-2020 16:44:26

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

Dumby, не поправите ещё одну кнопочку?


Такая же история - в однопроцессорном режиме работает, а в многопроцессорном отказывается.

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

Выделить код

Код:

/*CODE*/

// Кнопка сохраняет страницу с картинками или её часть, если она выделена, в html одним файлом ..........
var saveToFile = function (fileContent, fileName) {
    var uc = Cc['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Ci.nsIScriptableUnicodeConverter);
    uc.charset = 'utf-8';
    fileContent = uc.ConvertFromUnicode(fileContent);

    var nsIFilePicker = Ci.nsIFilePicker;
    var fp = Cc['@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 = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
    stream.init(fp.file, 0x02|0x20|0x08, 0666, 0);
    stream.write(fileContent, fileContent.length);
    stream.close();
  }
});
};

var resolveURL = function (url, base) {
    try {
        var ioService = Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService);
        var baseURI = ioService.newURI(base, null, null);
        var absURI = ioService.newURI(url, null, baseURI);
        return absURI.spec;
    } catch (e) {}
};

var getSelWin = function (w) {
    if (w.getSelection().toString()) return w;
    for (var i = 0, f, r; f = w.frames[i]; i++) {
        try {
            if (r = getSelWin(f)) return r;
        } catch(e) {}
    }
};

var encodeImg = function (src, obj) {
    var canvas, img, ret = src;
    if (/^https?:\/\//.test(src)) {
        canvas = doc.createElement('canvas');
        if (!obj || obj.nodeName.toLowerCase() != 'img') {
            img = doc.createElement('img');
            img.src = src;
        } else {
            img = obj;
        };
        if (img.complete) try{
            canvas.width = img.width;
            canvas.height = img.height;
            canvas.getContext('2d').drawImage(img, 0, 0);
            ret = canvas.toDataURL((/\.jpe?g/i.test(src) ? 'image/jpeg' : 'image/png'));
        } catch (e) {};
        if (img != obj) img.src = 'about:blank';
    };
    return ret;
};

var toSrc = function (obj) {
    var strToSrc = function (str) {
        var chr, ret = '', i = 0, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\x22' : '\\\x22', '\\': '\\\\'};
        while (chr = str.charAt(i++)) {
            ret += meta[chr] || chr;
        };
        return '\x22' + ret + '\x22';
    },
    arrToSrc = function (arr) {
        var ret = [];
        for (var i = 0; i < arr.length; i++) {
            ret[i] = toSrc(arr[i]) || 'null';
        };
        return '[' + ret.join(',') + ']';
    },
    objToSrc = function (obj) {
        var val, ret = [];
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop) && (val = toSrc(obj[prop]))) ret.push(strToSrc(prop) + ': ' + val);
        };
        return '{' + ret.join(',') + '}';
    };

    switch (Object.prototype.toString.call(obj).slice(8, -1)) {
        case 'Array': return arrToSrc(obj);
        case 'Boolean':
        case 'Function':
        case 'RegExp': return obj.toString();
        case 'Date': return 'new Date(' + obj.getTime() + ')';
        case 'Math': return 'Math';
        case 'Number': return isFinite(obj) ? String(obj) : 'null';
        case 'Object': return objToSrc(obj);
        case 'String': return strToSrc(obj);
        default: return obj ? (obj.nodeType == 1 && obj.id ? 'document.getElementById(' + strToSrc(obj.id) + ')' : '{}') : 'null';
    }
};

var mainWin = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content
var selWin = getSelWin(mainWin), win = selWin || mainWin, doc = win.document, loc = win.location;
var ele, pEle, clone, reUrl = /(url\(\x22)(.+?)(\x22\))/g;

if (selWin) {
    var rng = win.getSelection().getRangeAt(0);
    pEle = rng.commonAncestorContainer;
    ele = rng.cloneContents();
} else {
    pEle = doc.documentElement;
    ele = (doc.body || doc.getElementsByTagName('body')[0]).cloneNode(true);
};

while (pEle) {
    if (pEle.nodeType == 1) {
        clone = pEle.cloneNode(false);
        clone.appendChild(ele);
        ele = clone;
    };
    pEle = pEle.parentNode
};

var sel = doc.createElement('div');
sel.appendChild(ele);

for (var el, all = sel.getElementsByTagName('*'), i = all.length; i--;) {
    el = all[i];
    if (el.style && el.style.backgroundImage) el.style.backgroundImage = el.style.backgroundImage.replace(reUrl, function (a, prev, url, next) {
        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, loc.href);
        return prev + encodeImg(url) + next;
    });
    switch (el.nodeName.toLowerCase()) {
        case 'link':
        case 'style':
        case 'script': el.parentNode.removeChild(el); break;
        case 'a': 
        case 'area': if (el.hasAttribute('href') && el.getAttribute('href').charAt(0) != '#') el.href = el.href; break;
        case 'img':
        case 'input': if (el.hasAttribute('src')) el.src = encodeImg(el.src, el); break;
        case 'audio':
        case 'video':
        case 'embed':
        case 'frame':
        case 'iframe': if (el.hasAttribute('src')) el.src = el.src; break;
        case 'object': if (el.hasAttribute('data')) el.data = el.data; break;
        case 'form': if (el.hasAttribute('action')) el.action = el.action; break;
    }
};

var head = ele.insertBefore(doc.createElement('head'), ele.firstChild);
var meta = doc.createElement('meta');
meta.httpEquiv = 'content-type';
meta.content = 'text/html; charset=utf-8';
head.appendChild(meta);
var title = doc.getElementsByTagName('title')[0];
if (title) head.appendChild(title.cloneNode(true));

head.copyScript = function (unsafeWin) {
    if ('$' in unsafeWin) return;
    var f = doc.createElement('iframe');
    f.src = 'about:blank';
    f.setAttribute('style', 'position:fixed;left:0;top:0;visibility:hidden;width:0;height:0;');
    doc.documentElement.appendChild(f);
    var str, script = doc.createElement('script');
    script.type = 'text/javascript';
    for (var name in unsafeWin) {
        if (name in f.contentWindow || !/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name)) continue;
        try {
            str = toSrc(unsafeWin[name]);
            if (!/\{\s*\[native code\]\s*\}/.test(str)) {
                script.appendChild(doc.createTextNode('var ' + name + ' = ' + str.replace(/<\/(script>)/ig, '<\\/$1') + ';\n'));
            }
        } catch (e) {};
    };
    f.parentNode.removeChild(f);
    if (script.childNodes.length) this.nextSibling.appendChild(script);
};
head.copyScript(win.wrappedJSObject || win);

head.copyStyle = function (s) {
    if (!s) return;
    var style = doc.createElement('style');
    style.type = 'text/css';
    if (s.media && s.media.mediaText) style.media = s.media.mediaText;
    try {
        for (var i = 0, rule; rule = s.cssRules[i]; i++) {
            if (rule.type != 3) {
                if((!rule.selectorText || rule.selectorText.indexOf(':') != -1) || (!sel.querySelector || sel.querySelector(rule.selectorText))) {
                    var css = !rule.cssText ? '' : rule.cssText.replace(reUrl, function (a, prev, url, next) {
                        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, s.href || loc.href);
                        if(rule.type == 1 && rule.style && rule.style.backgroundImage) url = encodeImg(url);
                        return prev + url + next;
                    });
                    style.appendChild(doc.createTextNode(css + '\n'));
                }
            } else {
                this.copyStyle(rule.styleSheet);
            }
        }
    } catch(e) {
        if (s.ownerNode) style = s.ownerNode.cloneNode(false);
    };
    this.appendChild(style);
};

var sheets = doc.styleSheets;
for (var j = 0; j < sheets.length; j++) head.copyStyle(sheets[j]);
head.appendChild(doc.createTextNode('\n'));

var doctype = '', dt = doc.doctype;
if (dt && dt.name) {
    doctype += '<!DOCTYPE ' + dt.name;
    if (dt.publicId) doctype += ' PUBLIC \x22' + dt.publicId + '\x22';
    if (dt.systemId) doctype += ' \x22' + dt.systemId + '\x22';
    doctype += '>\n';
};

var fileName = selWin ? win.getSelection().toString() : (title && title.text ? title.text : loc.pathname.split('/').pop());
fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '').replace(/[\.]+/ig, ' ').replace(/[\,]+/ig, ' ').replace(/\s+/g, '_').slice(0, 100).replace(/^\s+|\s+$/g, '');
fileName += (function () {
    var d = new Date(), z = function(n){return (n < 10 ? '0' : '') + n};
    return '_' + '[' + z(d.getFullYear()) + '_' + z(d.getMonth()+1) + '_' + z(d.getDate()) + '—' + z(d.getHours()) + '_' + z(d.getMinutes()) + '_' + z(d.getSeconds()) + ']';
})();

if(!/\.html?$/.test(fileName))fileName += '.html';

saveToFile(doctype + sel.innerHTML + '\n<!-- This document saved from ' + (loc.protocol != 'data:' ? loc.href : 'data:uri') + ' -->', fileName);

Отредактировано unter_officer (22-06-2020 16:50:58)


«The Truth Is Out There»

Отсутствует

 

№1479122-06-2020 22:09:13

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

Re: Custom Buttons

unter_officer
В Инициализацию

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

Выделить код

Код:

(func => this._handleClick = () => {
	var saveToFile = (fileContent, fileName) => {
		var uc = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
		uc.charset = "utf-8";
		fileContent = uc.ConvertFromUnicode(fileContent);

		var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
		fp.init(window, "", fp.modeSave);
		fp.defaultString = fileName;
		fp.appendFilters(fp.filterHTML);
		fp.appendFilters(fp.filterAll);
		fp.open(rv => {
			if (rv != fp.returnOK && rv != fp.returnReplace) return;

			var stream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
			stream.init(fp.file, 0x02|0x20|0x08, 0o666, 0);
			stream.write(fileContent, fileContent.length);
			stream.close();
		});
	}
	var msgName = _id + ":SaveSnapshotToHTML";
	var msgListener = msg => saveToFile(...msg.data);
	messageManager.addMessageListener(msgName, msgListener);
	addDestructor(() => messageManager.removeMessageListener(msgName, msgListener));

	var url = "data:," + encodeURIComponent(
		`(${func})(ChromeUtils.import("resource://gre/modules/Services.jsm").Services);`.replace("%MSG_NAME%", msgName)
	);
	(this._handleClick = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false))();

})(({io, focus}) => {
	var resolveURL = function (url, base) {
		try {
			return io.newURI(url, null, io.newURI(base)).spec;
		} catch {}
	};

	var getSelWin = function (w) {
		if (w.getSelection().toString()) return w;
		for (var i = 0, f, r; f = w.frames[i]; i++) {
			try {
				if (r = getSelWin(f)) return r;
			} catch(e) {}
		}
	};

	var encodeImg = function (src, obj) {
		var canvas, img, ret = src;
		if (/^https?:\/\//.test(src)) {
			canvas = doc.createElement('canvas');
			if (!obj || obj.nodeName.toLowerCase() != 'img') {
				img = doc.createElement('img');
				img.src = src;
			} else {
				img = obj;
			};
			if (img.complete) try{
				canvas.width = img.width;
				canvas.height = img.height;
				canvas.getContext('2d').drawImage(img, 0, 0);
				ret = canvas.toDataURL((/\.jpe?g/i.test(src) ? 'image/jpeg' : 'image/png'));
			} catch (e) {};
			if (img != obj) img.src = 'about:blank';
		};
		return ret;
	};

	var toSrc = function (obj) {
		var strToSrc = function (str) {
			var chr, ret = '', i = 0, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\x22' : '\\\x22', '\\': '\\\\'};
			while (chr = str.charAt(i++)) {
				ret += meta[chr] || chr;
			};
			return '\x22' + ret + '\x22';
		},
		arrToSrc = function (arr) {
			var ret = [];
			for (var i = 0; i < arr.length; i++) {
				ret[i] = toSrc(arr[i]) || 'null';
			};
			return '[' + ret.join(',') + ']';
		},
		objToSrc = function (obj) {
			var val, ret = [];
			for (var prop in obj) {
				if (obj.hasOwnProperty(prop) && (val = toSrc(obj[prop]))) ret.push(strToSrc(prop) + ': ' + val);
			};
			return '{' + ret.join(',') + '}';
		};

		switch (Object.prototype.toString.call(obj).slice(8, -1)) {
			case 'Array': return arrToSrc(obj);
			case 'Boolean':
			case 'Function':
			case 'RegExp': return obj.toString();
			case 'Date': return 'new Date(' + obj.getTime() + ')';
			case 'Math': return 'Math';
			case 'Number': return isFinite(obj) ? String(obj) : 'null';
			case 'Object': return objToSrc(obj);
			case 'String': return strToSrc(obj);
			default: return obj ? (obj.nodeType == 1 && obj.id ? 'document.getElementById(' + strToSrc(obj.id) + ')' : '{}') : 'null';
		}
	};

	var mainWin = {};
	focus.getFocusedElementForWindow(content, true, mainWin);
	mainWin = mainWin.value;

	var selWin = getSelWin(mainWin), win = selWin || mainWin, doc = win.document, loc = win.location;
	var ele, pEle, clone, reUrl = /(url\(\x22)(.+?)(\x22\))/g;

	if (selWin) {
		var rng = win.getSelection().getRangeAt(0);
		pEle = rng.commonAncestorContainer;
		ele = rng.cloneContents();
	} else {
		pEle = doc.documentElement;
		ele = (doc.body || doc.getElementsByTagName('body')[0]).cloneNode(true);
	};

	while (pEle) {
		if (pEle.nodeType == 1) {
			clone = pEle.cloneNode(false);
			clone.appendChild(ele);
			ele = clone;
		};
		pEle = pEle.parentNode
	};

	var sel = doc.createElement('div');
	sel.appendChild(ele);

	for (var el, all = sel.getElementsByTagName('*'), i = all.length; i--;) {
		el = all[i];
		if (el.style && el.style.backgroundImage) el.style.backgroundImage = el.style.backgroundImage.replace(reUrl, function (a, prev, url, next) {
			if (!/^[a-z]+:/.test(url)) url = resolveURL(url, loc.href);
			return prev + encodeImg(url) + next;
		});
		switch (el.nodeName.toLowerCase()) {
			case 'link':
			case 'style':
			case 'script': el.parentNode.removeChild(el); break;
			case 'a': 
			case 'area': if (el.hasAttribute('href') && el.getAttribute('href').charAt(0) != '#') el.href = el.href; break;
			case 'img':
			case 'input': if (el.hasAttribute('src')) el.src = encodeImg(el.src, el); break;
			case 'audio':
			case 'video':
			case 'embed':
			case 'frame':
			case 'iframe': if (el.hasAttribute('src')) el.src = el.src; break;
			case 'object': if (el.hasAttribute('data')) el.data = el.data; break;
			case 'form': if (el.hasAttribute('action')) el.action = el.action; break;
		}
	};

	var head = ele.insertBefore(doc.createElement('head'), ele.firstChild);
	var meta = doc.createElement('meta');
	meta.httpEquiv = 'content-type';
	meta.content = 'text/html; charset=utf-8';
	head.appendChild(meta);
	var title = doc.getElementsByTagName('title')[0];
	if (title) head.appendChild(title.cloneNode(true));

	head.copyScript = function (unsafeWin) {
		if ('$' in unsafeWin) return;
		var f = doc.createElement('iframe');
		f.src = 'about:blank';
		f.setAttribute('style', 'position:fixed;left:0;top:0;visibility:hidden;width:0;height:0;');
		doc.documentElement.appendChild(f);
		var str, script = doc.createElement('script');
		script.type = 'text/javascript';
		for (var name in unsafeWin) {
			if (name in f.contentWindow || !/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name)) continue;
			try {
				str = toSrc(unsafeWin[name]);
				if (!/\{\s*\[native code\]\s*\}/.test(str)) {
					script.appendChild(doc.createTextNode('var ' + name + ' = ' + str.replace(/<\/(script>)/ig, '<\\/$1') + ';\n'));
				}
			} catch (e) {};
		};
		f.parentNode.removeChild(f);
		if (script.childNodes.length) this.nextSibling.appendChild(script);
	};
	head.copyScript(win.wrappedJSObject || win);

	head.copyStyle = function (s) {
		if (!s) return;
		var style = doc.createElement('style');
		style.type = 'text/css';
		if (s.media && s.media.mediaText) style.media = s.media.mediaText;
		try {
			for (var i = 0, rule; rule = s.cssRules[i]; i++) {
				if (rule.type != 3) {
					if((!rule.selectorText || rule.selectorText.indexOf(':') != -1) || (!sel.querySelector || sel.querySelector(rule.selectorText))) {
						var css = !rule.cssText ? '' : rule.cssText.replace(reUrl, function (a, prev, url, next) {
							if (!/^[a-z]+:/.test(url)) url = resolveURL(url, s.href || loc.href);
							if(rule.type == 1 && rule.style && rule.style.backgroundImage) url = encodeImg(url);
							return prev + url + next;
						});
						style.appendChild(doc.createTextNode(css + '\n'));
					}
				} else {
					this.copyStyle(rule.styleSheet);
				}
			}
		} catch(e) {
			if (s.ownerNode) style = s.ownerNode.cloneNode(false);
		};
		this.appendChild(style);
	};

	var sheets = doc.styleSheets;
	for (var j = 0; j < sheets.length; j++) head.copyStyle(sheets[j]);
	head.appendChild(doc.createTextNode('\n'));

	var doctype = '', dt = doc.doctype;
	if (dt && dt.name) {
		doctype += '<!DOCTYPE ' + dt.name;
		if (dt.publicId) doctype += ' PUBLIC \x22' + dt.publicId + '\x22';
		if (dt.systemId) doctype += ' \x22' + dt.systemId + '\x22';
		doctype += '>\n';
	};

	var fileName = selWin ? win.getSelection().toString() : (title && title.text ? title.text : loc.pathname.split('/').pop());
	fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '').replace(/[\.]+/ig, ' ').replace(/[\,]+/ig, ' ').replace(/\s+/g, '_').slice(0, 100).replace(/^\s+|\s+$/g, '');
	fileName += (function () {
		var d = new Date(), z = function(n){return (n < 10 ? '0' : '') + n};
		return '_' + '[' + z(d.getFullYear()) + '_' + z(d.getMonth()+1) + '_' + z(d.getDate()) + '\u2014' + z(d.getHours()) + '_' + z(d.getMinutes()) + '_' + z(d.getSeconds()) + ']';
	})();

	if(!/\.html?$/.test(fileName))fileName += '.html';

	sendAsyncMessage("%MSG_NAME%", [doctype + sel.innerHTML + '\n<!-- This document saved from ' + (loc.protocol != 'data:' ? loc.href : 'data:uri') + ' -->', fileName]);

});

Отсутствует

 

№1479222-06-2020 23:20:16

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 77.0

Re: Custom Buttons

Dumby
Не знаете почему omni.ja в 10/64 winrar виснет?

Отсутствует

 

№1479323-06-2020 02:58:25

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

Dumby пишет

В Инициализацию

Dumby, огромное спасибо!


«The Truth Is Out There»

Отсутствует

 

№1479423-06-2020 10:13:23

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

Re: Custom Buttons

solombala пишет

Не знаете почему в 10/64 winrar виснет?

Уговорил. Поставил в виртуалку Win10 Pro и WinRAR 5.90

скрытый текст
После правки файла из omni.ja в текстовом редакторе,
WinRAR спрашивает обновить ли его в архиве, и,
после обновления, ничего не падает и ничего не виснет,
то есть — не воспроизводится.


А насчёт прав на ветвь реестра Macromedia, так в окне разрешений
есть кнопка «Дополнительно», и если там назначить себя владельцем,
(с галкой наследования разрешений дочерними объектами),
то ветвь успешно удаляется.


Заодно проверил стиль, который тебе Виталий давал,
тот, что с «--panel-disabled-color», и тоже прекрасно работает.

Отсутствует

 

№1479523-06-2020 11:06:51

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 77.0

Re: Custom Buttons

Dumby
Ну с macromedia давно справился. винрар - это винда косячит...А вот с «--panel-disabled-color не понятно. хотите сказать , что меняется колор "востановить пред...сессию" , когда нет этой сессии?
И еще такие же места "Пусто" и т.д ?  Не верю...Извиняюсь, нашел косяк toolbarbutton.css
НУЖЕН ТОЛЬКО ЭТОТ winrar-x64-591b1 ...Т.к версия винды новая . Теперь гуд!

Отредактировано solombala (23-06-2020 17:46:01)

Отсутствует

 

№1479623-06-2020 14:46:23

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

Есть вопросик.
Например, имеем такой код:

Выделить код

Код:

var selectionTxt = document.commandDispatcher.focusedWindow.getSelection();
var url = 'https://translate.google.com/#view=home&op=translate&sl=auto&tl=ru&text=';
var txtUrl = (url + encodeURIComponent(selectionTxt));
gBrowser.selectedTab = gBrowser.addTab(txtUrl, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });

В однопроцессорном режиме работает нормально - открывается новая вкладка translate.google.com, вставляется текст и происходит перевод текста.
В многопроцессорном режиме - открывается новая вкладка translate.google.com, а вот текст не вставляется. Консоль при этом молчит.


Как сделать, чтобы работало в многопроцессорном режиме?

Отредактировано unter_officer (23-06-2020 14:47:34)


«The Truth Is Out There»

Отсутствует

 

№1479723-06-2020 15:22:15

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

Re: Custom Buttons

unter_officer попробуй

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

Выделить код

Код:

let browserMM = gBrowser.selectedBrowser.messageManager;
 browserMM.addMessageListener('getSelect', function listener(message) {
   // создать текст для записи
    var selectionTxt = message.data; 
    var url = 'https://translate.google.com/#view=home&op=translate&sl=auto&tl=ru&text=';
var txtUrl = (url + encodeURIComponent(selectionTxt));
gBrowser.selectedTab = gBrowser.addTab(txtUrl, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });
 browserMM.removeMessageListener('getSelect', listener, true);
});
        browserMM.loadFrameScript('data:,sendAsyncMessage("getSelect", content.document.getSelection().toString())', false);

Отсутствует

 

№1479823-06-2020 15:46:35

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

Andrey_Krropotkin, большое спасибо! Всё работает.


«The Truth Is Out There»

Отсутствует

 

№1479924-06-2020 03:01:29

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

Есть такой код:

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

Выделить код

Код:

/*Initialization Code*/

// Открывать ссылки длинным кликом ..........
(code => {
    var delay = 500;               // время удержания в мс
    var inBackground = false;      // открывать в фоновой вкладке
    var relatedToCurrent = false;  // открывать рядом с related вкладкой

    var p = "CB" + _id.slice(20) + ":LongPressHandler:";
    var msgDestroy = p + "Destroy", msgResponse = p + "Response";
    code = code.replace(/%MD%/g, msgDestroy).replace("%MR%", msgResponse)
        .replace("%DL%", delay).replace("%BG%", inBackground);

    var url = "data:," + encodeURIComponent(code);
    var mm = window.getGroupMessageManager("browsers");
    mm.loadFrameScript(url, true);

    function handleLongPress(msg) {
        var [link, ref, ctrl] = msg.data;
        var bg = inBackground != null ? inBackground
            : Services.prefs.getBoolPref("browser.tabs.loadInBackground");
        gBrowser.loadOneTab(link, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }), {
            relatedToCurrent, inBackground: ctrl != bg, //referrerURI: makeURI(ref)
        };
    }
    mm.addMessageListener(msgResponse, handleLongPress);

    addDestructor(() => {
        mm.removeDelayedFrameScript(url);
        mm.broadcastAsyncMessage(msgDestroy);
        mm.removeMessageListener(msgResponse, handleLongPress);
    });
})(`({
    init() {
        addEventListener("mousedown", this, false);
        addMessageListener("%MD%", this);
    },
    receiveMessage() {
        removeEventListener("mousedown", this, false);
        removeMessageListener("%MD%", this);
    },
    handleEvent(e) {
        if (e.type == "mousedown") {
            if (e.button || e.shiftKey || e.altKey || e.detail != 1) return;

            var a = e.originalTarget.closest("a[href]");
            if (!a || a.href.startsWith("javascript:")) return;

            this.ctrl = e.ctrlKey;
            this.initLongPress(a);
        } else {
            if (e.type == "click" && !this.link) e.preventDefault();
            this.destroyLongPress();
        }
    },
    get timer() {
        delete this.timer;
        return this.timer = Cc["@mozilla.org/timer;1"]
            .createInstance(Ci.nsITimer);
    },
    notify() {
        sendSyncMessage("%MR%", [this.link.href, this.link.ownerDocument.URL, this.ctrl]);
        this.link = null;
        if (!%BG%) this.destroyLongPress();
    },
    initLongPress(a) {
        addEventListener("click", this, true);
        addEventListener("dragstart", this, false);
        this.timer.initWithCallback(this, %DL%, this.timer.TYPE_ONE_SHOT);
        this.link = a;
    },
    destroyLongPress() {
        removeEventListener("click", this, true);
        removeEventListener("dragstart", this, false);
        this.link && this.timer.cancel();
        this.link = null;
    }
}).init();`);

В целом работает нормально, но в многопроцессорном режиме проявляется небольшой глюк.


Наводим курсор на ссылку, он принимает вид ладошки. Делаем длинный клик, открывается страница в новой вкладке, но курсор не меняет свой вид, так и остается в виде ладошки.
Чтобы курсор вернулся в исходное состояние, его надо увести за пределы окна, либо навести на одну из панелей браузера. В однопроцессорном режиме такого нет, всё работает как надо.


Не могу понять, это какой-то мой локальный глюк или проблема всё-таки в коде?

P.S. Версия [firefox] 77.0.1

Отредактировано unter_officer (24-06-2020 03:22:17)


«The Truth Is Out There»

Отсутствует

 

№1480024-06-2020 09:25:14

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

Re: Custom Buttons

unter_officer пишет

Не могу понять, это какой-то мой локальный глюк или проблема всё-таки в коде?
P.S. Версия [firefox] 77.0.1

Глюку сто лет, однако, похоже, исчезнет в Firefox 78
(читай - через неделю, а RC build1 доступен уже сейчас),
но лучше использовать расширение или WebExtensions.

Отсутствует

 

Board footer

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