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

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№185117-01-2025 22:16:25

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

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

О, значит будет в конце body


Ещё, у меня вторая серия этой истории с верхним тулбаром.


Bug 1935035 - Infobar has incorrect styling when new sidebar panel is enabled (Firefox 136+)


То есть, решили использовать для notifications специальный тулбар,
а раз верхний UCF-тулбар добавляется после последнего тулбара
(который теперь для нотификаций), то ситуация повторяется,
инфобар появляется над дополнительным и разрезает монолит подряд идущих.


Можно посмотреть, запустив с консоли, например
gNotificationBox.appendNotification("", {label: "Test"}, [{label: "Close", callback: () => false}]);


Надо на что-то заменить селектор «:scope > toolbar:last-of-type»
То ли на «#PersonalToolbar»
то ли на «:scope > :nth-last-child(1 of toolbar:not(#notifications-toolbar))»
то ли ещё на что-то.

Отсутствует

 

№185223-01-2025 12:41:47

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

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

Возможно ли как-то прикрутить Attributes_Inspector к Thunderbird?
Или это совсем тухлая затея?
Просто Виталий говорил, что CustomizableUI там урезанный и поэтому кнопки таким способом в Thunderbird не добавить.


«The Truth Is Out There»

Отсутствует

 

№185324-01-2025 21:31:12

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

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

unter_officer пишет

к Thunderbird

Что-то не слишком подробно.


Я совсем не комплиментарен TB,
но, ладно, поставил 135.0b2 и подключил распоследний UCF.


В CustomStylesScripts.mjs, в UcfStylesScripts.scriptschrome.load
прописал имя файла кода, добавляющего кнопку на #tabs-toolbar
с таким, примерно, содержимым

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

Выделить код

Код:

(async () => {
	var btn = document.createXULElement("toolbarbutton");

	var ai = "Attributes Inspector";

	//btn.setAttribute("label", ai);
	btn.setAttribute("tooltiptext", ai);
	btn.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//wDM//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//QID//0CA//8AzP////////////8AzP//AMz//wDM/////////////wDM////////////////////////AMz//0CA//9AgP//AMz/////////////AMz//wDM//8AzP////////////8AzP///////////////////////wDM//9AgP//QID//wDM/////////////wDM//8AzP//AMz/////////////AMz//wDM/////////////wDM//8AzP//QID//0CA//8AzP////////////8AzP//AMz//wDM/////////////wDM//8AzP////////////8AzP//AMz//0CA//9AgP//AMz///////////////////////////////////////8AzP//AMz/////////////AMz//wDM//9AgP//QID//wDM////////////////////////////////////////AMz//wDM/////////////wDM//8AzP//QID//0CA//8AzP////////////8AzP//AMz//wDM/////////////wDM//8AzP////////////8AzP//AMz//0CA//9AgP//AMz/////////////AMz//wDM//8AzP////////////8AzP//AMz/////////////AMz//wDM//9AgP//QID//wDM//////////////////8AzP//AMz/////////////AMz//wDM/////////////wDM//8AzP//QID//0CA//8AzP//AMz//////////////////////////////////wDM//8AzP////////////8AzP//AMz//0CA//9AgP//AMz//wDM//8AzP///////////////////////wDM//8AzP///////////////////////wDM//9AgP//QID//wDM//8AzP//AMz//wDM/////////////wDM//8AzP//AMz///////////////////////8AzP//QID//0CA//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//AMz//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==");

	var id, focus = () => BrowsingContext.get(id)?.window?.focus();
	btn["onmouse" + (AppConstants.platform == "win" ? "over" : "move")]
		= () => id = Services.focus.activeBrowsingContext?.id;
	btn.onmousedown = e => e.button || focus();

	btn._handleClick = () => {
		var u = Services.io.newURI;
		var url = u(Components.stack.filename).resolve("attributesInspector.js");
		var code = Cu.readUTF8URI(u(url)).replace(/\n.+?$/, "})");

		var scope = Cu.getJSTestingFunctions().evalReturningScope(`var f = ${code}`, window);
		var func = scope.f.bind(btn);
		delete scope.f;
		(btn._handleClick = func)();
	}
	document.getElementById("tabs-toolbar").append(btn);
})();


Рядом с ним, файл кода Attributes Inspector'а
под именем attributesInspector.js


И, вроде, завелось. Выглядит как-то так

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

Выделить код

Код:

data:image/png;base64,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


Кстати, special_widgets.js в UCF дефолтно подключён,
что, в Thunderbird, приводит к записи в консоли
«ReferenceError: gNavToolbox is not defined».
Такое вот наблюдение.

Отсутствует

 

№185424-01-2025 23:00:45

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

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

Dumby
Просто супер! Отлично работает.
Огромное спасибо.


Можно я обнаглею и попрошу вас сделать ещё одну кнопочку для Thunderbird. Разумеется, если это будет возможно.
Вот эту: Reload user{Chrome, Content}


«The Truth Is Out There»

Отсутствует

 

№185525-01-2025 01:38:35

dinn
Участник
 
Группа: Members
Зарегистрирован: 28-09-2024
Сообщений: 46
UA: Firefox 134.0

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

Dumby, убегает запятая, в стилях перечерк, что делать - я не знаю, может вы просветите чуток?

Выделить код

Код:

document.body.style.cssText = `-moz-context-properties: fill, fill-opacity;`

Отредактировано dinn (25-01-2025 01:40:08)

Отсутствует

 

№185625-01-2025 15:28:33

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

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

unter_officer пишет

эту

Может extensions.user_chrome_files.custom_scripts_background
плюс такая правка, не уверен.

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

Выделить код

Код:

/*
	ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs").CustomizableUI.createWidget({
		label: "Reload user{Chrome, Content}.css",
		tooltiptext: "L: Reload userChrome.css\nR: Reload userContent.css",

		id: "ucf-userContentReloader",
		localized: false,
		onCreated(btn) {
			btn._handleClick = this.click;
			btn.oncontextmenu = oncontextmenu;
			btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAIpwAACKcBMsYCAwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMwSURBVEiJ5dbNb5RVFMfxz3mmrYgYE0IN4IaKb4n4UqOwMCYu2JCoQVDiwoUrQ4j0xao7ExITQxRoodEFK1cmRkSE8AeYYKpEFF0YY4SiUSMRQW0sLe0818U8nekwHe3U7vhtnnNOzj3f89znPvderjVFK8npaSWrPSjpElahQzhvyrF4y++t1GqbF7DHOvQLj6Ozrt2EDutYRHAasMK0vXgWWZO0SX/7DlJf6Skp3UWcFeVRV4zG235tCZx6rDPtKLqqAN4XPhROm3DJEiG3LA6aKkZ14jUSKaOd1Gsco6Qz8vRiDDvTFJz63S13AjdVAg7JvBxDzs2RfrE2MP9ijolZijvJXo/h8pmmb5z6LZf7qICWJQNxwP5mM1OnzNdy03V1U0oi2x77y+/Wp16t3CDWgvDKvKGIQZepfO+iWBIpKG9s7HGW0k7dKgsJjsSQffOF1or4srAuS04U9jOp14amYGGgiF2Re6llaEWnMSbPNyl5DtNFQzvnBKdd2oRNhXt4ZvW1rCwfkbInY9jHMeiscBiEJ9Lz2mfSaovgovXC8sI7siAoYsgnMy8JkmPYhhtdbwOV6a9NdVhT69qphYIblPl0FuO2WrimVVVrcu7dZkFqd75q525uBCelqj0tXzRwvSYbwWZ1doOVi4Yad0vVDj81gjPfV+2y9YsGLnlgFrj6p9TA405irPAemwmn/raNqc/D/wO9uXj+bMhXDeDihDledLYt9VmTektb5flxebYgcOpx+yzw0aic3vXgSqY9hdUuOUx6T+WWcX/LUELYh3ZMyqq1G8FxwCl8ULjdVFd6d6tgPQbMfLIwHIPONgVXWs1OFm3Mjt6Rdlg2X2bq0yfsLtzP/OHVq3PqzuPUm/Vj9xz9ZDrcg5F/Bb6gS8mbkq1F6EdlW+IdE03Baae1pEeJb1SuO0vrMvPsPvKRArDaChf8qWRal/BQccBsxnXFiBFTtjS7czW93qYdVurQJZW6SLeK+DaGyofSLh0uGUNHk6F/SfZI3ojh2k41b3DThnrdS+1/nAnjcxzR5mDsdeG/6szrXl2nJX4w4RFJJ3LhF7lzMey3lmtdU/oHaoj4Y/PDRWgAAAAASUVORK5CYII=");
		},
		get click() {
			var {file, spec} = getURI("hrome");
			var chromeSheet = getSheet(Services.wm.getMostRecentWindow(null).document, spec);
			delete this.click;
			return this.click = !chromeSheet ? noop : function() {
				var win = this.ownerGlobal;
				if (win.event?.detail < 2 && file.exists())
					reload(chromeSheet),
					win.setTimeout(restyle, 50);
			}
		}
	});
*/
	var click = btn => {
		var {file, spec} = getURI("hrome");
		var chromeSheet = getSheet(Services.wm.getMostRecentWindow(null).document, spec);

		(click = !chromeSheet ? noop : btn =>  {
			var win = btn.ownerGlobal;
			if (win.event?.detail < 2 && file.exists())
				reload(chromeSheet),
				win.setTimeout(restyle, 50);
		})(btn);
	}
	var clickcall = function() {click(this);}

	var topic = "chrome-document-loaded";
	var obs = doc => {
		if (!doc.documentURI?.endsWith("/messenger.xhtml")) return;

		var btn = doc.createXULElement("toolbarbutton");

		btn._handleClick = clickcall;
		btn.oncontextmenu = oncontextmenu;
		btn.tooltipText = "L: Reload userChrome.css\nR: Reload userContent.css";
		btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAIpwAACKcBMsYCAwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMwSURBVEiJ5dbNb5RVFMfxz3mmrYgYE0IN4IaKb4n4UqOwMCYu2JCoQVDiwoUrQ4j0xao7ExITQxRoodEFK1cmRkSE8AeYYKpEFF0YY4SiUSMRQW0sLe0818U8nekwHe3U7vhtnnNOzj3f89znPvderjVFK8npaSWrPSjpElahQzhvyrF4y++t1GqbF7DHOvQLj6Ozrt2EDutYRHAasMK0vXgWWZO0SX/7DlJf6Skp3UWcFeVRV4zG235tCZx6rDPtKLqqAN4XPhROm3DJEiG3LA6aKkZ14jUSKaOd1Gsco6Qz8vRiDDvTFJz63S13AjdVAg7JvBxDzs2RfrE2MP9ijolZijvJXo/h8pmmb5z6LZf7qICWJQNxwP5mM1OnzNdy03V1U0oi2x77y+/Wp16t3CDWgvDKvKGIQZepfO+iWBIpKG9s7HGW0k7dKgsJjsSQffOF1or4srAuS04U9jOp14amYGGgiF2Re6llaEWnMSbPNyl5DtNFQzvnBKdd2oRNhXt4ZvW1rCwfkbInY9jHMeiscBiEJ9Lz2mfSaovgovXC8sI7siAoYsgnMy8JkmPYhhtdbwOV6a9NdVhT69qphYIblPl0FuO2WrimVVVrcu7dZkFqd75q525uBCelqj0tXzRwvSYbwWZ1doOVi4Yad0vVDj81gjPfV+2y9YsGLnlgFrj6p9TA405irPAemwmn/raNqc/D/wO9uXj+bMhXDeDihDledLYt9VmTektb5flxebYgcOpx+yzw0aic3vXgSqY9hdUuOUx6T+WWcX/LUELYh3ZMyqq1G8FxwCl8ULjdVFd6d6tgPQbMfLIwHIPONgVXWs1OFm3Mjt6Rdlg2X2bq0yfsLtzP/OHVq3PqzuPUm/Vj9xz9ZDrcg5F/Bb6gS8mbkq1F6EdlW+IdE03Baae1pEeJb1SuO0vrMvPsPvKRArDaChf8qWRal/BQccBsxnXFiBFTtjS7czW93qYdVurQJZW6SLeK+DaGyofSLh0uGUNHk6F/SfZI3ojh2k41b3DThnrdS+1/nAnjcxzR5mDsdeG/6szrXl2nJX4w4RFJJ3LhF7lzMey3lmtdU/oHaoj4Y/PDRWgAAAAASUVORK5CYII=");

		doc.getElementById("tabs-toolbar").append(btn);
	}
	Services.obs.addObserver(obs, topic);
	Services.obs.addObserver(function quit(s, t) {
		Services.obs.removeObserver(quit, t);
		Services.obs.removeObserver(obs, topic);
	}, "quit-application-granted");

dinn пишет

убегает запятая

Ух ты! Я вижу это!
Ожидалось что угодно, но только не такое

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

Выделить код

Код:

data:image/png;base64,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


Видимо, какое-то повреждение в CSS-парсере, что ли.
У меня, сходу, не получилось ничего с этим сделать.

в стилях перечерк

А этот вот перечёрк, он вообще надёжен?
Просто я попробовал обрести в девтулс вот этот hbox...


Тут рад бы был привести скриншот,
но, из-за дата-урлов, тогда выпадаю из лимита в 64k, поэтому словами:


ПКМ по вкладке —> Пункт «Переместить вкладку» (#context_moveTabOptions)
—> его пред-последний дочерний элемент (hbox.menu-right),
ну, типа стрелка
[>]


И «перечёрк» присутствует.


Хотя я даже близко ничем никчему не прикасался,
скрин сделан практически с чистого профиля.

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

Выделить код

Код:

data:image/png;base64,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

Отсутствует

 

№185725-01-2025 16:17:27

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

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

Dumby пишет

Может extensions.user_chrome_files.custom_scripts_background
плюс такая правка, не уверен.

Спасибо большое! Всё работает.


«The Truth Is Out There»

Отсутствует

 

№185803-02-2025 12:15:24

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

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

Dumby помоги ещё! :beer:


Как определить, что загруженный файл является графическим по его содержанию, а не по расширению ?
В коде завершения загрузки надо переименовывать лишь картинки, взяв имя из Clipboard


P.S. пробовал некоторые примеры из сети, но не получилось в твой скрипт приспособить...

Отредактировано Dobrov (03-02-2025 12:18:10)

Отсутствует

 

№185904-02-2025 04:51:52

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

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

Поставил крайнюю версию UCF. Отвалилось всё в custom_script_win.js
Очистка работает, но раньше при ESC возвращало всё взад, теперь пусто.

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

Выделить код

Код:

// Script For browser window document [ChromeOnly]
// https://forum.mozilla-russia.org/viewtopic.php?pid=788229#p788229
// Очистить панель адреса или поиска прокруткой колёсиком мыши на панели
(this.clearsearchurlbar = {
    init(that) {
        for (let el of (this.urlsearcbar = document.querySelectorAll("#urlbar,#searchbar")))
            el.addEventListener("wheel", this);
        that.unloadlisteners.push("clearsearchurlbar");
    },
    handleEvent(e) {
        e.target.value = "";
    },
    destructor() {
        for (let el of this.urlsearcbar)
            el.removeEventListener("wheel", this);
    },
}).init(this);

// Автоматически открывать папки закладок на панели закладок
(this.placesmenudndhandler = {
    delay: 350,
    init(that) {
        var PlacesToolbar = this.PlacesToolbar = document.querySelector("#PlacesToolbar");
        if (!PlacesToolbar) return;
        PlacesToolbar.addEventListener("mouseover", this);
        this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
        that.unloadlisteners.push("placesmenudndhandler");
    },
    isButtonMenu(node) {
        if (node.localName == "toolbarbutton" &&
            node.getAttribute("type") == "menu" &&
            node.menupopup?.hasAttribute("placespopup"))
            return true;
        return false;
    },
    isOpen(popup) {
        if (popup.state === "open")
            return true;
        return false;
    },
    handleEvent(event, target = event.target, popup) {
        if (!this.isButtonMenu(target) || this.isOpen(popup = target.menupopup))
            return;
        this.timer.cancel();
        this.timer.initWithCallback(() => {
            if (this.curpopup && this.isOpen(this.curpopup))
                this.curpopup.hidePopup();
            this.curpopup = popup;
            popup.openPopup();
        }, this.delay, Ci.nsITimer.TYPE_ONE_SHOT);
        target.addEventListener("mouseleave", () => {
            this.timer.cancel();
        }, { once: true });
    },
    destructor() {
        this.PlacesToolbar.removeEventListener("mouseover", this);
    },
}).init(this);

// Пункт для контекстного меню адресной строки, подставляющий модификаторы поиска
(this.searchmodifiers = {
    init(that) {
        var urlbar = this.urlbar = gURLBar.textbox;
        if (!urlbar) return;
        urlbar.addEventListener("popupshowing", this);
        that.unloadlisteners.push("searchmodifiers");
    },
    handleEvent(e) {
        if (e.originalTarget != this.popup) return;
        this.urlbar.removeEventListener("popupshowing", this);
        this.urlbar = null;
        var sep = this.popup.querySelector("menuseparator.menuseparator-add-engine") || this.popup.lastElementChild;
        var menu = this.append("menu", sep, {label: "Вставить ^ * + % ~ # @"}, "before");
        this.append("menuseparator", menu, null, "before");
        var popup = this.append("menupopup", menu, {oncommand: "insert(event);"}, "append");
        popup.addEventListener("popupshowing", this, { once: true });
        this.handleEvent = e => {
            var df = document.createDocumentFragment();
            for (let label of [
                "^ История",
                "* Закладки",
                "+ Страницы с метками",
                "% Текущие открытые вкладки",
                "~ Набранные",
                "# Названия",
                "@ Веб-адреса (URLs)"
            ])
                this.append("menuitem", df, {label}, "append");
            popup.append(df);
            var ed = gURLBar.inputField.editor
                .QueryInterface(Ci.nsIEditor || Ci.nsIPlaintextEditor);
            popup.insert = e => {
                var str = e.target.label[0] + " ";
                var val = gURLBar.inputField.value;
                if (val && !val.endsWith(" ")) str = " " + str;
                ed.endOfDocument();
                ed.insertText(str);
            };
        };
    },
    get popup() {
        delete this.popup;
        return this.popup = gURLBar.inputField.parentNode.menupopup;
    },
    append(name, parent, attrs, func) {
        var elm = document.createXULElement(name);
        if (attrs) for (let a in attrs) elm.setAttribute(a, attrs[a]);
        parent[func](elm);
        return elm;
    },
    destructor() {
        this.urlbar?.removeEventListener("popupshowing", this);
    },
}).init(this);

// Добавить подменю "Поиск изображения в" в контекстном меню изображений
(this.searchimagecontextmenu = {
    handleEvent(evt) {
        if (evt.target != this.contextMenu || !gContextMenu?.imageInfo?.currentSrc) return;
        var array = [
            ['Google', 'https://www.google.lv/favicon.ico', 'https://www.google.com/searchbyimage?&image_url='],
            ['Яндекс', 'https://yastatic.net/morda-logo/i/favicon_islands.ico', 'https://yandex.ru/images/search?rpt=imageview&url='],
            ['Bing', 'https://www.bing.com/s/a/bing_p.ico', 'https://www.bing.com/images/search?view=detailv2&iss=sbi&form=SBIHMP&sbisrc=UrlPaste&q=imgurl:'],
            ['Tineye', 'https://tineye.com/favicon.ico', 'https://tineye.com/search?pluginver=bookmark_1.0&url='],
        ];
        var menu = document.createXULElement("menu");
        menu.setAttribute("label", "Поиск изображения в ...");
        menu.setAttribute("class", "menu-iconic");
        menu.setAttribute("image", array[1][1]);
        menu.setAttribute("onclick", "_searcclick(event);");
        menu._searcclick = function(e) {
            if (e.target != this) return;
            gBrowser.selectedTab = gBrowser.addTrustedTab(this._searcharg[2] + encodeURIComponent(gContextMenu.imageInfo.currentSrc), { index: gBrowser.selectedTab._tPos + 1 } );
            this.parentNode.hidePopup();
        }
        menu._searcharg = array[0];
        var menuPopup = document.createXULElement("menupopup");
        menu.append(menuPopup);
        array.forEach(m=> {
            var mItem = document.createXULElement("menuitem");
            mItem.setAttribute("label", m[0]);
            mItem.setAttribute("image", m[1]);
            mItem.setAttribute("class", "menuitem-iconic");
            mItem.setAttribute("oncommand", "gBrowser.selectedTab = gBrowser.addTrustedTab(_searcharg[2] + encodeURIComponent(gContextMenu.imageInfo.currentSrc), { index: gBrowser.selectedTab._tPos + 1 } );");
            mItem._searcharg = m;
            menuPopup.append(mItem);
        });
        var mItem = document.createXULElement("menuitem");
        mItem.setAttribute("label", 'Искать во всех поисковиках');
        mItem.setAttribute("oncommand", "_searcharg.forEach(m => { gBrowser.selectedTab = gBrowser.addTrustedTab(m[2] + encodeURIComponent(gContextMenu.imageInfo.currentSrc), { index: gBrowser.selectedTab._tPos + 1 } );});");
        mItem._searcharg = array;
        menuPopup.append(mItem);
        this.contextMenu.querySelector("#context-copyimage-contents")?.before(menu);
        this.popupshowing = e => {
            if (e.target != this.contextMenu) return;
            menu.hidden = !gContextMenu?.imageInfo?.currentSrc;
        };
        this.popuphiding = e => {
            if (e.target != this.contextMenu) return;
            menu.hidden = true;
        };
        this.contextMenu.addEventListener("popuphiding", this);
        this.handleEvent = e => {
            this[e.type](e);
        };
    },
    init(that) {
        var contextMenu = this.contextMenu = document.querySelector("#contentAreaContextMenu");
        if (!contextMenu) return;
        contextMenu.addEventListener("popupshowing", this);
        that.unloadlisteners.push("searchimagecontextmenu");
    },
    destructor() {
        this.contextMenu.removeEventListener("popupshowing", this);
        this.contextMenu.removeEventListener("popuphiding", this);
    },
}).init(this);

// Очистить куки ПКМ на иконке в строке адреса https://forum.mozilla-russia.org/viewtopic.php?pid=783022#p783022
(this.clearsitedatawithrightclick = {
    get clearSiteData() {
        delete this.clearSiteData;
        try {
            return this.clearSiteData = eval(`(${gIdentityHandler.clearSiteData})`.replace(/^\((async\s)?.*?clearSiteData/, "($1function clearSiteData").replace(/this\s*\./g, "gIdentityHandler.").replace(/(?:let\s*hidden\s*=\s*new\s*Promise\s*\([\S\s]+await\s*hidden\s*;|PanelMultiView\.hidePopup.+?;|event\.stopPropagation.+?;)/g, ""));
        } catch (e) {}
        return this.clearSiteData = function() {}
    },
    init(that) {
    var identitybox = this.identitybox = document.querySelector("#identity-box");
    if (!identitybox)
            return;
        identitybox.addEventListener("contextmenu", this, true);
        identitybox.addEventListener("click", this, true);
        that.unloadlisteners.push("clearsitedatawithrightclick");
    },
    handleEvent(e) {
        if (e.button != 2)
            return;
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();
        if (e.type != "click")
            return;
        this.clearSiteData(e);
    },
    destructor() {
        this.identitybox.removeEventListener("contextmenu", this, true);
        this.identitybox.removeEventListener("click", this, true);
    },
}).init(this);


Даже №1825  в скриптах исправил. :angry: Знать бы, что ещё отвалилось и когда я об этом узнаю.

Отсутствует

 

№186004-02-2025 09:31:12

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 326
UA: Google 2.1

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

xrun1
Посмотрите ещё №1836
Вы используете:

Выделить код

Код:

that.unloadlisteners.push

такого там больше нет.

Добавлено 04-02-2025 09:45:28
для примера

Выделить код

Код:

that.unloadlisteners?.push("clearsearchurlbar") || that.setUnloadMap?.("clearsearchurlbar", this.destructor, this);

правда не знаю работает ли через "||"... для меня стояла задача, чтоб не мешало

Отредактировано Farby (04-02-2025 09:45:28)


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№186104-02-2025 16:04:07

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

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

Farby пишет

that.unloadlisteners.push

такого там больше нет.

Проясните мне, пожалуйста, один момент. Такого нет в принципе, или только в новой версии UCF? Ведь на

version, date year-month-day: 2024-10-31

всё прекрасно работает, даже без правки №1836.
Это первое. И второе: сейчас попробую заменить и нужно ли в версию

version, date year-month-day: 2025-1-17

вносить правку №1836?
Спасибо за помощь.:beer:

Отредактировано xrun1 (04-02-2025 16:05:11)

Отсутствует

 

№186204-02-2025 16:57:37

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

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

Dobrov пишет

Как определить, что загруженный файл является графическим по его содержанию, а не по расширению ?

Может что-то тупенькое подойдёт?
Типа попытки загрузить в <img>
Если удалось — значит графический.


Вот, погоняй

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

Выделить код

Код:

(async fx125 => {
	var arg = window;
	if (fx125) arg = arg.browsingContext;

	var fp = makeFilePicker();
	fp.init(arg, "", fp.modeOpen);
	var res = await new Promise(fp.open);
	if (res != fp.returnOK) return;

	var isGraf = url => new Promise(resolve => {
		var img = new Image();
		img.onload = img.onerror = e => resolve(e.type.startsWith("l"));
		img.src = url;
	});

	alert(await isGraf(fp.fileURL.spec));

})(parseInt(Services.appinfo.platformVersion) >= 125);

Отсутствует

 

№186304-02-2025 18:04:55

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 326
UA: Google 2.1

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

xrun1 пишет

Проясните мне, пожалуйста, один момент. Такого нет в принципе, или только в новой версии UCF?

unloadlisteners был удалён в этом комите, что касается правок это на вкус и цвет, я не пользую UCF...


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№186405-02-2025 15:50:41

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

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

Farby
Обновился на [firefox] 135, кнопки не отвалились.
Себе на будущее, 136 и т.д. сделал новый UCF и внёс правки, чтобы как только - так сразу. Спасибо, работают. :beer:
Кто поможет?
В 135-й отвалились значки поиска по выделенному.

картинка
6da12ef9b3cfc8f199c548ececdcdf41.png

contextsearch.js
    scriptschrome: { // For browser window document [ChromeOnly]
        domload: [ // By event "DOMContentLoaded"
            { path: "sidebar_tabs.js", ucfobj: true, },// Sidebar Tabs
        ],
        load: [ // By event "load"
            { path: "cs_win/contextsearch.js", ucfobj: true, },

Выделить код

Код:

(this.contextsearch = {
    topic: "browser-search-engine-modified",
    hide: "browser.search.hiddenOneOffs",
    defaultImg: "chrome://browser/skin/search-engine-placeholder.png",
    searchSelect: null,
    popup: null,
    init(that) {
        var searchSelect = this.searchSelect = document.querySelector("#context-searchselect");
        if (!searchSelect)
            return;
        var popup = this.popup = searchSelect.closest("menupopup");
        popup.addEventListener("popupshowing", this);
        that.unloadlisteners?.push("contextsearch");
    },
    destructor() {
        this.popup.removeEventListener("popupshowing", this);
        if (this.popupshowing == this.handler) {
            this.popup.removeEventListener("popuphidden", this);
            Services.obs.removeObserver(this, this.topic);
            Services.prefs.removeObserver(this.hide, this);
        }
    },
    handleEvent(e) {
        this[e.type](e);
    },
    popupshowing(e) {
        var popup = this.popup;
        var searchSelect = this.searchSelect;
        if (e.target != popup || searchSelect.hidden) return;

        var menu = document.createXULElement("menu");
        menu.className = "menu-iconic";
        var menupopup = document.createXULElement("menupopup");
        menu.append(menupopup);
        menu.ePopup = menupopup;
        searchSelect.style.setProperty("display", "none", "important");
        searchSelect.before(menu);
        menu.onclick = this.search.bind(this);
        this.handler = e => e.target != popup || (menu.hidden = searchSelect.hidden);
        this.handlerRebuild = e => this.handler(e) || this.rebuild(menu);
        this.popuphidden = ev => {
            if (ev.target != popup) return;
            menu.hidden = true;
        };
        this.popup.addEventListener("popuphidden", this);
        this.rebuild(menu);
    },
    getEngines() {
        var args = "hideOneOffButton" in Services.search.defaultEngine
            ? [e => !e.hideOneOffButton]
            : Object.defineProperty(
                [function(e) {return !this.includes(e.name);}], "1", {
                    get: () => Services.prefs.getStringPref(this.hide)?.split(",") || []
                }
            );
        return (this.getEngines = async () =>
            (await Services.search.getVisibleEngines()).filter(...args)
        )();
    },
    async rebuild(menu) {
        var de = Services.search.defaultEngine;
        de = de.wrappedJSObject || de;
        this.setAttrs(menu, de, `Искать в ${de.name} или в ...`);
        menu.ePopup.textContent = "";
        for(let engine of await this.getEngines()) {
            if (engine == de) continue;
            var menuitem = document.createXULElement("menuitem");
            menuitem.className = "menuitem-iconic";
            this.setAttrs(menuitem, engine);
            menu.ePopup.append(menuitem);
        }
        this.popupshowing = this.handler;
        Services.obs.addObserver(this, this.topic, false);
        Services.prefs.addObserver(this.hide, this);
    },
    setAttrs(node, engine, label = engine.name) {
        node.engine = engine;
        node.setAttribute("label", label);
        node.setAttribute("image", engine._iconURI ? engine._iconURI.spec : engine.iconURI ? engine.iconURI.spec : this.defaultImg);
    },
    observe() {
        this.popupshowing = this.handlerRebuild;
        Services.obs.removeObserver(this, this.topic);
        Services.prefs.removeObserver(this.hide, this);
    },
    search(e) {
        var {engine} = e.target;
        if (!engine) return;
        var searchSelect = this.searchSelect;
        var submission = engine.getSubmission(
            searchSelect.searchTerms, null, "contextmenu"
        );
        if (submission) {
            let tab = gBrowser.addTab(submission.uri.spec, {
                postData: submission.postData,
                index: (gBrowser.selectedTab._tPos + 1),
                triggeringPrincipal: searchSelect.principal
            });
            if (e.button == 0)
                gBrowser.selectedTab = tab;
        }
        var popup = this.popup;
        e.button != 1 && popup.state == "open" && popup.hidePopup();
    }
}).init(this);

Отредактировано xrun1 (05-02-2025 15:52:31)

Отсутствует

 

№186505-02-2025 17:12:15

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 326
UA: Google 2.1

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

xrun1 пишет

Кто поможет?
В 135-й отвалились значки поиска по выделенному.

На замену

browser-search-engine.uc.js

Выделить код

Код:

// ==UserScript==
// @name      Browser search engine
// @author    Vitaliy V.
// @include   main
// @shutdown  window.contextsearch.destructor();
// @note      https://forum.mozilla-russia.org/viewtopic.php?pid=780283#p780283
// ==/UserScript==

(this.contextsearch = {
    topic: "browser-search-engine-modified",
    hide: "browser.search.hiddenOneOffs",
    defaultImg: "chrome://browser/skin/search-engine-placeholder.png",
    searchSelect: null,
    popup: null,
    init(that) {
        var searchSelect = this.searchSelect = document.querySelector("#context-searchselect");
        if (!searchSelect)
            return;
        var popup = this.popup = searchSelect.closest("menupopup");
        popup.addEventListener("popupshowing", this);
      //  that.unloadlisteners?.push("contextsearch"); // OLD UCF
        that.setUnloadMap?.("contextsearch", this.destructor, this);
    },
    destructor() {
        this.popup.removeEventListener("popupshowing", this);
        if (this.popupshowing == this.handler) {
            this.popup.removeEventListener("popuphidden", this);
            Services.obs.removeObserver(this, this.topic);
            Services.prefs.removeObserver(this.hide, this);
        }
    },
    handleEvent(e) {
        this[e.type](e);
    },
    popupshowing(e) {
        var popup = this.popup;
        var searchSelect = this.searchSelect;
        if (e.target != popup || searchSelect.hidden) return;

        var menu = document.createXULElement("menu");
        menu.className = "menu-iconic";
        var menupopup = document.createXULElement("menupopup");
        menu.append(menupopup);
        menu.ePopup = menupopup;
        searchSelect.style.setProperty("display", "none", "important");
        searchSelect.before(menu);
        menu.onclick = this.search.bind(this);
        this.handler = e => e.target != popup || (menu.hidden = searchSelect.hidden);
        this.handlerRebuild = e => this.handler(e) || this.rebuild(menu);
        this.popuphidden = ev => {
            if (ev.target != popup) return;
            menu.hidden = true;
        };
        this.popup.addEventListener("popuphidden", this);
        this.rebuild(menu);
    },
    getEngines() {
        var args = "hideOneOffButton" in Services.search.defaultEngine
            ? [e => !e.hideOneOffButton]
            : Object.defineProperty(
                [function(e) {return !this.includes(e.name);}], "1", {
                    get: () => Services.prefs.getStringPref(this.hide, [])?.split(",") || []
                }
            );
        return (this.getEngines = async () =>
            (await Services.search.getVisibleEngines()).filter(...args)
        )();
    },
    async rebuild(menu) {
        var de = Services.search.defaultEngine;
        de = de.wrappedJSObject || de;
        this.setAttrs(menu, de, `Искать в ${de.name} или в ...`);
        menu.ePopup.textContent = "";
        for(let engine of await this.getEngines()) {
            if (engine == de) continue;
            var menuitem = document.createXULElement("menuitem");
            menuitem.className = "menuitem-iconic";
            this.setAttrs(menuitem, engine);
            menu.ePopup.append(menuitem);
        }
        this.popupshowing = this.handler;
        Services.obs.addObserver(this, this.topic, false);
        Services.prefs.addObserver(this.hide, this);
    },
    async setAttrs(node, engine, label = engine.name) {
        node.engine = engine;
        node.setAttribute("label", label);
        node.setAttribute("image", await engine.getIconURL?.() || engine.getIconURLBySize?.(16, 16) || this.defaultImg);
    },
    observe() {
        this.popupshowing = this.handlerRebuild;
        Services.obs.removeObserver(this, this.topic);
        Services.prefs.removeObserver(this.hide, this);
    },
    search(e) {
        var {engine} = e.target;
        if (!engine) return;
        var searchSelect = this.searchSelect;
        var submission = engine.getSubmission(
            searchSelect.searchTerms, null, "contextmenu"
        );
        if (submission) {
            let tab = gBrowser.addTab(submission.uri.spec, {
                postData: submission.postData,
                index: (gBrowser.selectedTab._tPos + 1),
                triggeringPrincipal: searchSelect.principal
            });
            if (e.button == 0)
                gBrowser.selectedTab = tab;
        }
        var popup = this.popup;
        e.button != 1 && popup.state == "open" && popup.hidePopup();
    }
}).init(this);


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№186606-02-2025 00:29:12

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

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

Dumby пишет

Типа попытки загрузить в <img> Если удалось — значит графический.

Благодарю! пойдёт, за неимением лучшего, т.к. определять по расширению глупо.
Возвращает false для pcx tga tif и видимо, всех, не поддерживаемых на страницах HTML.
на Маке и Линукс тип можно получить через proc.runwAsync(file path) это слишком тупой способ…

Отсутствует

 

№186706-02-2025 01:44:13

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

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

Farby
Спасибо, работает.:beer:
Я сразу забыл уточнить, что использую правленый Вами вариант https://forum.mozilla-russia.org/viewto … 58#p808658.

Отсутствует

 

№186806-02-2025 01:58:19

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

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

Dumby
Помоги! Не смог прикрутить проверку графического файла к скрипту отслеживания загрузок!
для isGraf await тоже не помог, сбой на строке var src = download.source.url;

onDownloadChanged

Выделить код

Код:

(async () => {
	var list = await Downloads.getList(Downloads.ALL);

	list.addView({
		onDownloadChanged(download) {
			if (!download.succeeded) return;

			var isGraf = url => new Promise(resolve => {
				var img = new Image();
				img.onload = img.onerror = e => resolve(e.type.startsWith("l"));
				img.src = url;
			});

			var src = download.source.url;
			// var s = await isGraf(src);
			console.log(src);
			// alert(await isGraf(src));

		}
	});
})();

Отсутствует

 

№186906-02-2025 02:12:21

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

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

Dobrov
По сути то же, что предложил Dumby, вдруг код пригодится. Я в своём скрипте использую. На экзотических форматах не проверял.

Отсутствует

 

№187006-02-2025 18:34:39

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

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

Dobrov пишет

await тоже не помог

Ещё бы, onDownloadChanged() ведь не асинхронная функция.

download.source.url

Ещё раз по сети притащить? Нет, такое точно без меня.


Может как-то так

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

Выделить код

Код:

(async renamed => {

	var view = {
		onDownloadChanged(download) {
			if (
				!download.succeeded || download[renamed]
				|| this.skipRenameForDownload(download)
			)
				return;;
			
			var win = Services.wm.getMostRecentBrowserWindow();
			var img = new win.Image();

			img.onload = this.onImgLoad;	
			img.src = (img.u = Services.io.newFileURI(
				img.f = win.FileUtils.File((img.d = download).target.path)
			)).spec;
		},
		onImgLoad() {
			var uri = this.u.QueryInterface(Ci.nsIURL);
			var file = this.f, {parent} = file;
			var newName = view.getNewFileName() + "." + uri.fileExtension;

			var newFile = parent.clone();
			newFile.append(newName);
			newFile.createUnique(file.NORMAL_FILE_TYPE, file.permissions);

			file.renameTo(parent, newFile.leafName);

			var {d} = this;
			d.target.path = newFile.path;
			d[renamed] = true;

			d.onchange(d.succeeded = false);
			d.onchange(d.succeeded = true);
			view.dh.addDownloadToHistory(d);
		},
		get dh() {
			delete this.dh;
			return this.dh = ChromeUtils.importESModule(
				"resource://gre/modules/DownloadHistory.sys.mjs"
			).DownloadHistory;
		},

		skipRenameForDownload(download) {
			return false; // dummy
		},
		getNewFileName(arg) {
			return "renamed"; // dummy
		}
	};
	(await Downloads.getList(Downloads.ALL)).addView(view);

})(Symbol.for("Download renamed for some reason"));

Отсутствует

 

№187107-02-2025 01:52:14

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

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

Решил "пощупать" 136 версию, бета 2.
Отвалилось с десяток скриптов.


У всех отвалившихся скриптов в консоли какая-то странная одинаковая ошибка:
Content-Security-Policy: Параметры страницы заблокировали выполнение обработчика события (script-src-attr), поскольку он нарушает следующую директиву: «script-src-attr 'none' 'report-sample'»


Это что за ошибка такая? И как её исправить?


add
Не уверен, но есть подозрение, что отвалились скрипты, где присутствует что-то типа такого:
btn.setAttribute("oncommand", "handleCommand(this)");
btn.setAttribute("oncommand", "BrowserCommands.reload()");
menuitem.setAttribute("oncommand", m[2]);
menuitem.setAttribute("onclick", "_searcclick(event);");
popup.setAttribute("onpopupshowing", "event.defaultPrevented || filler.fill(event)");

Отредактировано unter_officer (07-02-2025 03:56:32)


«The Truth Is Out There»

Отсутствует

 

№187207-02-2025 08:20:31

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

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

unter_officer пишет

Это что за ошибка такая?

Не столько даже ошибка, скорее репортинг. Генезис таков:


Bug 1937080 - Mitigate breakage risks for parent-process script security


а точнее, именно для бетки,


Bug 1942991 - Block inline event handlers from browser.xhtml in Early Beta

И как её исправить?

Ну, пока что, можно просто настройку переключить.
Но, как у них заведено, настройка подлежит удалению.


Поэтому, лучше переделать коды с использования «on…» атрибутов
на использование метода addEventListener()


В некоторых случаях, можно использовать объектный on-хэндлер,
типа elm.onclick = e => {…}
но для каких-нибудь "oncommand", "onpopupshowing"
таковых нет, поскольку это чисто XUL'ский стафф.

Отредактировано Dumby (07-02-2025 08:22:07)

Отсутствует

 

№187307-02-2025 15:13:00

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

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

Dumby - не все картинки переименовываются.


Наверное, с Overlay проблемы, но имена получены и меняются для всех.
ClickPicSave.jsm нормально сохраняет не в папку Загрузки, но не переименовывает с некоторых сайтов.
Может, для подобных расширений тоже не сработает. Через "Сохранить изображение как…" всегда переименует.

Mod onDownloadChanged

Выделить код

Код:

(async renamed => {

	var view = {
		onDownloadChanged(download) {
			if (!download.succeeded || download[renamed] || this.skipRenameForDownload(download))
				return;
			
			var win = Services.wm.getMostRecentBrowserWindow();
			var img = new win.Image();

			img.onload = this.onImgLoad;
			img.src = (img.u = Services.io.newFileURI(
				img.f = win.FileUtils.File((img.d = download).target.path)
			)).spec;
		},
		onImgLoad() {
			var uri = this.u.QueryInterface(Ci.nsIURL);
			var file = this.f, {parent} = file;

			var newName = view.getNewFileName(file, uri.fileExtension);
			var newFile = parent.clone();
			newFile.append(newName);
			newFile.createUnique(file.NORMAL_FILE_TYPE, file.permissions);

console.log(file.leafName, newName);

			file.renameTo(parent, newFile.leafName);

			var {d} = this;
			d.target.path = newFile.path;
			d[renamed] = true;

			d.onchange(d.succeeded = false); d.onchange(d.succeeded = true);
			view.dh.addDownloadToHistory(d);
		},
		get dh() {
			delete this.dh;
			return this.dh = ChromeUtils.importESModule("resource://gre/modules/DownloadHistory.sys.mjs").DownloadHistory;
		},
		getNewFileName(file, ext) { //имя будет из Clipboard…
			return (file.leafName.replace(new RegExp('.'+ ext +'$','i'),'') +"_ReName").slice(0,128) +"."+ ext;
		},
		skipRenameForDownload(download) {
			return false; // dummy
		}
	};
	(await Downloads.getList(Downloads.ALL)).addView(view);

})(Symbol.for("Download renamed"));

Отсутствует

 

№187407-02-2025 15:44:50

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

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

Dumby пишет

Поэтому, лучше переделать коды с использования «on…» атрибутов
на использование метода addEventListener()

В некоторых случаях, можно использовать объектный on-хэндлер,
типа elm.onclick = e => {…}
но для каких-нибудь "oncommand", "onpopupshowing"
таковых нет, поскольку это чисто XUL'ский стафф.

Dumby, в общем что смог, то переделал. Не знаю насколько правильно, но вроде работает и в консоль не "гадит".
Однако остались скрипты, которые мне не осилить. Поэтому просьба помочь.

Восстановление удалённых закладок или папок

Выделить код

Код:

//
(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: "Восстановить удалённое",
        oncommand: "PlacesTransactions.undo().catch(Cu.reportError);",
        image: "data:image/png;base64,.....",
    }))
        menuitem.setAttribute(...args);

    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"));

Simple Session Manager

Выделить код

Код:

//
(async (pid, mp, self) => CustomizableUI.createWidget((self = {
    id: "ucf_SimpleSessionManager",
    label: "Simple Session Manager",
    tooltiptext: "Менеджер сессий",
    localized: false,
    init() {
        this.handleEvent = e => this[e.type](e);
        this.onTimeout = async () => await this.saveSession() || this.save();
        Services.obs.addObserver(this, "quit-application");
        var {openMenu} = this;
        this.render = function() {
            this.openMenu = openMenu;
            this.constructor.prototype.render.call(this);
        }
        delete this.init;
        return this;
    },
    image: "data:image/png;base64,.....",
    onCreated(btn) {
        btn.type = "menu";
        btn.phTimestamp = 0;
        btn.render = this.render;
        btn.onclick = this.click;
        btn.setAttribute("image", this.image);
        var popup = btn.ownerDocument.createXULElement("menupopup");
        popup.filler = this;
        popup.id = pid;
        popup.setAttribute("onpopupshowing", "event.defaultPrevented || filler.fill(event)");
        btn.prepend(popup);

        btn.addEventListener("mousedown", this);
        popup.addEventListener("command", this);
        btn.ownerGlobal.addEventListener("unload", () => {
            btn.removeEventListener("mousedown", this);
            popup.removeEventListener("command", this);
            if (popup.filler != this)
                // popup.removeEventListener("dragstart", this),
                popup.removeEventListener("popuphidden", this);
        }, {once: true});
    },
    openMenu(arg) {
        var pos;
        if (this.matches(".widget-overflow-list > :scope"))
            pos = "after_start";
        else var win = this.ownerGlobal, {width, height, top, bottom, left, right} =
            this.closest("toolbar").getBoundingClientRect(), pos = width > height
                ? `${win.innerHeight - bottom > top ? "after" : "before"}_start`
                : `${win.innerWidth - right > left ? "end" : "start"}_before`;
        this.firstChild.setAttribute("position", pos);
        delete this.openMenu;
        this.openMenu(arg);
    },
    mousedown(e) {
        if (e.button) return;
        var trg = e.target;
        if (trg.nodeName.startsWith("t"))
            trg.mdTimestamp = Cu.now(),
            trg.tid = e.view.setTimeout(this.onTimeout, 500),
            e.preventDefault();
    },
    boot(trg) {
        var popup = trg.parentNode;
        var old = popup.querySelector("[boot]");
        if (old != trg) old?.removeAttribute("boot");
        trg.toggleAttribute("boot");
        popup.bootChanged = true;
    },
    muTimestamp: 0,
    click(e) {
        var trg = e.target;
        if (trg.nodeName == "menu") {
            if (e.button > 1) self.boot(trg);
            else if (Cu.now() - self.muTimestamp > 50)
                e.view.closeMenus(trg.menupopup),
                self.restoreSession(trg.label, (e.button || e.ctrlKey) && e.view);
        }
        else if (trg != this || e.button) return;
        e.view.clearTimeout(this.tid);
        if (this.mdTimestamp - this.phTimestamp > 50) this.open = true;
    },
    async command(e) {
        var arg, trg = e.target, cmd = trg.value;
        if (cmd.startsWith("r"))
            arg = trg.parentNode.parentNode.label;
        await this[cmd](arg) || this.save();
    },
    dragstart(e) {
        var trg = e.target;
        if (trg.nodeName != "menu") return;

        var popup = trg.parentNode;
        this.dragData = {trg, mouse: true};
        trg.menupopup.hidePopup();

        var win = trg.ownerGlobal;
        win.setCursor("grabbing");
        var {width} = trg.getBoundingClientRect();
        trg.setAttribute("maxwidth", width);

        win.addEventListener("mouseup", this);
        popup.addEventListener("mousemove", this);
    },
    mousemove(e) {
        var trg = e.target, dtrg = this.dragData.trg;
        if (trg == dtrg || trg.nodeName != "menu") return;

        e.movementY > 0
            ? trg.nextSibling != dtrg && trg.after(dtrg)
            : trg.previousSibling != dtrg && trg.before(dtrg);
    },
    mouseup(arg) {
        if (arg.constructor.isInstance?.(arg)) {
            arg.preventDefault();
            var {trg} = this.dragData;
            this.dragData.mouse = false;
            this.muTimestamp = Cu.now();
        }
        else var trg = arg;

        trg.removeAttribute("maxwidth");
        trg.ownerGlobal.setCursor("auto");
        trg.ownerGlobal.removeEventListener("mouseup", this);
        trg.parentNode.removeEventListener("mousemove", this);
    },
    popuphidden(e) {
        if (!e.target.id) return;
        e.view.removeEventListener("keydown", this, true);
        var popup = e.target;
        popup.parentNode.phTimestamp = Cu.now();

        var save;
        if (this.dragData) {
            var {trg, mouse} = this.dragData;
            mouse && this.mouseup(trg);

            delete this.dragData;
            var order = Array.from(popup.getElementsByTagName("menu"), m => m.label);
            if (order.toString() != this.meta.order.toString()) {
                var hasBoot = this.meta.boot != null;
                if (hasBoot) var bootName = this.meta.order[this.meta.boot];
                this.meta.order = order;
                if (hasBoot) this.meta.boot = this.meta.order.indexOf(bootName);
                save = true;
            }
        }
        if (popup.bootChanged) {
            delete popup.bootChanged;
            var {boot} = this.meta;
            var bootNode = e.target.querySelector("[boot]");
            var ind = bootNode && this.meta.order.indexOf(bootNode.label);
            if (ind != boot)
                this.meta.boot = ind,
                save = true;
        }
        save && this.save(e.view);
    },

    sku: `#${pid} > menu[maxwidth]`,
    skd: `#${pid} > menu:is([maxwidth],[_moz-menuactive]):not([open])`,
    keydown(e) {
        if (e.repeat && e.key == "Shift" || !e.shiftKey && e.key != " ") return;
        var func = this.keyHandlers[e.key];
        if (!func) return;

        var menu = e.view.windowRoot
            .ownerGlobal.document.querySelector(this.skd);
        if (menu)
            e.stopImmediatePropagation(),
            func.call(this, menu, e);
    },
    keyup(e) {
        if (e.key != "Shift") return;
        var win = e.view.windowRoot.ownerGlobal;
        win.removeEventListener("keyup", this, true);
        win.document.querySelector(this.skd)?.removeAttribute("maxwidth");
    },
    keyHandlers: {
        Enter(menu) {
            this.boot(menu);
        }
    },
    arrow(menu) {
        if (menu.hasAttribute("maxwidth")) return;
        menu.setAttribute("maxwidth", menu.getBoundingClientRect().width);
        menu.ownerGlobal.addEventListener("keyup", this, true);
        this.dragData = {trg: menu};
    },
    fill(e) {
        var mxe = e.view.MozXULElement;

        var initFrag = mxe.parseXULToFragment(`
            <menuitem value="saveSession" class="menuitem-iconic" label="Сохранить сессию"/>
            <menuseparator/>
        `);
        this.menuFrag = mxe.parseXULToFragment(`<menu class="menu-iconic"><menupopup>
            <menuitem label="Переименовать"
                class="menuitem-iconic" value="renameSession"/>
            <menuitem label="Удалить"
                class="menuitem-iconic" value="removeSession"/>
        </menupopup></menu>`);

        this.regStyle();

        var filler = { fill: e => e.target.id
            ? e.view.addEventListener("keydown", this, true)
                || e.target.fillFlag || this.fillSessions(e.target)
                : this.dragData?.mouse && e.preventDefault()
        };

        (this.fill = e => {
            var trg = e.target;
            trg.setAttribute("context", "");
            trg.append(trg.ownerDocument.importNode(initFrag, true));
            (trg.filler = filler).fill(e);
            // trg.addEventListener("dragstart", this);
            trg.addEventListener("popuphidden", this);
        })(e);
    },
    fillSessions(popup) {
        while(popup.lastChild.nodeName == "menu") popup.lastChild.remove();
        var ind = 0, {boot} = this.meta;
        for(var name of this.meta.order) {
            var df = popup.ownerDocument.importNode(this.menuFrag, true);
            df.firstChild.setAttribute("label", name);
            if (ind++ == boot) df.firstChild.toggleAttribute("boot");
            popup.append(df);
        }
        popup.fillFlag = true;
    },
    regStyle() {
        delete this.regStyle;
        var subst = "ucf-ssm-style-resurl";
        Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler).setSubstitution(
            subst, Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
                @-moz-document url-prefix(chrome://browser/content/browser.xhtml) {
                    #${pid} > menu {
                        // list-style-image: url("${this.image}");
                        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAEnQAABJ0BfDRroQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGxSURBVDiNnZE/T1NRGMZ/7zn3lmKLkIKpaUxZFINEJZ0YHXRwcnBxMQ6aOJi4+FH8Dm5OOjA4+AEYGCTRook1JlVIVUrbW/rnPg63UtReIr7bOXmf5/ye59jDlanHS3O+wn/Mu+/DF8HFeVe5f+vaPTdfPpF4UNvk6frmhwAvXOEsvrR0IoN47xM4CHCADmDQBkAHbdTrTBRZdgYLs6NTD/MiMC+gC8MO6ke8ffWsXv3S3JpksHouv7Z4/UEeM8z6IwKfEGjYRt0G1d3m1p3n0Y1JBi/vTtfKw1Yec2CHBDFmXYjboAgL4tTc5pXsmcNcDxIDUFQHuqgfYT69OAuE9qqAoX4jIcAL7b9H+0deOYYg3tkYXxx2EAo7dQYEBF/TEULD5oow7KHut18RhGVD3GwxMZ36YWn6IJd37vQCSMSNBpYQCMs43PQMAJXlwtr6k7CGfo9iznN1ebGY7Ak1NSJwYERYJgM+Q+nClVzp/OXc3wWMwdT+jAVKCMwLC2PUeoMrrEI4m94BQq0a6mxjoca/YKFgUCfeqR8jPhoHcIAHe3ST2+UFLv2T8o/5uMvrnx9Wn65p5nMEAAAAAElFTkSuQmCC");
                    }
                    #${pid} > [value=saveSession] {
                        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKVSURBVHjajFNNTBNREJ6+7na73bLbQn8I0BKNCYWKGr0oYoiJPxeNh6oHozcOxgSVi4le1JNHQRPigRsewURNPKiJMQicSISUACelRVJ2tz/bdktpy9adBzT8xTjJ5L35ezNv5hsLHEAv7noEntguChx7EuV8oTydKRhfno8kCnt9LTuFZ7f87mAz/8rnl86GOoOBBq+LQX1S1ioLs0txWdEmsulS38Phlcy+BwZ6W0L+JsfolcjpsFDnBKNcgQ193bRUwSrwQFgr6Dkd3o9NzilqMdI/FF+sPYCZ245I4zdunw9DtQr6LxlK6bVdpdrcPAiHfGBYLDD69ltUXsmfw0oIGoPNjkHMjMHa3J9asDyRpoyEOrQR0+dq5MxR0c29Rj3Bhvn8YjeWjZmN9cpWcApSkzpkptYg8T1FdWjTfysg1Ang9YtdT+80OogTbJc7OlsD+OftzOqsBrMflqHe6QKXIEL00zLV0UpSBbM/G9DeEQy6OXKJsfPsCbdXYjb0Yu2/nmMS9LSGYGlYpXLPkxCwkq1mR98Gn8Q4XexxYhhgYKf3TPTfRDaPqklkvViaSSpaxSpw/x1v5e0UG8W10k+iW8qfF2ZiccIydFQ7ScsXKO8ep4NiYj4ai6k5+Eoev1F1Wcn8QJDgnAnHbGYRWTh800cZ77Ryzmr6eCGXzYGiZCcQ2vQ32XT5PiIMTJBI4Waw1ZtZzLu7XaSMd1s9b9paKJA+vpuKqols3y4ov7wXaPN67GPXIl1hnDOOansyVicHhGHMzHkzeDKqqPnr/UOJxX3LNNDb5BJd3KC3Uexu7wgEGxq3limRqcxH47FVWRtPreYePBpJagdu4zYhwjx1cMFus59CuVgqTmPDDlrnvwIMAGS8IFCLagHpAAAAAElFTkSuQmCC");
                    }
                    #${pid} [value=restoreSession] {
                        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAACzElEQVQ4jX2QPWwbZRjHf+/5vfPdObZjO3Ga2pVpGtxCP4QIDKgqDCDUNQwgJCS2qFI3hBCRCvXSCcTAAu0GY0Fi4kuq+IjUCpWAgCTq4IpS3Di2G8c+x/bZ57t7mSJFMfBf/3p+z+95BPvy3pufxqKmcVY3ZFFKmQtFGIReuNnrDze6lv5TqfSyx4EIgA/e+fzkZML6MDmVnD80mz1kxW3DMAxQCs/z6Hb6g3q1Xt1ttdfa7dbFN668vrkHkADJhPntufNnc0LTDi7AjFkkUknzcGF2LvCDuZVvfiwCj+/1GoAmhL3x6x2cZhsVqjFIGIZs15ts/LJOJCLt/Z0EiE3Y9eLpR1ONaoMH9zbHAGiC9FSKkwunWF1Z3RoDABhRg/zRPPmj+XHA/0QDaLectFLj6gcT+AHdTm9mzMC27e766lrWtCwy2Qz2hIUeNVDAaDCku9ujWW/ij3wsO9oaMzCiunf66TMU5gt4wyGbf1Upr5W5u15mq1JDhYqZQo6HIuqtueLw4vLXzwC89NZXeQFw/ePv7zx5buHEf6nf3qgMVipOGE0ko6EKhoQi3NnZ+c51BwsaQLOxM9N1uv86vNtz+aHSDn0pH9S2tl6r/Pn3s/VG/WYunzs/NZ2OSID0dKpRrzZS98v3kYbEsi1004BQcbtc9Q07bdYb229/dvmFL5aWVvVts9mq1Wo/e54vJIAQqGOPzQHgj3zcvos39BAIBshRqJQYjYZ/AFy79tQIeHVx+ctiIDRTA+g43Xud9q4PIHVJPBknk82QzqY5VZg2UUrEYhOX9s5aXL5RnMykb8Rj9kcC4OrSVZ1Hpt+PJ5PPz+SzR5KpyYRpGgRKMei7fHLr7lBmZ1XHcX4LgsCxLPt4JBLRm82Hr4j9DyuVSprdO/ZELGafkXpkXtPA94OK03Vv/R4/csEw5XOGbuieN6y6bv/S9XdfvPkPTgcoDlpQJpwAAAAASUVORK5CYII=");
                    }
                    #${pid} [value=renameSession] {
                        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPFJREFUeNrEU0sOgkAMbc1IIHoQT+KeY7hkBW5ccwLdsOICxI2X8peIGhggI21gggpCwsImM01f+tpOO0WlFIwR0efgeR5nsG0boihizPd91A5UwZDjuq5qwycwUkQYhttSr4Y4l76fDdtBEAQqz3OVZdnPQ09o2sQhrpBSQgnAen/qzLxZzljHcawxy7KAuCJNUyiKAm53SS0FBGQNlUW3lFO2iVCLYRhAXJEkCQPn65NGAswpL/4fWAebt1ZGXB3geHlw9maXsKqjS94CHNxF7xRM0/wKgI7jDBojvbnZAz3Gv/9E7NvGvmXCsev8EmAAWocA9ofpaRIAAAAASUVORK5CYII=");
                    }
                    #${pid} [value=removeSession] {
                        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABt0lEQVQ4ja2RT2sTURTFz8tk0nntFAQrVLBQxIUg/tkkMoLyIEVECHZhNrrxI+hOP5Mb6eBCcEipYIjZ2LpvhFasUtBSkwzOve+6mE6YSScuxLt67753fudyLvA/a7T+qCHmiTfrfWCMd3j9diPfq2SHX+uPnzJx71gP33w3bX9avBcE2j+SkK30Di7ffJ71VebMxD1hC2GGEEfH41prpftynIm92A0t2aYQQYgBThrndz/2KwCgf9Z2LNtImFOAtc356ijcCwJdJrZEUWzPfJpMAAAStPWR/h2Ktc10CoIQRUKEabFNvNbKfndcAKSjtrVfHW5YorWTzxDKYAxLtOWM+P7yt51hIYPpsDTNTyB/EwNAtWxdMuV8GCfbgxjxIviUYSV/SQOrbVjitbx4N8alBeXcdZR+3Tl3xS8FlIkt0dbnWH3xlbPgKgUo3HEq+tX7C4EuAAbGeOmqCuLIJt69s3PeQ1epKGfapCQJO6vGmwAWf/C1Wau6td8dV123BaAAUfHw6gSwtP3ugxA/y6X9INszAOQgbwFAIC/MQb9/Kv2vF2/UByejlVVn1Xiby/X6rPd/qj/1ak71UYKuwQAAAABJRU5ErkJggg==");
                    }
                    #${pid} > menuseparator:last-child,
                    #${pid} > menu[maxwidth] > .menu-right {
                        display: none;
                    }
                    #${pid} > menu[boot] {
                        color: #AA0000;
                        font-weight: bold;
                    }
                }`.replace(/;$/gm, " !important;"))));
        var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
        sss.loadAndRegisterSheet(Services.io.newURI("resource://" + subst), sss.USER_SHEET);
    },
    get gs() {
        delete this.gs;
        return this.gs = Cu.import("resource:///modules/sessionstore/SessionStore.jsm", {});
    },
    splice(name, newName) {
        var ind = this.meta.order.indexOf(name);
        if (ind == -1) return;
        var args = [ind, 1];

        if (1 in arguments) args.push(newName);
        else {
            if (ind == this.meta.boot) this.meta.boot = null;
            else if (ind < this.meta.boot) this.meta.boot--;
        }
        this.meta.order.splice(...args);
    },
    get meta() {
        var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
        file.append("simple_session_manager.json");
        this.path = file.path;
        try {
            this.data = JSON.parse(Cu.readUTF8File(file));
        } catch {
            this.pp = file.parent.path;
            this.data = Object.create(null);
        }
        var meta = this.data[mp];
        if (!meta) {
            var order = Object.keys(this.data);
            meta = this.data[mp] = {order, boot: null};
        }
        delete this.meta;
        return this.meta = meta;
    },
    io: {
        get OS() {
            delete this.OS;
            Cu.import("resource://gre/modules/osfile.jsm", this);
            return this.OS;
        },
        makeDirectory(path) {
            return (this.makeDirectory = this.OS.File.makeDir)(path);
        },
        writeJSON(path, obj) {
            var wa = this.OS.File.writeAtomic;
            return (this.writeJSON = (path, obj) => wa(path, JSON.stringify(obj)))(path, obj);
        }
    },
    async save(excWin) {
        var io = Cu.getGlobalForObject(Cu).IOUtils || this.io;
        if (this.pp)
            await io.makeDirectory(this.pp), delete this.pp;
        (this.save = excWin => {
            this.meta.order.length
                ? io.writeJSON(this.path, this.data)
                : io.remove(this.path, {ignoreAbsent: true});
            for(var win of CustomizableUI.windows) {
                if (win == excWin) continue;
                var popup = win.document.getElementById(pid);
                if (popup) popup.fillFlag = false;
            }
        })(excWin);
    },
    get prompter() {
        var {prompt} = Services;
        var p = {}, args = [null, null, "UCF Simple Session Manager"];
        p.alert = prompt.alert.bind(...args);
        p.confirm = prompt.confirm.bind(...args);
        var pr = prompt.prompt.bind(...args);
        p.prompt = (msg, value) => {
            var res = {value};
            return pr(msg, res, null, {}) ? res.value : null;
        }
        delete this.prompter;
        return this.prompter = p;
    },
    observe(s, t, data) {
        Services.obs.removeObserver(this, "quit-application");
        if (data.includes("restart")) return;

        var {boot} = this.meta;
        if (boot == null) return;

        var state = this.data[this.meta.order[boot]];
        var ssi = this.gs.SessionStoreInternal;
        ssi.getCurrentState = () => state;
        Services.obs.removeObserver(ssi, "browser:purge-session-history");

        Services.prefs.setBoolPref("browser.sessionstore.resume_session_once", true);
    },
    get bwt() {
        delete this.bwt;
        var url = "resource:///modules/BrowserWindowTracker.jsm";
        return this.bwt = ChromeUtils.import(url).BrowserWindowTracker;
    },
    getTabLabel() {
        return `${
            this.bwt.getTopWindow().gBrowser.selectedTab.label.slice(0, 70)
        }`;
    },
    getName(state) {
        var tl = 0;
        for(var w of state.windows) tl += w.tabs.length;
        return `${tl}(B) [${
            new Date().toLocaleString("mn").replace(" ", " - ")
        }]`;
    },
    exists(name) {
        this.meta;
        return (this.exists = name => name in this.data &&
            !this.prompter.alert("Сессия с тем же именем уже существует!"))(name);
    },
    getState() {
        return JSON.parse(this.gs.SessionStore.getBrowserState());
    },
    get spref() {
        var pref = "browser.sessionstore.interval";
        var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
        var wait = cb => timer.initWithCallback(cb, 1e3, timer.TYPE_ONE_SHOT);
        delete this.spref;
        return this.spref = async cb => {
            var val = Services.prefs.getIntPref(pref);
            Services.prefs.setIntPref(pref, 100);
            await new Promise(wait);
            Services.prefs.setIntPref(pref, val);
        }
    },
    async saveSession(name = this.getName(this.getState()), getTabLabel = this.getTabLabel()) {
        var saveName = this.prompter.prompt("Сохранить", getTabLabel );
        var name = (saveName + ", " + name );
        if (name == null || saveName == null) return true;

        if (this.exists(name)) return this.saveSession(name);

        await this.spref();
        this.data[name] = this.getState();

        this.meta.order.push(name);
        //this.meta.order.unshift(name);
        //if (this.meta.boot != null) this.meta.boot++;
    },
    restoreSession(name, win) {
        var ss = this.gs.SessionStore;
        var state = JSON.stringify(this.data[name]);
        win ? ss.setWindowState(win, state) : ss.setBrowserState(state);
    },
    renameSession(name, newName = name) {
        var newName = this.prompter.prompt(`Переименовать "${name}" в:`, newName);
        if (newName == null || newName == name) return true;

        if (this.exists(newName)) return this.renameSession(name, newName);

        var {data} = this;
        this.splice(name, newName);
        data[newName] = data[name];
        delete data[name];
    },
    removeSession(name) {
        if (!this.prompter.confirm(`Вы уверены, что хотите удалить: ${name} ?`))
            return true;
        delete this.data[name];
        this.splice(name);
    }
}).init()))("ucf-ssm-menupopup", "{07cae4f5-18b0-487b-80eb-973304af9528}");

Переключить текущий поисковик

Выделить код

Код:

//
try {CustomizableUI.createWidget({
    label: "Переключить текущий поисковик",
    id: "ucf_ToggleCurrentSearchEngine",
    localized: false,
    image: "data:image/png;base64,.....",
    excludeHiddenOneOffs: true,
    gn: () => Services.search.defaultEngine,
    gp: () => Services.search.defaultPrivateEngine,
    sn: val => Services.search.defaultEngine = val,
    sp: val => Services.search.defaultPrivateEngine = val,
    onCreated(btn) {
        btn.type = "menu";
        btn.owner = this;
        btn.setAttribute("image", this.image);

        var win = btn.ownerGlobal;
        var popup = btn.appendChild(win.document.createXULElement("menupopup"));
        var pr = win.PrivateBrowsingUtils.isWindowPrivate(win);
        popup.getDefaultEngine = pr ? this.gp : this.gn;
        popup.setDefaultEngine = pr ? this.sp : this.sn;
        popup.setAttribute("oncommand", "setDefaultEngine(event.target.engine)");
        popup.setAttribute("onpopupshowing", "this.shouldRebuild && owner.rebuild(this, document)");

        this.autoOpenCloseFeature(win, btn);
        this.updButton(btn, win);
    },
    getEngines() {
        var ve = Services.search.getVisibleEngines;
        if (!this.excludeHiddenOneOffs) return (this.getEngines = ve)();

        var arr = [];
        var args = this.fx116
            ? [e => !e.hideOneOffButton]
            : Object.defineProperty(
                [function(e) {return !this.includes(e.name);}], "1", {get: () => {
                    var str = Services.prefs.getStringPref(this.pref);
                    return str ? str.split(",") : arr;
                }}
            );
            return (this.getEngines = async () => (await ve()).filter(...args))();
    },
    async rebuild(popup, doc) {
        popup.textContent = "";
        var df = doc.createDocumentFragment();
        var de = popup.getDefaultEngine().wrappedJSObject, jsde = this.json(de);
        var check = true;
        for(var engine of await this.getEngines()) {
            if (check && engine.name == de.name && this.json(engine) == jsde) {
                check = false; continue;
            }
            var menuitem = df.appendChild(doc.createXULElement("menuitem"));
            menuitem.engine = engine;
            menuitem.label = engine.name;
            menuitem.className = "menuitem-iconic";
            menuitem.image = await this.img(engine);
        }
        popup.append(df);
        delete popup.shouldRebuild;
    },
    async updButton(btn, win) {
        this.updButton = () => {};
        Services.search.isInitialized || await Services.search.init();
        this.fx116 = "hideOneOffButton" in Services.search.defaultEngine;

        var topics = ["browser-search-engine-modified", "quit-application-granted"];
        for(var topic of topics) Services.obs.addObserver(this, topic, false);
        this.observe = (s, topic) => this[topic[0]]();

        var remove = () => topics.forEach(
            topic => Services.obs.removeObserver(this, topic)
        );
        var {id} = this;
        var wins = callback => {
            for(var win of CustomizableUI.windows) {
                var btn = win.document.getElementById(id);
                btn && callback(btn, win);
            }
        }
        if (this.excludeHiddenOneOffs && !this.fx116) {
            var setRebuild = btn => btn.firstChild.shouldRebuild = true;
            var {pref} = this, obs = () => wins(setRebuild);
            Services.prefs.addObserver(pref, obs);
            this.q = () => remove(Services.prefs.removeObserver(pref, obs));
        }
        else this.q = remove;

        var updButton = (btn, win) => {
            var popup = btn.firstChild;
            var engine = popup.getDefaultEngine();
            /*btn.label =*/ btn.tooltipText = engine.name;
            popup.shouldRebuild = true;
            win.requestAnimationFrame(async () => btn.icon.src = await this.img(engine));
        }
        (this.b = () => wins(updButton))();
        this.updButton = updButton;
        btn.tooltipText || updButton(btn, win);
    },
    pref: "browser.search.hiddenOneOffs",
    json: e => JSON.stringify(e.toJSON()),
    img: async e => await e.getIconURL?.() || e.iconURI?.spec || "chrome://browser/skin/search-engine-placeholder.png",

    // https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/autoOpenCloseMenu.js
    // Automatically open menu on mouse over (and hide it on mouse out)
    autoOpenCloseFeature(win, btn, openDelay = 20000, closeDelay = 350) {
        var _openTimer = 0;
        var _closeTimer = 0;
        btn.onmouseover = function(e) {
            win.clearTimeout(_closeTimer);
            if(e.target == btn && closeOtherMenus()) {
                btn.open = true;
                return;
            }
            _openTimer = win.setTimeout(function() {
                btn.open = true;
            }, openDelay);
        };
        btn.onmouseout = function(e) {
            win.clearTimeout(_openTimer);
            _closeTimer = win.setTimeout(function() {
                btn.open = false;
            }, closeDelay);
        };
        function closeOtherMenus() {
            return win.Array.prototype.some.call(
                btn.parentNode.getElementsByTagName("*"),
                function(node) {
                    if(
                        node != btn
                        && win.XULElement.isInstance(node)
                        // See https://github.com/Infocatcher/Custom_Buttons/issues/28
                        //&& node.boxObject
                        //&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
                        && "open" in node
                        && node.open
                        && node.getElementsByTagName("menupopup").length
                    ) {
                        node.open = false;
                        return true;
                    }
                    return false;
                }
            );
        }
    }
});} catch(ex) {Cu.reportError(ex);}

Отредактировано unter_officer (08-02-2025 01:19:14)


«The Truth Is Out There»

Отсутствует

 

№187508-02-2025 01:17:36

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

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

Dumby, по мере тестирования выплыло ещё пару кнопок, которы у меня исправить не получается.
Если не трудно, поправьте пожалуйста и эти кнопочки.

Сохранить как PNG

Выделить код

Код:

//
(async func => CustomizableUI.createWidget({
    id: "ucf_SaveAsPNG",
    label: "Сохранить как PNG",
    tooltiptext: "Сохранить как PNG",
    localized: false,
    // defaultArea: CustomizableUI.AREA_NAVBAR,
    onCreated(btn) {
        var win = btn.ownerGlobal;
        new win.Function("_id, xhtmlns, addDestructor", func.toString().slice(7, -1)).call(
            btn, this.id, "http://www.w3.org/1999/xhtml",
            destructor => win.addEventListener("unload", destructor, {once: true})
        );
        btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGwSURBVHjarJPPaxNBGIafmd1km23saqtRaLB6kFYl2ELpRayCVL20RvCmJwk9ePNWvPsXtCA9eNCDeO0hLemPo96LYAuKkRhtsBViEtI0rrt+GyFQ1oMkfjAf883M+8w7w4zyfZ9uwsxms10RzCBNTd3sSLy2lvsDCCKzWMCKGHgotOTAlpamJPm+jCmFL00bmmbD5WlmsKXTdBltB3bcxowaLWJwsTpi4bvNVu1JMmVn5cmcqTB6/DAg3hcjGpUFskjZjlgFKdmvVIiISKlfUhlyQMVPywgDjvX1YCjpOBZ2fZ+9+TuUpxcZuz7Ebl7ArkfM0dgDcOAFCvfwHTi9URJJi2RCqEuPmRxPUXn9imodLo1D6orGjMHW6govZqfDDkYviDXBlZ4vsFsrk8vXqZRWeDY8hz55lvvpGU7sFEn0RhhTtTBg/tETCvlNdj68papsUoND3Lh6iyPOOYrvv/JufYNrqcssbW8zkjwdBnz7/JKL50/x4F4at9GgsFckX/2IefQHZyb6mbl9l2LpE8ff1PnufWkD/t87yC1v/pvi4V8AwZvuNFS33/m3AAMAhEeAiqLmty4AAAAASUVORK5CYII=");
    }
}))(() => {


((main, parts) => this._handleClick = () => {
    var df = MozXULElement.parseXULToFragment(`
        <menupopup>
            <menuitem class="menuitem-iconic"
                image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOwSURBVHjaYmBiYuJvamo+xiIsLLL3uaazMUAAMTY3txxjAAFubq7/ZiYm/wECACIA3f8AGhobzGhoaP8QFRr/6enp/wT5+fgBLS0tAOLi4gCnp6cAAoixtrbuFBsb6x+QNnZ2jo0MXz9/+Qdk/wfhO3fu/Gc5cuwoA4NqHEOoszjDrVu3GFiAogxJtiwMagrCQHMeMgAEoHhsdRCG4Tj463+rxGFIqN2CYI7wBpiaWhzPheF5SMhIKliCYiQtyTC4hvSLcu7cHYQQl5SSDyFGa23UWkfvfXTORWNMpiIYH2NV1xXN5gvq9kfqNjtSStF7mkAhBPTXHm3TYL1qsV2+8LyfIaXEbRjAyuzpUOCcI+cMYgzp31hCnft+fgII6Cm95oiICOd///4CFTAwAOWBgBFIM7Lw8vLZM5w7d+7/t2/fwA4DOfDp02d/QQ4GWv1z6tSpU5g+ffrI8OnTJyagFUx2Tu5MsnIyTDk52UyfPn5k/vXr9x+mjx8+MsTFxTGERMUzVK09yCAsn8AwY+ZMhlevX0Pc9PTZM4a3b94wXHjwmaEsu5th87GpQIcyMdy+fZvh79+/DEwfP35giIuPZ3hzbTeDCtcjhngnEwZVVRWGz58/g+ON5dOnz6BYYKioqGY4eOggg5SuBYORkRHDixcvQL5hZNTR0flnY2PD+O8fKAwYgGHwHyTMwMzMwrBt2zZHgAA9Uz1Lw1AUPWlKE1vFlEIFHRoKQgcRtDSLIAiCgoJuiovYP6DopnR1EdRYHO3W6tbg5K5LwclmVQviRwutpSaQtI3P+yIK7/Eu94t77jkPiqIcGUaZ5vlmlvXFbNui12LEBSPo/uU29/EYrYQ1m01WqVRYPn++FQiHI3Mj8RG4jst7wHFcFAoFaFoGsixBliRoGc338dg3AQuKojc2OoZ+vzcZ4JRwQNQAxVIJsVgMuVwO8/OL2D29xPjSHvpCHAf7+36M57iuSzUdnzISg4d3AvxgVqHrJ5BCIcxu7KCdWoLx3MFLaBjOxDJSC1lIsowzXUfVNFEnJflrJi2i1WrBtm1MpzNgAoN5U8TtySE61Sccb6/jIjuF3uMduo5DOWk/l9fwxQr0o+6J+rSqqlxjQq1WQ9kw8PH2CoF5cLtd8gaRSCSwsrqKZDJJu3A8WZbFer2hB2nLAc5ZNBplHFskEsEmSUcURV8q+GXTH5ffBo1OUzNFGUa7/cm4eGcEIbA2MBBW6df8VnC1s3/zv8mfScchaq+GhgavfwBr4dP0kYqtcwAAAABJRU5ErkJggg=="
                label="Сохранить всю страницу как PNG"
                value="all"/>

            <menuitem class="menuitem-iconic"
                image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOwSURBVHjaYmBiYuJvamo+xiIsLLL3uaazMUAAMTY3txxjAAFubq7/ZiYm/wECACIA3f8AGhobzGhoaP8QFRr/6enp/wT5+fgBLS0tAOLi4gCnp6cAAoixtrbuFBsb6x+QNnZ2jo0MXz9/+Qdk/wfhO3fu/Gc5cuwoA4NqHEOoszjDrVu3GFiAogxJtiwMagrCQHMeMgAEoHhsdRCG4Tj463+rxGFIqN2CYI7wBpiaWhzPheF5SMhIKliCYiQtyTC4hvSLcu7cHYQQl5SSDyFGa23UWkfvfXTORWNMpiIYH2NV1xXN5gvq9kfqNjtSStF7mkAhBPTXHm3TYL1qsV2+8LyfIaXEbRjAyuzpUOCcI+cMYgzp31hCnft+fgII6Cm95oiICOd///4CFTAwAOWBgBFIM7Lw8vLZM5w7d+7/t2/fwA4DOfDp02d/QQ4GWv1z6tSpU5g+ffrI8OnTJyagFUx2Tu5MsnIyTDk52UyfPn5k/vXr9x+mjx8+MsTFxTGERMUzVK09yCAsn8AwY+ZMhlevX0Pc9PTZM4a3b94wXHjwmaEsu5th87GpQIcyMdy+fZvh79+/DEwfP35giIuPZ3hzbTeDCtcjhngnEwZVVRWGz58/g+ON5dOnz6BYYKioqGY4eOggg5SuBYORkRHDixcvQL5hZNTR0flnY2PD+O8fKAwYgGHwHyTMwMzMwrBt2zZHgAA9Uz1Lw1AUPWlKE1vFlEIFHRoKQgcRtDSLIAiCgoJuiovYP6DopnR1EdRYHO3W6tbg5K5LwclmVQviRwutpSaQtI3P+yIK7/Eu94t77jkPiqIcGUaZ5vlmlvXFbNui12LEBSPo/uU29/EYrYQ1m01WqVRYPn++FQiHI3Mj8RG4jst7wHFcFAoFaFoGsixBliRoGc338dg3AQuKojc2OoZ+vzcZ4JRwQNQAxVIJsVgMuVwO8/OL2D29xPjSHvpCHAf7+36M57iuSzUdnzISg4d3AvxgVqHrJ5BCIcxu7KCdWoLx3MFLaBjOxDJSC1lIsowzXUfVNFEnJflrJi2i1WrBtm1MpzNgAoN5U8TtySE61Sccb6/jIjuF3uMduo5DOWk/l9fwxQr0o+6J+rSqqlxjQq1WQ9kw8PH2CoF5cLtd8gaRSCSwsrqKZDJJu3A8WZbFer2hB2nLAc5ZNBplHFskEsEmSUcURV8q+GXTH5ffBo1OUzNFGUa7/cm4eGcEIbA2MBBW6df8VnC1s3/zv8mfScchaq+GhgavfwBr4dP0kYqtcwAAAABJRU5ErkJggg=="
                label="Сохранить видимую часть страницы как PNG"
                value="page"/>

            <menuitem class="menuitem-iconic"
                image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKaSURBVHjaYpx94sPD44//CDG9+/SDp8bsBw9AADEmrX7zmQEIGF+//fD/w8dPDAABxNix6/nbcA0GIQYoYGJiZGSQFBdmOHnqLAMrKwsDQAAxJq958/n/f4jsm2//GBifP3v+/8cfiMDDj/8ZmHi5ORl4gPjPn18M///9ZWDh5uVm4GJkYfj56zcD9z9GBoAAYmwH2aL8UwimDRk8+fyfgYWRgZFBgI+b4TsWBR+BtoNcxcDDwwW2R1iQn2HvgcMMX799Y/j6/TvDzz+/GVj+/fvPvO0BC8N/oGpGhv8ML3m0GS59EwWbcP/9XwaAAGSRwQ3CMAxFfxq3TgrqiSMswARMwSJMxZEdGAXBAEiQquICJMFuekDqwTlY38/Wi9kf78OqNTO8kndretBh+1puuvl+R8Dpwm9iruG8xPP/tIGzhULc1OB6voJJXxGjQpumGpsKCc8wEqISwGJfA1P1IYCEmCegkTmqLIELT/8KC+/x+cbxBpEPOl8zbn0q5voWXdcipQQrgZiC/QlQORmzNBAEUfjt7N4ichBUDIKCWNsJhiBiZ2mZf5XC0v/gT7C10lqwNMVBkBC9kKAmt7e+uQtJxBS6cNwy7L2b981bTrz/fnmIxnHTYN081i1F8PQacddDzm0M+UfAYPw/gfyTlqMNVfOJVxIGpfxNgMcZRwoYpkVpe1ezLn/jplc7B2wWb+1gwwfuvxg31lwi7MAimOU4E+IevuXoXt+gILTE1aQ1VBJnwNYR9ltXFKCweM9RWFpYCnjWiukU7dYJLs7PUMyKuglNAZt6GVncZ7SgIU2ZJ8M/bLqVQEFYN9hJPQ5201pgvhztjnk2ZhOYh+esd/vY39ZPZYWBXlURqZ4Qwg8uZXU3gM7p3vAbsXveewxHZWUAAAAASUVORK5CYII="
                label="Сохранить выбранный элемент страницы как PNG"
                value="click"/>

            <menuitem class="menuitem-iconic"
                image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAL/SURBVHjaYijccvd25ZHvv5n4RSUVQs2vswAEECOIxwACy+8v/3/30Zv/AAHE0Hb6y+//UPDv4///LD/+MjJ8+PqF4cvnnww/vgkxAAQQY8Xhb78YgQCsj5mFgQGm/P+v///fvvj/n+n/fwaGe//vMexg2Mrw7BsDA8vXHwwMPN/5GdQ/mzG8BbIBAoiRfdqvX8xf/rBCDAEaAWL8ByOgmZwMLBXGvxnrzLgYVj9cyfCL+TfDj9+/Gd7//sAQw5vK8PEXAwMTRBsD0Li3DNKikgwC4twM3NIMDF9/fGf4CVTA8u0fM+ODjwwM7qJZDH8/MTBI/GFgUAba/QYo+fEnAwNAADKoXQVhIAjOJYfgsxIR/AwRi/yBlY3gz9j7FUI+wt7CwkbEzs7CNIo2Yl53t3duElDBhYXZZXaWGbHYKW0M4b+cex7WG9FaxmxGfNcfYNH3T+pr/LcSzu1h3Wx11EU2eOkYYRSi7jVgrQeb1TDtzFHkLgu13GQIBgGkJ6GFxva8h6XqX0kgRlF+AfkEw4S7ujEGbKnAzDa6GNEYLvOh2N6wOUGaVXHKayqQsHeiHgyfqKJ51sbxjvAWoG1qWWkYiKJnZhKTpgapK1tEslRw50+4camIGz/ObfcuBP0HBREEn12I+MBUadPM5HomqbWgi8kJydzHOfdctXmU29Vhbhqq8leNfxQyLP6lWgjjdxds9Yxs95ZRVAo+h8yFqEau2fHEKjpKqgojRDg+H0iw1gb212NY2oC/MCxz5DxGaYgPsKrGsnRYUEusnvKb4MNqnBlN5aZD8q54Hb2gP+gj62bohOyKdVxgobTBk3vE7cMzDhYPkVA0NW0xaBrlk6BZtRN20I16SMIWPt0CJlLQowqJStE2YwqnQRbE2ZwazrYURDquL5zcnCINU4xdiYo7QXXo4TesSMaIGGRTJ6jnqBxvkJNwfhFa2Ovu1jlrwXjD2gZ9wITeKVhImEFXgXcIgrvri/udqySztpDZemJurTzK70h/3h1xY3xpvwGLI42vrCwxmAAAAABJRU5ErkJggg=="
                label="Сохранить выбранную область страницы как PNG"
                value="clipping"/>
        </menupopup>
    `);
    var popup = df.firstChild;
    popup.setAttribute("context", "");
    popup.setAttribute("oncommand", "handleCommand(event);");
    popup.handleCommand = e => {
        var name = _id + ":DataURLReady";
        main = main.replace("%MESSAGE_NAME%", name);

        var urls = {}, configurable = true, enumerable = true;
        Object.entries(parts).forEach(([key, part]) => Object.defineProperty(urls, key, {
            configurable, enumerable, get() {
                var value = `data:;charset=utf-8,({${
                    encodeURIComponent(main + part)
                }%0A}).init("${key}")`;
                Object.defineProperty(urls, key, {configurable, enumerable, value});
                return value;
        }}));

        // Получить название вкладки без не сохраняемых символов и лишних пробелов .....
        var getTabLabel = () => {
            var label = gBrowser.selectedTab.label;
            var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
            return label.substring(0, 50);
        }

        var listener = msg => {
            var fp = makeFilePicker();
            // fp.init(window, "Сохранить как…", fp.modeSave); // Farby: https://forum.mozilla-russia.org/viewtopic.php?pid=809686#p809686 .....
            fp.init(
                !("inIsolatedMozBrowser" in window.browsingContext.originAttributes)
                  ? window.browsingContext
                  : window
                , "Сохранить как…", fp.modeSave);
            fp.appendFilter("", "*.png");

            var fileName = getTabLabel();
            fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '').replace(/\s+/g, '_').slice(0, 100).replace(/^\s+|\s+$/g, '');
            var fileDate = (function () {
              var d = new Date(), z = function(n){return (n < 10 ? '0' : '') + n};
              return '[' + z(d.getFullYear()) + '_' + z(d.getMonth()+1) + '_' + z(d.getDate()) + '\u2014' + z(d.getHours()) + '_' + z(d.getMinutes()) + '_' + z(d.getSeconds()) + ']';
            })();

            fp.defaultString = fileName + "_" + fileDate + ".png";
            fp.open(res => res == fp.returnCancel || !fp.file || makeWebBrowserPersist().saveURI(
                Services.io.newURI(msg.data), document.nodePrincipal,
                null, null, null, null, null, fp.file, null, null
            ));
        }
        messageManager.addMessageListener(name, listener);
        addDestructor(() => messageManager.removeMessageListener(name, listener));

        (popup.handleCommand = e => gBrowser.selectedBrowser.messageManager
            .loadFrameScript(urls[e.target.value], false)
        )(e);
    }
    this.append(df);
    (this._handleClick = () => popup.openPopup(this, "after_start"))();
})(`
    init(cmd) {
        cmd.startsWith("c")
            ? this[cmd].init(this[cmd].parent = this)
            : this[cmd]();
    },
    capture(win, x, y, width, height) {
        var canvas = win.document.createElementNS("${xhtmlns}", "canvas");
        canvas.width = width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        var tryDraw = ind => {
            try {ctx.drawWindow(win, x, y, canvas.width, canvas.height, "white")}
            catch(ex) {canvas.height = ind * canvas.width; tryDraw(--ind);}
        }
        tryDraw(17);
        sendAsyncMessage("%MESSAGE_NAME%", canvas.toDataURL("image/png"));
    },
    `, {

    all: `all() {
        var win = content;
        this.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY);
    }`,
    page: `page() {
        var win = content, doc = win.document, body = doc.body, html = doc.documentElement;
        var scrX = (body.scrollLeft || html.scrollLeft) - html.clientLeft;
        var scrY = (body.scrollTop || html.scrollTop) - html.clientTop;
        this.capture(win, scrX, scrY, win.innerWidth, win.innerHeight);
    }`,
    clipping: `clipping: {
        handleEvent(e) {
            if (e.button) return false;
            e.preventDefault();
            e.stopPropagation();
            switch(e.type) {
                case "mousedown":
                    this.downX = e.pageX;
                    this.downY = e.pageY;
                    this.bs.left = this.downX + "px";
                    this.bs.top = this.downY + "px";
                    this.body.appendChild(this.box);
                    this.flag = true;
                    break;
                case "mousemove":
                    if (!this.flag) return;
                    this.moveX = e.pageX;
                    this.moveY = e.pageY;
                    if (this.downX > this.moveX) this.bs.left = this.moveX + "px";
                    if (this.downY > this.moveY) this.bs.top  = this.moveY + "px";
                    this.bs.width = Math.abs(this.moveX - this.downX) + "px";
                    this.bs.height = Math.abs(this.moveY - this.downY) + "px";
                    break;
                case "mouseup":
                    this.uninit();
                    break;
            }
        },
        init() {
            var win = {};
            Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager)
                .getFocusedElementForWindow(content, true, win);
            this.win = win.value;

            this.doc = this.win.document;
            this.body = this.doc.body;
            if (!HTMLBodyElement.isInstance(this.body)) {
                Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
                    .showAlertNotification("${self.image}", ${JSON.stringify(self.label)}, "Не удается захватить!");
                return false;
            }
            this.flag = null;
            this.box = this.doc.createElement("div");
            this.bs = this.box.style;
            this.bs.border = "red dashed 1px";
            this.bs.position = "absolute";
            this.bs.zIndex = "2147483647";
            this.defaultCursor = this.win.getComputedStyle(this.body, "").cursor;
            this.body.style.cursor = "crosshair";
            ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.addEventListener(type, this, true));
        },
        uninit() {
            var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)];
            this.body.style.cursor = this.defaultCursor;
            this.body.removeChild(this.box);
            this.parent.capture.apply(this, pos);
            ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.removeEventListener(type, this, true));
        }
    }`,
    click: `click: {
        getPosition() {
            var html = this.doc.documentElement;
            var body = this.doc.body;
            var rect = this.target.getBoundingClientRect();
            return [
                this.win,
                Math.round(rect.left) + (body.scrollLeft || html.scrollLeft) - html.clientLeft,
                Math.round(rect.top) + (body.scrollTop || html.scrollTop) - html.clientTop,
                parseInt(rect.width),
                parseInt(rect.height)
            ];
        },
        highlight() {
            this.orgStyle = this.target.hasAttribute("style") ? this.target.style.cssText : false;
            this.target.style.cssText += "outline: red 1px solid; outline-offset: 1px; -moz-outline-radius: 2px;";
        },
        lowlight() {
            if (this.orgStyle) this.target.style.cssText = this.orgStyle;
            else this.target.removeAttribute("style");
        },
        handleEvent(e) {
            switch(e.type){
                case "click":
                    if (e.button) return;
                    e.preventDefault();
                    e.stopPropagation();
                    this.lowlight();
                    this.parent.capture.apply(this, this.getPosition());
                    this.uninit();
                    break;
                case "mouseover":
                    if (this.target) this.lowlight();
                    this.target = e.target;
                    this.highlight();
                    break;
            }
        },
        init() {
            this.win = content;
            this.doc = content.document;
            ["click", "mouseover"].forEach(type=> this.doc.addEventListener(type, this, true));
        },
        uninit() {
            this.target = false;
            ["click", "mouseover"].forEach(type=> this.doc.removeEventListener(type, this, true));
        }
    }`
});
});

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

Выделить код

Код:

//
(async (id, popup, self) => (self = {

    clickInterval: 5*60,
    intervals: [
        10, 15, 30, 60, 3*60, 5*60, 10*60, 15*60, 30*60, 45*60, 60*60,
    ],
    async init() {
        this.addStyle();
        var dsp = e => this[e.type](e);
        var tc = document.getElementById("tabbrowser-tabs");

        var trgs = [popup, tc, tc, document.getElementById("tabbrowser-tabpanels")];
        var types = ["popupshowing", "TabClose", "SSTabRestored", "EndSwapDocShells"];

        (this.destructor = (meth = "removeEventListener") => types.forEach(
            (type, ind) => trgs[ind][meth](type, dsp, ind == 3)
        ))("addEventListener");

        ucf_custom_scripts_win[id] = this;
        ucf_custom_scripts_win.unloadlisteners.push(id);

        await SessionStore.promiseAllWindowsRestored;
        for(var tab of gBrowser.tabs)
            tab.linkedPanel || this.maybeInitTab(tab);
    },
    maybeInitTab(tab) {
        var sec = this.sec(tab);
        sec && this.initTab(tab, sec, true);
    },
    mousedown(e) {
        if (e.button) return;
        e.stopImmediatePropagation();
        self.destroyTab(this.closest("tab"));
    },
    initTab(tab, sec, skipSet) {
        skipSet || SessionStore.setCustomTabValue(tab, id, sec);
        var img = document.createXULElement("hbox");
        img.className = id;
        // img.onmousedown = this.mousedown; // клик по иконке отключает перезагрузку вкладки .....

        tab.throbber.before(img);
        tab.setAttribute(id, setInterval(this.reload, sec * 1e3, tab));
    },
    destroyTab(tab) {
        clearInterval(tab.getAttribute(id));
        SessionStore.deleteCustomTabValue(tab, id);
        tab.removeAttribute(id);
        tab.querySelector("." + id).remove();
    },
    addStyle() {
        var css = `
            tab.tabbrowser-tab[${id}] .${id} {
                width: 16px;
                height: 16px;
                position: relative;
                margin-top: -1px;
                margin-inline-start: -2px;
                margin-inline-end: -14px;
                background-position: top right;
                background-repeat: no-repeat;
                background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEHSURBVHjaYmQAArWgflEglQrEgUCsAsR3gHg9EM++ta7wNSNIASMjQx/rr7fhEd6WrAbaygy3Hr1l2Hjw+u8Xbz+v/P+foYgFZIKEMG94foARKxfTDwZ3G3UGb6Cgj406a2rrhvDnbz5fZwJZ4W+vyRroacdw4MB+hjt37jA8e/aMYd/2NQzOxrKsIHmQIhU1OWGQ0xiSk5MZVFVVGdasWcPg4eHBYKglDxJWAVl3B+gGE5AV8vLyDLdv3wbTrKysDOuOHgMpugMyaT3IkbeBjgVJqKiogOnbUMeD5JmFNT1ufP3+S2b/mfua7z//YH778RvD1iO3GLoXHwH7DqionZGYcAIIMADkw2lofXkQ/wAAAABJRU5ErkJggg==");
                z-index: 1000;
            }
            tab.tabbrowser-tab[${id}]:-moz-locale-dir(rtl) .${id} {
                background-position: top right;
            }
            tab.tabbrowser-tab[${id}] .tab-icon-image {
                display: -moz-box;
            }
            tab.tabbrowser-tab[${id}][pendingicon] .tab-icon-image {
                visibility: hidden;
            }
            #context_autoreloadTab[checked] > menupopup > :nth-child(2),
            #context_autoreloadTab:not([checked]) > menupopup > :first-child {
                display: none;
            }
            #context_autoreloadTab[checked] > .menu-iconic-left > image {
                fill: currentColor;
                -moz-context-properties: fill;
                list-style-image: url("chrome://global/skin/icons/check.svg");
            }
            /*
            tab.tabbrowser-tab[${id}] .tab-throbber,
            tab.tabbrowser-tab[${id}] .tab-icon-pending,
            tab.tabbrowser-tab[${id}]:not([pendingicon]) .tab-icon-image:not([src],[busy],[pinned],[crashed],[sharing]) {
                display: none;
            }
            */
        `.replace(/;\s*\n/g, " !important;\n");
        windowUtils.loadSheetUsingURIString(
            "data:text/css," + encodeURIComponent(css), windowUtils.USER_SHEET
        );
    },
    get tab() {
        return TabContextMenu.contextTab;
    },
    sec(tab) {
        return SessionStore.getCustomTabValue(tab, id);
    },
    click(menu) {
        var {tab} = this;
        var has = menu.toggleAttribute("checked");
        has
            ? this.initTab(tab, this.clickInterval)
            : this.destroyTab(tab);

        var w = menu.clientWidth;
        this.setLabel(has && self.clickInterval);

        if (this.menupopup.state == "open")
            this.updMenupopup(),
            menu.clientWidth != w && setTimeout(this.move, 50);
    },
    changeInterval(tab, sec) {
        clearInterval(tab.getAttribute(id)),
        SessionStore.setCustomTabValue(tab, id, sec),
        tab.setAttribute(id, setInterval(this.reload, sec * 1e3, tab));
    },
    cmd(e) {
        var {value} = e.target;
        if (value == this.currSec) return;

        var {tab} = this;
        this.setLabel(value);

        if (this.menu.hasAttribute("checked"))
            this.changeInterval(tab, value);
        else
            this.menu.toggleAttribute("checked"),
            this.initTab(tab, value);
    },
    reload(tab) {
        gBrowser.reloadTab(tab);
    },
    get shouldHide() {
        return !this.tab.linkedBrowser.currentURI.scheme.startsWith("http");
    },
    format(sec) {
        var map = new Map();
        // resource://gre/modules/PluralForm.jsm
        var f = n => n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
        var hh = ["", "а", "ов"], ms = ["а", "ы", ""];
        return (this.format = sec => {
            var res = map.get(sec = +sec);
            if (!res) {
                var num, arr = [];
                if ((num = Math.floor(sec / 3600)) > 0)
                    sec -= num * 3600,
                    arr.push(`${num} час${hh[f(num)]}`);
                if ((num = Math.floor(sec / 60)) > 0)
                    sec -= num * 60,
                    arr.push(`${num} минут${ms[f(num)]}`);
                sec > 0 && arr.push(`${sec} секунд${ms[f(sec)]}`);
                map.set(sec, res = arr.join(" "));
            }
            return res;
        })(sec);
    },
    async prompt(val) {
        var {tab} = this, sec = this.sec(tab);
        var res = await Services.prompt.asyncPrompt(
            null, Services.prompt.MODAL_TYPE_WINDOW,
            val ? "ЕЩЁ РАЗ:" : "Задать интервал обновления",
            "Введите число секунд авто-обновления",
            val || sec || this.clickInterval, null, null
        );
        if (!res.get("ok")) return;

        var val = res.get("value");
        if (!val) return;
        if (!isFinite(val)) return this.prompt(val);

        var val = String(Math.round(val) || 1);
        sec ? this.changeInterval(tab, val) : this.initTab(tab, val);
    },
    initShadowDOM() {
        delete this.initShadowDOM;
        this.initShadowDOM();

        var df = MozXULElement.parseXULToFragment(
            `<menuitem closemenu="single" label="Не перезагружать"
                oncommand="event.stopPropagation(); parentNode.parentNode.click();"/>
            <menuitem closemenu="single" value="${self.clickInterval}"
                label="${self.format(self.clickInterval)}" type="radio"/>
            <menuitem label="Другой…"
                oncommand="event.stopPropagation(); parentNode.parentNode.linkedObject.prompt();"/>
            <menuseparator/>`
        );
        var menuitem = df.children[1];

        for(var sec of self.intervals) {
            if (sec == self.clickInterval) continue;
            menuitem = menuitem.cloneNode(false);
            menuitem.setAttribute("value", sec);
            menuitem.setAttribute("label", self.format(sec));
            df.append(menuitem);
        }
        this.append(df);
    },
    setLabel(sec) {
        this.menu.setAttribute("label", (this.currSec = sec)
            ? `Интервал перезагрузки:   ${this.format(sec)}`
            : "Задать интервал перезагрузки"
        );
    },
    popupshowing(e) {
        if (this.shouldHide) return;
        var df = MozXULElement.parseXULToFragment(
            `<menu id="context_autoreloadTab"
                class="menu-iconic"
                onclick="if (event.target == this) linkedObject.click(this)"
            >
                <menupopup oncommand="parentNode.linkedObject.cmd(event)"/>
            </menu>`
        );
        var menu = this.menu = df.firstChild;
        menu.linkedObject = this;
        var menupopup = this.menupopup = menu.firstChild;
        menupopup.initShadowDOM = this.initShadowDOM;
        popup.querySelector("#context_duplicateTab").after(menu);

        this.clickInterval = String(this.clickInterval);
        this.move = () => menupopup.moveToAnchor(menu, "end_before");

        this.updMenupopup = () => {
            var old = menupopup.querySelector("[checked=true]");
            var cur = this.currSec && menupopup.querySelector(`[value="${this.currSec}"]`);
            if (old != cur)
                old?.removeAttribute("checked"),
                cur && cur.setAttribute("checked", true);
        }
        (this.popupshowing = e => {
            if (e.target == popup) {
                if (menu.hidden = this.shouldHide) return;

                var sec = this.sec(this.tab);
                var has = menu.hasAttribute("checked");
                if (Boolean(sec) ^ has)
                    has = !has,
                    menu.toggleAttribute("checked");

                var curr = has && sec;
                curr !== this.currSec && this.setLabel(curr);
            }
            else if (e.target == menupopup) this.updMenupopup();
        })(e);
    },
    TabClose(e) {
        var intervalId = e.target.getAttribute(id);
        if (!intervalId) return;
        clearInterval(intervalId);

        var tab = e.detail.adoptedBy;
        tab?.ownerGlobal.ucf_custom_scripts_win[id].initTab(tab, this.sec(e.target));
    },
    SSTabRestored(e) {
        var tab = e.target;
        tab.hasAttribute(id) || this.maybeInitTab(tab);
    },
    async EndSwapDocShells(e) {
        var br = e.detail, trg = e.target;
        await new Promise(requestAnimationFrame);

        var win = br.ownerGlobal;
        if (!win.closed) return;
        var tab = win.gBrowser.getTabForBrowser(br);
        if (!tab) return;

        var sec = this.sec(tab);
        if (sec)
            tab = gBrowser.getTabForBrowser(trg),
            tab.hasAttribute(id) || this.initTab(tab, sec);
    }
}).init())("ucf-tab-auto-reload", document.getElementById("tabContextMenu"));


«The Truth Is Out There»

Отсутствует

 

Board footer

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