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

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№1926Вчера 12:02:13

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

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

Отсутствует

 

№1927Вчера 12:38:21

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

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

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

Отсутствует

 

№1928Вчера 12:47:52

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

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

_zt

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

Отсутствует

 

№1929Вчера 13:00:13

_zt
Забанен
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1696
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 (Вчера 13:08:42)

Отсутствует

 

№1930Вчера 13:22:47

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

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

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

Отредактировано Garalf (Вчера 13:31:11)

Отсутствует

 

№1931Вчера 13:41:12

_zt
Забанен
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1696
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 (Вчера 13:46:19)

Отсутствует

 

№1932Вчера 16:33:09

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1259
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:

Отсутствует

 

№1933Вчера 17:11:00

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 345
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);
		}
	}
}

Отсутствует

 

№1934Вчера 19:20:22

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2315
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

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

Отсутствует

 

№1935Вчера 19:55:50

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

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

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

Отсутствует

 

№1936Вчера 20:46:18

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1259
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 и значок "Сегодня" - всё получилось, работает, спасибо!

Отсутствует

 

№1937Сегодня 10:21:02

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2315
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();
                });

Отсутствует

 

№1938Сегодня 17:45:17

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

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

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

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

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

Отсутствует

 

Board footer

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