Dumby
Есть ваш код для переключения стиля https://forum.mozilla-russia.org/viewto … 42#p795542, я его использую для переключения стиля скрытия панели вкладок.
Использую с reg();, т.е. с инициализацией при старте браузера.
При открытии некоторых дополнительных окон, скрипт самопроизвольно переключает стиль. Открылось новое окно, например, "новое приватное" или окно NoScript (NoScript запросы в окнах открывает) и стиль переключился - вкладки появились, открыл еще одно окно и стиль переключился - вкладки пропали (причем во всех окнах имеющих панель табов). На другие окна, например, менеджера кук или информации о странице, скрипт так не реагирует.
Если стиль использовать не из скрипта, то он себя так не ведет.
Можете это поправить?
Отсутствует
Использую с reg();, т.е. с инициализацией при старте браузера.
Мне предлагается угадать,
куда именно вызов reg() был вписан?
Угадатель из меня никакой.
Хотелось бы думать, что сразу после var reg = …;
но, видимо, это не так.
Отсутствует
egorsemenov06
Что-то я не представляю как такое сделать.
Если бы иметь уверенность, что exe'шник будет
запускаться только этим кодом, тогда ещё можно попробовать.
Но ведь он может быть запущен в любой момент иным способом,
и, наверно, получается, что это бесполезная писанина для custom_script.js
(async url => { var path = ".......\\opera-proxy.windows-386.exe"; var icons = [ 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><rect fill="limegreen" x="0" y="0" width="16" height="16"/></svg>', 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><rect fill="red" x="0" y="0" width="16" height="16"/></svg>' ]; var labels = [ "Active", "Not Active" ]; var tooltips = [ "Active", "Not Active" ]; var type = "network.proxy.type"; try {var exp = ChromeUtils.importESModule(url + "sys.mjs");} catch {exp = ChromeUtils.import(url + "jsm");} exp.PageActions.addAction(new exp.PageActions.Action({ title: labels[1], iconURL: icons[1], pinnedToUrlbar: true, id: "ucf-opera-proxy", onPlacedInUrlbar(node) { var pref = Services.prefs.getIntPref(type) == 1, proc, active; var upd = () => { var state = pref && Boolean(proc); if (state == active) return; var ind = +!(active = state); this.setIconURL(icons[ind]); this.setTitle(labels[ind]); this.setTooltip(tooltips[ind]); } this["nsPref:changed"] = () => upd( pref = Services.prefs.getIntPref(type) == 1 ); this["process-finished"] = this["process-failed"] = () => upd(proc = null); this["quit-application-granted"] = t => { Services.obs.removeObserver(this, t); Services.prefs.removeObserver(type, this); proc?.kill(); } this.observe = (s, topic) => this[topic](topic); Services.prefs.addObserver(type, this); Services.obs.addObserver(this, "quit-application-granted"); var {id} = node; var style = `#${id} {display: flex !important;}\n` + `@media (max-width: 680px) {#${id} {visibility: collapse !important;}}`; (this.onPlacedInUrlbar = this._onPlacedInUrlbar = node => { var sheet = new node.ownerGlobal.CSSStyleSheet(); sheet.replaceSync(style); node.ownerDocument.adoptedStyleSheets.push(sheet); })(node); var run = () => { var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); file.initWithPath(path); (run = () => { proc = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); //proc.startHidden = true; try {proc.init(file); proc.runwAsync([], 0, this);} catch {proc = null;} upd(); })(); } this._onCommand = () => { if (active) Services.prefs.setIntPref(type, 0), proc.kill(); else pref || Services.prefs.setIntPref(type, 1), proc || run(); } } })); })("resource:///modules/PageActions.");
Отсутствует
С некоторой задежкой.
/* this._onCommand = () => { */ var timeout = 1500; var tid, oldState, reload = (gb, tab, state) => { tid = null; active != state && gb.reloadTab(tab); } this._onCommand = e => { tid ? clearTimeout(tid) : oldState = active; var gb = e.view.gBrowser; tid = setTimeout(reload, timeout, gb, gb.selectedTab, oldState);
Отсутствует
остаеться ручная настройка прокси, хотя иконка на кнопке красная "Not Active"
Всё правильно.
Active — это считается когда и настройка, и запущенный кодом exe'шник.
Например, когда Active, если снаружи переключить только настройку,
или только завершить процесс, тогда это уже считается как Not Active.
при выходе и перезапуске из firefox что бы переключалась на без прокси невозможно сделать?
Ну почему же, вполне возможно.
Перед proc?.kill(); дописать active && Services.prefs.setIntPref(type, 0);
Отсутствует
Друзья, поделитесь, пожалуйста, настроенным комплектом UCF версии от 2021-9-23
с примерами подключенных скриптов и стилей.
У меня в состоянии UCF "из коробки" на 114.0 дополнительная и вертикальная панель не появляются...
Отсутствует
Viatcheslav
Примеры там по умолчанию есть, в описании все написано.
https://m.freespeech.club/cQjSgTzr.7z
Версию я сам менял, так как она была перевыложена в ноябре с какими то изменениями сделанными в октябре.
Отредактировано _zt (12-06-2023 09:35:38)
Отсутствует
Как сюда добавить хоткей? Не хочется лишний раз дублировать код. Там что-то такое:
if (e.code == "KeyQ" && e.ctrlKey && e.altKey), не знаю как подставить.
128(){ //Clean Cache var cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool); Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart"); if (cancelQuit.data) return false; Services.appinfo.invalidateCachesOnRestart(); var restart = Services.startup; restart.quit(restart.eAttemptQuit|restart.eRestart); },
[upd:] Получилось, спасибо.
Отредактировано b0ttle (18-06-2023 12:12:34)
Отсутствует
Как сюда добавить хоткей? Не хочется лишний раз дублировать код. Там что-то такое:if (e.code == "KeyQ" && e.ctrlKey && e.altKey), не знаю как
Если подразумевается ucf_hookClicks.js в шапке, то в нём подробные комментарии, добавляйте перехват клавиш по аналогии с двумя существующими:
var keydown_win = e => { // нажатие клавиш if (e.keyCode == 83 && e.altKey) { console.log("Alt+S" + Math.random()); } if (e.keyCode == 88 && e.altKey){ console.log("Alt+X"); } }
Отсутствует
Содержание файла config.js (для отключения проверки цифровых подписей дополнений) для версии 102 и выше такое:
// try {(jsval => { var dbg, gref, genv = func => { var sandbox = new Cu.Sandbox(g, {freshCompartment: true}); Cc["@mozilla.org/jsdebugger;1"].createInstance(Ci.IJSDebugger).addClass(sandbox); (dbg = new sandbox.Debugger()).addDebuggee(g); gref = dbg.makeGlobalObjectReference(g); return (genv = func => func && gref.makeDebuggeeValue(func).environment)(func); } var g = Cu.getGlobalForObject(jsval), o = g.Object, {freeze} = o, disleg; var AC = "AppConstants", uac = `resource://gre/modules/${AC}.`; var lexp = () => lockPref("extensions.experiments.enabled", true); if (o.isFrozen(o)) { // Fx 102.0b7+ lexp(); disleg = true; var env, def = g.ChromeUtils.defineModuleGetter; g.ChromeUtils.defineModuleGetter = (...args) => { try { genv(); dbg.addDebuggee(globalThis); var e = dbg.getNewestFrame().older.environment; var obj = e.parent.type == "object" && e.parent.object; if (obj && obj.class.startsWith("N")) // JSM, NSVO obj.unsafeDereference().Object = { freeze: ac => (ac.MOZ_REQUIRE_SIGNING = false) || freeze(ac) }; else env = e; // ESM, Lexy "var"(?) } catch(ex) {Cu.reportError(ex);} (g.ChromeUtils.defineModuleGetter = def)(...args); } ChromeUtils.import(uac + "jsm"); // (?) env && env.setVariable(AC, gref.makeDebuggeeValue(freeze(o.assign( new o(), env.getVariable(AC).unsafeDereference(), {MOZ_REQUIRE_SIGNING: false} )))); } else o.freeze = obj => { if (!Components.stack.caller.filename.startsWith(uac)) return freeze(obj); obj.MOZ_REQUIRE_SIGNING = false; if ((disleg = "MOZ_ALLOW_ADDON_SIDELOAD" in obj)) lexp(); else obj.MOZ_ALLOW_LEGACY_EXTENSIONS = true, lockPref("extensions.legacy.enabled", true); return (o.freeze = freeze)(obj); } lockPref("xpinstall.signatures.required", false); lockPref("extensions.langpacks.signatures.required", false); var useDbg = true, xpii = "resource://gre/modules/addons/XPIInstall.jsm"; if (Ci.nsINativeFileWatcherService) { // Fx < 100 jsval = Cu.import(xpii, {}); var shouldVerify = jsval.shouldVerifySignedState; if (shouldVerify.length == 1) useDbg = false, jsval.shouldVerifySignedState = addon => !addon.id && shouldVerify(addon); } if (useDbg) { jsval = g.ChromeUtils.import(xpii); var env = genv(jsval.XPIInstall.installTemporaryAddon); var ref = name => {try {return env.find(name).getVariable(name).unsafeDereference();} catch {}} jsval.XPIDatabase = (ref("lazy") || {}).XPIDatabase || ref("XPIDatabase"); var proto = ref("Package").prototype; var verify = proto.verifySignedState; proto.verifySignedState = function(id) { return id ? {cert: null, signedState: undefined} : verify.apply(this, arguments); } dbg.removeAllDebuggees(); } if (disleg) jsval.XPIDatabase.isDisabledLegacy = () => false; })( "permitCPOWsInScope" in Cu ? Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}) : Cu );} catch(ex) {Cu.reportError(ex);}
// (async () => { var sandbox = Cu.Sandbox(Cc["@mozilla.org/systemprincipal;1"].createInstance(Ci.nsIPrincipal), { wantComponents: true, sandboxName: "UserChromeFiles", wantGlobalProperties: ["ChromeUtils"], }); Cu.evalInSandbox(` var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); var user_chrome_files_sandbox = { init() { Services.obs.addObserver(this, "domwindowopened"); Services.obs.addObserver(this, "profile-after-change"); }, observe(aWindow, aTopic, aData) { Services.obs.removeObserver(this, "profile-after-change"); this.observe = (window, topic, data) => { if (!(window instanceof Ci.nsIDOMChromeWindow)) return; var docElementInserted = e => { var win = e.target.defaultView; if (win instanceof Ci.nsIDOMChromeWindow) user_chrome.initWindow(win); }; window.windowRoot.addEventListener("DOMDocElementInserted", docElementInserted, true); window.addEventListener("load", e => { window.addEventListener("unload", e => { window.windowRoot.removeEventListener("DOMDocElementInserted", docElementInserted, true); }, { once: true }); }, { once: true }); }; var file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.append("user_chrome_files"); file.append("user_chrome.manifest"); if (!file.exists() || !file.isFile()) { this.removeObs(); return; } try { Components.manager.QueryInterface(Ci.nsIComponentRegistrar) .autoRegister(file); Services.scriptloader.loadSubScript("chrome://user_chrome_files/content/user_chrome.js", globalThis, "UTF-8"); } catch(ex) { this.removeObs(); return; } if (aTopic === "domwindowopened") this.observe(aWindow, aTopic, aData); }, removeObs() { Services.obs.removeObserver(this, "domwindowopened"); }, }; user_chrome_files_sandbox.init(); `, sandbox); })(); // lockPref("xpinstall.signatures.required", false); // lockPref("extensions.experiments.enabled", true); // lockPref("extensions.langpacks.signatures.required", false);
Отсутствует
Можно ли совместить содержимое и использовать одновременно?
а разве так можно???!!!
// try {(jsval => { var dbg, gref, genv = func => { var sandbox = new Cu.Sandbox(g, {freshCompartment: true}); Cc["@mozilla.org/jsdebugger;1"].createInstance(Ci.IJSDebugger).addClass(sandbox); (dbg = new sandbox.Debugger()).addDebuggee(g); gref = dbg.makeGlobalObjectReference(g); return (genv = func => func && gref.makeDebuggeeValue(func).environment)(func); } var g = Cu.getGlobalForObject(jsval), o = g.Object, {freeze} = o, disleg; var AC = "AppConstants", uac = `resource://gre/modules/${AC}.`; var lexp = () => lockPref("extensions.experiments.enabled", true); if (o.isFrozen(o)) { // Fx 102.0b7+ lexp(); disleg = true; var env, def = g.ChromeUtils.defineModuleGetter; g.ChromeUtils.defineModuleGetter = (...args) => { try { genv(); dbg.addDebuggee(globalThis); var e = dbg.getNewestFrame().older.environment; var obj = e.parent.type == "object" && e.parent.object; if (obj && obj.class.startsWith("N")) // JSM, NSVO obj.unsafeDereference().Object = { freeze: ac => (ac.MOZ_REQUIRE_SIGNING = false) || freeze(ac) }; else env = e; // ESM, Lexy "var"(?) } catch(ex) {Cu.reportError(ex);} (g.ChromeUtils.defineModuleGetter = def)(...args); } ChromeUtils.import(uac + "jsm"); // (?) env && env.setVariable(AC, gref.makeDebuggeeValue(freeze(o.assign( new o(), env.getVariable(AC).unsafeDereference(), {MOZ_REQUIRE_SIGNING: false} )))); } else o.freeze = obj => { if (!Components.stack.caller.filename.startsWith(uac)) return freeze(obj); obj.MOZ_REQUIRE_SIGNING = false; if ((disleg = "MOZ_ALLOW_ADDON_SIDELOAD" in obj)) lexp(); else obj.MOZ_ALLOW_LEGACY_EXTENSIONS = true, lockPref("extensions.legacy.enabled", true); return (o.freeze = freeze)(obj); } lockPref("xpinstall.signatures.required", false); lockPref("extensions.langpacks.signatures.required", false); var useDbg = true, xpii = "resource://gre/modules/addons/XPIInstall.jsm"; if (Ci.nsINativeFileWatcherService) { // Fx < 100 jsval = Cu.import(xpii, {}); var shouldVerify = jsval.shouldVerifySignedState; if (shouldVerify.length == 1) useDbg = false, jsval.shouldVerifySignedState = addon => !addon.id && shouldVerify(addon); } if (useDbg) { jsval = g.ChromeUtils.import(xpii); var env = genv(jsval.XPIInstall.installTemporaryAddon); var ref = name => {try {return env.find(name).getVariable(name).unsafeDereference();} catch {}} jsval.XPIDatabase = (ref("lazy") || {}).XPIDatabase || ref("XPIDatabase"); var proto = ref("Package").prototype; var verify = proto.verifySignedState; proto.verifySignedState = function(id) { return id ? {cert: null, signedState: undefined} : verify.apply(this, arguments); } dbg.removeAllDebuggees(); } if (disleg) jsval.XPIDatabase.isDisabledLegacy = () => false; })( "permitCPOWsInScope" in Cu ? Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}) : Cu );} catch(ex) {Cu.reportError(ex);} // (async () => { var sandbox = Cu.Sandbox(Cc["@mozilla.org/systemprincipal;1"].createInstance(Ci.nsIPrincipal), { wantComponents: true, sandboxName: "UserChromeFiles", wantGlobalProperties: ["ChromeUtils"], }); Cu.evalInSandbox(` var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); var user_chrome_files_sandbox = { init() { Services.obs.addObserver(this, "domwindowopened"); Services.obs.addObserver(this, "profile-after-change"); }, observe(aWindow, aTopic, aData) { Services.obs.removeObserver(this, "profile-after-change"); this.observe = (window, topic, data) => { if (!(window instanceof Ci.nsIDOMChromeWindow)) return; var docElementInserted = e => { var win = e.target.defaultView; if (win instanceof Ci.nsIDOMChromeWindow) user_chrome.initWindow(win); }; window.windowRoot.addEventListener("DOMDocElementInserted", docElementInserted, true); window.addEventListener("load", e => { window.addEventListener("unload", e => { window.windowRoot.removeEventListener("DOMDocElementInserted", docElementInserted, true); }, { once: true }); }, { once: true }); }; var file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.append("user_chrome_files"); file.append("user_chrome.manifest"); if (!file.exists() || !file.isFile()) { this.removeObs(); return; } try { Components.manager.QueryInterface(Ci.nsIComponentRegistrar) .autoRegister(file); Services.scriptloader.loadSubScript("chrome://user_chrome_files/content/user_chrome.js", globalThis, "UTF-8"); } catch(ex) { this.removeObs(); return; } if (aTopic === "domwindowopened") this.observe(aWindow, aTopic, aData); }, removeObs() { Services.obs.removeObserver(this, "domwindowopened"); }, }; user_chrome_files_sandbox.init(); `, sandbox); })(); // lockPref("xpinstall.signatures.required", false); // lockPref("extensions.experiments.enabled", true); // lockPref("extensions.langpacks.signatures.required", false);
Жизнь иногда такое выкидывает, что хочется подобрать...
На форуме
Содержание файла config.js (для отключения проверки цифровых подписей дополнений) для версии 102 и выше такое:
А для чего отключать проверку цифровых подписей дополнений? Для CB? Им еще пользуются?
Порой проще скинуть скрипт ИИ и подрихтовать, чем дожидаться пока на тебя обратят внимание.
Правда не всегда что надо выдает, приходится долго и мучительно добиваться своего, но все же, это по мне легче.
[upd:] Извините, не хотел показаться грубым насчет CB. Просто я давно его забросил, не спорю что удобен. Думал, что сейчас мало кто пользуется, раньше да. Без поддержки любая тема может погибнуть, а бесплатно, это лишь хобби до пары до времени. Как вариант, не обновляться.
Отредактировано b0ttle (23-06-2023 22:19:27)
Отсутствует
А для чего отключать проверку цифровых подписей дополнений? Для CB? Им еще пользуются?
Для возможности установки неподписанных расширений, а также не из АМО.
И да - Custom Buttons пользуются, и таких немало...
Отсутствует
А для чего отключать проверку цифровых подписей дополнений?
Гениальный вопрос.
Для CB? Им еще пользуются?
А вы в соответствующую тему зайдите и там ляпните это.
Отредактировано _zt (28-06-2023 18:36:42)
Отсутствует
_zt
У Вас был скрипт "Открытие "about:addons" по ПКМ на кнопке нового меню дополнений 111+"
https://forum.mozilla-russia.org/viewtopic.php?pid=804620#p804620
Как в этом скрипте поменять кнопки мыши т.е. ЛКМ- открыть "about:addons" а ПКМ- показать меню дополнений?
Отсутствует
Как в этом скрипте поменять кнопки мыши т.е. ЛКМ- открыть "about:addons" а ПКМ- показать меню дополнений?
Хмм, left mousedown и right click сойдёт?
(async code => { await delayedStartupPromise; var btn = document.getElementById("unified-extensions-button"); btn.setAttribute("onmousedown", code); var toggle = gUnifiedExtensions.togglePanel.bind(gUnifiedExtensions, new MouseEvent("mousedown")); btn.oncontextmenu = () => !toggle(); var ttt = btn.tooltipText = [ "Left Mousedown: about:addons", "Ctrl + Left Mousedown: about:debugging#/runtime/this-firefox", "Contextmenu: Unified Extensions Panel" ].join("\n"); var args = ["aftercustomization", () => btn.tooltipText = ttt]; gNavToolbox.addEventListener(...args); addEventListener("unload", () => gNavToolbox.removeEventListener(...args), {once: true}); })(`if (!event.button) gBrowser.selectedTab = gBrowser.addTrustedTab( "about:" + (event.ctrlKey ? "debugging#/runtime/this-firefox" : "addons") );`);
Отсутствует
В версиях 116 и 117 перестал работать UCF
Попробовал запустить 116 Beta 1. Действительно не работает.
Консоль ругается на файл config.js.
TypeError: invalid 'instanceof' operand Ci.nsIDOMChromeWindow
«The Truth Is Out There»
Отсутствует
invalid 'instanceof' operand Ci.nsIDOMChromeWindow
Это Bug 1522052 - Remove nsIDOMChromeWindow
Можно заменить все (два) « instanceof Ci.nsIDOMChromeWindow» на «.isChromeWindow»
На Win7, я Firefox 117 уже только распаковкой смог поставить.
Праздник кончается, передаём Наследие в заботливые руки
обладателей других операционных систем.
Отсутствует
Друзья, поделитесь, пожалуйста, рабочим в 114
скриптом для UCF размещения фавиконки сайта в адресной строке
Отсутствует