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

Заказывай стафф с атрибутикой Mozilla и... пусть все вокруг завидуют тебе! Быть уникальным - быть с Mozilla!

№192609-03-2025 12:02:13

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 347
UA: Firefox 136.0

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

Отсутствует

 

№192709-03-2025 12:38:21

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

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

Garalf
В CustomStylesScripts.mjs в секцию scriptsbackground, это аналог custom_scripts.js, но будет ли лоадер работать из js я не знаю. Если у вас настолько древний ucf, что нет CustomStylesScripts.mjs, то может стоит обновиться?

Отсутствует

 

№192809-03-2025 12:47:52

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 347
UA: Firefox 136.0

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

_zt

CustomStylesScripts.mjs у меня есть.
Будьте добры подробно разьясните, что куда ложить.

Отсутствует

 

№192909-03-2025 13:00:13

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

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

Garalf
Найдите секцию scriptsbackground и в ней пропишите первой строкой *

{ func: 'ChromeUtils.importESModule("chrome://user_chrome_files/content/custom_scripts/имя_скрипта.mjs")', },

а саму имя_скрипта.mjs киньте в папку profile\chrome\user_chrome_files\custom_scripts
   
(* вроде эти лоадеры должны быть прописаны до всего остального в секции)
   
И не забудьте startupCache сбросить, в окне настроек ucf есть опция со звездочкой.

Отредактировано _zt (09-03-2025 13:08:42)

Отсутствует

 

№193009-03-2025 13:22:47

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 347
UA: Firefox 136.0

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

_zt
Большое спасибо! Все получилось.
Правда, там, по-видимому, сам скрипт править надо.
И еще вопрос. А для скриптов .JSM надо делать аналогично?

Отредактировано Garalf (09-03-2025 13:31:11)

Отсутствует

 

№193109-03-2025 13:41:12

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

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

Garalf
А они еще работают?
https://forum.mozilla-russia.org/viewtopic.php?pid=793488#p793488
Можно создать jsm.js, прописать в ней все jsm типа

(async url => ChromeUtils.import(url))(
    "chrome://user_chrome_files/content/custom_scripts/111.jsm"
);
(async url => ChromeUtils.import(url))(
    "chrome://user_chrome_files/content/custom_scripts/222.jsm"
);
(async url => ChromeUtils.import(url))(
    "chrome://user_chrome_files/content/custom_scripts/333.jsm"
);

и прописать ее в scriptsbackground как обычный скрипт

{ path: "jsm.js", },

   
Или просто в custom_script.js

Отредактировано _zt (09-03-2025 13:46:19)

Отсутствует

 

№193209-03-2025 16:33:09

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

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

Dumby
В [firefox] 136 отвалился places_sidebar_folders_statistics.js. Не пашет ни в UCF-2025, ни в предыдущем.
В новом UCF отвалился google-translate.js. Это так, теоретически. У меня пока старый UCF на 136-й работает работает, хотя может просто не всё знаю...
Ещё есть скрипт, который заменяет значки папок. Вполне успешно и для боковой панели, и для библиотеки. Но в боковой панели "душит" значок "Сегодня" (журнал-история), который в библиотеке выглядит правильно. Могу отключить, конечно, если поправить нельзя.

custom_script.js

Выделить код

Код:

