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

Общайтесь со знакомыми и друзьями в нашей группе в Контакте.

№1725105-03-2025 12:15:03

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

Garalf
Норм. Благодарю. Тут еще упал скрипт

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

Выделить код

Код:

(async sep => {
	if (!sep) return;

	var key = "hasRemoveTransaction";
	var g = Cu.import("resource://gre/modules/PlacesTransactions.jsm", {});
	/*
	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];
		}
		g[key] = entry => {
			for(var tr of entry)
				if (raws.get(tr) instanceof PlacesTransactions.Remove)
					return true;
		}
	}
	var menuitem = document.createXULElement("menuitem");
	for(var args of Object.entries({
		closemenu: "single",
		class: "menuitem-iconic",
		id: "placesCmd_undoRemove",
		label: "Восстановить удалённое",
		oncommand: "PlacesTransactions.undo().catch(Cu.reportError);",
		image: "data:image/svg+xml;charset=utf-8;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljDQogICAtIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMNCiAgIC0gZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4gLS0+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiIGZpbGw9IiMwMEVBM0EiIGZpbGwtb3BhY2l0eT0iY29udGV4dC1maWxsLW9wYWNpdHkiPg0KICA8cGF0aCBkPSJNMTMgMEgzYTMgMyAwIDAgMC0zIDN2OGEzIDMgMCAwIDAgMyAzaDRsLS4zLjRhMSAxIDAgMSAwIDEuNiAxLjJsMS41LTJhMSAxIDAgMCAwIDAtMS4ybC0xLjUtMmExIDEgMCAwIDAtMS42IDEuMmwuMy40SDNhMSAxIDAgMCAxLTEtMVY1aDEydjZhMSAxIDAgMCAxLTEgMSAxIDEgMCAwIDAgMCAyIDMgMyAwIDAgMCAzLTNWM2EzIDMgMCAwIDAtMy0zek0yIDRWM2ExIDEgMCAwIDEgMS0xaDEwYTEgMSAwIDAgMSAxIDF2MXoiLz4NCjwvc3ZnPg0K",
	}))
		menuitem.setAttribute(...args);

	var desc = Object.getOwnPropertyDescriptor(XULElement.prototype, "hidden");
	var {set} = desc;
	desc.set = () => {
		var entry = PlacesTransactions.topUndoEntry;
		set.call(menuitem, !entry || !g[key](entry));
	}
	Object.defineProperty(menuitem, "hidden", desc);
	sep.before(menuitem);
})(document.getElementById("placesContext_deleteSeparator"));

Отсутствует

 

№1725205-03-2025 15:03:17

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

Re: Custom Buttons

green25
Это тема про кнопки. Вот последний в соответствующей теме, если не пропустил обновлений... Попробуй обновить свой.

Отсутствует

 

№1725305-03-2025 15:28:40

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

xrun1
Не работает...

Отсутствует

 

№1725405-03-2025 15:47:56

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

Re: Custom Buttons

green25
Ответил.

Отсутствует

 

№1725505-03-2025 18:22:32

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

xrun1
Не понял, куда этот код пихать ?

Отсутствует

 

№1725606-03-2025 03:02:27

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

Re: Custom Buttons

green25 пишет

Тут еще упал скрипт

Этот скрипт не для Custom Buttons.

Отсутствует

 

№1725706-03-2025 08:44:57

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

Re: Custom Buttons

xrun1 пишет

Этот скрипт

Так, я повторю ещё раз.
Без никакого скрипта вообще.


Итак, STR, окно браузера, панель закладок в нём.
ПКМ по закладке на этой панели —> «Удалить закладку».
Закладка удаляется, исчезает, как и ожидалось.


Теперь, вызываем окно консоли (Ctrl+Shift+J)
и запускаем с него PlacesTransactions.undo()


Восторг! Закладка возвращается.
В точности туда же, где и была.


А теперь(!), не сходя с места,
снова ПКМ по этой закладке —> «Удалить закладку».


И... тишина.
Закладка просто молча не удаляется.


Почему так происходит — я не знаю.
Тем не менее — веский повод отказаться от этого кода как такового.
Увы.

Отсутствует

 

№1725806-03-2025 09:05:06

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

Dumby
Очень надо,шикарная кнопа была


А возврат закладки, так пункт  контексте с командой и все дела...И пункт можно и скрывать .

Отредактировано green25 (06-03-2025 09:05:28)

Отсутствует

 

№1725906-03-2025 09:30:00

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

Re: Custom Buttons

Dumby пишет

Почему так происходит — я не знаю.
Тем не менее — веский повод отказаться от этого кода как такового.

Мне очень много приходится работать с закладками, поэтому для меня эта кнопка очень нужная.


Что касается работоспособности на FF136.
Вы мне сами вот ЗДЕСЬ подсказали как эту кнопочку реанимировать, за что вам огромное спасибо:

Dumby пишет

Вроде этот код был признан непригодным к использованию,
из-за загадочного глюка, возникающего после вызова PlacesTransactions.undo()


Но, если абстрагироваться от этого, то что тут сложного?
Там, где устанавливаются атрибуты, изымаем oncommand


А вместо этого, далее, пишем строку, добавляющую листенер
menuitem.addEventListener("command", () => PlacesTransactions.undo().catch(Cu.reportError));
И все дела.

Я воспользовался вашим советом и несмотря на глюк продолжаю пользоваться этой кнопочкой.

Отредактировано unter_officer (06-03-2025 09:31:45)


«The Truth Is Out There»

Отсутствует

 

№1726006-03-2025 11:51:15

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

1.png
Вставил сменив команду,локаль и икону . Плюс кнопкой убираю это: visibility: collapse !important; и наоборот visibility: initial !important;

Отредактировано green25 (06-03-2025 11:51:44)

Отсутствует

 

№1726106-03-2025 12:04:35

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

Re: Custom Buttons

unter_officer пишет

несмотря на глюк продолжаю пользоваться этой кнопочкой

Аналогично. Я остался на UCF "version, date year-month-day: 2024-10-31" и на [firefox] 136 код работает без правки.

Dumby пишет

И... тишина.
Закладка просто молча не удаляется.

Удаляем и восстанавливаем соседнюю закладку. И повторно удаляем проблемную. Это не повод отказываться от скрипта!:)

Отсутствует

 

№1726206-03-2025 12:26:22

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

Re: Custom Buttons

xrun1 пишет

Удаляем и восстанавливаем соседнюю закладку. И повторно удаляем проблемную. Это не повод отказываться от скрипта!

Можно сделать немного по другому. ПКМ на нужной закладке -> Измениить.
В открывшемся окне "Отмена". И после этого закладку снова можно удалить.
Да, это лишние телодвижения, но такой вариант тоже работает.


xrun1 пишет

Аналогично. Я остался на UCF "version, date year-month-day: 2024-10-31" и на  136 код работает без правки.

Я UCF обновил до крайней версии и исправил код скрипта.
Тем более, что там править то совсем чуть-чуть. :)

Отредактировано unter_officer (06-03-2025 12:31:04)


«The Truth Is Out There»

Отсутствует

 

№1726306-03-2025 12:56:55

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

unter_officer

unter_officer пишет

Я UCF обновил до крайней версии и исправил код скрипта

Можно посмотреть ?

Отсутствует

 

№1726406-03-2025 13:02:13

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

Re: Custom Buttons

green25 пишет

Можно посмотреть ?

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

Выделить код

Код:

//
(async sep => {
    if (!sep) return;

    var key = "hasRemoveTransaction";
    var raws = UcfPrefs.dbg.ref("lazy", PlacesTransactions.undo).TransactionsHistory.proxifiedToRaw;
    raws[key] ??= entry => {
        for(var transaction of entry) {
            if (raws.get(transaction) instanceof PlacesTransactions.Remove)
                return true;
        }
    }
    var menuitem = document.createXULElement("menuitem");
    for(var args of Object.entries({
        closemenu: "single",
        class: "menuitem-iconic",
        id: "placesCmd_undoRemove",
        label: "Восстановить удалённое",
        image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAEd0lEQVRIx53Ve2yW5RkG8N/7ft8Hxa/9CgjSSDnMA4xVTUMQWzadhzhnjSCC0y0jSjom+JdGp844ZhSjHLJsowaNZoCCHOWglXGoQbo2fBW3obDNUBfXKpsUVhxn6OHdH8+31GXGmL3/3M913ffzPNed93qeBxvmI8umCNjyPFEDSRJw40qKa9jyHSbdzY77Ar+9FTvZ+nHAb9T7P76YcwlOktlBdJia2SSthfRvaR/Mync5tp85Q2mbEHJ/X0bqRTpOBJyehog3C3j1HV9RQP91xG9T8z2SofyphMELWH4zW5s40s7kQ/T0cnYfXfPD1OgM0TlGzSN1DZkzxG1EdURjaa9HCfddEupfuSkIfHXJ5wVENA8Iw9QcRnbzXj31++g8w+WVZHMhXzaKhu2MGMtd36f5CTrn8WAJyf001KCYpA6dDBtLlOfoYuI6kgp6XuLsbhQRfw39ovDPx7/JgYS1b3NkCxcvoPgTevIULyFVTm4jyinp4uRJiirYt5BMLc15kvE0lnCsgZaE2wdx6LVCo9/ghQn4LhdFxEOonELv8ogVV9Iyjd9fx8T1FE2nq5XSQWQuJbsmrJH9JclMsldhFsW3EU0iuxsb6f9zTA3dHj1J1yPsKaPrIOtnkn6KDY2cvYF/vkfmINGuiPdnUD6Pd/7Mur/x0RCqXqTfj+m5glyO1B8ovR1pijeil6KvBw8V1QaB/QYWzNgSYu+TmMm5GVhKT47OBWR28kgnvxvKS/OjvuMGuTSr72FtBR/WctNe4l+H3GUt7DxB2TKe+CmnF5IZRzSZzFmS4wy9n2QGY2eR3Mx193DqAao+4vh04lZS2/EkQyqo7cWux4Kjwf4gKF3N5hEs+QsLlwVuVRPLP2FeTSh95hZSpSx6OOAkwWCWLSEqYWVz4JtLqd3GiuX0/oS6XKjd/BQbF6SRJynij4eJKpl7WSg8cCdzxjHjH3QuIsaorQx7NCx8QQdxCYM2kzxL423BbGN6SP+I6tmcO86hahqu4MA2To3mX+eTxbA2er6VJjcA/Yl2kOzlrutJxrDraaI1XH09j3fQVk7pcG5sCgIOttLVzejpmMPrnxJvYnIZXelwxGHTCOaX0PorsmUMOC/wpeNofg4fjg9EW3+k6CzcYJ99M7h6fSfxFFJrMZzFm0I+fzXxlTQ1EHf3eSlJyI3mlYGs/yEPx4F7/NkQ11zEymFhnDoY9RnwcHmIZ34Q1CcTkBD9FSM58gu8SmUHbmVuJbYRt2AiE/cwZT/tG3h+Gh29lH3A+VPZ+zMq1rHwcq6tY1U31ReQXPgFt3M+/9+xJRvM9f5S3NnX6btLqfqYt1p44xQrFnH0aX6zmBXIj+Hae0N95qG+ea/PJjrB7tV47csE7CzEJqKXyTcW8CquaibfwTOX0FjPLSfYk+G8XWyb+rlTUcndVUQjWXOK+FiBn/QfQen/FVBVVdhoc4FIkczqM5WBvPMWp4fQMpzFHeEN2NCFCcyNSH2b1AiSl3nhVnrnkjpNkqP9jrBvdzX8G2rIlxvMK3a7AAAAInpUWHRTb2Z0d2FyZQAAeNorLy/Xy8zLLk5OLEjVyy9KBwA22AZYEFPKXAAAAABJRU5ErkJggg==",
    }))
        menuitem.setAttribute(...args);

        menuitem.addEventListener("command", () => PlacesTransactions.undo().catch(Cu.reportError));

    var desc = Object.getOwnPropertyDescriptor(XULElement.prototype, "hidden");
    var {set} = desc;
    desc.set = () => {
        var entry = PlacesTransactions.topUndoEntry;
        set.call(menuitem, !entry || !raws[key](entry));
    }
    Object.defineProperty(menuitem, "disabled", {});
    Object.defineProperty(menuitem, "hidden", desc);
    sep.before(menuitem);
})(document.getElementById("placesContext_deleteSeparator"));


«The Truth Is Out There»

Отсутствует

 

№1726506-03-2025 13:18:01

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

unter_officer
Какае еще манипуляии нужны, в 115 не работает.

Отсутствует

 

№1726606-03-2025 13:22:21

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

Re: Custom Buttons

green25 пишет

Какае еще манипуляии нужны, в 115 не работает.

Если не ошибаюсь, в 115 должен работать код без всяких правок (проверить сейчас не могу).
Вам давали на него ссылку: https://forum.mozilla-russia.org/viewto … 99#p808799



P.S.
Проверил на FF 115.21.0 ESR.
Работает, как не исправленный вариант скрипта, так и исправленный.
Версия UCF крайняя.

Отредактировано unter_officer (06-03-2025 14:17:33)


«The Truth Is Out There»

Отсутствует

 

№1726706-03-2025 14:37:04

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

Re: Custom Buttons

unter_officer
Правленый код работает и на предыдущей версии UCF. Поправил у себя и проверил. [firefox] 136.

Отсутствует

 

№1726806-03-2025 14:44:56

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

unter_officer
Не понимаю другие UCF работают...Может сдесь config.js ? Или user_chrome.js ?

Отсутствует

 

№1726906-03-2025 16:44:42

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

Dumby
С преддыдущей просьбой не парьтесь . Косяк или баг в XPIDatabase.jsm...Рихтанул и все..
Как отключить обновление на конкретный аддон ,через ID ? Версию менять нельзя ,падает зараза...
Что с этим не так? (115)

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

Выделить код

Код:

var cancel = true;
Services.obs.addObserver(function wfp(win, topic) {
	Services.obs.removeObserver(wfp, topic);
	var sd = win.gSanitizePromptDialog, {sanitize} = sd;
	sd.sanitize = e => cancel = sanitize.call(sd, e);
}, "widget-first-paint");

Отредактировано green25 (11-03-2025 15:58:12)

Отсутствует

 

№1727011-03-2025 08:35:25

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

Garalf
Нужны коды-скрипты на (130 >13..) Config.js  и user_chrome.js  и т.д
Помогу избавится напрочь от Datareporter и другой дряни в профиле.

Отсутствует

 

№1727112-03-2025 08:32:43

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

В 115 не работает


#toolbar-menubar toolbarpaletteitem[place="toolbar"][id^="wrapper-customizableui-special-spring"],
#toolbar-menubar > toolbarspring {
    max-width: none !important;
    cursor: default !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar > :-moz-any(toolbarspring,spacer,[id^="wrapper-customizableui-special-spring"]) {
    flex-grow: 1 !important;
}
Нужен код "Очистить список закрытых вкладок"

Отредактировано green25 (12-03-2025 13:22:18)

Отсутствует

 

№1727212-03-2025 21:48:31

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

del

Отредактировано green25 (14-03-2025 12:06:40)

Отсутствует

 

№1727313-03-2025 12:45:41

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 34
UA: unknown 0.0

Re: Custom Buttons

Кто знает , что за шняга в Storage при выходе to-be-removed ? Кеш аддонов ?  Можно загасить ?
С куками связано. Куки на сессию и нет этой папки. как по умолчанию сделать ? "Разрешить на сессию" - в разрешениях
Или так ,но по умолчанию ,никак префку не могу найти
1.png

Отредактировано green25 (14-03-2025 23:23:28)

Отсутствует

 

№1727415-03-2025 23:27:46

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

Re: Custom Buttons

Dumby посмотри пожалуйста эту кнопку может где пропустил изменения

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

Выделить код

Код:

if(true) return; // Disabled by Disable Initialization button

// https://forum.mozilla-russia.org/viewtopic.php?id=56040
// http://infocatcher.ucoz.net/js/cb/cbEditorToggleOnTop.js
// https://github.com/Infocatcher/Custom_Buttons/tree/master/CB_Editor_Toggle_on_Top

// Custom Buttons Editor: Toggle on Top button for Custom Buttons
// (code for "initialization" section)

// (c) Infocatcher 2012-2015
// version 0.1.11 - 2015-06-04

// Hotkey: Ctrl+T

const watcherId = "customButtonsToggleOnTop_" + this.id;
var {Components} = window; // Prevent garbage collection in Firefox 3.6 and older
var storage = (function() {
    if(!("Services" in window)) // Firefox 3.6 and older
        return Application.storage;
    // Simple replacement for Application.storage
    // See https://bugzilla.mozilla.org/show_bug.cgi?id=1090880
    var global = Components.utils.getGlobalForObject(Components.utils);
    // Ensure, that we have global object (because window.Services may be overwritten)
   // var global = Components.utils.import("resource://gre/modules/Services.jsm", {});
    var ns = "_cbEditorToggleOnTopStorage";
    // Note: Firefox 57+ returns NonSyntacticVariablesObject w/o .Object property
    var storage = global[ns] || (global[ns] = Components.utils.getGlobalForObject(global).Object.create(null));
    return {
        get: function(key, defaultVal) {
            if(key in storage)
                return storage[key];
            return defaultVal;
        },
        set: function(key, val) {
            if(key === null)
                delete storage[key];
            else
                storage[key] = val;
        }
    };
})();
var watcher = storage.get(watcherId, null);
if(!watcher) {
    watcher = {
        btnPos: 0, // 0 - at top right window corner, 1 - at end of tabs, 2 - before dialog buttons spacer
        btnStyle: "button", // "button" or "toolbarbutton"
        btnChecked: true, // use "checked" style: true or false

        // Fogue icons, http://p.yusukekamiyamane.com/
        // http://www.iconfinder.com/icondetails/12276/16/gps_location_pin_icon
        icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AgNBjAx4SevkwAAAjxJREFUKM+FUk1oE0EU/mZnRU0U6cFLIT1KKkkNpIcSWwUvVty2l142hZpDoQcPgYQKQkUEz6V6sHgR/KGQQwleQg/xEKRRsIEmga4NoZa2oRGKpJaWmp2Z52UX12Dxg4838+D73ps3jzUYQycIgDc7l0oNAkgqpZ4n5uc/NgHsEEHDKZB/X5OJRGJcSplemJ6+6SZPFStvJ0Ta4eEhTNMcE0I8fDsxcQsAdPwHc6nUoBRCOz4+Rr1eR39//+18Pn/h/cjIGea+eS6VegLgKoBfRPRdKbXGOf8GIBmPx8cty0Kz2YTf74ff70cmkynpNSIAwP7+/t2ZmZnowcGBPDo6+rm1tdWo1Wo7pmnesSwLtm2jWCx+EkJwKSUnoln2wWnv9eTkMBE9TafT0b29PbTbbXDO0Wq1YNs2lpaWVpVSj8ZyuWXhaPg953CtXK6v9fVtr6ys9A4NDXU3Gg24JoVC4fPJycnjsVxu2TtMzgCUAVQAUKVSrwDtzc3NQCQS6d7d3XU7EK1W62twY+ML84i1N4zB5TvgYrVaPTs1NRXNZDKlrq4u+Hw+BAKBy1LK6zYA2xE+6/gqzhgbXl9fnw+FQrPBYPCHlBKjo6NRIjpPRD3kEdbcJWGMgTF2Y3Fx8UE4HE4yxl70WtYCEc1ms9kS51wDcM4r/FOS87BhGK90XTc0TeNuPgggFosNG4axOjAw8PJKxwIxAD26rt9XShWVUtvOWosO2h1RAJAMwCUAPseInGG6UTlm6l/8DZ+nFuAjSdH0AAAAAElFTkSuQmCC",
        iconPinned: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AgNBjIpwH1VRwAAAgdJREFUKM+FkkFoU0EQhr/dtxFSquLBS8CAICISQci1oBWLKaaINL300psXDxH0ItSD4L21UKgUxV4aWnKyiIGaQwio2IQ0PQQpBaEhoaEk0dSQNsnb9WAepg+LPwz/7DD/7O7MiJIQuGEAV3QIiNowV4f0HlA0BskJsI8fo75YLHIEjw3ccIInivVxX1IqcXFu7l4Lnhq4BaD4P4Y6INsHB+zlcpwfH7+zG48PavCIvj8/B64CRxoqXdg8Bd+BqG9xMVJNpaiUy5zxehkcGCC2uppV28Y44rs3V1aCFIt2p15v/MzlSj/S6eKlmZnRairFoW2zmUx+boHVBsvAtEj+fV5Iw4vbS0tBe2uLw04H2+ulUy5zaNu8X17OdOGZgkTX3TADCRumP0xNZY3fz6/9fSr5PNVGg6/x+BfdE/Y3wxJAHtj6wzt5aHsSiQv+4WFfbWcHu9VCeDzdRq32DdgQfZMQom9JjDGngcn19fWF2shI9vrYWNBqNjFCND8mk+8MTDq5s65RWUKIUKFQmA0EAtP3pawdra0xGokE0dqrwe8kvgS2e1cjpURKORyLxTaUUg+UUuciUvIWQq8hU5uYMPOQmQcuu7fAsqxr4XD4jVIqLKW0nPgV4AmEFiDzCF65hQLwK6Ueaq0/aa13e2vddVnHxV3AFsBZYKBXyPSa6bDuFdP/st/BfOD54p3eIQAAAABJRU5ErkJggg==",

        boxId: "cbToggleOnTopBox",
        btnId: "cbToggleOnTopButton",
        onTopAttr: "cbOnTop",
        naAttr: "cbOnTopNA",
        styleId: "cbToggleOnTopStyle",
        get btnTip() {
            var locale = (function() {
                if("Services" in window && "locale" in Services) {
                    var locales = Services.locale.requestedLocales // Firefox 64+
                        || Services.locale.getRequestedLocales && Services.locale.getRequestedLocales();
                    if(locales)
                        return locales[0];
                }
                var prefs = "Services" in window && Services.prefs
                    || Components.classes["@mozilla.org/preferences-service;1"]
                        .getService(Components.interfaces.nsIPrefBranch);
                function pref(name, type) {
                    return prefs.getPrefType(name) != prefs.PREF_INVALID ? prefs["get" + type + "Pref"](name) : undefined;
                }
                if(!pref("intl.locale.matchOS", "Bool")) { // Also see https://bugzilla.mozilla.org/show_bug.cgi?id=1414390
                    var locale = pref("general.useragent.locale", "Char");
                    if(locale && locale.substr(0, 9) != "chrome://")
                        return locale;
                }
                return Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                    .getService(Components.interfaces.nsIXULChromeRegistry)
                    .getSelectedLocale("global");
            })().match(/^[a-z]*/)[0];
            if(locale == "ru")
                return "Поверх всех окон (Ctrl+T)";
            return "Always on top (Ctrl+T)";
        },

        REASON_STARTUP: 1,
        REASON_SHUTDOWN: 2,
        REASON_WINDOW_LOADED: 3,
        REASON_WINDOW_CLOSED: 4,

        get obs() {
            delete this.obs;
            return this.obs = Components.classes["@mozilla.org/observer-service;1"]
                .getService(Components.interfaces.nsIObserverService);
        },
        get ww() {
            delete this.ww;
            return this.ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
                .getService(Components.interfaces.nsIWindowWatcher);
        },
        get wm() {
            delete this.wm;
            return this.wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                .getService(Components.interfaces.nsIWindowMediator);
        },
        init: function(reason) {
            this.obs.addObserver(this, "quit-application-granted", false);
            var ws = this.wm.getEnumerator(null);
            while(ws.hasMoreElements())
                this.initWindow(ws.getNext(), reason);
            this.ww.registerNotification(this);
        },
        destroy: function(reason) {
           // this.obs.removeObserver(this, "quit-application-granted");
            var ws = this.wm.getEnumerator(null);
            while(ws.hasMoreElements())
                this.destroyWindow(ws.getNext(), reason);
            this.ww.unregisterNotification(this);
        },
        checkOnTopAttr: function(window) {
            if(this.version < 71)
                return this.checkOnTopAttr = function() {}
            var attr = this.onTopAttr;
            var id = window.document.documentElement.id;
           // var xs = Cu.import("resource://gre/modules/Services.jsm", {})
           //     .Services.xulStore;
            (this.checkOnTopAttr = function(window) {
                var de = window.document.documentElement;
                if(de.hasAttribute(attr))
                    return;
                var url = window.location.href;
              //  if(xs.hasValue(url, id, attr))
              //      de.setAttribute(attr, xs.getValue(url, id, attr));
            })(window);
        },
        initWindow: function(window, reason) {
            if(!this.isTargetWindow(window))
                return;
            window.addEventListener("keypress", this, true);
            if(this.hasSizeModeChangeEvent)
                window.addEventListener("sizemodechange", this, false);
            else {
                window.addEventListener("resize", this, false); // Can detect only maximize/restore
                this.legacySizeModeChange(window);
            }
            this.checkOnTopAttr(window);

            var document = window.document;
            this.removeStyle(document);
            this.addStyle(document);
            var box = document.getElementById(this.boxId);
            box && box.parentNode.removeChild(box);
            box = document.createElementNS(xulns, "hbox");
            box.id = this.boxId;
            var btn = document.createElementNS(xulns, this.btnStyle);
            btn.id = this.btnId;
            if(this.btnChecked) {
                btn.setAttribute("type", "checkbox");
                btn.setAttribute("autoCheck", "false");
            }
            btn.tooltipText = this.btnTip;
            btn.addEventListener("command", this, false);
            box.appendChild(btn);
            switch(this.btnPos) {
                default:
                    box.setAttribute("cbOnTopFloat", "true");
                    document.documentElement.appendChild(box);
                break;
                case 1:
                    if(this.platformVersion >= 72)
                        box.setAttribute("pack", "end");
                    else
                        box.setAttribute("align", "right");
                    let tabbox = document.getElementById("custombuttons-editbutton-tabbox");
                    let tabs = tabbox.getElementsByTagName("tabs")[0];
                    tabs.parentNode.insertBefore(box, tabs);
                    box.style.marginBottom = -(btn.boxObject || btn.getBoundingClientRect()).height + "px";

                break;
                case 2:
                    box.setAttribute("align", "center");
                    let btnBox = document.documentElement.getButton("accept").parentNode;
                    let insPos = btnBox.firstChild;
                    for(let node = insPos; node; node = node.nextSibling) {
                        if(node.localName == "spacer") {
                            insPos = node;
                            break;
                        }
                    }
                    btnBox.insertBefore(box, insPos);
            }
            this.checkWindowStatus(window, box);
            //this.setOnTop(btn);
        },
        destroyWindow: function(window, reason) {
            if(reason == this.REASON_WINDOW_CLOSED)
                window.removeEventListener("DOMContentLoaded", this, false); // Window can be closed before DOMContentLoaded
            if(!this.isTargetWindow(window))
                return;
            window.removeEventListener("keypress", this, true);
            if(this.hasSizeModeChangeEvent)
                window.removeEventListener("sizemodechange", this, false);
            else
                window.removeEventListener("resize", this, false);
            var document = window.document;
            var btn = this.shadow(document).getElementById(this.btnId);

            btn.removeEventListener("command", this, false);
            if(reason == this.REASON_SHUTDOWN) {
                let box = btn.parentNode;
                box.parentNode.removeChild(box);
                this.removeStyle(document);
                let xulWin = this.getXulWin(window);
                xulWin.zLevel = xulWin.normalZ;
            }
        },
        isTargetWindow: function(window) {
            return window.location.href.substr(0, 41) == "chrome://custombuttons/content/editor.xul";
        },
        observe: function(subject, topic, data) {
            if(topic == "quit-application-granted")
                this.destroy();
            else if(topic == "domwindowopened")
                subject.addEventListener("DOMContentLoaded", this, false);
            else if(topic == "domwindowclosed")
                this.destroyWindow(subject, this.REASON_WINDOW_CLOSED);
        },
        handleEvent: function(e) {
            var trg = e.originalTarget || e.target;
            var window;
            switch(e.type) {
                case "DOMContentLoaded":
                    window = trg.defaultView;
                    window.removeEventListener("DOMContentLoaded", this, false);
                    this.initWindow(window, this.REASON_WINDOW_LOADED);
                break;
                case "keypress":
                    if(
                        !(
                            (e.ctrlKey || e.metaKey) && !e.altKey && !e.shiftKey
                            && String.fromCharCode(e.charCode).toLowerCase() == "t"
                        )
                    )
                        break;
                    e.preventDefault();
                    e.stopPropagation();
                case "command":
                    window = trg.ownerDocument.defaultView.top;
                    this.toggleOnTop(window);
                break;
                case "sizemodechange":
                case "resize":
                    window = trg;
                    this.checkWindowStatus(window);
            }
        },
        version: 0,
        get hasSizeModeChangeEvent() {
            var appinfo = "Services" in window && Services.appinfo;
            delete this.hasSizeModeChangeEvent;
            return this.hasSizeModeChangeEvent = appinfo && (
                appinfo.name == "Pale Moon"
                || (this.version = parseFloat(appinfo.platformVersion)) >= 8
            );
        },
        legacySizeModeChange: function(window) {
            var lastState = window.windowState;
            window.setInterval(function(window, _this) {
                var state = window.windowState;
                if(state != lastState)
                    _this.checkWindowStatus(window);
                lastState = state;
            }, 150, window, this);
        },
        checkWindowStatus: function(window, box) {
            if(!box)
                box = this.shadow(window.document).getElementById(this.boxId);
            var na = String(window.windowState != window.STATE_NORMAL);
            if(box.getAttribute(this.naAttr) == na)
                return;
            box.setAttribute(this.naAttr, na);
            //LOG("Set n/a: " + na);
            this.setOnTop(box.firstChild);
        },
        addStyle: function(document) {
            var style = '\
                %box%[cbOnTopFloat] {\n\
                    display: block !important;\n\
                    position: fixed !important;\n\
                    top: 0 !important;\n\
                    right: 0 !important;\n\
                }\n\
                %btn%, %btn% * {\n\
                    margin: 0 !important;\n\
                    padding: 0 !important;\n\
                }\n\
                %btn% > .button-box > .button-icon {\n\
                    margin: -3px -1px !important;\n\
                }\n\
                toolbarbutton%btn% {\n\
                    padding: 0 2px !important;\n\
                }\n\
                %btn% {\n\
                    position: relative !important;\n\
                    z-index: 2147483647 !important;\n\
                    list-style-image: url("%icon%") !important;\n\
                    -moz-user-focus: ignore !important;\n\
                    min-height: 0 !important;\n\
                    min-width: 0 !important;\n\
                }\n\
                %btn%[%onTopAttr%="true"] {\n\
                    list-style-image: url("%iconPinned%") !important;\n\
                }\n\
                %box%[%naAttr%="true"] image {\n\
                    opacity: 0.75 !important;\n\
                }'
                .replace(/%box%/g, "#" + this.boxId)
                .replace(/%btn%/g, "#" + this.btnId)
                .replace(/%onTopAttr%/g, this.onTopAttr)
                .replace(/%icon%/g, this.icon)
                .replace(/%iconPinned%/g, this.iconPinned)
                .replace(/%naAttr%/g, this.naAttr);

            if(this.shadow(document, style))
                return;
            document.insertBefore(document.createProcessingInstruction(
                "xml-stylesheet",
                'id="' + this.styleId + '" href="' + "data:text/css,"
                    + encodeURIComponent(style) + '" type="text/css"'
            ), document.documentElement);
        },
        removeStyle: function(document) {
            if(this.shadow(document, false))
                return;
            var mark = 'id="' + this.styleId + '"';
            for(var child = document.documentElement; child = child.previousSibling; ) {
                if(
                    child.nodeType == child.PROCESSING_INSTRUCTION_NODE
                    && child.data.substr(0, mark.length) == mark
                ) {
                    document.removeChild(child);
                    break;
                }
            }
        },
        shadow: function(document, arg) {
            var sr = document.documentElement.shadowRoot;
            if(this.btnPos != 2 || !sr)
                return (this.shadow = function(document, arg) {
                    return arg === undefined ? document : false;
                })(document, arg);

            if(arg === undefined)
                return sr;
            var st = sr.querySelector("style"), id = this.styleId;
            if(arg) {
                st.append(arg);
                st.lastChild[id] = true;
            }
            else {
                var tn = Array.from(st.childNodes).find(function(node) {
                    return id in node;
                });
                tn && tn.remove();
            }
            return true;
        },
        getXulWin: function(window) {
            return (
                    window.docShell && window.docShell instanceof Components.interfaces.nsIDocShell
                        ? window.docShell
                        : window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                            .getInterface(Components.interfaces.nsIWebNavigation)
                            .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                )
                    .treeOwner
                    .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                    .getInterface(Components.interfaces.nsIXULWindow || Ci.nsIAppWindow);
        },
        setOnTop: function(btn, toggle) {
            var document = btn.ownerDocument;
            var root = document.documentElement;
            var onTop = root.getAttribute(this.onTopAttr) == "true";
            if(toggle) {
                onTop = !onTop;
                root.setAttribute(this.onTopAttr, onTop);
                if(root.id) {
                    if("persist" in document)
                        document.persist(root.id, this.onTopAttr);
                    else // Firefox 63+
                        Services.xulStore.persist(root, this.onTopAttr);
                }
            }
            else if(!onTop) // Just opened or restored window always have zLevel == normalZ
                return;
            var window = document.defaultView;
            var state = window.windowState;
            // Strange glitches with minimized "raisedZ" window...
            var restore = onTop && state == window.STATE_MINIMIZED;
            if(restore || state == window.STATE_NORMAL) {
                if(restore)
                    onTop = false;
                let xulWin = this.getXulWin(window);
                xulWin.zLevel = onTop ? xulWin.raisedZ : xulWin.normalZ;
                //LOG("Set on top: " + onTop);
            }
            this.checkButton(btn, onTop);
        },
        toggleOnTop: function(window) {
            this.setOnTop(this.shadow(window.document).getElementById(this.btnId), true);
        },
        checkButton: function(btn, onTop) {
            btn.setAttribute(this.onTopAttr, onTop);
            this.btnChecked && btn.setAttribute("checked", onTop);
        }
    };
    storage.set(watcherId, watcher);
    watcher.init(watcher.REASON_STARTUP);
}
function destructor(reason) {
    if(reason == "update" || reason == "delete") {
        watcher.destroy(watcher.REASON_SHUTDOWN);
        storage.set(watcherId, null);
    }
}
if(
    typeof addDestructor == "function" // Custom Buttons 0.0.5.6pre4+
    && addDestructor != ("addDestructor" in window && window.addDestructor)
)
    addDestructor(destructor, this);
else
    this.onDestroy = destructor;

Дает ошибку в строке -  xulWin.zLevel = onTop ? xulWin.raisedZ : xulWin.normalZ;

На форуме

 

№1727516-03-2025 12:52:47

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

Re: Custom Buttons

Andrey_Krropotkin пишет

может где пропустил изменения
Дает ошибку в строке -  xulWin.zLevel = onTop ? xulWin.raisedZ : xulWin.normalZ;

Да, пропустил. Вот это:


Bug 1902315 - Remove popup and window z-level fiction from our codebase. (Firefox 129+)


Не одно и тоже, но есть флаг "alwaysontop", однако,
здесь — кот не валялся, а перезагружать окно — сам понимаешь ...

Отсутствует

 

Board footer

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