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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№137616-04-2024 18:04:32

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V.
На мой взгляд самое логичное место для одиночного файла пользовательских настроек (CustomStylesScripts.mjs) это корень user_chrome_files. Сейчас надо слишком много щелчков мыши в проводнике сделать, что бы перейти от одного файла к другому, а потом возможно еще и обратно.
   
custom_script_all_win.js и custom_script_win.js используются для тестирования скриптов, перед тем как создать файл скрипта и прописать его нормально. Я б не стал их убирать, это никакого профита не принесет.
   
Я бы создал папочки под скрипты, например: "Background", "DOMContentLoaded_all", "DOMContentLoaded_child", "DOMContentLoaded_win", "DOMWindowCreated_child", "Load_all","Load_win", "Pageshow_child". Чтоб они одной кучей не лежали затрудняя поиск нужного. В этом случае можно вообще CustomStylesScripts.mjs ликвидировать и сделать автозагрузку скриптов из соответствующих папок или оставить только CustomStyles.mjs, или стили тоже сделать с автозагрузкой, только уже из соответствующих файлов. Или не автозагрузку, а кнопку/окно с меню лежащих в папках скриптов. Закинул в папку скрипт и включил галку в браузере.

Отсутствует

 

№137716-04-2024 18:27:33

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

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

Т.е. в папке chrome две папки UserChromeFiles ?

Да-да, именно две.


Новоначальный (if any) — разворачивает обе две.
Обновляющийся — заменяет только вторую.

или можно вообще убрать

Не надо ничего нигде убирать.


Идея была услышана, рассмотрена, прикинута, и отвергнута.
Это совершенно нормально, на то оно и обсуждение.


Продолжаем так, как оно есть сейчас,
ещё не хватало чего-то поперёк здорового консерватизма.

Отсутствует

 

№137816-04-2024 23:09:03

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

Re: UCF - ваши кнопки, скрипты…

выглядит красиво
rebuild_userChrome.png

Отсутствует

 

№137917-04-2024 00:34:23

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 125.0

Re: UCF - ваши кнопки, скрипты…

_zt пишет

самое логичное место для одиночного файла пользовательских настроек (CustomStylesScripts.mjs) это корень user_chrome_files

Да возможно так и сделаю это уже мелочи, в принципе и сами можете в двух местах пути подправить в user_chrome.js и StylesScriptsChild.mjs

_zt пишет

сделать автозагрузку скриптов

Нет этого делать не буду, это может задерживать запуск [firefox] не случайно же даже для userChrome.css userContent.css сделали настройку чтобы не искать файлы в директории

_zt пишет

Или не автозагрузку, а кнопку/окно с меню лежащих в папках скриптов. Закинул в папку скрипт и включил галку в браузере

Я не любитель gui там где это не к чему, не потому что это сложно сделать, хотя и это тоже это вам не userChromeJS (или как там называется) где одинаковые оконные скрипты по одному событию загружаются и все. Так что кому нужны gui, автозакрузки ищите замену если найдете

Отредактировано Vitaliy V. (17-04-2024 00:38:04)

Отсутствует

 

№138017-04-2024 01:19:02

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

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

и каким образом оконный скрипт увидит globalThis background скрипта (если UcfPrefs.customSandbox не использовать)

globalThis[Symbol.for('UcfGlob')] = this.UcfGlob; - общие функции в scriptsbackground:
UcfGlob = Cu.getGlobalForObject(Cu)[Symbol.for("UcfGlob")]; // код оконного скрипта из scriptschrome:

Так Dumby подсказал: надо что-то в SystemGlobal добавить, чтобы с других мест вызывать.
Я пробовал делать общий объект в background скрипте через UcfPrefs.customSandbox, но не получилось:
оконный скрипт выдаёт undefined

Отсутствует

 

№138117-04-2024 01:51:02

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 125.0

Re: UCF - ваши кнопки, скрипты…

Dobrov
ES модули и background скрипты загруженные в песочницу не одно и тоже, в песочнице globalThis не равно Cu.getGlobalForObject(Cu)
а UcfPrefs.customSandbox дает ссылку именно на песочницу, надеюсь теперь понятно

Отсутствует

 

№138217-04-2024 11:12:47

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

не случайно же даже для userChrome.css userContent.css сделали настройку чтобы не искать файлы в директории

Я что то пропустил, что за настройка? А, типа что б только по импорту в основных файлах?

Отредактировано _zt (17-04-2024 11:14:13)