(async cdl => {
  var icons = Object.assign(Object.create(null), {

    "Mozilla": "chrome://user_chrome_files/content/custom_styles/icons/mozilla.png",
    "Ru-Board": "chrome://user_chrome_files/content/custom_styles/icons/ru-board.ico",
    "Метки": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//+/////v////wAA//8AAP//AAD//wAA//8AAP//AAD//7////+/////AAD//wAA//8AAP//AAD//wAA//8AAP//v////7////8AAP//AAD//wAA//8AAP//AAD//wAA//+/////v////wAA//8AAP//AAD//wAA//8AAP//AAD//7////+/////AAD//wAA//+/////v////wAA//8AAP//v////7////8AAP//AAD//wAA//8AAP//AAD//wAA//+/////v////wAA//8AAP//v////7////8AAP//AAD//7////+/////AAD//wAA//8AAP//AAD//wAA//8AAP//v////7////8AAP//AAD//7////+/////AAD//wAA//+/////v////wAA//8AAP//AAD//wAA//8AAP//AAD//7////+/////AAD//7////+/////v////7////8AAP//v////7////8AAP//AAD//wAA//8AAP//AAD//wAA//+/////v////7////+/////v////7////+/////v////7////+/////AAD//wAA//8AAP//AAD//wAA//8AAP//v////7////+/////v////wAA//8AAP//v////7////+/////v////wAA//8AAP//AAD//wAA//8AAP//AAD//7////+/////v////wAA//8AAP//AAD//wAA//+/////v////7////8AAP//AAD//wAA//8AAP//AAD//wAA//+/////v////wAA//8AAP//AAD//wAA//8AAP//AAD//7////+/////AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==",
    "Сегодня": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wIC//8CAv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wIC//8CAv//AgL//wIC/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wIC//8CAv//AgL//wIC//8CAv//AgL//wIC//8CAv//AgL//wIC//8CAv//AgL/AAAAAAAAAAAAAAAAAAAAAP8CAv//AgL//wIC//8CAv//AgL//wIC//8CAv//AgL//wIC//8CAv//AgL//wIC/wAAAAAAAAAAAAAAAAAAAAD/AgL//wIC//8CAv//1NT////////////////////////U1P//AgL//wIC//8CAv8AAAAAAAAAAAAAAAAAAAAA/wIC//8CAv//qqr///////9kZP//AgL//wIC//9kZP///////6qq//8CAv//AgL/AAAAAAAAAAAAAAAA/wIC//8CAv//ZGT///////9kZP//AgL//wIC//8CAv//AgL//2Rk////////ZGT//wIC//8CAv8AAAAA/wIC//8CAv//AgL//4eH////////AgL//wIC//8CAv//AgL//wIC//8CAv///////4eH//8CAv//AgL//wIC//8CAv//AgL//wIC//+Hh////////wIC//8CAv//AgL//wIC//8CAv//AgL///////+Hh///AgL//wIC//8CAv8AAAAA/wIC//8CAv//ZGT///////9kZP//AgL//wIC//8CAv//AgL//2Rk////////ZGT//wIC//8CAv8AAAAAAAAAAAAAAAD/AgL//wIC///U1P///////2Rk//8CAv//AgL//2Rk////////1NT//wIC//8CAv8AAAAAAAAAAAAAAAAAAAAA/wIC//8CAv//AgL//9TU////////////////////////1NT//wIC//8CAv//AgL/AAAAAAAAAAAAAAAAAAAAAP8CAv//AgL//wIC//8CAv//AgL//wIC//8CAv//AgL//wIC//8CAv//AgL//wIC/wAAAAAAAAAAAAAAAAAAAAD/AgL//wIC//8CAv//AgL//wIC//8CAv//AgL//wIC//8CAv//AgL//wIC//8CAv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8CAv//AgL//wIC//8CAv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wIC//8CAv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/n+sQfw/rEHAA6xBwAOsQcADrEHAA6xBgAGsQQAArEEAAKxBgAGsQcADrEHAA6xBwAOsQcADrEH8P6xB/n+sQQ==",
    "Панель закладок": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP8A////AP///wD///+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/wD///8A////AP///50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/AP///wD///8A////nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP8A////AP///wD///+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/wD///8A////AP///50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/AP///wD///8A////nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP8A////AP///wD///8A////AP///wD///8A////AP///wD///+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/wD///8A////AP///wD///8A////AP///wD///8A////AP///50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/nT8A/50/AP+dPwD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==",

  });
  var tv = Ci.nsITreeView;
  var {RESULT_TYPE_URI: uri, RESULT_TYPE_SEPARATOR: sep} = Ci.nsINavHistoryResultNode;
  var func = function PTV_getImageSrc(aRow, aColumn) {
    if (this._getColumnType(aColumn) != this.COLUMN_TYPE_TITLE)
      return "";
    var res, node = this._getNodeForRow(aRow);
    if (node.type != uri && node.type != sep) res = icons[node.title];
    return res || node.icon;
  }
  var obs = doc => {
    var proto = doc.ownerGlobal.PlacesTreeView?.prototype;
    if (proto) try {
      if (proto.QueryInterface(tv) == proto) proto.getImageSrc = func;
    } catch {}
  }
  Services.obs.addObserver(obs, cdl, false);
  Services.obs.addObserver(function quit(s, topic) {
    Services.obs.removeObserver(quit, topic);
    Services.obs.removeObserver(obs, cdl);
  }, "quit-application-granted", false);
})("chrome-document-loaded");


Скриншот.
Блин, хоть не обновляйся, каждый раз "засада".:cry:

Отсутствует

 

№193309-03-2025 17:11:00

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 347
UA: Firefox 136.0

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

Dumby
Посмотри пожалуйста. В 136 не работает.

Reload user(Chrome, Content).mjs

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

Выделить код

Код:

var name = "UCF_userContentReloader"; /*, EXPORTED_SYMBOLS = [name + "Child"]; */ export {UCF_userContentReloaderChild};
if (typeof Services != "object")
	/* eslint-disable-next-line no-var */
	var Services = globalThis.Services;

var find = function(sheet) {
	return sheet.href == this;
}
var getSheet = (doc, href) =>
	InspectorUtils.getAllStyleSheets(doc).find(find, href);

if (!ChromeUtils.domProcessChild.childID) {
	var noop = () => {};
	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 getURI = sub => {
		var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
		file.append(`userC${sub}.css`);
		return Services.io.newFileURI(file).QueryInterface(Ci.nsIFileURL);
	}
	var oncontextmenu = e => e.ctrlKey || e.shiftKey || e.detail != 1 || contextmenu(e);

	var contextmenu = e => {
		var {file, spec} = getURI("ontent");
		var wb = Services.appShell.createWindowlessBrowser();
		var contentSheet = getSheet(wb.document, spec);
		wb.close();

		if (!contentSheet) return oncontextmenu = contextmenu = noop;

		ChromeUtils.registerProcessActor(name, {child: {esModuleURI: Components.stack.filename}});
		(contextmenu = async e => {
			if (!file.exists()) return;
			e.preventDefault();
			var data = await reload(contentSheet, Object.create(null));
			if (data) for(var p in data) {
				for(var dp of ChromeUtils.getAllDOMProcesses())
					dp.remoteType && await dp.getActor(name).sendQuery(spec, data);
				restyle();
				return;
			}
		})(e);
	}

	var restyle = () => {
		var subst = "u_css_reloader_restyle_substitution";
		var rph = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
		rph.setSubstitution(subst, Services.io.newURI("data:text/css,:root{}"));

		var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
		var args = [Services.io.newURI(`resource://${subst}/`), sss.USER_SHEET];
		(restyle = () => {
			sss.loadAndRegisterSheet(...args);
			sss.unregisterSheet(...args);
		})();
	}
	var reload = async (sheet, obj) => {
		try {var style = await (await fetch(sheet.href)).text();}
		catch {return obj;}

		InspectorUtils.parseStyleSheet(sheet, style);
		if (obj) obj[sheet.href] = style;
		for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) {
			var rule = sheet.cssRules.item(ind);

			rule.type == rule.IMPORT_RULE
			&& rule.styleSheet.href.startsWith("file:///")
			&& await reload(rule.styleSheet, obj);
		}
		return obj;
	}
}
else var UCF_userContentReloaderChild = class extends JSProcessActorChild {
	receiveMessage(msg) {
		var {sheet} = this;
		if (!sheet) {
			var en = Services.ww.getWindowEnumerator(null);
			if (en.hasMoreElements()) sheet =
				this.sheet = getSheet(en.getNext().document, msg.name);
		}
		sheet && this.parse(sheet, msg.data);
	}
	parse(sheet, data) {
		var style = data[sheet.href];
		if (!style) return;

		InspectorUtils.parseStyleSheet(sheet, style);
		for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) {
			var rule = sheet.cssRules.item(ind);

			rule.type == rule.IMPORT_RULE
			&& rule.styleSheet.href.startsWith("file:///")
			&& this.parse(rule.styleSheet, data);
		}
	}
}

