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

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

№32630-05-2022 09:38:10

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

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

_zt пишет

Может обратную дешифровку сделать при "выводе" из скрипта?

Если именно при открытии вкладок, то можно так попробовать
(это если и для своего, и для сторонних форматов).

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

Выделить код

Код:

/*
		if (own)
			for(var ind = 3, arr = text.split("\n"), len = arr.length; ind < len; ind += 3)
				gb.addTrustedTab(arr[ind]);
		else {
			var urls = this.parse(text);
			if (urls?.size) for(var url of urls) gb.addTrustedTab(url);
		}
		if (!e.button && !e.shiftKey) gb.selectedTab = gb.visibleTabs[tl];
	},
*/
		if (own)
			for(var ind = 3, arr = text.split("\n"), len = arr.length; ind < len; ind += 3)
				gb.addTrustedTab(this.decode(arr[ind]));
		else {
			var urls = this.parse(text);
			if (urls?.size) for(var url of urls) gb.addTrustedTab(this.decode(url));
		}
		if (!e.button && !e.shiftKey) gb.selectedTab = gb.visibleTabs[tl];
	},
	decode: url => url.startsWith("data:") ? url : decodeURI(url),


А так-то, было бы неплохо самому Автору дополнения рассмотреть
возможность ограничения ширины списка адресов, а то у меня тут
попался data:… адрес, так окно расколбасило не просто «во все окно браузера по ширине»,
а далеко за пределы экрана, овер шестнадцать тысяч (!) пикселей.
Ну или пользовательский смирительный стиль какой-нибудь запилить.

Отсутствует

 

№32730-05-2022 23:23:42

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

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

Dumby
Спасибо, теперь нормально.
   

Dumby пишет

смирительный стиль

Ну так как то.

userContent.css

Выделить код

Код:

@-moz-document url-prefix(moz-extension://uuid) {
/* Не позволять растягивать дополнительные окна больше заданного размера */
.rich-confirm-dialog {
    max-width: 800px !important;
}
}

Отредактировано _zt (30-05-2022 23:26:37)

Отсутствует

 

№32831-05-2022 04:26:32

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

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

Dumby
[firefox] 101 в расширение add_toolbar_buttons.2021.9.5.xpi  от Vitaliy V. перестала полноценно работать кнопка Дополнения, не открывается список. Можешь поправить? Или хотя бы скрипт починить из этого расширения №9229?

Отредактировано voqabuhe (31-05-2022 05:32:01)

Отсутствует

 

№32931-05-2022 08:03:32

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

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

voqabuhe пишет

перестала полноценно работать кнопка Дополнения, не открывается список

ChromeUtils.import(…, null) сто лет как считался "не по понятиям".
Может замени в parent.js

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

Выделить код

Код:

/*
XPCOMUtils.defineLazyGetter(this, "GlobalManager", () => {
    const { GlobalManager } = ChromeUtils.import("resource://gre/modules/Extension.jsm", null);
    return GlobalManager;
});
*/
XPCOMUtils.defineLazyGetter(this, "GlobalManager", () =>
    ChromeUtils.import("resource://gre/modules/ExtensionParent.jsm").ExtensionParent.GlobalManager
);

Отсутствует

 

№33031-05-2022 08:44:26

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

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

Dumby

Dumby пишет

ChromeUtils.import(…, null) сто лет как считался "не по понятиям".
Может замени в parent.js

Гениально! Спасибо!

Отсутствует

 

№33131-05-2022 17:04:45

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

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

Dumby пишет

Может замени в parent.js
скрытый текст

Благодарю :beer:


Win7

Отсутствует

 

№33201-06-2022 01:36:31

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

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

Dumby
На [firefox] 102 превьюшки TST улетели в край экрана, можете поправить.

Отсутствует

 

№33301-06-2022 18:17:57

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

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

_zt пишет

можете поправить

Следуем за ними.

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

Выделить код

Код:

/*
			var z = win.windowUtils.screenPixelsPerCSSPixel;
*/
			var z = win.devicePixelRatio;

Отсутствует

 

№33402-06-2022 19:17:32

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

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

Dumby
Спасибо. Трудно самому такое найти, особенно когда не знаешь чего искать.
   
Этот скрипт не позволяет запустить [firefox] 102, если в scriptschrome: >> load:, а если в  scriptsallchrome: >> load: - крашит [firefox] при вызове соответствующего окна / панели (places\/bookmarksSidebar\.xhtml или places\/places\.xhtml).