Отсутствует

 

№138317-04-2024 12:06:37

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 125.0

Re: UCF - ваши кнопки, скрипты…

_zt пишет

Я что то пропустил, что за настройка?

Наверняка знаете давно сделали toolkit.legacyUserProfileCustomizations.stylesheets не помню с какой версии

Отсутствует

 

№138417-04-2024 13:22:31

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

Re: UCF - ваши кнопки, скрипты…

Bug 1541233 - Stop loading userContent.css or userChrome.css by default unless a preference is set

Status: RESOLVED FIXED
Milestone: mozilla69

Отсутствует

 

№138517-04-2024 15:42:54

brake
Участник
 
Группа: Members
Зарегистрирован: 05-05-2022
Сообщений: 14
UA: Firefox 125.0

Re: UCF - ваши кнопки, скрипты…

Dummy

Bug 1880914  Move Browser* helper functions used from global menubar and similar commands to a single object in a separate file, loaded as-needed

What is the relplacement of  BrowserReloadSkipCache() in the latest version

Edit: I searched through the code at searchfox.org, may be  this can work.

Выделить код

Код:

BrowserCommands.reloadWithFlags(Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE)

Отредактировано brake (17-04-2024 16:08:16)

Отсутствует

 

№138618-04-2024 02:04:44

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

Re: UCF - ваши кнопки, скрипты…

brake пишет

Bug 1880914

этот баг закрыт и он 2020 года.
P.S. тут вообще-то обсуждение скриптов, кнопок… Нужно отдельную тему создать для багов и особенностей версий Firefox!

Отсутствует

 

№138718-04-2024 09:25:07

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

Re: UCF - ваши кнопки, скрипты…

Dobrov пишет

тут вообще-то обсуждение скриптов

Это оно и было, разве нет?

он 2020 года

Откуда ты такое взял?
2024-02-19 15:29 PST

Отсутствует

 

№138818-04-2024 14:54:01

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 127.0

Re: UCF - ваши кнопки, скрипты…

Dumby
В [nightly] окно управления куками не вызывается, вообще [nightly] падает.

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

Выделить код

Код:

// https://forum.mozilla-russia.org/viewtopic.php?pid=788786#p788786
// Для custom_script.js в user_chrome_files
try {CustomizableUI.createWidget({
	label: "Пароли / Cookies",
	tooltiptext: "ЛКМ: Показать пароли\nПКМ: Показать cookies",
	id: "ucf-logins-sitedata",
	localized: false,
	onCreated(btn) {
		btn._handleClick = btn.oncontextmenu = e => this.view(e, btn.ownerGlobal);
		btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAADo0lEQVR42pWUf0idVRzGP+d4vVfbFFeu/SErV1bUBiI6ivajUcEiiiBoaTEEo7Lsj2W1P6Q2xFiL0Qp0q/7pB2GLijZGG/aDSPuBxBbkGm3O7IJuRJmod+t6r+89p+d9b6TWhu17uefe97zn+5zn+3yfcwznCz9e7c2S5fr3i8Ec5yLCzHtq96txdGNZSoE+a8mxgRG2cx/t5uTFAd7u17GOPrbl9oDdibGjdPgrtOIlwd7TtI2aN8zCbGcBn/dJJb7LdtP2n1XP+Q8Z+a2St5bVzVPmlPInBVKHnw/Y7tdr7OE7yjhksnM2sTxrHJ/7Sr0booIbaDSDeC9pjec8EQH6TdRzgofNALddqBR/HWNU84B5n0+j533EWcYKKZwyjZyZz/BJ36XxVkrpZPDnOMUJy4xmCmOSsxDSZwPKrtylhjXwqtnvR3mGczxBwOXEbIaU+4YMLWYNSUPTcA9pt1GLFQEUFek3fBCQE6oNp204NUXvWIUfrGsmyS6mNV/bo+F6bfg0HP/gNHWsMmwaDCKLhGGtwwks5mweKcS2OawrYOJchz9Y08ExsjgxTweOm/pNhhvD3YPE+B0JPv5kh2HzcEogi0XOEQtfCcxGdKeEWRqRDfHHf7/L71hjuYSDpFVFThQvXeGpOkqaJa6YPsPXt/xqaBhWoitRWi4PmFH2oja6K3fyYLILm20hq6ljRzb6vfUZyvmS6bi2KTBk0lpaDtVbHGO9hhOf/WFoTKaEIoaiFdO6YMZhF9fyzvIBGpJ3knOHKEy8RnfFY35AJnexVn1d1FAn/81MezUklC3Bn7wSAk4JpYRpARa5nMovJBv7iKnE/ZS508RzX/B2ZYP/kRcFslXsQq3lQSeHSPrY338X5Yaoyq6eZZgVYFyAQUbtLe7lK1fP0p+2cvTuVn9SzNK05hsVWslGWNhgMqqqwB0W10fN1fLkPxo6aRjHRQydPUV31bWRgb+3ezT/ePiGbNwSm56Uo/qY4GW1bUgbeXMvo7PG3jw8KcDSqMs2ZBgaMPYm+65qkoFfV+IjODVBFlUFlkTwgrmGNi4QAkz6yHuhP0JtstYwemaV79xQBdkDcnq+UiffpYNmbuY9Y0jNOZQS0My5HJpGugTYooLziamz8EP/Wn/4oRpm4p1IAbl4QjrtNytp+n/XV/PYSpV5GaYge2RvSXHtt/JaGVsk9O6o1BKekuC7FwKbfx/++3Y5oINvdFBzGsvpN+uj07tg/AUtF37/2LRsMgAAAABJRU5ErkJggg==");
	},
	view(e, win) {
		if (e && (e.ctrlKey || e.shiftKey)) return;

		var uri = win.gBrowser.selectedBrowser.currentURI;
		try {
			var url = win.ReaderMode.getOriginalUrl(uri.spec);
			if (url) uri = Services.io.newURI(url);
		} catch {}

		try {var tld = Services.eTLD.getBaseDomain(uri);}
		catch {var tld = uri.asciiHost;}
		e ? this.viewCookies(tld, win) : this.viewPasswords(tld, uri, win);
		return false;
	},
	viewPasswords(tld, uri, win) {
		try {
			tld = Services.io.newURI(`${uri.scheme}://${tld}`).displayHost;
		} catch {}

		var params = new win.URLSearchParams({...(tld && {filter: tld})});
		var gb = win.gBrowser;
		var separator = params.toString() ? "?" : "";
		var tabToSelect, url = `about:logins${separator}${params}`;

		for (var tab of gb.visibleTabs) {
			var {spec} = tab.linkedBrowser.currentURI;
			if (!spec.startsWith("about:logins")) continue;

			if (spec != url) {
				var pending = tab.hasAttribute("pending");
				if (pending) gb.selectedTab = tab;
				tab.linkedBrowser.fixupAndLoadURIString(
					url, {triggeringPrincipal: tab.nodePrincipal}
				);
				if (pending) return;
			}
			tabToSelect = tab;
			break;
		}
		gb.selectedTab = tabToSelect || gb.addTrustedTab(url);
	},
	async viewCookies(tld, window) {
		var wt = "Browser:SiteDataSettings";
		var win = Services.wm.getMostRecentWindow(wt);

		if (!win) {
			await window.SiteDataManager.updateSites();
			var url = "chrome://browser/content/preferences/dialogs/siteDataSettings.xhtml";

			var id = "SiteDataSettingsDialog", xs = Services.xulStore;
			var x = xs.getValue(url, id, "screenX") || 0;
			var y = xs.getValue(url, id, "screenY") || 0;

			var features = "chrome,dialog=no,resizable," + (
				x || y ? `screenX=${x},screenY=${y}` : "centerscreen"
			);
			win = window.openDialog(url, wt, features);

			//var xenoWin = win.document.readyState == "complete"; // ???

			var e = await new Promise(resolve =>
				win.windowRoot.addEventListener("DOMContentLoaded", resolve, {once: true})
			);
			e.target.documentElement.setAttribute("windowtype", wt);
		}
		var doc = win.document;
		doc.documentElement.setAttribute("persist", "screenX screenY width height");

		var sb = doc.querySelector("#searchBox");
		sb.inputField.setUserInput(tld);
		setTimeout(() => sb.editor.selection.collapseToEnd(), 50);
		win.focus();
	}
});} catch(ex) {Cu.reportError(ex);}


Vitaliy V.
В ATB такая же история, новый уже поставил.
А этот скрипт нормально работает, первый спойлер. Точнее, такой вариант:
скрытый текст

Выделить код

Код:

(this.viewcookieswithrightclick = {
            init(that) {
                var star = this.star = document.querySelector("#star-button-box");
                if (!star)
                    return;
                star.addEventListener("contextmenu", this, true);
                star.addEventListener("click", this, true);
                that.unloadlisteners.push("viewcookieswithrightclick");
            },
            handleEvent(e) {
                if (e.button != 2)
                    return;
                e.preventDefault();
                e.stopPropagation();
                e.stopImmediatePropagation();
                if (e.type != "click")
                    return;
                this.viewCookies();
            },
            getETDL(uri) {
                var eTLD = "";
                try {
                    eTLD = Services.eTLD.getBaseDomain(uri);
                } catch (e) {
                    try {
                        eTLD = uri.asciiHost;
                    } catch (e) {}
                }
                return eTLD;
            },
            async viewCookies() {
                var sds = "chrome://ucfsdswnd/content/sds.xhtml";
                var type = "Browser:SiteDataSettings", g = Cu.getGlobalForObject(Cu);
                if (!Object.hasOwn(g, sds)) {
                    var xhtml = (await (await fetch("chrome://browser/content/preferences/dialogs/siteDataSettings.xhtml")).text())
                        .replace(/(persist=".+)"/, `$1 screenX screenY sizemode" windowtype="${type}"`);
                    g[sds] = Cc["@mozilla.org/addons/addon-manager-startup;1"]
                        .getService(Ci.amIAddonManagerStartup).registerChrome(
                            Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)),
                            [["override", sds, "data:application/xhtml+xml," + encodeURIComponent(xhtml)]]
                        );
                }
                (this.viewCookies = async () => {
                    var uri = gBrowser.selectedBrowser.currentURI;
                    try {
                        let _uri = ReaderMode.getOriginalUrl(uri.spec);
                        if (_uri)
                            uri = Services.io.newURI(_uri);
                    } catch(e) {}
                    uri = this.getETDL(uri);
                    var _win = Services.wm.getMostRecentWindow(type);
                    await SiteDataManager.updateSites();
                    if (!_win)
                        await new Promise(resolve =>
                            (_win = openDialog(sds, type, "chrome,dialog=no,resizable"))
                                .addEventListener("DOMContentLoaded", resolve, {once: true})
                        );
                    else if ("_gSiteDataSettings" in _win)
                         _win._gSiteDataSettings();
                    else {
                        Services.scriptloader.loadSubScript("data:," + encodeURIComponent(`
                            var _gSiteDataSettings = gSiteDataSettings._gSiteDataSettings = (function() {
                                SiteDataManager.getSites().then(sites => {
                                    this._sites = sites;
                                    var sortCol = document.querySelector("treecol[data-isCurrentSortCol=true]");
                                    this._sortSites(this._sites, sortCol);
                                    this._buildSitesList(this._sites);
                                });
                            }).bind(gSiteDataSettings);
                            _gSiteDataSettings();
                            var updateSetInterval = setInterval(async () => {
                                await SiteDataManager.updateSites();
                                _gSiteDataSettings();
                            }, 5000);
                            let removeBtns = document.querySelectorAll("#removeSelected, #removeAll");
                            var updateClearInterval = () => {
                                clearInterval(updateSetInterval);
                                for (let btn of removeBtns)
                                    btn.removeEventListener("command", updateClearInterval);
                                updateClearInterval = null;
                            };
                            for (let btn of removeBtns)
                                btn.addEventListener("command", updateClearInterval);
                        `), _win);
                         _win.addEventListener("unload", () => {
                            _win.updateClearInterval?.();
                        }, { once: true });
                    }
                    _win.focus();
                    var filter = _win.document.getElementById("searchBox");
                    if (!filter) return;
                    filter.value = uri;
                    filter.focus();
                    filter.dispatchEvent(new _win.Event("input", { bubbles: true }));
                })();
            },
            destructor() {
                this.star.removeEventListener("contextmenu", this, true);
                this.star.removeEventListener("click", this, true);
            },
        }).init(this);


   
Dumby
Еще fileToBase64 не открывает обзор файлов в [nightly].

Отредактировано _zt (18-04-2024 19:48:35)

Отсутствует

 

№138918-04-2024 20:07:10

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 127.0

Re: UCF - ваши кнопки, скрипты…

Уже было, но на всякий случай продублирую.

"126+ Функция Ctrl+Shift+R по ПКМ на стандартной кнопке обновления страницы"

Выделить код

Код:

// 126+ Функция Ctrl+Shift+R по ПКМ на стандартной кнопке обновления страницы
// https://forum.mozilla-russia.org/viewtopic.php?pid=784200#p784200
try {
  (() => {
    var node = CustomizableUI.getWidget("stop-reload-button").forWindow(window).node.querySelector("#reload-button"),
    tooltipid = "reload-button-shortcut-tooltip", tooltiporig = node.tooltip;
    if (!document.querySelector(`#${tooltipid}`)) {
      document.querySelector("#dynamic-shortcut-tooltip").after(MozXULElement.parseXULToFragment(`
        <tooltip id="${tooltipid}">
          <description class="tooltip-label">ЛКМ  Обновить страницу (Ctrl+R)</description>
          <description class="tooltip-label">СКМ  Дублировать вкладку (Ctrl+ЛКМ)</description>
          <description class="tooltip-label">ПКМ  Обновить минуя кэш (Ctrl+Shift+R)</description>
        </tooltip>
      `));
    }
    node.tooltip = tooltipid;
    node.setAttribute("context", "false");
    var click = e => {
      if (e.button != 2) return;
      e.preventDefault();
      e.stopPropagation();
      e.stopImmediatePropagation();
       BrowserCommands.reloadSkipCache();
    };
    node.addEventListener("click", click);
    this.browsercommands.reloadskipcache = {
      destructor() {
        node.removeEventListener("click", click);
        node.tooltip = tooltiporig;
        node.removeAttribute("context");
      }
    };
    this.unloadlisteners.push("browsercommands.reloadskipcache");
  })();
} catch(e) {}

Добавлено 18-04-2024 20:30:52
Vitaliy V.
Можете этот скрипт для [nightly] переделать, не работает.

Отредактировано _zt (18-04-2024 20:30:52)

Отсутствует

 

№139018-04-2024 20:46:53

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

Re: UCF - ваши кнопки, скрипты…

_zt пишет

управления куками не вызывается, вообще [nightly] падает

Хмм, у меня, с этого окна — не падает.
127.0a1 (2024-04-17) (32-разрядный), но, правда, у меня и кук нет.


Однако, какой-то crash-жести, определённо, завезли целый вагон.
Поэтому, я пока пребываю в состоянии «да шло бы оно всё ...».

Еще fileToBase64 не открывает обзор файлов

[censored]