Отсутствует

 

№193409-03-2025 19:20:22

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

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

xrun1 пишет

Поведение кнопки немого сломалось, давно уже. Не принципиально, конечно.
При закрытии ЛКМ или СКМ фокус улетает на позицию ниже. Т.е. если была панель закладок --> какая-то папка или закладка, фокус сместится на меню закладок. Если меню закладок --> какая-то папка или закладка --> фокус на другие закладки.

Да, так оно устроено:


treeView.js пишет

// Select the row next to the closed container if any of its
// children were selected, and nothing else is selected.

Можно попробовать собрать корневые папки в которых есть выделение,
и выделить их уже после закрытия.


А ещё, я тут в бесконечную петлю разворачивания угодил.
На панели закладок есть папка-шорткат на панель закладок,
ну типа place:parent=toolbar_____


И вот, разворачивается панель закладок, доходит до этой папки,
разворачивает её, а в ней, сответственно, тоже такая же папка,
и так далее, и так далее. Браузер виснет намертво.
Вобщем, исключил некоторые вещи из разворачивания.

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

Выделить код

Код:

(svg => {
	var id = "sidebar-button-toggle-state", subst = id + "-image";
	var rph = Services.io.getProtocolHandler("resource")
		.QueryInterface(Ci.nsIResProtocolHandler);
	rph.hasSubstitution(subst) || rph.setSubstitution(
		subst, Services.io.newURI("data:image/svg+xml," + encodeURIComponent(svg))
	);
	var HQO = Ci.nsINavHistoryQueryOptions;
	var QRN = Ci.nsINavHistoryQueryResultNode;
	var TFS = Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT;
	var LST = new Set([HQO.RESULTS_AS_ROOTS_QUERY, HQO.RESULTS_AS_LEFT_PANE_QUERY]);

	var stop = e => e.stopImmediatePropagation();

	var toggle = function(e) {
		if (this.start) return;
		var {view} = this.tree;
		if (view._isPlainContainer(view._rootNode)) return;
		this.start = true;

		var close = e.button < 2;
		var closeAll = e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey);

		var index = view.rowCount, ind;

		if (close) {
			var sel = view.selection, {count} = sel;
			if (count) {
				var roots = new Set(), currRoot;
				for(ind = 0; ind < index; ind++) {
					var node = view._rows[ind];
					if (node.indentLevel == 0) currRoot = node;
					if (sel.isSelected(ind)) {
						roots.add(currRoot);
						if (!--count) break;
					}
				}
			}
			this.tree.addEventListener("select", stop, true);
		}
		else var open = true;

		if (closeAll) for(ind = index; ind >= 0; ind--)
			view.isContainer(ind) && view.isContainerOpen(ind) && view.toggleOpenState(ind);

		else for(ind = 0; ind < index; ind++) {
			if (!view.isContainer(ind) || view.isContainerOpen(ind) != close) continue;

			if (open) {
				var node = view._rows[ind];
				if (
					node.type == TFS && node.indentLevel ||
					node instanceof QRN && LST.has(node.queryOptions.resultType)
				)
					continue;
			}
			view.toggleOpenState(ind);
			index = view.rowCount;
		}

		if (roots) {
			sel.clearSelection();
			for(ind = 0, len = view.rowCount; ind < len; ind++)
				roots.has(view._rows[ind]) && sel.rangedSelect(ind, ind, true);
			roots.clear();
		}
		close && this.tree.removeEventListener("select", stop, true);
		this.start = false;
	}

	document.getElementById("sidebar").addEventListener("MozBeforeInitialXULLayout", e => {
		var parent = e.target.querySelector(":root:is(#bookmarksPanel,#history-panel) > #sidebar-search-container");
		if (!parent) return;

		var doc = e.target;
		var btn = doc.createXULElement("toolbarbutton");
		btn.id = id;
		btn.onclick = toggle;
		btn.tree = parent.nextSibling;
		btn.tooltipText = "ЛКМ: Закрыть все папки верхнего уровня\n((Ctrl или Shift) и ЛКМ) или СКМ: Закрыть все папки\nПКМ: Открыть все папки";
		parent.prepend(btn);

		var sheet = new doc.ownerGlobal.CSSStyleSheet();
		sheet.replaceSync(`
			#${id} {
				margin: 1px !important;
				padding: 4px !important;
				border: none !important;
				min-width: 0 !important;
				appearance: none !important;
				background: none !important;
				list-style-image: url(resource://${subst}) !important;

				&:hover {
					background: hsla(240, 5%, 5%, .1) !important;
				}
				&:hover:active {
					background: hsla(240, 5%, 5%, .15) !important;
				}
			}
		`);
		doc.adoptedStyleSheets.push(sheet);
	});
	
})(`<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 48 48">
	<g>
		<path style="fill: #0078ad; fill-opacity: 1;"
			d="M 2.438,0 C 1.087,0 0,1.088 0,2.438 V 45.56 C 0,46.91 1.087,48 2.438,48 H 45.56 C 46.91,48 48,46.91 48,45.56 V 2.438 C 48,1.088 46.91,0 45.56,0 Z" />
		<path style="opacity: .25; fill: #000000;"
			d="M 5,11 V 39.5 L 13.5,48 H 45.5 C 47,47.9 47.9,47 48,45.5 V 13.6 L 43.4,9 10,8 Z"/>
		<path style="fill: #ffffff;"
			d="M 10.9,6 H 37.1 C 41.6,6 45,9.48 45,13.7 V 34.3 C 45,38.7 41.6,42 37.1,42 H 10.9 C 6.51,42 3,38.7 3,34.3 V 13.7 C 3.03,9.48 6.54,6.03 10.9,6 Z M 39.7,34.3 V 13.7 C 39.7,12.3 38.7,11.1 37.1,11.1 H 24 V 36.8 H 37.1 C 38.7,36.8 39.7,35.8 39.7,34.3 Z M 8.25,34.3 C 8.25,35.8 9.42,36.8 10.9,36.8 H 21.4 V 11.1 H 10.9 C 9.42,11.1 8.25,12.3 8.25,13.7 Z" />
		<path style="fill: #ffffff;"
			d="M 12,16.3 H 17.7 C 18.4,16.3 19,15.7 19,15 19,14 18.4,13.4 17.7,13.4 H 12 C 11.2,13.4 10.6,14 10.6,15 10.6,15.7 11.2,16.3 12,16.3 Z M 12,21.8 H 17.7 C 18.4,21.8 19,21.3 19,20.5 19,19.6 18.4,19 17.7,19 H 12 C 11.2,19 10.6,19.6 10.6,20.5 10.6,21.3 11.2,21.8 12,21.8 Z M 14.9,27.4 H 17.7 C 18.4,27.4 19,26.8 19,26.1 19,25.1 18.4,24.6 17.7,24.6 H 14.9 C 14,24.6 13.4,25.1 13.4,26.1 13.4,26.8 14,27.4 14.9,27.4 Z" />
	</g>
</svg>`);