Отсутствует

 

№33502-06-2022 21:19:50

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

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

_zt пишет

крашит

Ну да, я упоминал. Если грузить скрипт снаружи в объект
глобального системного объекта, то, на ранних бетах и найтли,
разрабы валят пользователю браузер.


Это не касается доживающих последние времена NSVO.
Но Cu.import() больше таковые не возвращает.


Пока сам Cu.import() ещё с нами, можно так попробовать

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

Выделить код

Код:

/*
	if (!g[key]) {
		Services.scriptloader.loadSubScript(
			`data:,this.${key}=TransactionsHistory.proxifiedToRaw;`, g
		);
		var raws = g[key];
*/
	var raws = g.TransactionsHistory?.proxifiedToRaw;
	if (raws) g = raws;
	if (!g[key]) {
		if (!raws) {
			Services.scriptloader.loadSubScript(
				`data:,this.${key}=TransactionsHistory.proxifiedToRaw;`, g
			);
			raws = g[key];
		}

Отсутствует

 

№33603-06-2022 00:10:35

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

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

Dumby
Работает, спасибо. Эта правка до esr доживет или неизвестно?

Отсутствует

 

№33703-06-2022 08:02:23

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

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

_zt пишет

до esr доживет или неизвестно?

Так 102 всё уже, готова. Почти весь отвал делается в Nightly.
Бывают, конечно, исключения, но это редкость.

Отсутствует

 

№33806-06-2022 11:54:42

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 101.0

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

В [firefox] 101 (может и раньше) отвалилась кнопка "Дополнения" из расширения Add Toolbar Buttons.
Была такая отдельно от 18.09.2020

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

Выделить код

Код:

try {(() => {
    var id = "ucf-aom-button",
    label = "Дополнения",
    tooltiptext = "ЛКМ: Меню дополнений\nShift+ЛКМ: Меню дополнений + открыть менеджер\nСКМ: Открыть менеджер дополнений",
    img = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='16' width='16' viewBox='0 0 48 48'><g><rect x='0' y='0' width='48' height='48' rx='3' ry='3' style='fill:rgb(0, 120, 173);'/><path style='opacity:0.25;fill:black;' d='M 24,4.5 18,12 3,23.7 12,32.7 3.9,44.1 7.8,48 H 45 C 46.7,48 48,46.7 48,45 V 26.1 L 34.8,12.9 31.8,12.3 Z'/><path style='fill:white;' d='M 19.88,3 C 16.93,3 14.55,4.662 14.55,6.701 14.63,7.474 15.11,8.438 15.37,8.762 16.59,10.41 16.59,11.44 16.29,12.06 H 6.299 C 4.476,12.06 3,13.53 3,15.35 V 23.68 C 3.625,24 4.65,24 6.299,22.77 6.625,22.52 7.587,22.02 8.363,21.94 10.4,21.94 12.06,24.35 12.06,27.29 12.06,30.24 10.4,32.65 8.363,32.65 7.725,32.63 6.774,32.07 6.299,31.82 4.65,30.59 3.625,30.59 3,30.91 V 41.71 C 3,43.53 4.476,45 6.299,45 H 19.58 C 19.88,44.38 19.88,43.35 18.65,41.71 18.4,41.38 17.91,40.42 17.82,39.65 17.82,37.6 20.23,35.94 23.18,35.94 26.14,35.94 28.55,37.6 28.55,39.65 28.53,40.28 27.97,41.23 27.71,41.71 26.47,43.35 26.47,44.38 26.79,45 H 32.65 C 34.47,45 35.96,43.53 35.96,41.71 V 32.55 C 36.56,32.23 37.59,32.23 39.23,33.47 39.72,33.73 40.68,34.29 41.29,34.29 43.35,34.29 45,31.91 45,28.94 45,25.99 43.35,23.59 41.29,23.59 40.54,23.67 39.58,24.17 39.23,24.41 37.59,25.65 36.56,25.65 35.96,25.33 V 15.35 C 35.96,13.53 34.47,12.06 32.65,12.06 H 23.49 C 23.19,11.44 23.19,10.41 24.41,8.762 24.66,8.287 25.22,7.337 25.23,6.713 25.23,4.662 22.85,3 19.88,3' /></g></svg>",
    checked = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='16' width='16'><path d='M 4,5 7.5,8.5 12,4 V 8 L 8,12 H 7 L 4,9 Z' style='fill:white'/></svg>",
    show_version = true,
    show_description = true,
    user_permissions = true,
    show_hidden = true,
    show_disabled = true,
    enabled_first = true,
    exceptions_listset = new Set([

    ]);
    exceptions_type_listset = new Set([

    ]);
    if (!("AddonManager" in this))
        ChromeUtils.defineModuleGetter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
    if (!("GlobalManager" in this))
        XPCOMUtils.defineLazyGetter(this, "GlobalManager", () => {
            const { GlobalManager } = ChromeUtils.import("resource://gre/modules/Extension.jsm", null);
            return GlobalManager;
        });
    var extensionOptionsMenu = {
        get alertsService() {
            delete this.alertsService;
            return this.alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
        },
        get clipboardHelp() {
            delete this.clipboardHelp;
            return this.clipboardHelp = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
        },
        get exceptions_type_listarr() {
            delete this.exceptions_type_listarr;
            var arr = ["extension", "theme", "locale", "dictionary"];
            if (!exceptions_type_listset.size)
                return this.exceptions_type_listarr = arr;
            return this.exceptions_type_listarr = arr.filter(type => !exceptions_type_listset.has(type));
        },
        populateMenu: async function(e) {
            var popup = e.target, doc = e.view.document;
            var addons = await AddonManager.getAddonsByTypes(this.exceptions_type_listarr);
            var addonsMap = new WeakMap(),
            setAttributesMenu = (mi, addon, extension) => {
                var permissions, uuid,
                props = {
                    label: `${addon.name}${show_version ? ` ${addon.version}` : ""}`,
                    class: "menuitem-iconic",
                    tooltiptext: `${(show_description && addon.description) ? `${addon.description}\n` : ""}ID: ${addon.id}${addon.isActive && (uuid = extension?.uuid) ? `\nUUID: ${uuid}` : ""}${(user_permissions && (permissions = addon.userPermissions?.permissions)?.length) ? `\nРазрешения: ${permissions.join(", ")}` : ""}\n${addon.optionsURL ? "\nЛКМ: Настройки" : ""}\nCtrl+ЛКМ: Копировать ID${uuid ? "\nShift+ЛКМ: Копировать UUID" : ""}${addon.creator?.url ? "\nCtrl+Shift+ЛКМ: Автор" : ""}${addon.homepageURL ? "\nСКМ: Домашняя страница" : ""}${!addon.isBuiltin ? "\nCtrl+СКМ: Просмотр источника" : ""}\nShift+СКМ: Просмотр источника во вкладке\nПКМ: Включить/Отключить${(!addon.isSystem && !addon.isBuiltin) ? "\nCtrl+ПКМ: Удалить" : ""}`,
                };
                for (let p in props)
                    mi.setAttribute(p, props[p]);
                if (addon.iconURL)
                    mi.setAttribute("image", addon.iconURL);
                var cls = mi.classList;
                addon.isActive ? cls.remove("ucf-disabled") : cls.add("ucf-disabled");
                addon.optionsURL ? cls.remove("ucf-notoptions") : cls.add("ucf-notoptions");
                addon.isSystem ? cls.add("ucf-system") : cls.remove("ucf-system");
                cls.add(`ucf-type-${addon.type}`);
            };
            addons.filter(a => !(a.iconURL || "").startsWith("resource://search-extensions/")).sort((a, b) => {
                var ka = `${(enabled_first ? a.isActive ? "0" : "1" : "")}${a.type || ""}${a.name.toLowerCase()}`;
                var kb = `${(enabled_first ? b.isActive ? "0" : "1" : "")}${b.type || ""}${b.name.toLowerCase()}`;
                return (ka < kb) ? -1 : 1;
            }).forEach(addon => {
                if (!exceptions_listset.has(addon.id) &&
                    (!addon.hidden || show_hidden) &&
                    (!addon.userDisabled || show_disabled)) {
                    let extension = GlobalManager.extensionMap.get(addon.id),
                    mi = doc.createXULElement("menuitem");
                    setAttributesMenu(mi, addon, extension);
                    mi._Addon = addon;
                    mi._Extension = extension;
                    popup.append(mi);
                    addonsMap.set(addon, mi);
                }
            });
            var click = (e) => {
                this.handleClick(e);
            };
            popup.addEventListener("click", click);
            var listener = {
                onEnabled: addon => {
                    var mi = addonsMap.get(addon);
                    if (mi)
                        setAttributesMenu(mi, addon, mi._Extension);
                },
                onDisabled: addon => {
                    listener.onEnabled(addon);
                },
                onInstalled: addon => {
                    var extension = GlobalManager.extensionMap.get(addon.id),
                    mi = doc.createXULElement("menuitem");
                    setAttributesMenu(mi, addon, extension);
                    mi._Addon = addon;
                    mi._Extension = extension;
                    popup.prepend(mi);
                    addonsMap.set(addon, mi);
                },
                onUninstalled: addon => {
                    var mi = addonsMap.get(addon);
                    if (mi) {
                        mi.remove();
                        addonsMap.delete(addon);
                    }
                },
            };
            AddonManager.addAddonListener(listener);
            popup.addEventListener("popuphiding", (e) => {
                AddonManager.removeAddonListener(listener);
                popup.removeEventListener("click", click);
                addonsMap = null;
                while (popup.hasChildNodes())
                    popup.firstChild.remove();
            }, { once: true });
        },
        handleClick: function(e) {
            var win = e.view, mi = e.target;
            if (!("_Addon" in mi) || !("_Extension" in mi))
                return;
            var addon = mi._Addon, extension = mi._Extension;
            switch (e.button) {
                case 0:
                    if (e.ctrlKey && e.shiftKey) {
                        if (addon.creator?.url)
                            win.gBrowser.selectedTab = this.addTab(win, addon.creator.url);
                    } else if (e.ctrlKey) {
                        this.clipboardHelp.copyString(addon.id);
                        try {
                            this.alertsService.showAlertNotification(`${img}`, "ID в буфере обмена!", addon.id, false);
                        } catch(e) {}
                    } else if (e.shiftKey) {
                        if (extension?.uuid) {
                            this.clipboardHelp.copyString(extension.uuid);
                            try {
                                this.alertsService.showAlertNotification(`${img}`, "UUID в буфере обмена!", extension.uuid, false);
                            } catch(e) {}
                        }
                    } else if (addon.isActive && addon.optionsURL)
                        this.openAddonOptions(addon, win);
                    win.closeMenus(mi);
                    break;
                case 1:
                    if (e.ctrlKey) {
                        if (!addon.isBuiltin)
                            this.browseDir(addon);
                    } else if (e.shiftKey)
                        this.browseDir(addon, win);
                    else if (addon.homepageURL)
                        win.gBrowser.selectedTab = this.addTab(win, addon.homepageURL);
                    win.closeMenus(mi);
                    break;
                case 2:
                    if (!e.ctrlKey) {
                        let endis = addon.userDisabled ? "enable" : "disable";
                        if (addon.id == "screenshots@mozilla.org")
                            Services.prefs.setBoolPref("extensions.screenshots.disabled", !addon.userDisabled);
                        else if (addon.id == "webcompat-reporter@mozilla.org")
                            Services.prefs.setBoolPref("extensions.webcompat-reporter.enabled", addon.userDisabled);
                        addon[endis]({ allowSystemAddons: true });
                    } else if (!addon.isSystem && !addon.isBuiltin && Services.prompt.confirm(win, null, `Удалить ${addon.name}?`))
                        addon.uninstall();
                break;
            }
        },
        openAddonOptions: function(addon, win) {
            switch (addon.optionsType) {
                case 5:
                    win.BrowserOpenAddonsMgr(`addons://detail/${encodeURIComponent(addon.id)}/preferences`);
                    break;
                case 3:
                    win.switchToTabHavingURI(addon.optionsURL, true);
                    break;
            }
        },
        browseDir: function(addon, win) {
            try {
                if (!win) {
                    let file = Services.io.getProtocolHandler("file")
                    .QueryInterface(Ci.nsIFileProtocolHandler)
                    .getFileFromURLSpec(addon.getResourceURI().QueryInterface(Ci.nsIJARURI).JARFile.spec);
                    if (file.exists())
                        file.launch();
                } else
                    win.gBrowser.selectedTab = this.addTab(win, addon.getResourceURI().spec);
            } catch (e) {}
        },
        addTab: function(win, url, params = {}) {
            params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
            params.relatedToCurrent = true;
            return win.gBrowser.addTab(url, params);
        },
    };
    CustomizableUI.createWidget({
        id: id,
        type: "custom",
        label: label,
        tooltiptext: tooltiptext,
        localized: false,
        defaultArea: CustomizableUI.AREA_NAVBAR,
        onBuild: function(doc) {
            var btn = doc.createXULElement("toolbarbutton"), win = doc.defaultView,
            props = {
                id: id,
                label: label,
                tooltiptext: tooltiptext,
                type: "menu",
                class: "toolbarbutton-1 chromeclass-toolbar-additional",
            };
            for (let p in props)
                btn.setAttribute(p, props[p]);
            btn.addEventListener("click", (e) => {
                if (e.button == 0) {
                    if (e.shiftKey)
                        win.BrowserOpenAddonsMgr();
                } else if (e.button == 1)
                    win.BrowserOpenAddonsMgr();
            });
            var mp = doc.createXULElement("menupopup");
            mp.id = `${id}-popup`;
            mp.addEventListener("click", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("contextmenu", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("popupshowing", (e) => {
                extensionOptionsMenu.populateMenu(e);
            });
            btn.append(mp);
            var btnstyle = "data:text/css;charset=utf-8," + encodeURIComponent(`
                #${id}, #${id}-popup menuitem {
                    list-style-image: url("${img}") !important;
                }
                #${id}-popup menuitem::after {
                    display: -moz-box !important;
                    content: "" !important;
                    height: 16px !important;
                    width: 16px !important;
                    padding: 0 !important;
                    border: 1px solid rgb(0, 116, 232) !important;
                    border-radius: 0 !important;
                    background-repeat: no-repeat !important;
                    background-position: center !important;
                    background-size: 16px !important;
                    background-color: rgb(0, 116, 232) !important;
                    background-image: url("${checked}") !important;
                    opacity: 1 !important;
                }
                #${id}-popup menuitem.ucf-disabled::after {
                    border-color: currentColor !important;
                    background-color: transparent !important;
                    background-image: none !important;
                    opacity: .6 !important;
                }
                #${id}-popup menuitem.ucf-disabled > label,
                #${id}-popup menuitem.ucf-notoptions > label {
                    opacity: .6 !important;
                }
                #${id}-popup menuitem.ucf-system > label {
                    text-decoration: underline !important;
                    text-decoration-style: dotted !important;
                }
                #${id}-popup menuitem > label {
                    margin-inline-end: 0 !important;
                }
                #${id}-popup menuitem > .menu-accel-container {
                    display: -moz-box !important;
                    padding: 4px !important;
                    margin: 0 !important;
                    opacity: 1 !important;
                }
                #${id}-popup menuitem > .menu-accel-container .menu-iconic-accel {
                    display: -moz-box !important;
                    margin: 0 !important;
                    height: 8px !important;
                    width: 8px !important;
                    border-radius: 4px !important;
                    background-color: transparent !important;
                    opacity: 1 !important;
                    font-size: 0 !important;
                }
                #${id}-popup menuitem.ucf-type-dictionary > .menu-accel-container .menu-iconic-accel {
                    background-color: rgb(227, 27, 93) !important;
                }
                #${id}-popup menuitem.ucf-type-locale > .menu-accel-container .menu-iconic-accel {
                    background-color: rgb(48, 172, 55) !important;
                }
                #${id}-popup menuitem.ucf-type-theme > .menu-accel-container .menu-iconic-accel {
                    background-color: rgb(219, 106, 0) !important;
                }
            `);
            try {
                win.windowUtils.loadSheetUsingURIString(btnstyle, win.windowUtils.USER_SHEET);
            } catch (e) {}
            return btn;
        },
    });
})();} catch (e) {}


Есть новее?

Отсутствует

 

№33906-06-2022 12:20:13

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 91.0

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

xrun1 пишет

В [firefox] 101 (может и раньше) отвалилась кнопка "Дополнения" из расширения Add Toolbar Buttons

Я здесь добавил обновлённый вариант.
Скрипт с под первого спойлера отсюда тоже пока работает.

Отсутствует

 

№34006-06-2022 12:27:10

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 101.0

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

sandro79 пишет

Я здесь добавил обновлённый вариант.

Ваш пост не увидел. :) Спасибо.

Отсутствует

 

№34119-06-2022 07:23:40

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

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

Dumby
На 102 отвалился add_toolbar_buttons, его можно вернуть к жизни?
add_toolbar_buttons.2021.9.5.xpi

Отсутствует

 

№34219-06-2022 09:36:05

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

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

_zt
Да, враги народа не дремлют. Сделали так и так.
Не просто сделали, а ещё и засунули это в бету 102.


Таким образом, трюк с переопределением Object.freeze() больше не работает.
Это я про антиподписячий код говорю. Пока такой вариант
(в смысле если напишут export var …, а если напишут export const …, тогда ...).

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

Выделить код

Код:

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


Однако напомню, что в 91ESR антиподписячий код не обязателен,
можно обойтись только настройками. Есть вероятность того, что это будет верно и для 102ESR.
А дурацкие надписи на about:addons можно убрать скриптом, или, в крайнем случае, стилем.

Отсутствует

 

№34320-06-2022 06:25:13

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

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

Dumby
Спасибо.
   
Посмотрим, что в esr будет, ведь atb на ранних бетах работал, а потом вот чего придумали. Да и совместимость с последующими версиями хотелось бы иметь.

Отсутствует

 

№34425-06-2022 12:15:36

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

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

Dumby
Вы делали скрипт - кнопка включения стиля
А как бы этот стиль инициализировать при старте браузера, т.е. сделать кнопку не "включения", а наоборот "отключения стиля".

Отсутствует

 

№34525-06-2022 14:24:39

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

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

_zt пишет

Вы делали скрипт - кнопка включения стиля

Не совсем так. Это, скорее, proof of concept, что стиль будет перечитан с диска.


Можно после строки, где функция reg определяется, добавить строку с её вызовом: reg();
Это имеется в виду, что кнопка вытащена на тулбар.

Отсутствует

 

№34625-06-2022 18:41:41

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

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

Dumby
Концепт так концепт, главное что работает. В меню расширений "другие инструменты" тоже работает. Спасибо.

Отсутствует

 

№34728-06-2022 10:33:07

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

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

egorsemenov06 пишет

не смог вставить не принимает форум

В base64 всё примет.

в [firefox] 102.0 падает вкладка

Да, вижу. Увы, ничего лучше не придумал

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

Выделить код

Код:

/*
        var evt = new node.ownerGlobal.KeyboardEvent(
            "keypress", {bubbles: true, cancelable: true, ...e}
        );
        node.dispatchEvent(evt);
    },
*/
        if(ChromeUtils.domProcessChild.childID) {
            var cmd = this.beh2cmd[e.ctrlKey + "_" + e.shiftKey + "_" + e.keyCode];
            cmd && docShell.doCommand(cmd);
        }
        else node.dispatchEvent(new node.ownerGlobal.KeyboardEvent(
            "keypress", {bubbles: true, cancelable: true, ...e}
        ));
    },
    beh2cmd: { // Ctrl_Shift_VK
        false_true_36: "cmd_selectLinePrevious", // Shift+Home
    },

Отредактировано Dumby (28-06-2022 10:35:49)

Отсутствует

 

№34828-06-2022 11:45:07

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

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

egorsemenov06 пишет

А как это в base64

Ух ты! Хотел написать

Ну, типа текстовая ссылка для скормления адресной строке.
И спойлер [например]

Но получил: «500 Internal Server Error».
Риторический вопрос: чё за дела?

Отсутствует

 

№34928-06-2022 13:51:53

Inko7
Участник
 
Группа: Members
Зарегистрирован: 09-11-2009
Сообщений: 1008
UA: Firefox 101.0

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

Dumby
egorsemenov06
спасибо за поднятие проблемы и правки кода
один вопросик всегда беспокоил по этой кнопке: почему когда переключаешь раскладку для слов начинающихся на букву Б, код срабатывает некорректно? Это поправимо?

Отредактировано Inko7 (28-06-2022 13:52:31)

Отсутствует

 

№35028-06-2022 22:58:37

antialt
Участник
 
Группа: Members
Зарегистрирован: 18-01-2017
Сообщений: 9
UA: Firefox 102.0

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

Dumby пишет

_zt
Да, враги народа не дремлют. Сделали так и так.
Не просто сделали, а ещё и засунули это в бету 102.


Таким образом, трюк с переопределением Object.freeze() больше не работает.
Это я про антиподписячий код говорю. Пока такой вариант
(в смысле если напишут export var …, а если напишут export const …, тогда ...).

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

Выделить код

Код:

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


Однако напомню, что в 91ESR антиподписячий код не обязателен,
можно обойтись только настройками. Есть вероятность того, что это будет верно и для 102ESR.
А дурацкие надписи на about:addons можно убрать скриптом, или, в крайнем случае, стилем.

Подскажите, как вернуть к жизни add_toolbar_buttons.2021.9.5.xpi на 102 (Final или ESR), очень уж удобный плагин :)!

Отсутствует

 

Board footer

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