picker.init(win,
picker.init(win.browsingContext,

Отсутствует

 

№139118-04-2024 21:24:35

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 127.0

Re: UCF - ваши кнопки, скрипты…

Dumby
fileToBase64 ожил, спасибо.
А куки я скриптом из спойлера вызываю, просто все кнопки жмакал и вот нажмакал два падения, решил поделится.
ps^ Изменил

Выделить код

Код:

var x = xs.getValue(url, id, "screenX") || 100;
			var y = xs.getValue(url, id, "screenY") || 100;

и заработало! У меня размер экрана подделывается, это может быть связано?
   
Там уже 240418 выложили.

Отредактировано _zt (18-04-2024 21:26:45)

Отсутствует

 

№139219-04-2024 13:54:32

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 125.0

Re: UCF - ваши кнопки, скрипты…

_zt пишет

Vitaliy V.
Можете этот скрипт для [nightly] переделать, не работает.

Это тоже с BrowserCommands связано, добавил совместимость с [nightly]

Отсутствует

 

№139319-04-2024 14:28:08

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 127.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V.
Спасибо.

Отсутствует

 

№139420-04-2024 11:35:23

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 127.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V.
Поставил новый ATB, при вызове окна управлением кук браузер опять упал (я выше писал об этом). Изменил в нем строки

Выделить код

Код:

let sx = xs.getValue(url, id, "screenX") || 10;
            let sy = xs.getValue(url, id, "screenY") || 10;

Браузер больше не падает.

Отсутствует

 

№139520-04-2024 14:26:57

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 125.0

Re: UCF - ваши кнопки, скрипты…

_zt пишет

я выше писал об этом

Видел но у меня [nightly][linux][windows] не падает, скорее всего баг [nightly],
я так понял у вас не работает с параметром centerscreen
попробуйте заменить
let features = ...;
на
let features = "chrome,dialog=no,resizable,centerscreen";
а потом так например
let features = "chrome,dialog=no,resizable,screenX=10,screenY=10";


И удалить xulstore.json

Отредактировано Vitaliy V. (20-04-2024 14:34:49)

Отсутствует

 

№139620-04-2024 16:37:26

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

Re: UCF - ваши кнопки, скрипты…

Помогите решить задачу:
Кнопка не видит функции, прописанные перед CustomizableUI.createWidget(… ?
на первой строке меню ошибка: Uncaught ReferenceError is not defined


Если убрать «var», то код работает, но мусорит переменными в окно браузера.

Как «пробросить» нужные функции, которых много ? (BrowserReloadEx и прочие)

Выделить код

Код:

(async id => { // UserMenu

var BrowserReloadEx = (skip) =>{ // ошибка –> Uncaught ReferenceError is not defined
	if(parseInt(Services.appinfo.version) < 126)
		skip ? BrowserReloadSkipCache() : BrowserReload();
	else 
		skip ? BrowserCommands.reloadSkipCache() : BrowserCommands.reload();
},
G = { v: "permissions.default.image",
	Pref(key,set){key = [key];
		var t = Services.prefs.getPrefType(key[0]), m = {b:"Bool",n:"Int",s:"String"};
		t = m[t == 128 ? "b" : t == 64 ? "n" : t == 32 ? "s" : ""];
		if (!t) t = m[set != undefined ? (typeof set)[0] : (typeof key[1])[0]];
		if (t) if (set != undefined)
			Services.prefs[`set${t}Pref`](key[0],set)
		else
			set = Services.prefs[`get${t}Pref`](...key);
		return set;
	}
}

var MyMenu = { //имя курсивом: есть подсказка, обводка: изменяемые строки, alt() клик правой кнопкой
	Pics: { // Графика сайтов Вкл/Выкл permissions.default.image
		upd() { // обновлять сроку перед показом меню
			var s = G.Pref(G.v) == 1, i = "chrome://browser/skin/canvas-blocked.svg";
			this.label = `Графика страниц ${s ? "загружается" : G.Pref(G.v) == 3 ? "кроме сторонних" : "отключена"}`;
			this.image = s ? i.replace("-blocked","") : i;
			this.tooltipText = `${G.v} = ${G.Pref(G.v)}\nRClick – кроме сторонних`;
		},
		cmd(){
			BrowserReloadEx();
			G.Pref(G.v, G.Pref(G.v) == 2 ? 1 : 2);
		}
	},
	"SubMenu": { //сперва разделитель
		sep: 1, men: 1, //это подменю
		"Censor Tracker": {
			upd(){this.image = `chrome://devtools/skin/images/${G.Pref("network.proxy.type") == 2 ? "check" : "close"}.svg`}
		}
	}
}

CustomizableUI.getWidget(id)?.label || (self => CustomizableUI.createWidget(self = {id,
	id: id, label: id, tooltiptext: id, localized: false, defaultArea: CustomizableUI.AREA_NAVBAR,
	onCreated(btn) {
		btn.style.setProperty("list-style-image", "url(chrome://branding/content/icon32.png)");
		btn.type = "menu";
		var doc = btn.ownerDocument, m = nn => doc.createXULElement(nn);
		var popup = m("menupopup"), menu = m("menuitem");
		menu.m = m;
		menu.fill = this.fill;
		menu.render = this.render;
		popup.append(menu);
		btn.prepend(popup);
	},
	render(){
		var popup = this.parentNode;
		this.remove();
		this.fill(MyMenu, popup);
	},
	renderSub(){
		delete this.render;
		this.render();
		this.render = self.updSub;
		this.upd();
	},
	updSub(){
		this.parentNode.state.startsWith("c") || this.upd();
	},
	fill(o, popup){
		for (key in o){
			var val = o[key];
			if(typeof val != "object") continue;
			var {lab, inf, img, cmd, alt, sep, men, upd} = val;
			sep && popup.append(this.m("menuseparator"));
			var name = men ? "menu" : "menuitem";
			var item = this.m(name);
			item.setAttribute("label", lab || key);
			item.alt = alt; //RClick в ucf_hookClicks.js {Mouse…
			if (inf)
				item.tooltipText = inf, item.style.setProperty("font-style", "italic", "important");
			if(img || /this\.image.*=/.test(upd))
				item.className = name + "-iconic", item.setAttribute("image", img || "chrome://devtools/skin/images/blocked.svg");
			men || cmd && item.setAttribute("oncommand", cmd.toString().replace(
				/cmd\(.*?\){/, "{var trg = event.target || event;"));
			popup.append(item);
			if(upd){ //выделить обновляемый пункт меню
				item.style.filter = "drop-shadow(0.1px 1px 0.1px #c99)";
				if(item.renderedOnce) (item.render = upd).call(item);
				else item.upd = upd, item.render = self.renderSub;
			}
			men && this.fill(val, item.appendChild(this.m("menupopup")));
		}
	}
}))();

})("ucf_test_menu");

Отсутствует

 

№139720-04-2024 16:43:03

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 127.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V.
Первый вариант вызывает падения даже после удаления xulstore.json, а второй заработал без удаления. Я ранее xulstore.json уже несколько раз удалял за эти дни, тоже на него сразу подумал.
   
Еще есть проблема, которая возможно связана и которая меня больше волнует. Браузерные алерты теперь с заголовком, у меня они появляются тонкими (#alertTitleBox под этот заголовок уезжает и не весь #alertTextBox показывается) и с большим отступом от правого/нижнего края экрана. Причем если chrome://global/content/alerts/alert.xhtml открыть в строке адреса, то окно падает в правый угол правильно, вплотную к панели задач и правому краю экрана. Я чего то наколхозил, что в большинстве случаев приводит к нормальному отображению, но не меняет позицию алертов

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

Выделить код

Код:

@-moz-document url("chrome://global/content/alerts/alert.xhtml") {
:root {
    min-height: 216px !important;
    min-width: 400px !important;
}
#alertNotification {
    padding: 18px 16px 0 0 !important;
}
#alertTitleBox {
    font-size: 12px !important;
    color: #0074E8 !important;
    padding: 0 !important;
    margin: 0 !important;
}
#alertTextBox {
    min-width: 300px !important;
    font-weight: bold;
    flex-direction: row !important;
    align-items: center !important;
    justify-content: center !important;
    padding: 0 !important;
    margin: 0 !important;
}
#alertBox {
    box-shadow: rgba(10, 10, 12, 0.32) 0 0 5px !important;
}
@media (prefers-color-scheme: dark) {
#alertBox {
    border-color: #0074E8 !important;
    background-color: var(--menu-background-color, var(--arrowpanel-background, Field)) !important;
    color: var(--menu-color, var(--arrowpanel-color, FieldText)) !important;
}
}
/* !!! */
}