Что-то мне стрёмно по такому адресу переходить.
Ссылка точно правильная?

отвалился google-translate.js. Это так, теоретически. У меня пока старый UCF

А с компат-костылём пробовал?

в боковой панели "душит" значок "Сегодня" (журнал-история), который в библиотеке выглядит правильно

Просто у журнала в боковой панели CSP пожёстче.
Можно заресурсить иконки, которые предполагается использовать там.
После определения icons дописываем что-то типа

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

Выделить код

Код:

//
	var num = 0, rph = Services.io.getProtocolHandler("resource")
		.QueryInterface(Ci.nsIResProtocolHandler);

	for(var title of ["Сегодня", ]) {

		var url = icons[title];
		if (!url) continue;

		var subst = "custom-tree-folder-img-" + num++;
		rph.setSubstitution(subst, Services.io.newURI(url)),
		icons[title] = "resource://" + subst;
	}

Inko7 пишет

Uncaught TypeError: Cu.import is not a function
    get obj chrome://user_chrome_files/content/custom_scripts/win/F8_kbd_layout.js:10

Кнопка не вытащена что ли. Ну, можно так написать

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

Выделить код

Код:

/*
                obj = Cu.import("resource:///modules/CustomizableUI.jsm", {})
                    .gPalette.get(id);
*/
                obj = UcfPrefs.dbg.ref("gPalette", CustomizableUI.createWidget).get(id);


Ещё, атрибут "oncommand" убрать из кнопки было бы неплохо
скрытый текст

Выделить код

Код:

/*
        btn.setAttribute("oncommand", "linkedObj.switch(document);");
*/
        btn._handleClick = () => this.switch(doc);

Garalf пишет

Посмотри пожалуйста. В 136 не работает.
Reload user(Chrome, Content).mjs

Посмотрел — ничего не увидел. Должно работать.

Отсутствует

 

№193509-03-2025 19:55:50

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

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

Dumby
Отлично! Спасибо.

Отсутствует

 

№193609-03-2025 20:46:18

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

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

Dumby пишет

Ссылка точно правильная?

Виноват, запутался. places_sidebar_folders_statistics.js показывает количество закладок/папок в боковой панели.
Что касается google-translate.js. В старой версии UCF работет без костылей. Не работает именно с UCF-2025. Я к тому, что если переходить на новую версию, жалко терять скрипт.

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

Выделить код

Код:

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/google-translate.js", ucfobj: true, },


скрытый текст
Image002_2025-03-09_20-30.png

sidebar-button-toggle-state и значок "Сегодня" - всё получилось, работает, спасибо!

Отсутствует

 

№193710-03-2025 10:21:02

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

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

xrun1 пишет

количество закладок/папок в боковой панели

Да уж, тупой гаденький CSP.
Особо жалко direct eval(), он, наверно, незаменим.
И indirect eval() тоже жалко, он удобнее чего-то другого.


Ладно, вроде вот так, например, работает

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

Выделить код

Код:

(async () => {
	var proto = PlacesTreeView.prototype;

	proto.addFolderStats = node => {
		var title = PlacesUIUtils.getBestTitle(node, true);

		if (PlacesUtils.nodeIsContainer(node)) {
			var wasClosed = !node.containerOpen;
			if (wasClosed) node.containerOpen = true;

			var urls = 0, containers = 0;
			for(var ind = 0, max = node.childCount; ind < max; ind++) {
				var child = node.getChild(ind);
				if (PlacesUtils.nodeIsURI(child)) urls++;
				else if (PlacesUtils.nodeIsContainer(child)) containers++;
			}
			if (wasClosed) node.containerOpen = false;
		
			title += ` (${urls}/${containers})`;
		}
		return title;
	}

	var eval = code => windowRoot.ownerGlobal.UcfPrefs.dbg
		.makeGlobalObjectReference(window).executeInGlobal(code).return.unsafeDereference();

	Object.assign(proto, eval(`({getCellText: ${proto.getCellText}})`.replace(
		"PlacesUIUtils.getBestTitle(node, true)", "this.addFolderStats(node)"
	)));
})();

В старой версии UCF работет без костылей. Не работает именно с UCF-2025. Я к тому, что если переходить на новую версию, жалко терять скрипт.

Похоже, я плохо объясняю.
В старой работет без костылей — потому, что они не нужны.
В UCF-2025 не работет без костылей — потому, что их нет, а код не поправлен.


Хорошо, вот смотри. FF 138.0a1, UCF 2025-1-17 + костыли.
Подключил скрипт по ссылке как написано.
Пункты в меню есть, при клике открывается окошко перевода
(самого перевода, конечно, нет, поскольку нет сети).


Теперь отключаю костыли. Пункты в меню пропадают.


Теперь убираю из google-translate.js деструктор.
Пункты в меню снова появляются.

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

Выделить код

Код:

/*
                this.destructor = () => {
                    gBrowser.tabpanels.removeEventListener('mouseup', mouseUp, false);
                    if (w)
                        w.closeWin();
                };
                that.unloadlisteners.push("googletranslate");
*/


Деструктор здесь, вроде, особо не нужен,
там же нет каких-нибудь обсёрверов, но если считаешь иначе,
или просто для порядка, то можно так написать
скрытый текст

Выделить код

Код:

//
                setUnloadMap("googletranslate", () => {
                    gBrowser.tabpanels.removeEventListener("mouseup", mouseUp, false);
                    w?.closeWin();
                });

Отсутствует

 

№193810-03-2025 17:45:17

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

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

Dumby
places_sidebar_folders_statistics.js теперь работает.

или просто для порядка, то можно так написать

Как говорил герой Пуговкина в "Двух капитанах" - палочки должны быть попендикулярны.
Для порядка добавил.))
Спасибо!:beer:

Отсутствует

 

№193917-03-2025 13:51:31

m0nkrus
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 10-09-2021
Сообщений: 32
UA: Firefox 136.0
Веб-сайт

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

Vitaliy V. пишет
_zt пишет

URL-bar History Dropmarker отвалился. Поправите?

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

Выделить код

Код:

(async (
    id = Symbol("urlbarhistorydropmarker"),
    hidewhenusertyping = true, // скрывать dropmarker при вводе
    copyvalueistyped = true, // при вводе копировать содержимое адресной строки вместо URL
    currentURIlabel = "Адрес текущей страницы в буфере обмена!",
    valueIsTypedlabel = "Содержимое адресной строки в буфере обмена!",
    Ltooltiptext = "ЛКМ: Показать историю",
    Mtooltiptext = "СКМ: Обновить текущую страницу", // или false
    Rtooltiptext = "ПКМ: Копировать URL в буфер обмена", // или false
) => (this[id] = {
    dropmarker: null,
    pref: "browser.urlbar.suggest.history",
    get style() {
        delete this.style;
        return this.style = `data:text/css;charset=utf-8,${encodeURIComponent(`
            #urlbar .urlbar-history-dropmarker {
                list-style-image: url("chrome://global/skin/icons/arrow-down.svg") !important;
                transition: opacity 0.15s ease;
            }
            #urlbar[switchingtabs] > :is(#urlbar-input-container,.urlbar-input-container) > .urlbar-history-dropmarker {
                transition: none;
            }
            ${hidewhenusertyping ? `#urlbar[usertyping] > :is(#urlbar-input-container,.urlbar-input-container) > .urlbar-history-dropmarker {
                display: none;
            }` : ""}
            #nav-bar:not([customizing="true"]) > #nav-bar-customization-target > #urlbar-container:not(:hover) > #urlbar:not([focused]) > :is(#urlbar-input-container,.urlbar-input-container) > .urlbar-history-dropmarker {
                opacity: 0;
            }
        `)}`;
    },
    get helper() {
        delete this.helper;
        return this.helper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
    },
    init() {
        this.UrlbarProviderPlaces = ChromeUtils.importESModule("resource:///modules/UrlbarProviderPlaces.sys.mjs").UrlbarProviderPlaces;
        this.UrlbarProviderInputHistory = ChromeUtils.importESModule("resource:///modules/UrlbarProviderInputHistory.sys.mjs").UrlbarProviderInputHistory;
        Services.prefs.addObserver(this.pref, this);
        setUnloadMap(id, this.destructor, this);
        if (Services.prefs.getBoolPref(this.pref, false))
            this.createDropmarker();
    },
    get tooltipText() {
        delete this.tooltipText;
        return this.tooltipText = `${Ltooltiptext}${Mtooltiptext ? `\n${Mtooltiptext}` : ""}${Rtooltiptext ? `\n${Rtooltiptext}` : ""}`;
    },
    createDropmarker() {
        windowUtils.loadSheetUsingURIString(this.style, windowUtils.USER_SHEET);
        var dropmarker = this.dropmarker = document.createXULElement("image");
        dropmarker.className = "urlbar-page-action urlbar-history-dropmarker urlbar-icon";
        dropmarker.tooltipText = this.tooltipText;
        document.querySelector("#urlbar #page-action-buttons").before(dropmarker);
        dropmarker.addEventListener("mousedown", this);
        if (Rtooltiptext || Mtooltiptext)
            dropmarker.addEventListener("click", this);
    },
    removeDropmarker() {
        this.removeListeners();
        this.dropmarker.remove();
        this.dropmarker = null;
        windowUtils.removeSheetUsingURIString(this.style, windowUtils.USER_SHEET);
    },
    removeListeners() {
        this.dropmarker.removeEventListener("mousedown", this);
        if (Rtooltiptext || Mtooltiptext)
            this.dropmarker.removeEventListener("click", this);
    },
    observe() {
        if (!this.dropmarker) {
            if (Services.prefs.getBoolPref(this.pref, false))
                this.createDropmarker();
        } else
            this.removeDropmarker();
    },
    handleEvent(e) {
        this[e.type](e);
    },
    mousedown(e) {
        if (e.button) return;
        e.preventDefault();
        e.stopPropagation();
        if (gURLBar.view.isOpen)
            gURLBar.view.close();
        else {
            if (!gURLBar.valueIsTyped)
                this.UrlbarProviderPlaces.getPriority = this.UrlbarProviderInputHistory.getPriority = function() {
                    delete this.getPriority;
                    return 3;
                };
            gURLBar.focus();
            gURLBar.startQuery();
        }
    },
    click(e) {
        if (e.button === 0) return;
        e.preventDefault();
        e.stopPropagation();
        if (e.button === 1 && Mtooltiptext) {
            BrowserCommands.reload();
            return;
        }
        if (!Rtooltiptext) return;
        var url, val;
        if (!gURLBar.valueIsTyped || !copyvalueistyped) url = gURLBar.makeURIReadable(gBrowser.selectedBrowser.currentURI).displaySpec, val = currentURIlabel;
        else url = gURLBar.untrimmedValue, val = valueIsTypedlabel;
        this.helper.copyString(url);
        ConfirmationHint.show(this.dropmarker, "", { hideArrow: true });
        ConfirmationHint._message.removeAttribute("data-l10n-id");
        ConfirmationHint._message.textContent = val;
    },
    destructor() {
        if (this.dropmarker)
            this.removeListeners();
        Services.prefs.removeObserver(this.pref, this);
    },
}).init())();

Сейчас перейдя с версии 109.0.1 (UCF тоже установил свежий) попытался задействовать этот скрипт вместо старого. В адресной строке ничего не появилось. Я что-то сделал не так? Или скрипт устарел?


Там была приписка:

_zt пишет

Тем кто будет использовать - ucfobj: true, старый с false работал.

Но что это и где переключается, я не в курсе.

Отредактировано m0nkrus (17-03-2025 14:21:09)

Отсутствует

 

№194017-03-2025 23:37:57

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

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

m0nkrus
Привет ещё раз. Скрипт работает. Его надо добавить в файл custom_script_win.js и сохранить файл в кодировке 65001 - (UTF-8) без BOM.

ucfobj: true, старый с false работал

Этот комментарий относится к следующему. Можно не добавлять в custom_script_win.js, а загружать скрипт как самостоятельный файл. Тогда его надо сохранить отдельно в кодировке, указанной выше. И прописать в файле CustomStylesScripts.mjs. Например, так:

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

Выделить код

Код:

scriptschrome: { // For browser window document [ChromeOnly]
        domload: [ // By event "DOMContentLoaded"
            // { path: "sidebar_tabs.js", ucfobj: true, },// Sidebar Tabs
        ],
        load: [ // By event "load"
            { path: "custom_script_win.js", ucfobj: true, },
            { path: "special_widgets.js", ucfobj: true, }, // Special Widgets
            { path: "cs_win/urlbarhistorydropmarker.js", ucfobj: true, }, // Действия на дропмаркере ПКМ - копировать адрес https://forum.mozilla-russia.org/viewtopic.php?pid=810081#p810081


У меня подобные файлы лежат в папке \chrome\user_chrome_files\custom_scripts\cs_win\. Поправьте путь и название, как удобно.

Отсутствует

 

№194118-03-2025 01:10:08

m0nkrus
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 10-09-2021
Сообщений: 32
UA: Firefox 136.0
Веб-сайт

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

xrun1 пишет

Привет ещё раз. Скрипт работает. Его надо добавить в файл custom_script_win.js и сохранить файл в кодировке 65001 - (UTF-8) без BOM

Вот оно! Переносил скрипт из старого файла через сравнение содержимого файлов в Total Commander. И эта зараза производила сравнение почему-то в ANSI-1251. В этом же формате и сохранила результат.
Спасибо огромное!


Еще вопрос можно? Был в свое время скрипт по возвращению favicon в адресную строку. У меня ссылка в избранном на его обсуждение следующая: https://forum.mozilla-russia.org/viewto … 84#p794984 Так вот, хотелось бы узнать, есть ли какой-то рабочий вариант. Тот, что у меня был на версии 109.0.1 (UCF 2021-9-20), не работает. Хотя я перенес файл скрипта, как он был. И прописку перенес из старого CustomStylesScripts.jsm в новый CustomStylesScripts.mjs. Вроде из-за смены локации и расширения, синтаксис у файла не особо изменился.

Сам скрипт, на всякий случай
(this.faviconinurlbar = {
            init(that) {
                var identity = document.querySelector("#identity-icon");
                if (!identity)
                    return;
                var iconDefault = "chrome://global/skin/icons/defaultFavicon.svg"; // или свою иконку
                var style = "data:text/css;charset=utf-8," + encodeURIComponent(`
                    #identity-faviconinurlbar {
                        --v-faviconinurlbar-default: url("${iconDefault}");

                        list-style-image: var(--v-faviconinurlbar, none) !important;
                        pointer-events: none !important;
                        height: 16px !important;
                        width: auto !important;
                        margin-inline-start: 3px !important;
                        -moz-context-properties: fill, fill-opacity;
                        fill: currentColor;
                        fill-opacity: var(--urlbar-icon-fill-opacity, 1);
                    }
                    #identity-faviconinurlbar:not([faviconinurlbar="true"]) {
                        --v-faviconinurlbar: var(--v-faviconinurlbar-default) !important;
                    }
                    #identity-icon {
                        margin-inline-start: 4px !important;
                    }
                    .identity-box-button {
                        padding-inline: 2px !important;
                    }         
                    #urlbar[actiontype="extension"] #identity-faviconinurlbar,
                    #identity-box:is(.extensionPage,.chromeUI) #identity-faviconinurlbar {
                        display: none !important;
                    }
                    #urlbar:not(.searchButton) > #urlbar-input-container > #identity-box[pageproxystate="invalid"] #identity-icon {
                        display: none !important;
                    }
                `);
                windowUtils.loadSheetUsingURIString(style, windowUtils.USER_SHEET);
                var faviconinurlbar = document.createXULElement("image");
                faviconinurlbar.id = "identity-faviconinurlbar";
                identity.before(faviconinurlbar);
                gBrowser.tabContainer.addEventListener("TabAttrModified", this);
                gBrowser.addProgressListener(this);
                that.unloadlisteners.push("faviconinurlbar");
                var {STATE_START, STATE_STOP, STATE_IS_NETWORK} = Ci.nsIWebProgressListener;
                var updatefavicon = image => {
                    if (image) {
                        faviconinurlbar.style.setProperty("--v-faviconinurlbar", `url("${image}")`);
                        faviconinurlbar.setAttribute("faviconinurlbar", "true");
                        faviconinurlbar.setAttribute("faviconchrome", `${image.startsWith("chrome:")}`);
                    } else {
                        faviconinurlbar.setAttribute("faviconinurlbar", "false");
                        faviconinurlbar.style.setProperty("--v-faviconinurlbar", "");
                    }
                };
                this.handleEvent = e => {
                    var tab = e.target, changed;
                    if (!tab.selected || !((changed = e.detail.changed).includes("image") || changed.includes("selected"))) return;
                    updatefavicon(tab.image);
                };
                this.onStateChange = (aWebProgress, aRequest, aStateFlags, aStatus) => {
                    if (aStateFlags & STATE_IS_NETWORK && aWebProgress?.isTopLevel) {
                        if (aStateFlags & STATE_START)
                            faviconinurlbar.setAttribute("favbusy", "true");
                        else if (aStateFlags & STATE_STOP) {
                            faviconinurlbar.setAttribute("favbusy", "false");
                            updatefavicon(gBrowser.selectedTab.image);
                        }
                    }
                };
            },
            destructor() {
                gBrowser.tabContainer.removeEventListener("TabAttrModified", this);
                gBrowser.removeProgressListener(this);
            }
        }).init(this);

Отредактировано m0nkrus (18-03-2025 01:34:03)

Отсутствует

 

№194218-03-2025 08:54:45

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 162
UA: Firefox 136.0

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

m0nkrus пишет

скрипт по возвращению favicon в адресную строку.

Скрипт от Aris-t2 работает во множестве версий Firefox, среди них актуальные v136.0.2 и v128.8.0esr.

Отсутствует

 

№194318-03-2025 09:52:14

m0nkrus
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 10-09-2021
Сообщений: 32
UA: Firefox 136.0
Веб-сайт

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

fuchsfan
Круто, что он работает. Но можно заодно и ссылку на него?!

Отсутствует

 

№194418-03-2025 10:51:49

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

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

m0nkrus пишет

Но что это и где переключается, я не в курсе.

В CustomStylesScripts.mjs
   
Добавлено 18-03-2025 11:00:42

m0nkrus пишет

скрипт по возвращению favicon в адресную строку

Этот попробуйте, я не проверял

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

Выделить код

Код:

(this.faviconinurlbar = {
            init(that) {
                var identity = document.querySelector("#identity-icon");
                if (!identity)
                    return;
                var iconDefault = "chrome://global/skin/icons/defaultFavicon.svg"; // или свою иконку
                var style = "data:text/css;charset=utf-8," + encodeURIComponent(`
                    #identity-faviconinurlbar {
                        --v-faviconinurlbar-default: url("${iconDefault}");

                        list-style-image: var(--v-faviconinurlbar, none) !important;
                        pointer-events: none !important;
                        height: 16px !important;
                        width: auto !important;
                        margin-inline-start: 4px !important;
                        -moz-context-properties: fill, fill-opacity;
                        fill: currentColor;
                        fill-opacity: var(--urlbar-icon-fill-opacity, 1);
                    }
                    #identity-faviconinurlbar:not([faviconinurlbar="true"]),
                    #identity-faviconinurlbar[favbusy="true"] {
                        --v-faviconinurlbar: var(--v-faviconinurlbar-default) !important;
                    }
                    #identity-faviconinurlbar[faviconchrome="true"],
                    #urlbar[actiontype="extension"] #identity-faviconinurlbar,
                    #identity-box:is(.extensionPage,.chromeUI,.localResource) #identity-faviconinurlbar,
                    #urlbar:not(.searchButton) #identity-box[pageproxystate="invalid"] #identity-faviconinurlbar {
                        display: none !important;
                    }
                `);
                windowUtils.loadSheetUsingURIString(style, windowUtils.USER_SHEET);
                var faviconinurlbar = document.createXULElement("image");
                faviconinurlbar.id = "identity-faviconinurlbar";
                identity.after(faviconinurlbar);
                gBrowser.tabContainer.addEventListener("TabAttrModified", this);
                gBrowser.addProgressListener(this);
                that.unloadlisteners.push("faviconinurlbar");
                var {STATE_START, STATE_STOP, STATE_IS_NETWORK} = Ci.nsIWebProgressListener;
                var updatefavicon = image => {
                    if (image) {
                        faviconinurlbar.style.setProperty("--v-faviconinurlbar", `url("${image}")`);
                        faviconinurlbar.setAttribute("faviconinurlbar", "true");
                        faviconinurlbar.setAttribute("faviconchrome", `${image.startsWith("chrome:")}`);
                    } else {
                        faviconinurlbar.setAttribute("faviconinurlbar", "false");
                        faviconinurlbar.style.setProperty("--v-faviconinurlbar", "");
                    }
                };
                this.handleEvent = e => {
                    var tab = e.target, changed;
                    if (!tab.selected || !((changed = e.detail.changed).includes("image") || changed.includes("selected"))) return;
                    updatefavicon(tab.image);
                };
                this.onStateChange = (aWebProgress, aRequest, aStateFlags, aStatus) => {
                    if (aStateFlags & STATE_IS_NETWORK && aWebProgress?.isTopLevel) {
                        if (aStateFlags & STATE_START)
                            faviconinurlbar.setAttribute("favbusy", "true");
                        else if (aStateFlags & STATE_STOP) {
                            faviconinurlbar.setAttribute("favbusy", "false");
                            updatefavicon(gBrowser.selectedTab.image);
                        }
                    }
                };
            },
            destructor() {
                gBrowser.tabContainer.removeEventListener("TabAttrModified", this);
                gBrowser.removeProgressListener(this);
            }
        }).init(this);

Отредактировано _zt (18-03-2025 11:01:31)

Отсутствует

 

№194518-03-2025 11:18:35

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 162
UA: Firefox 136.0

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

m0nkrus пишет

Круто, что он работает. Но можно заодно и ссылку на него?!

Ссылку только для тех, кому < 5 или > 90. Не пробовали семь букв загуглить?

Отсутствует

 

№194618-03-2025 11:27:28

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

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

m0nkrus пишет

Но можно заодно и ссылку на него?!

https://github.com/Aris-t2/CustomJSforFx/blob/master/scripts/favicon_in_urlbar.uc.js
:offtopic:


Win7

Отсутствует

 

№194718-03-2025 13:28:25

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

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

m0nkrus пишет

скрипт по возвращению favicon в адресную строку

Ссылку дал выше kokoss, сам пользуюсь. Подключаете через CustomStylesScripts.mjs. Т.е. сохраняете файл и там прописываете (см. №1940):

Выделить код

Код:

{ path: "cs_win/favicon_in_urlbar.uc.js", ucfobj: false, }, // Иконка в urlbar с правками от Aris https://github.com/Aris-t2/CustomJSforFx/blob/master/scripts/favicon_in_urlbar.uc.js

Правки для себя сделал такие:

Выделить код

Код:

const favicon_click_opens_page_info_window = true; // opens page info window on click, if set to true
...
  favimginurlbar.style.width = "16px"; // 18px
  favimginurlbar.style.height = "16px"; // 18px

И чтобы два раза не вставать, если пользуетесь полем поиска в адресной строке. Подключается аналогично.

Отсутствует

 

№194818-03-2025 19:11:16

m0nkrus
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 10-09-2021
Сообщений: 32
UA: Firefox 136.0
Веб-сайт

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

fuchsfan пишет

Ссылку только для тех, кому < 5 или > 90. Не пробовали семь букв загуглить?

Не пробовали не отвечать, если не готовы помогать?


kokoss, xrun1, моя вам глубокая признательность. То, что надо!


xrun1 пишет

И чтобы два раза не вставать, если пользуетесь полем поиска в адресной строке. Подключается аналогично.

Не очень понял, что этот скрипт делает. Ищу, да, через адресную строку. Но вроде как favicon_in_urlbar.uc.js на общих основаниях иконку подставляет. Или вы о чем-то другом?

Отредактировано m0nkrus (18-03-2025 19:12:04)

Отсутствует

 

№194918-03-2025 19:33:35

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

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

m0nkrus пишет

Не очень понял, что этот скрипт делает.

Добавляет значок поисковика: https://github.com/Aris-t2/CustomJSforFx/blob/master/scripts_preview_images/search_engine_icon_in_searchbar.png


Win7

Отсутствует

 

№195018-03-2025 19:38:58

m0nkrus
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 10-09-2021
Сообщений: 32
UA: Firefox 136.0
Веб-сайт

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

kokoss
Так это не про поиск в адресной строке. Это про поле поиска рядом с адресной строкой. xrun1 не очень удачно сформулировал, вот я и не понял :)

Отсутствует

 

Board footer

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