Пока исправят кнопки, выйдет новый ff и опять всё отвалится. Мартышкин труд, блин.
Я уже устал от этого FF... Проблема на проблеме! Постоянные костыли... А самое главное что проц жрет не померно и память засирает!
Попытался уйти с relaes на esr так теперь и тут палки в колесах... Переход просто так не возможен...
Отваливаются все контейнеры исчезли значки дополнений! Это вообще какой-то кошмар!
Отредактировано suz191 (18-11-2018 00:09:56)
Отсутствует
suz191
исчезли значки дополнений
удалить extensions.json в папке профиля
Да! Это решило вопрос с дополнениями! Появились! Спасибо огромное А контейнеры и куки перекинуть как-нибудь можно?
Добавленно!
Всё я прикрутил... Ура...
Контейнеры и куки не отвалились... Если кому интересно метод ниже
Берем из профиля RELEAS у вас там будут свои цифры! Главное чтоб начало и конец не изменились в ESR, а само описание контейнеров подставляем из нужного!
{"version":2,"lastUserContextId":12,"identities": это начало забираем эту середину тут конец ,{"userContextId":42434545695,"public":false,"icon":"","color":"","name":"userContextIdInternal.webextStorageLocal","accessKey":""}]}
Правим в профиле ESR
{"version":8,"lastUserContextId":9,"identities": это начало вставляем её сюда тут конец ,{"userContextId":9,"public":false,"icon":"","color":"","name":"userContextIdInternal.thumbnail","accessKey":""}]}
Не забываем добавить к профилю cookies.sqlite
собственно все можно пользоваться, после этого куки и контейнеры не исчезнут!
Мы только что перешли с releas на esr без потерь и потерпевших
Не работает клик правой кнопки Исследовать элемент
Востанвливаем
Забираем их из чистого и ставим в prefs.js вместо своих которые там есть и плевать что их там больше чем в новом. Выделяйте все и ставьте другие.
Всё кнопка работает! Исследовать страничку можно))))
Отредактировано suz191 (25-11-2018 08:47:13)
Отсутствует
Подскажите, плз, а как перенести все кнопки из старого профиля в новый?
Я не нашел никаких опций для импорта/экспорта.
Надо только кнопки перенести из старого профиля..
Ещё проблема, скопировал плагин из старого профиля в новый, вручную 1 кнопку перенес, всё точно также, а она не работает.
Отредактировано ezh (21-11-2018 14:45:16)
Отсутствует
Подскажите, плз, а как перенести все кнопки из старого профиля в новый?
В папке старого профиля скопируй папку custombuttons и вставь в новый профиль, само расширение уже должно быть установлено. А потом нужные кнопки выведи на панели.
Отсутствует
Господа специалисты опять лажа , не работает context Search в 63... Где там собака зарыта?
var searchSelect = document.getElementById('context-searchselect');
searchSelect.collapsed = false; // удалить стандартный пункт меню для поиска
// Создать новый пункт меню для поиска ....
var contextMenu = document.getElementById("contentAreaContextMenu");
var menu = contextMenu.insertBefore( document.createElement('menu'), searchSelect ); // над каким пунктом меню показывать
menu.setAttribute("class", "menu-iconic");
// устанавливать иконку, название и поисковик для нового пункта меню
function setMenu() {
menu.engine = searchService.currentEngine;
menu.setAttribute("label", "Искать в...");
};
setMenu();
// наблюдатель за стандартным пунктом меню 'Копировать' прячет меню поиска
var copy = document.getElementById('context-copy');
var setHiddenMenu = new MutationObserver(function() {
menu.hidden = copy.hidden || copy.disabled;
});
setHiddenMenu.observe( copy, { attributes: true, attributeFilter: ["hidden", "disabled"] } );
// Создать подменю с поисковиками ....
var menuPopup = menu.appendChild( document.createElement("menupopup") );
menuPopup.setAttribute('style', 'overflow: scroll');
// создать пункты в подменю
function setItemsToMenuPopup(e) {
menuPopup.textContent = "";
var engines = searchService.getVisibleEngines({});
engines.forEach(function( engine ) {
var mItem = document.createElement("menuitem");
mItem.setAttribute("label", engine.name );
mItem.setAttribute("class", "menuitem-iconic");
mItem.setAttribute("src", engine.iconURI.spec );
mItem.engine = engine;
menuPopup.appendChild( mItem );
});
};
setItemsToMenuPopup();
// Установить действие для клика на меню и подменю ....
menu.setAttribute("onmouseup", "\
var background = ( event.button == 0 ) ? false : true;\
var clip = gClipboard.read();\
goDoCommand('cmd_copy');\
setTimeout(function() {\
document.getElementById('contentAreaContextMenu').hidePopup();\
var submission = event.target.engine.getSubmission( gClipboard.read(), null );\
gBrowser.loadOneTab( submission.uri.spec, null, null, submission.postData, background, false );\
gClipboard.write( clip );\
}, 0);\
");
// Наблюдатель за изменениями в поисковиках пересоздаёт меню и подменю ....
var getEngineModified = {
observe: function(subject, topic, data) {
if ( /changed|removed|current/.test( data ) ) { setMenu(); setItemsToMenuPopup() };
}
};
Services.obs.addObserver( getEngineModified, "browser-search-engine-modified", false );
// Удалять наблюдатели и меню, показать стандартный пункт ....
addDestructor(function() {
contextMenu.removeChild( menu );
setHiddenMenu.disconnect();
Services.obs.removeObserver( getEngineModified, "browser-search-engine-modified", false );
searchSelect.collapsed = false;
});
})(document.getElementById("contentAreaContextMenu") );
Отсутствует
drage2
Переходите на ESR с этого релизистого мутанта Пока они полностью совместимы и имеют одинаковую обертку... В ESR практически все работает и он кушает поменьше ресурсов. Там ещё ни кто не нагадил пока...
Отредактировано suz191 (24-11-2018 04:15:46)
Отсутствует
Ultima2m
Я ушел на BASILISK т.к. там не изгажен imakros, и полностью работает Custom Buttons, а основной браузер с соц сетями перевел из RELEAS в ESR там тоже Custom Buttons работает нормально и нет бреда с изменением функций.
WаterFox тоже можно попробовать, тоже хороший баузер, менее прожорливый и почти тот же ESR только немного пониже
Может когда люди по убегают до них хоть дойдет, что они творят Хотя и это не поможет это мировая тенденция засрать все так, чтоб комп зависал и вы бежали покупать новую технику!
Отредактировано suz191 (24-11-2018 06:22:38)
Отсутствует
Как можно сделать так, чтобы он не обращался к локальным путям... а обращался сразу с профиля или с папки ?
Что надо изменить в_var file=Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
try{document.getElementById("context-viewimage").setAttribute("onclick","gBrowser.selectedTab=gBrowser.addTab(checkForMiddleClick(this,event))");} catch(e){ };var closer={observe: function(subject,topic,data){if(data=="shutdown"){ var file=Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); file.initWithPath("X:\\Firefox\\Profile\\g.vbs");file.launch(); //file.initWithPath("..\\Profile\\g.vbs");file.launch(); //вот как тут file.initWithPath("X:\\Firefox\\Profile\\SQL.vbs");file.launch();}}}; Services.obs.addObserver(closer,"quit-application",false); /**/
Upd: Спасибо Vitaliy V.
//[+?] AutoDelSql+trash try{document.getElementById("context-viewimage").setAttribute("onclick","gBrowser.selectedTab=gBrowser.addTab(checkForMiddleClick(this,event))");} catch(e){};var closer={observe:function(subject,topic,data){if(data=="shutdown"){ var file=Services.dirsvc.get("ProfD",Ci.nsIFile); //file.append("g.vbs"); file.append("SQL.vbs");if(file.exists())file.launch();}}}; Services.obs.addObserver(closer,"quit-application",false); /**/
Отредактировано func4ptch4 (01-12-2018 20:27:20)
Отсутствует
Как автоматически вырезать текст из заголовков вкладок, ненужное начало типа: Смотреть бесплатно… | Форум 'название'… и т.п?
или просто приведите пример изменения заголовка вкладки по событию: addEventListener('TabOpen'…
Отсутствует
получаешь вкладку,меняешь у неё label
var tab=какойто код выдающий вкладку
var txt=tab.getAttribute("label")
txt=чтото делаем с текстом
tab.setAttribute("label",txt)
кактотак
я помню те времена когда обновления программ убирали проблемы и исправляли баги, а не добавляли их.
toxID:05AB9B827D896AACEE7FF4573A02FB8F025F46ADC856B98F65BC1BA9BD21A81DC98BA9C36CE3
Отсутствует
Подскажите пожалуйста.
Можно ли с помощью Custom Buttons сделать подобное как в File and Folder Shortcuts для FF 63+ ?
Отсутствует
Всем привет. В общем, у меня все кнопки на панели вкладок, а все остальные панели полностью скрыты. Но на панели вкладок не работают дополнения типа Робоформ, Таб Сессион Менеджер, и так далее. Когда открываю панель адресной строки, всё работает, когда закрываю панель адресной строки, снова перестаёт работать. Как исправить эту проблему? Как сделать, чтобы все кнопки, дополнени и т.д. работали на панели вкладок при закрытых других вкладок? Кто знает?
Отсутствует
На Firefox 65 всё будет немного иначе.
Да, из Firefox 65 вырезали аддон-менеджерские коды
обслуживавшие bootstrapped extensions, и теперь и на этот
последний вид расширений Наследия лиса смотрит бараном.
Таким образом — новый расклад.
Код для конфигурационного файла. Состоит из двух частей.
Часть 1:
Антиподписячество и разрешение на paxmod'ы (aka WebExperiment).
Код упрощён до уровня перестановки настроек и флагов. Что-то вроде правки omni.ja
Примечания:
1. Настройка jsloader.shareGlobal должна быть в дефолтном значении true.
2. Размещение каких-либо других кодов перед этим строго не рекомендуется.
Пусть он исполнится первым, а затем уже все остальные (если есть).
Игнорируйте, если точно знаете что делаете.
3. У всего неподписанного в manifest.json должен быть указан id.
Если отсутствует — указываем.
Часть 2:
Запускатор Custom Buttons (см. далее).
// try {(nsvo => { var data = { MOZ_REQUIRE_SIGNING: false, MOZ_ALLOW_LEGACY_EXTENSIONS: true, get MOZ_UNSIGNED_SCOPES() { return 31; // AddonManager.SCOPE_ALL } }; var o = Cu.getGlobalForObject(nsvo).Object, {freeze} = o; o.freeze = obj => { if (Components.stack.caller.filename != "resource://gre/modules/AppConstants.jsm") return freeze(obj); for(let key in data) o.defineProperty(obj, key, o.getOwnPropertyDescriptor(data, key)); return (o.freeze = freeze)(obj); } lockPref("extensions.legacy.enabled", true); lockPref("xpinstall.signatures.required", false); lockPref("extensions.langpacks.signatures.required", false); })(Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}));} catch(ex) {Cu.reportError(ex);} // try {({ ids: new Set([ "custombuttons@xsms.org", ]), topics: [ "toolbox-update-addon-options", "final-ui-startup", "quit-application-granted", ], get gXPIProvider() { delete this.gXPIProvider; return this.gXPIProvider = Cu.import( "resource://gre/modules/addons/XPIProvider.jsm", {} ); }, init(obs) { this.obs = obs; for(var topic of this.topics) obs.addObserver(this, topic, false); }, destroy() { for(var topic of this.topics) this.obs.removeObserver(this, topic); }, observe(subj, topic) { if (topic != this.topics[0]) return this.destroy(); var {id} = subj.wrappedJSObject; if (!this.ids.has(id)) return; this.ids.size == 1 ? this.destroy() : this.ids.delete(id); var rootURI = this.gXPIProvider.getURIForResourceInFile( this.gXPIProvider.XPIProvider.activeAddons.get(id).addon.file, "" ); Cu.import(rootURI.resolve("startup.jsm"), {}).start(rootURI); } }).init(Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService));} catch(ex) {Cu.reportError(ex);}
На борту имеется paxmod-стафф, так что, надеюсь, теоретически,
может работать и без запускатора, только на физической правке omni.ja,
а в Firefox Developer Edition вообще только на настройках.
Но paxmod, в этом смысле, наследует от WebExtensions
убожество отложенного запуска, а это значит, что кнопки просто не могут
появляться в окнах стартующего браузера сразу, но только с некоторой задержкой.
Поэтому и запускатор.
Семёрка в номере версии лишь для того, чтобы отличалось чисто визуально (начертательно).
Как признак обратной несовместимости. Возможно будет работать на Firefox 63.
Отсутствует
Dumby
Пытаюсь установить custom_buttons-0.0.7.0.0.1-fx.xpi в портабельный FF 63, но он не может быть установлен из-за подписи. Файлы config.js и config-prefs.js закинул в D:\Firefox\App\Firefox64\ и D:\Firefox\App\Firefox64\defaults\pref\. Не знаете в чём проблема?
Отсутствует
Не знаете в чём проблема?
Конечно нет, откуда?
Могу ещё раз пересказать, с диагностическим уклоном.
Название не столь существенно, а вот расширение должно быть js,
то есть config-prefs.js, а не какой-нибудь config-prefs.js.txt
Важно: кодировка должна быть без BOM, иначе работать не будет.
Убеждаемся, что все три строки на месте и сохраняем.
pref("general.config.obscure_value", 0); pref("general.config.filename", "config.js"); pref("general.config.sandbox_enabled", false);
Затем, в папке, где лежит firefox.exe, создаём файл config.js
Кладём в него эти две строки и сохраняем.
Перезапускаем Firefox и открываем Консоль браузера (Ctrl+Shift+J).
Там, в самом начале, смотрим, появилось ли наше сообщение (примерно такое).
Если появилось, значит конфигурационный файл, как таковой, работает.
Теперь заменяем содержимое config.js кодом, сохраняем и перезапускаем Firefox.
В about:config включаем настройку devtools.chrome.enabled
Снова открываем Консоль браузера.
Внизу, в js-терминале вводим запрос, жмём Enter и смотрим ответ (примерно такой).
Если ответ 31, значит код работает.
На Панели меню - Файл > Работать автономно
На странице about:addons - Расширения > кнопка-шестерёнка > Установить дополнение из файла…
Я проделал всё это на чистом FirefoxPortable 63.0.3 (64-бит).
Custom Buttons 0.0.7.0.0.1 установился и работает.
Отсутствует
Dumby
Спасибо большое за пересказ, благодаря тесту понял, что проблема в config.js коде, который взял из FAQ - Как отключить проверку цифровых подписей в дополнениях Firefox. Всё установил, но не работает моя любимая кнопка Autocopy от bunda1.
Отредактировано Karn (11-12-2018 20:21:28)
Отсутствует
А для 60 ESR не подскажите как установить? Вчера поставил первый раз, вроде запустилось хоть и писало что дополнение не совместимо, но сегодня отпало всё.
Делал так. И присоединюсь к Karn, Autocopy не работает, а без него как без рук.
Отредактировано Mishania (12-12-2018 18:32:41)
Отсутствует
у меня вот такой автокопи работает
this.closest("toolbarpaletteitem") || (script => { var id = `CB${_id.slice(20)}:Autocopy`, pid = id + "Parent"; var nsvoStr = `Components.utils.import("resource://gre/modules/Services.jsm", {})`; var nsvo = eval(nsvoStr), {Services} = nsvo, parent = nsvo[pid]; if (!parent) { var cid = id + "Child", u = code => "data:," + encodeURIComponent(code); var pref = "CB.Autocopy.settings", topic = "quit-application-granted"; var PREF_ENABLED = 1, PREF_BLINK = 2, PREF_RESET = 4; (parent = nsvo[pid] = { init() { this.readSettings(); if (!this[PREF_ENABLED]) return; this.initChild(); if (this[PREF_RESET]) this.setObserver(true); }, destroy(reason) { var ud = reason[5] == "e"; if (ud || !this.obsAdded) this.saveSettings(); delete nsvo[pid]; if (reason == "delete") Services.prefs.clearUserPref(pref); if (!this[PREF_ENABLED]) return; this.destroyChild(); if (ud && this[PREF_RESET]) this.setObserver(false); }, get processURL() { delete this.processURL; this.frameURL = u(`${nsvoStr}["${cid}"].init(this);`); return this.processURL = u(script.replace(/%ID%/g, cid) .replace("%NSVO%", nsvoStr).replace("%BLINK%", this[PREF_BLINK]) ); }, get frameURLDestroy() { delete this.frameURLDestroy; this.processURLDestroy = u(`${nsvoStr}["${cid}"].forget();`); return this.frameURLDestroy = u(`${nsvoStr}["${cid}"].destroy(this);`); }, initChild() { Services.ppmm.loadProcessScript(this.processURL, true); Services.mm.loadFrameScript(this.frameURL, true); }, destroyChild() { Services.mm.removeDelayedFrameScript(this.frameURL); Services.mm.loadFrameScript(this.frameURLDestroy, false); Services.ppmm.removeDelayedProcessScript(this.processURL); Services.ppmm.loadProcessScript(this.processURLDestroy, false); }, readSettings() { this.prefVal = Services.prefs.getIntPref(pref, 3); for(var setting of [PREF_ENABLED, PREF_BLINK, PREF_RESET]) this[setting] = Boolean(this.prefVal & setting); }, saveSettings() { var settings = 0; for(var setting of [PREF_ENABLED, PREF_BLINK, PREF_RESET]) if (this[setting]) settings += setting; if (this.prefVal != settings) Services.prefs.setIntPref(pref, settings); }, btns: new Set(), register(btn) { this.btns.add(btn); btn._handleClick = this.click; btn.oncontextmenu = this.context; this.setImg(btn, this[PREF_ENABLED]); }, unregister(btn, reason) { this.btns.delete(btn); if (!this.btns.size) this.destroy(reason); }, setImg(btn, state) { btn.ownerDocument.getAnonymousElementByAttribute( btn, "class", "toolbarbutton-icon" ).src = state ? "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" : "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; }, click() { var newState = parent[PREF_ENABLED] = !parent[PREF_ENABLED]; for(var btn of parent.btns) parent.setImg(btn, newState); newState ? parent.initChild() : parent.destroyChild(); if (parent[PREF_RESET]) parent.setObserver(newState); }, context(e) { if (e.ctrlKey || e.shiftKey) return; if (e.detail > 1) return parent.popup.hidePopup(); if (!this.contains(parent.popup)) this.appendChild(parent.popup); e.preventDefault(); parent.popup.openPopup(this, "after_start"); }, get popup() { var win = Services.wm.getMostRecentWindow("navigator:browser"); var doc = win.document, popup = doc.createElement("menupopup"); popup.setAttribute("onclick", "event.stopPropagation();"); popup.setAttribute("oncommand", "handleCommand(event.target);"); for(var [lab, pref] of win.Object.entries({ "Выделенный текст мигает при автокопировании": PREF_BLINK, "Выключать автокопирование при выходе из браузера": PREF_RESET })) { var menuitem = popup.appendChild(doc.createElement("menuitem")); menuitem.setAttribute("label", lab); menuitem.setAttribute("type", "checkbox"); if (this[menuitem.pref = pref]) menuitem.setAttribute("checked", true); } popup.handleCommand = menuitem => { var newState = this[menuitem.pref] = menuitem.hasAttribute("checked"); if (!this[PREF_ENABLED]) return; if (menuitem.pref == PREF_BLINK) Services.ppmm.broadcastAsyncMessage(cid + ":FromParent", {blink: newState}); else if (menuitem.pref == PREF_RESET) this.setObserver(newState); } delete this.popup; return this.popup = popup; }, obsAdded: false, setObserver(set) {this.obsAdded = set ? Services.obs.addObserver(this, topic, false) : Services.obs.removeObserver(this, topic); }, observe() { Services.obs.removeObserver(this, topic); this[PREF_ENABLED] = false; this.saveSettings(); } }).init(); } parent.register(this); addDestructor(reason => parent.unregister(this, reason), parent); })(`(nsvo => (nsvo["%ID%"] = { x: -1, y: -1, d: false, handleEvent(e) {e.button || this[e.type](e);}, mousedown(e) {this.x = e.screenX; this.y = e.screenY, this.down = true;}, mouseup(e) { var {down} = this; this.down = false; if (!down) return; if (e.screenX == this.x && e.screenY == this.y && (e.detail == 1 || e.target.matches( "textarea[disabled],input[disabled],button,select,summary" ))) return; var name = e.originalTarget.nodeName; if (/^(?:(?:xul:)?(?:slider|scrollbarbutton)|resizer)$/.test(name)) return; this.x = this.y = -1; var win = this.getFocusedWin(e.target.ownerGlobal); var sel = win.getSelection(); if (sel.toString()) { this.cm.doCommand("cmd_copy", null, win); this.blinkEnabled && this.blink(win, e.detail > 1); } }, blinkEnabled: %BLINK%, blink(win, pause) { if (pause) return win.setTimeout(() => this.blink(win), 100); var sc = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIWebNavigation) .QueryInterface(Components.interfaces.nsIDocShell) .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsISelectionDisplay) .QueryInterface(Components.interfaces.nsISelectionController); sc.setDisplaySelection(sc.SELECTION_OFF); sc.repaintSelection(sc.SELECTION_NORMAL); win.setTimeout(() => { sc.setDisplaySelection(sc.SELECTION_ON); sc.repaintSelection(sc.SELECTION_NORMAL); }, 150); }, getFocusedWin(win) { var focusedWin = {}; var elm = Services.focus.getFocusedElementForWindow(win.top, true, focusedWin); return focusedWin.value; }, get cm() { delete this.cm; return this.cm = Components.classes["@mozilla.org/embedcomp/command-manager;1"] .getService(Components.interfaces.nsICommandManager); }, count: 0, init(cfmm) { this.count += 1; cfmm.addEventListener("mousedown", this); cfmm.addEventListener("mouseup", this); cfmm.addEventListener("unload", this); if (this.count == 1) this.cpmm.addMessageListener("%ID%:FromParent", this); }, destroy(cfmm) { this.count -= 1; cfmm.removeEventListener("mousedown", this); cfmm.removeEventListener("mouseup", this); cfmm.removeEventListener("unload", this); if (!this.count) this.cpmm.removeMessageListener("%ID%:FromParent", this); }, receiveMessage(msg) { if ("blink" in msg.data) this.blinkEnabled = msg.data.blink; }, unload(e) {this.destroy(e.target);}, forget: () => delete nsvo["%ID%"] }).cpmm = this)(%NSVO%);`);
Отсутствует