Нельзя ли алерты гвоздями (скриптом или стилем) прибить в правый нижний угол, над панелью задач?
   
up^ Закрыл сайдбар с TST, вызвал пару алертов и они сместились ближе к правому краю экрана, но не в край. На всякий случай отключил нижнюю панель UCF, но это результата не дало.

Отредактировано _zt (20-04-2024 16:51:01)

Отсутствует

 

№139821-04-2024 13:43:05

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 126.0

Re: UCF - ваши кнопки, скрипты…

Dobrov пишет

Кнопка не видит функции

Ну с cmd.toString() это не представляется возможным,
попробуй может заменить
item.setAttribute("oncommand", cmd.toString().replace(
                /cmd\(.*?\){/, "{var trg = event.target || event;"));
на
item.addEventListener("command", cmd);
Upd: нет так не пойдет в другом окне работать не будет,
зачем вообще в оконном скрипте делать CustomizableUI.createWidget ...
Вот если немного переделать для custom_script.js

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

Выделить код

Код:

(async id => { // UserMenu

    var BrowserReloadEx = (win, skip) =>{ // ошибка –> Uncaught ReferenceError is not defined
        if(parseInt(Services.appinfo.version) < 126)
            skip ? win.BrowserReloadSkipCache() : win.BrowserReload();
        else
            skip ? win.BrowserCommands.reloadSkipCache() : win.BrowserCommands.reload();
    };
    var G = {
		v: "permissions.default.image",
        Pref(key,set){key = [key];
            var t = Services.prefs.getPrefType(key[0]), m = {b:"Bool",n:"Int",s:"String"};
            t = m[t == 128 ? "b" : t == 64 ? "n" : t == 32 ? "s" : ""];
            if (!t) t = m[set != undefined ? (typeof set)[0] : (typeof key[1])[0]];
            if (t) if (set != undefined)
                Services.prefs[`set${t}Pref`](key[0],set)
            else
                set = Services.prefs[`get${t}Pref`](...key);
            return set;
        }
    };

    var MyMenu = { //имя курсивом: есть подсказка, обводка: изменяемые строки, alt() клик правой кнопкой
        Pics: { // Графика сайтов Вкл/Выкл permissions.default.image
            upd() { // обновлять сроку перед показом меню
                var s = G.Pref(G.v) == 1, i = "chrome://browser/skin/canvas-blocked.svg";
                this.label = `Графика страниц ${s ? "загружается" : G.Pref(G.v) == 3 ? "кроме сторонних" : "отключена"}`;
                this.image = s ? i.replace("-blocked","") : i;
                this.tooltipText = `${G.v} = ${G.Pref(G.v)}\nRClick – кроме сторонних`;
            },
            cmd(e){
                BrowserReloadEx(e.view);
                G.Pref(G.v, G.Pref(G.v) == 2 ? 1 : 2);
            }
        },
        "SubMenu": { //сперва разделитель
            sep: 1, men: 1, //это подменю
            "Censor Tracker": {
                upd(){this.image = `chrome://devtools/skin/images/${G.Pref("network.proxy.type") == 2 ? "check" : "close"}.svg`}
            }
        }
    };

    (self => CustomizableUI.createWidget(self = {
		id: id,
		label: id,
		tooltiptext: id,
		localized: false,
		defaultArea: CustomizableUI.AREA_NAVBAR,
        onCreated(btn) {
            btn.style.setProperty("list-style-image", "url(chrome://branding/content/icon32.png)");
            btn.type = "menu";
            var doc = btn.ownerDocument, m = nn => doc.createXULElement(nn);
            var popup = m("menupopup"), menu = m("menuitem");
            menu.m = m;
            menu.fill = this.fill;
            menu.render = this.render;
            popup.append(menu);
            btn.prepend(popup);
        },
        render(){
            var popup = this.parentNode;
            this.remove();
            this.fill(MyMenu, popup);
        },
        renderSub(){
            delete this.render;
            this.render();
            this.render = self.updSub;
            this.upd();
        },
        updSub(){
            this.parentNode.state.startsWith("c") || this.upd();
        },
        fill(o, popup){
            for (key in o){
                var val = o[key];
                if(typeof val != "object") continue;
                var {lab, inf, img, cmd, alt, sep, men, upd} = val;
                sep && popup.append(this.m("menuseparator"));
                var name = men ? "menu" : "menuitem";
                var item = this.m(name);
                item.setAttribute("label", lab || key);
                item.alt = alt; //RClick в ucf_hookClicks.js {Mouse…
                if (inf)
                    item.tooltipText = inf, item.style.setProperty("font-style", "italic", "important");
                if(img || /this\.image.*=/.test(upd))
                    item.className = name + "-iconic", item.setAttribute("image", img || "chrome://devtools/skin/images/blocked.svg");
                men || (item.cmd = cmd) && item.setAttribute("oncommand", "this.cmd(event);");
                popup.append(item);
                if(upd){ //выделить обновляемый пункт меню
                    item.style.filter = "drop-shadow(0.1px 1px 0.1px #c99)";
                    if(item.renderedOnce) (item.render = upd).call(item);
                    else item.upd = upd, item.render = self.renderSub;
                }
                men && this.fill(val, item.appendChild(this.m("menupopup")));
            }
        }
    }))();

})("ucf_test_menu");

_zt пишет

а второй заработал без удаления

Обновил расширение сделал без centerscreen все равно это не особо нужно, проверяйте

_zt пишет

Нельзя ли алерты гвоздями (скриптом или стилем) прибить в правый нижний угол, над панелью задач?

Ну возможно скриптом можно и то не всегда и не везде, зависит от оконного менеджера позволит он [firefox] перемещать окна или нет.
А что системные уведомления не проще включить, в [linux] они включены по умолчанию
alerts.useSystemBackend - true

Отредактировано Vitaliy V. (21-04-2024 15:50:07)

Отсутствует

 

№139921-04-2024 15:26:40

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
UA: Firefox 127.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V.
Спасибо за расширение.
   

Vitaliy V. пишет

А что системные уведомления не проще включить

Да я с удовольствием бы, но они мелькают ровно на секунду и в истории не сохраняются, хотя в настройках уведомлений Win, для Fx указано иное.

Добавлено 21-04-2024 15:38:29
Хотя, действительно, лучше включу системные.

Отредактировано _zt (21-04-2024 15:38:29)

Отсутствует

 

№140021-04-2024 16:59:07

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

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

попробуй заменить на item.addEventListener("command", cmd);

Я так переделал, и всё работает: item.onclick = cmd
Менюшка в оконном скрипте потому, что там весь основной код – перехват кликов и прочие функции.

Отсутствует

 

Board footer

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