fuchsfan
Этот пост?
https://forum.mozilla-russia.org/viewto … 48#p806748
Отсутствует
Garalf
В CustomStylesScripts.mjs в секцию scriptsbackground, это аналог custom_scripts.js, но будет ли лоадер работать из js я не знаю. Если у вас настолько древний ucf, что нет CustomStylesScripts.mjs, то может стоит обновиться?
Отсутствует
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)
Отсутствует
_zt
Большое спасибо! Все получилось.
Правда, там, по-видимому, сам скрипт править надо.
И еще вопрос. А для скриптов .JSM надо делать аналогично?
Отредактировано Garalf (Вчера 13:31:11)
Отсутствует
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)
Отсутствует
Dumby
В 136 отвалился places_sidebar_folders_statistics.js. Не пашет ни в UCF-2025, ни в предыдущем.
В новом UCF отвалился google-translate.js. Это так, теоретически. У меня пока старый UCF на 136-й работает работает, хотя может просто не всё знаю...
Ещё есть скрипт, который заменяет значки папок. Вполне успешно и для боковой панели, и для библиотеки. Но в боковой панели "душит" значок "Сегодня" (журнал-история), который в библиотеке выглядит правильно. Могу отключить, конечно, если поправить нельзя.
(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");
Отсутствует
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); } } }
Отсутствует
Поведение кнопки немого сломалось, давно уже. Не принципиально, конечно.
При закрытии ЛКМ или СКМ фокус улетает на позицию ниже. Т.е. если была панель закладок --> какая-то папка или закладка, фокус сместится на меню закладок. Если меню закладок --> какая-то папка или закладка --> фокус на другие закладки.
Да, так оно устроено:
// 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>`);
отвалился places_sidebar_folders_statistics.js
Что-то мне стрёмно по такому адресу переходить.
Ссылка точно правильная?
отвалился 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; }
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);
/* btn.setAttribute("oncommand", "linkedObj.switch(document);"); */ btn._handleClick = () => this.switch(doc);
Посмотри пожалуйста. В 136 не работает.
Reload user(Chrome, Content).mjs
Посмотрел — ничего не увидел. Должно работать.
Отсутствует
Ссылка точно правильная?
Виноват, запутался. 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, },
Отсутствует
количество закладок/папок в боковой панели
Да уж, тупой гаденький 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(); });
Отсутствует