Уважаемые форумчане, опять я с вопросом.
Поместил кастомную кнопку в скрипт (один готовый код копипейстнул в другой). И вроде как работает, но по клику выскакивает вот такое.
Увы, моих знаний не хватает понять, что надо править. Помогите, пожалуйста.
Вот код скрипта:
try { CustomizableUI.createWidget({ id: "FFTools", type: "custom", tooltiptext: [ "FFTools" ].join("\n"), onBuild: function(document) { var toolbarbutton_0 = document.createXULElement("toolbarbutton"); toolbarbutton_0.id = this.id; toolbarbutton_0.tooltipText = this.tooltiptext; toolbarbutton_0.label = "FFTools"; toolbarbutton_0.setAttribute("image", "data:image/png;base64,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"); toolbarbutton_0.addEventListener("click", function(event) { (n => { var inBackground = false; var data = [{ lab: "about:config", url: "about:config", img: "chrome://browser/skin/developer.svg" },{ lab: "about:config old", url: "chrome://global/content/config.xhtml", img: "chrome://browser/skin/developer.svg" },{ lab: "about:support", url: "about:support", img: "chrome://global/skin/icons/info.svg" },{ lab: "about:performance", url: "about:performance", img: "chrome://global/skin/icons/performance.svg" },{ lab: "about:memory", url: "about:memory", img: "chrome://global/skin/icons/warning.svg" },{ lab: "about:profiling", url: "about:profiling", img: "chrome://devtools/skin/images/profiler-stopwatch.svg" },,{ lab: "about:debugging", url: "about:debugging#/runtime/this-firefox", img: "chrome://browser/skin/developer.svg" }, null, { lab: "Библиотека", url: "chrome://browser/content/places/places.xhtml", img: "chrome://browser/skin/library.svg" }, { lab: "О сборочной конфигурации", url: "about:buildconfig", img: "chrome://devtools/skin/images/settings.svg" }]; this.type = "menu"; var popup = n("menupopup"), dummy = n("menuitem"); popup.toggleAttribute("context"); dummy.render = () => { dummy.remove(); data.forEach((o, ind) => { if (!o) return popup.append(n("menuseparator")); var menuitem = n("menuitem"); menuitem.setAttribute("label", o.lab || o.url); if (o.img) menuitem.className = "menuitem-iconic", menuitem.setAttribute("image", o.img); menuitem.ind = ind; popup.append(menuitem); }); popup.setAttribute("oncommand", "tab(event.target.ind);"); popup.tab = ind => { var {url, params} = data[ind]; var tab = gBrowser.addTrustedTab(url, params); if (!(params?.inBackground || inBackground)) gBrowser.selectedTab = tab; } } popup.append(dummy); this.prepend(popup); //this.onmouseover = () => this.open = true; this.removeAttribute("tooltiptext"); var tt = this.appendChild(n("box")).appendChild(n("tooltip")); tt.setAttribute("onpopupshowing", "return !(parentNode.parentNode.open = true);"); this.setAttribute("tooltip", tt.id = _id + "-tooltip"); })(nn => document.createXULElement(nn)); }, false); toolbarbutton_0.classList.add("toolbarbutton-1"); toolbarbutton_0.classList.add("chromeclass-toolbar-additional"); return toolbarbutton_0; } }); } catch(e) {}
Отсутствует
toolbarbutton_0.addEventListener("click"
Это-то зачем, type = "menu" вполне достаточно.
Неиспользуемое долой.
(async data => CustomizableUI.createWidget({ id: "FFTools", label: "FFTools", localized: false, onCreated(btn) { var doc = btn.ownerDocument; var n = nn => doc.createXULElement(nn); btn.type = "menu"; btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAJYElEQVRYha2XeXBV1R3H77T9o1M7bWe0rWNnqp3pX+2oSV6C6AiCZiMPkvfy8u65y9vXvJcAQXaaYCiiIhaUmBZBDIsYJALKvikCoiKyg4psAg4FsrzkveTlnHvuPd/+gUtdEFL7/ft3zudzf2eZeyTpJnN5wuVbTpSech8rO7P8eMmpU8dKTpuflV7ChdJLOFF02jpe8unpo8Wftp2wn4tdCLXfcbPz3jCH6lK/OVB+Pnqg6OyrH5aeeeVw8Zknj4y8OPZI2bkxh0tOzThUdGrVgRGnz5+zd6LTkcGFkd04VHqKHhxx9rUTrnP3/Sj4hzH8+nBZ+8h9w/ryb1R70Pn5vfvsl/75rv0zXHClcdaZwSejerC/8uiGzJw5v/tRIpIkSdjqH4pN4UnW29EnrJ2xx7E3HsTe8Xd+u+6wL/uHneUXXz9amcE+RxdOODPY6z5unP3biqEDhy6deiteCTWLNeE+visG8X4C4lAC5tkxsNKTId6LHsGOmlu/b+x216VxH5AM3nJ2Ypczjf2+C+haOXPkjaGNO38mSZKEhWFFLAkKa2sNrHURWOtCEBsCMPfEYB1IALujM3B52S0/NNdm7Wp4l5LBG652bKxIY//EDwHU5F13QI8n2ZAe9PytaApVmy/HYa2IQCz1QbQGINr8wtwchtgdBbZFnTf8ki+ylnTM3+pJY2Vlt9gkZ3Bm1bweoPEX3ynsUONTU1r1dsz1F5sLozBeCEIsDAirxQ9rqRe8zQ/+dhxYGwrfLFySJAnAT1aQjs7Vahov2TM4/vRxwKhd/o2ifm38nVwdjZQ3Ucdn+P5tPhuENc8nrCYfxCI/zBYvzI1RiJW+jQOBf5nl/t4JawIZLJIzWObrgtU5DUDs7q8Kro6qfu3KqCjYON9q/ngA7DEdbLYHxlwveLMXfIkPVmsQaK2+638RaEni9hc93VjkS6PJmYF16ikIVtN2DV7WePuVkhhSjkiKj9EzxhQPaL0OOsMD+owXxjwvzGVhiCW+HV+19Z2xf8SeiG0gEs3+zo8WhNJ4ypXB+Z2zgd6kgd5pv5cyRTU12eIkUi6/4LUaaJ0ONlUFa9BBZ+rgc3SIJSGgOeSTJEnCdt98a38Q2B2sGojA7EjX+qbqDKZrGXyyfRbAa4EroxNS+0OJ9X0Px9Ene2EkFLCkDvqoBjZNA52uw3jaA6MpADROugNb1OnmxSTEZs+GgcAlSZKmx9tXzhqdwWRPGhfemwqergEu1KyTUkOrz3U/FEJ/lQYaVEHjCmitBjZRA6vXwWf5wZ70pbHYN9xcL8PcFwA2+8sHKjC+pmPHxGQGk6tPgp1OwrychPgseU7qGhxjHQ8G0O9QQT1fSuigtSroBBX8MQ9oo/cKlpEnxUYV1jYVeDM8aKAC0eSlq5qaxuLZy2BeCkOcjAMfxw2pqyCGzsE+ZCs0UFkD01XQkAKa0MHGqjCm6DAavBm8IK/lr7khtmrAel0bEHzKlUI9koZCPkbH+7XgpyOwjkRhHYxA6sqNo7PAj2wJAXXooG4VVFdAIwpoQoExVgOd4AGf6z4qljthrlMg1iibByIwyvPxsaKKS9iyeBrMz0Mw94fB94dhfhCC1JsTZ525PvQPJ8Kwq2BODZRoYLoCFlbAEiqMsTqMRqVHLHVyc5kL4g0FeF0ruRn44MqTzUXO82j9x3SY54Kw3g3C3BuEuTsAsSfQL3XfE7vYfU8QPfcrwihVQO0qqIOAVSmgugIWJqAJAjZOEeJ5B7WWVEC0umG1uoHViv164Hu8uOWv9o9e0QK78U5LLcRpvxD7AhCb/eBvBWC+6YfY7jsp9eQk1rPcMDrzCIxHiGDFCliZDuZUv5aIyDDiGsxJhIqFFdx8sQK81Q2xhgCvutdhtVKObaE7du5s+bk+dcdf/HWvTh0/sblry4JGiLd8EMe8wtobgLXWC77BB3OLH2KDD1jvbZX68pNxnhdDx70EfUPdwihUwIoU0DIVzKGAugmYroCGCWhMBmtw94sF5dx8qQJiaSX4WgK+ToFYLQvWRnrTaz3g20Mwd+kw9yiw9mjg2zwQrRrMVg3WOh3mag+sNh1YpWsShjXelrk3RrM5XnTaKoVZqApWpIIWqWBlBLSCgLkJqEcGC8mgUQJzYhXDfIdhtlRALK0AX+GCWOWG9YYMc70MsdENaxMB36TAatNgvqiCv6TBfFmD1eaBtUQFFpAe7Gz+pSRJktSbU/0yz63G1Zwq9DzgFEaRClqkgBapoKUqaDkBqyRgmgzml8GiMsyEbJr1LsOa5+B4wWmhxWmJ5VUmVlRZYoVsYrFsWU1uYcxRYDyvQizWwJdoEAtVWM060ESav9owuH/cn43camRzdHTkOAQdTiyjUAV7RAUtUUHLCNhIAupQwFQZLOAGjchg1QRGggg+gVh8qmzwBjdjDcQy6mVB6wnoLBnGXALxHIG5UIVYpAnj7wT8CQLMrv3mrzu1xZ7jeUl05RF05I4S/cPcghcqoIUKaIkKVqqCjbx2QmgVAfPI1/ZFnIAlCOhYBexRAjqJgNYTsEYCNkMBe4qAPaOAzVXAJlaB1+tgDe4Z3zk2WLXqp3050bPcFkUqp1JczbWL/odki3+xFKxEAS1VwOwErIKAuRQwlYB6CVhEviYymoDVEbAJCtgUFbReBZupgs0kYAmXMBIqWMJ98LqXBgbX3ZXJjZrcFkIqzyU6cu0i9aBTmA8TYRRqoMVfdMKugtmVayKVBFSRwbwENKiAxQloUgGtI2CTNWTHyMgqTmHoKrifdKNx/G0/eHNh6Li7s7lxw8iPoMdG0JVbLrryy0V2SKUwixRhFOswynTwkRqM8msShpPAkAkMDwELKGAhBVmfG1mHU/SWVoI7vTBdahdqa//0g/CvOzHlrmxO9CTPT4LbPEjluXA1txydNjtSgx0iO8Qpsg9Xid5CN/qKq9Bb4kKm1IV0sRPdjzjQM8yBniGVMIbJ4CMC4GXqfgRH//am4P8dmp94mufFYBTEYRT40JdfhVSeCymbA522crTnlaMjvxwdBaPQaXOgy+ZEb4ELxmAdfEgAxhAfMDzQMGDwt7th2OL/MvIiKW6LwrCFwG0e0AIN/QUq+goUsAINvECHMcgLfl8IRkGw3Xgg/CyKJv3/XskYMf9XuL9OZbZkCyuIHaT54XYzL5Q18iPUtMXaWUHogDEotgj3RV1o/J6Hx3XyHzJeDZbgUcq0AAAAAElFTkSuQmCC"); var popup = n("menupopup"), dummy = n("menuitem"); popup.toggleAttribute("context"); dummy.n = n; dummy.render = this.render; popup.append(dummy); btn.prepend(popup); var tt = btn.appendChild(n("box")).appendChild(n("tooltip")); tt.btn = dummy.btn = btn; tt.setAttribute("onpopupshowing", "return !(this.btn.open = true);"); btn.setAttribute("tooltip", tt.id = btn.id + "-tooltip"); }, render() { var {n, btn, parentNode: popup} = this; this.remove(); for(var o of data) { if (!o) { popup.append(n("menuseparator")); continue; } var {lab, url, img} = o; var menuitem = n("menuitem"); menuitem.setAttribute("label", lab || url); if (img) menuitem.className = "menuitem-iconic", menuitem.setAttribute("image", img); menuitem.url = url; popup.append(menuitem); } popup.setAttribute( "oncommand", "gBrowser.selectedTab = gBrowser.addTrustedTab(event.target.url);" ); } }))([{ url: "about:config", img: "chrome://browser/skin/developer.svg" },{ lab: "about:config old", url: "chrome://global/content/config.xhtml", img: "chrome://browser/skin/developer.svg" },{ url: "about:support", img: "chrome://global/skin/icons/info.svg" },{ url: "about:performance", img: "chrome://global/skin/icons/performance.svg" },{ url: "about:memory", img: "chrome://global/skin/icons/warning.svg" },{ url: "about:profiling", img: "chrome://devtools/skin/images/profiler-stopwatch.svg" },{ lab: "about:debugging", url: "about:debugging#/runtime/this-firefox", img: "chrome://browser/skin/developer.svg" }, null,{ lab: "Библиотека", url: "chrome://browser/content/places/places.xhtml", img: "chrome://browser/skin/library.svg" },{ lab: "О сборочной конфигурации", url: "about:buildconfig", img: "chrome://devtools/skin/images/settings.svg" }]);
Отсутствует
Dumby
Так откуда ж мне знать, что оно неиспользуемое
Большое спасибо! Прекрасно работает.
За юзерагент извиняюсь, проверял кое-что и забыл сменить. Обычно стараюсь ставить на актуальный. когда что-то спрашиваю. Пользуюсь обычно 78 и 101. Хотя вообще у меня их много.
А можно ещё спросить, как сделать такое же, но для папок виндовс? Вариантов кнопок, открывающих одну папку, много, а хотелось бы одну кнопку на всех.
Опять... агент сменил, а страницу не обновил
Отредактировано kazarin (03-09-2022 01:18:50)
Отсутствует
А можно ещё спросить, как сделать такое же, но для папок виндовс?
Что-то не слишком подробный вопрос. Может типа как-то так
(async data => CustomizableUI.createWidget({ id: "WinFolders", label: "Some Label", localized: false, onCreated(btn) { var doc = btn.ownerDocument; var n = nn => doc.createXULElement(nn); btn.type = "menu"; btn.setAttribute("image", this.image); var popup = n("menupopup"), dummy = n("menuitem"); popup.toggleAttribute("context"); dummy.n = n; dummy.render = this.render; popup.append(dummy); btn.prepend(popup); var tt = btn.appendChild(n("box")).appendChild(n("tooltip")); tt.setAttribute("onpopupshowing", "return !(this.btn.open = true);"); btn.setAttribute("tooltip", tt.id = (tt.btn = btn).id + "-tooltip"); }, render() { var {n, parentNode: popup} = this; this.remove(); for(var o of data) { if (!o) { popup.append(n("menuseparator")); continue; } var {lab, file, img} = o; var menuitem = n("menuitem"); menuitem.setAttribute("label", lab || file.leafName); menuitem.className = "menuitem-iconic"; menuitem.setAttribute("image", img || "moz-icon://file:///" + file.path); menuitem.tooltipText = file.path; menuitem.file = file; popup.append(menuitem); } popup.setAttribute( "oncommand", 'var {file} = event.target; file.exists() ? file.reveal() : Services.prompt.alert(null, "Not found!", file.path);' ); }, get image() { var sym = Symbol.iterator; data[sym] = () => { delete data[sym]; var it = data[sym](), {next} = it; var f = Components.Constructor("@mozilla.org/file/local;1", "nsIFile", "initWithPath"); it.next = () => { var res = next.call(it), obj = res.value; if (obj) { var {file} = obj; //if (typeof file == "function") obj.file = obj.file(f); if (typeof file == "string") { var ind = file.indexOf("\\"), has = ind > 0; var root = has ? file.slice(0, ind) : file; if (root.length > 2) file = Services.dirsvc.get(root, Ci.nsIFile).path + (has ? file.slice(ind) : ""); obj.file = f(file); } } return res; } return it; } delete this.image; return this.image = "chrome://browser/skin/save.svg"; } }))([{ file: "WinD" },{ lab: "Автозагрузка", file: "Progs\\Startup" },{ file: "SysD\\drivers\\etc" }, null, { lab: "Fox", file: "GreD", img: "chrome://branding/content/icon16.png" },{ file: "UChrm\\user_chrome_files\\custom_scripts", img: "data:image/svg+xml, <svg xmlns='http://www.w3.org/2000/svg' fill='%23fee082' stroke='%23b28501'><path d='M 7.7500004,3.5 H 13.5 a 2,2 45 0 1 2,2 v 7 a 2,2 135 0 1 -2,2 h -11 a 2,2 45 0 1 -2,-2 v -9 a 2,2 135 0 1 2,-2 H 5.0000004 A 1.3150997,1.3150997 20.81677 0 1 5.8737051,1.8321819 L 7.7500004,3.5 5.8737051,5.1678181 A 1.3150997,1.3150997 159.18323 0 1 5.0000004,5.5 H 0.5'/></svg>" },{ file: "D:\\Folder\\SubFolder" }]);
Отсутствует
Как переместить эту закладку на панель навигации ?
как вариант добавить в эту кнопку код:
},{ lab: "LLC Config", url: "about:llc", img: "resource://long_left_click/svg/long-click.svg"
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
Dumby
Извините, что снова о том же, но что надо изменить в скриптах-кнопочках, чтоб они завелись на 68? Замечательно работают на 78 и выше, но хотелось бы, чтоб и там тоже.
(почему именно на 68, это форк квантумной лисы, работающей на XP, но на ней работают и все те же кнопки и скрипты, что и на обычном 68, только один скрипт за всё время не завёлся, видимо, обращается именно к изменённой части)
Отсутствует
68, это форк квантумной лисы
Уж не знаю что за форк, а на квантумной лисе 68
<toolbarbutton>-добро построено на XBL, значит такая правка
Отсутствует
Dumby
Сделайте пожалуйста что бы этот скрипт отрывал историю и закладки рядом с текущей вкладкой!
Add, и что бы работал в UCF/2021-6-5. И желательно что бы был выбор, открывать рядом с текущей или в новой!
Отредактировано kokoss (10-09-2022 21:35:19)
Win7
Отсутствует
Сделайте пожалуйста что бы этот скрипт отрывал историю и закладки рядом с текущей вкладкой!
Дело в том, что «этот скрипт» ничего не открывает,
он просто меняет метод BrowserUtils.whereToOpenLink().
Можно попробовать "TabOpen" послушать чтобы вкладку подвинуть,
но это как-то нестрого, нужно тестировать.
(async url => { try {var exp = ChromeUtils.importESModule(url + "sys.mjs");} catch {exp = ChromeUtils.import(url + "jsm");} var bu = exp.BrowserUtils, {whereToOpenLink} = bu; var ts, ind; var args = ["TabOpen", e => Cu.now() - ts < 100 && e.target.ownerGlobal.gBrowser.moveTabTo(e.target, ind) , {once: true}]; var rn = Ci.nsINavHistoryResultNode, notRn = o => !(o instanceof rn); bu.whereToOpenLink = function(e) { var beg, res = whereToOpenLink.apply(bu, arguments); if (!Event.isInstance(e) || "ws".includes(beg = res[0])) return res; try { var trg = e.composedTarget, win = trg.ownerGlobal; var node = trg._placesNode; if (notRn(node)) { node = trg.closest("tree")?.selectedNode; if (notRn(node)) return res; win = win.BrowserWindowTracker.getTopWindow(); } //if ((e.button == 1 || e.ctrlKey) && res == "tab") return "current"; var gb = win.gBrowser; if (beg == "c") { if (gb.selectedTab.isEmpty || node.uri.startsWith("javascript:")) return res; res = "tab"; } if (res.startsWith("t")) { ts = Cu.now(); ind = gb.selectedTab._tPos + 1; gb.tabContainer.addEventListener(...args); } return res; } catch(ex) {return res;} } })("resource://gre/modules/BrowserUtils.");
желательно что бы был выбор, открывать рядом с текущей или в новой
Прости великодушно, но я слишком глуп чтобы такие загадки разгадывать.
Это ещё более(!) непонятно, чем «переместить закладку на панель навигации».
Отсутствует
Можно попробовать "TabOpen" послушать чтобы вкладку подвинуть,
но это как-то нестрого, нужно тестировать.
скрытый текст
Благодарю , работает, а если нужно что бы открывало в новой вкладке, то изменяем "TabOpen" на "whereToOpenLink".
Win7
Отсутствует
Тут потребовалось, а оказалось, что у меня не работает.
1. Вопрос-подтверждение "Удалить закладку/папку?" Сам скрипт выше.
(async repl => { var obj = `{\n ${ (await (await fetch("chrome://browser/content/places/controller.js")).text()) .match(/async _removeRange\(.+?\n\ +}(?=,\n)/s)[0] .replace("// This is a common bookmark item.", repl) }\n}` var ps = await ChromeUtils.compileScript("data:,(" + encodeURIComponent(`${obj => { var patch = async ctor => { var proto = ctor.prototype, meth = proto?._removeRange; meth && Object.assign(proto, obj); } var key = "PlacesController"; var desc = Object.getOwnPropertyDescriptor(window, key); if (!desc) return; var {get} = desc; if (get) desc.get = () => { var val = get(); patch(val); return val; }, Object.defineProperty(window, key, desc); else patch(desc.value); }})(${obj});`)); var obs = doc => "PlacesController" in doc.ownerGlobal && ps.executeInGlobal(doc); var topic = "chrome-document-loaded"; Services.obs.addObserver(obs, topic); Services.obs.addObserver(function quit(s, t) { Services.obs.removeObserver(quit, t); Services.obs.removeObserver(obs, topic); }, "quit-application-granted"); })( `$& if (!removedFolders.ignore) { /* let info = await PlacesUtils.bookmarks.fetch(node.bookmarkGuid); */ let args = [node.bookmarkGuid]; let isBookmark = PlacesUtils.nodeIsBookmark(node); isBookmark && args.push(null, {includePath: true}); let info = await PlacesUtils.bookmarks.fetch(...args); if (isBookmark) info.parentGuid = info.path[0].guid; if ( info?.parentGuid == "${PlacesUtils.bookmarks.toolbarGuid}" && !(removedFolders.ignore ??= Services.prompt.confirm( null, null, "Удалить закладку/папку?" )) ) { totalItems--; continue; } }` );
// Исходная версия https://github.com/alice0775/userChrome.js/blob/master/undoBookmarksContextMenu.uc.js // более свежая https://github.com/alice0775/userChrome.js/blob/master/91/undoBookmarksContextMenu.uc.js // Версия _zt https://forum.mozilla-russia.org/viewtopic.php?pid=792868#p792868 // Версия ВВП https://forum.mozilla-russia.org/viewtopic.php?pid=798662#p798662 // Это вариант от Dumby https://forum.mozilla-russia.org/viewtopic.php?pid=798678#p798678 // иконка моя (async sep => { if (!sep) return; var key = "hasRemoveTransaction"; var g = Cu.import("resource://gre/modules/PlacesTransactions.jsm", {}); if (!g[key]) { Services.scriptloader.loadSubScript( `data:,this.${key}=TransactionsHistory.proxifiedToRaw;`, g ); var raws = g[key]; g[key] = entry => { for(var tr of entry) if (raws.get(tr) instanceof PlacesTransactions.Remove) return true; } } var menuitem = document.createXULElement("menuitem"); for(var args of Object.entries({ closemenu: "single", class: "menuitem-iconic", id: "placesCmd_undoRemove", label: "Восстановить удалённое", oncommand: "PlacesTransactions.undo().catch(Cu.reportError);", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAEd0lEQVRIx53Ve2yW5RkG8N/7ft8Hxa/9CgjSSDnMA4xVTUMQWzadhzhnjSCC0y0jSjom+JdGp844ZhSjHLJsowaNZoCCHOWglXGoQbo2fBW3obDNUBfXKpsUVhxn6OHdH8+31GXGmL3/3M913ffzPNed93qeBxvmI8umCNjyPFEDSRJw40qKa9jyHSbdzY77Ar+9FTvZ+nHAb9T7P76YcwlOktlBdJia2SSthfRvaR/Mync5tp85Q2mbEHJ/X0bqRTpOBJyehog3C3j1HV9RQP91xG9T8z2SofyphMELWH4zW5s40s7kQ/T0cnYfXfPD1OgM0TlGzSN1DZkzxG1EdURjaa9HCfddEupfuSkIfHXJ5wVENA8Iw9QcRnbzXj31++g8w+WVZHMhXzaKhu2MGMtd36f5CTrn8WAJyf001KCYpA6dDBtLlOfoYuI6kgp6XuLsbhQRfw39ovDPx7/JgYS1b3NkCxcvoPgTevIULyFVTm4jyinp4uRJiirYt5BMLc15kvE0lnCsgZaE2wdx6LVCo9/ghQn4LhdFxEOonELv8ogVV9Iyjd9fx8T1FE2nq5XSQWQuJbsmrJH9JclMsldhFsW3EU0iuxsb6f9zTA3dHj1J1yPsKaPrIOtnkn6KDY2cvYF/vkfmINGuiPdnUD6Pd/7Mur/x0RCqXqTfj+m5glyO1B8ovR1pijeil6KvBw8V1QaB/QYWzNgSYu+TmMm5GVhKT47OBWR28kgnvxvKS/OjvuMGuTSr72FtBR/WctNe4l+H3GUt7DxB2TKe+CmnF5IZRzSZzFmS4wy9n2QGY2eR3Mx193DqAao+4vh04lZS2/EkQyqo7cWux4Kjwf4gKF3N5hEs+QsLlwVuVRPLP2FeTSh95hZSpSx6OOAkwWCWLSEqYWVz4JtLqd3GiuX0/oS6XKjd/BQbF6SRJynij4eJKpl7WSg8cCdzxjHjH3QuIsaorQx7NCx8QQdxCYM2kzxL423BbGN6SP+I6tmcO86hahqu4MA2To3mX+eTxbA2er6VJjcA/Yl2kOzlrutJxrDraaI1XH09j3fQVk7pcG5sCgIOttLVzejpmMPrnxJvYnIZXelwxGHTCOaX0PorsmUMOC/wpeNofg4fjg9EW3+k6CzcYJ99M7h6fSfxFFJrMZzFm0I+fzXxlTQ1EHf3eSlJyI3mlYGs/yEPx4F7/NkQ11zEymFhnDoY9RnwcHmIZ34Q1CcTkBD9FSM58gu8SmUHbmVuJbYRt2AiE/cwZT/tG3h+Gh29lH3A+VPZ+zMq1rHwcq6tY1U31ReQXPgFt3M+/9+xJRvM9f5S3NnX6btLqfqYt1p44xQrFnH0aX6zmBXIj+Hae0N95qG+ea/PJjrB7tV47csE7CzEJqKXyTcW8CquaibfwTOX0FjPLSfYk+G8XWyb+rlTUcndVUQjWXOK+FiBn/QfQen/FVBVVdhoc4FIkczqM5WBvPMWp4fQMpzFHeEN2NCFCcyNSH2b1AiSl3nhVnrnkjpNkqP9jrBvdzX8G2rIlxvMK3a7AAAAInpUWHRTb2Z0d2FyZQAAeNorLy/Xy8zLLk5OLEjVyy9KBwA22AZYEFPKXAAAAABJRU5ErkJggg==", })) menuitem.setAttribute(...args); var desc = Object.getOwnPropertyDescriptor(XULElement.prototype, "hidden"); var {set} = desc; desc.set = () => { var entry = PlacesTransactions.topUndoEntry; var vis = entry && g[key](entry); vis && menuitem.removeAttribute("disabled"); set.call(menuitem, !vis); } Object.defineProperty(menuitem, "hidden", desc); sep.before(menuitem); })(document.getElementById("placesContext_deleteSeparator"));
Отсутствует
Поделитесь, кто пользуется и у кого работает.
Вопрос на удаление работал, но зачем нужен? Только время отнимает.
2. второй очень полезный: пережал иконку в Восстановить закладки, сократив на 800 байт.
Отсутствует
Только время отнимает.
1. Меня заставляет ещё раз подумать. Код работает в боковой панели, а хотелось бы ещё в панели закладок. Помнится, раньше и там работал.
2. Пережали иконку - спасибо, но мне это не интересно: в посте выше в коде моя иконка и вопрос был в том, что этот код не работает у меня на v104.0 и работает ли вообще?
UPD: обновлённый код от alice0775 пока не проверял.
Отредактировано xrun1 (13-09-2022 03:30:18)
Отсутствует
возможно ли сделать из этого расширения https://www.upload.ee/files/14493725/do … s.xpi.html кнопку для UCF
Конечно же нет, это ведь не расширение, а WebExtensions.
Не, ну может есть где-то такие лбы, которые могут, но они не будут.
Плюс, оно, в некоторой части, зависимо от конкретных веб-сайтов,
а значит должно обновляться, если там что-то поменяется.
что бы закачки передавались в портативный Download Master
Разве что можно попытаться забрать у него browser.runtime.sendNativeMessage() себе,
и попробовать построить симуляцию на аргументах командной строки.
Затея так себе, но раз всё равно не работает...
Создать .mjs'ку, прописать там путь до dmaster.exe. Импортировать, например, так
var UcfStylesScripts = { /** ************************▼ Настройки ▼************************ */ ....... scriptsbackground: [ // В фоне [System Principal] ....... { func: 'ChromeUtils.importESModule("chrome://user_chrome_files/content/custom_scripts/DownloadMaster.mjs");' }, ], /** ************************▲ Настройки ▲************************ */ };
if (!ChromeUtils.domProcessChild.childID) { var path = "C:\\Portable Program Files\\Download Master Portable\\dmaster.exe"; var urlsListURL = "download_master.urls"; // Relative to "chrome" folder, use "/" var U = Services.io.newFileURI, CC = Components.Constructor; var F = CC("@mozilla.org/file/local;1", "nsIFile", "initWithPath"); var file = F(path); if (!file.exists()) throw "Download Master Portable Not Found!\n" + path; var proc = CC("@mozilla.org/process/util;1", "nsIProcess", "init").bind(null, file); var urlsListPath = Services.io.newURI( U(Services.dirsvc.get("UChrm", Ci.nsIFile)).resolve(urlsListURL) ).QueryInterface(Ci.nsIFileURL).file.path; var esModuleURI = Components.stack.filename; ChromeUtils.registerWindowActor("DownloadMaster", { parent: {esModuleURI}, remoteTypes: ["extension"], child: {esModuleURI, events: {DOMDocElementInserted: {}}}, matches: ["moz-extension://*/_generated_background_page.html"] }); var DownloadMasterParent = class extends JSWindowActorParent { async receiveMessage(msg) { var id = msg.name, d = msg.data; if (id == "D") return file.launch(); // openDownloadMaster var args = []; if (id == "A") var arg = d.url; // openAddURLWindow else { var push, url, arg = "", dwnld = id == "l"; if (dwnld) url = d.url; // downloadFile else { // addUrls if (d.urls.length == 1) url = d.urls[0]; else await IOUtils.writeUTF8( push = url = urlsListPath, d.urls.join("\n") ); } arg += `<url>${url}</url><referer>${d.referrer}</referer>`; var str = "<cookies>" for(var {name, value} of d.cookies) str += `${name}=${value}; `; arg += str + "</cookies>"; if (dwnld) { // downloadFile var uri = U(F(d.filename)).QueryInterface(Ci.nsIFileURL); if (d.isNameSelected) arg += `<savepath>${uri.file.parent.path}</savepath>` + `<filename>${uri.fileName}</filename>`; var ext = uri.fileExtension; if (ext) arg += `<fileExtension>.${ext}</fileExtension>` } else if (d.urlsdata?.title) // addUrls [1] arg += `<filename>${d.urlsdata.title}</filename>`; args.push(push || "-addurl"); } args.push(arg); proc().runwAsync(args, args.length); } } } export {DownloadMasterParent}; export class DownloadMasterChild extends JSWindowActorChild { handleEvent(e) { var win = this.contentWindow; if (WebExtensionPolicy.getByHostname(win.location.host).id != "dm@westbyte.com") return; win = win.wrappedJSObject; var o = win.Object, res = new o(); res.downloadState = "DOWNLOAD_ACCEPTED"; var desc = new o(); desc.configurable = true; Cu.exportFunction(() => { delete res.protocolVersion; return res.protocolVersion = win.BRDEP.protocolVersion; }, desc, {defineAs: "get"}); o.defineProperty(res, "protocolVersion", desc); var dummy = win.Promise.resolve(res); var sendMethods = new Set([ "downloadFile", "addUrls", "openAddURLWindow", "openDownloadMaster" ]); win.browser.runtime.sendNativeMessage = (s, data) => { if (sendMethods.has(data.method)) { var id = data.method[4]; delete data.method; this.sendAsyncMessage(id, data); } return dummy; } } }
1. Вопрос-подтверждение "Удалить закладку/папку?"
Код работает в боковой панели
Видимо, симилярно этому. Заведи уже наконец "новый" UCF.
2. "Восстановить удалённое"
Тоже вроде обсуждалось. Но, наверно, без lazy.
Вобщем, пока Cu.import() еще с нами, такой вариант
(async sep => { if (!sep) return; var key = "hasRemoveTransaction"; var g = Cu.import("resource://gre/modules/PlacesTransactions.jsm", {}); var raws = (g.lazy || g).TransactionsHistory?.proxifiedToRaw; if (raws) g = raws; if (!g[key]) { if (!raws) { Services.scriptloader.loadSubScript( `data:,this.${key}=TransactionsHistory.proxifiedToRaw;`, g ); raws = g[key]; } g[key] = entry => { for(var tr of entry) if (raws.get(tr) instanceof PlacesTransactions.Remove) return true; } } var menuitem = document.createXULElement("menuitem"); for(var args of Object.entries({ closemenu: "single", class: "menuitem-iconic", id: "placesCmd_undoRemove", label: "Восстановить удалённое", oncommand: "PlacesTransactions.undo().catch(Cu.reportError);", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAEd0lEQVRIx53Ve2yW5RkG8N/7ft8Hxa/9CgjSSDnMA4xVTUMQWzadhzhnjSCC0y0jSjom+JdGp844ZhSjHLJsowaNZoCCHOWglXGoQbo2fBW3obDNUBfXKpsUVhxn6OHdH8+31GXGmL3/3M913ffzPNed93qeBxvmI8umCNjyPFEDSRJw40qKa9jyHSbdzY77Ar+9FTvZ+nHAb9T7P76YcwlOktlBdJia2SSthfRvaR/Mync5tp85Q2mbEHJ/X0bqRTpOBJyehog3C3j1HV9RQP91xG9T8z2SofyphMELWH4zW5s40s7kQ/T0cnYfXfPD1OgM0TlGzSN1DZkzxG1EdURjaa9HCfddEupfuSkIfHXJ5wVENA8Iw9QcRnbzXj31++g8w+WVZHMhXzaKhu2MGMtd36f5CTrn8WAJyf001KCYpA6dDBtLlOfoYuI6kgp6XuLsbhQRfw39ovDPx7/JgYS1b3NkCxcvoPgTevIULyFVTm4jyinp4uRJiirYt5BMLc15kvE0lnCsgZaE2wdx6LVCo9/ghQn4LhdFxEOonELv8ogVV9Iyjd9fx8T1FE2nq5XSQWQuJbsmrJH9JclMsldhFsW3EU0iuxsb6f9zTA3dHj1J1yPsKaPrIOtnkn6KDY2cvYF/vkfmINGuiPdnUD6Pd/7Mur/x0RCqXqTfj+m5glyO1B8ovR1pijeil6KvBw8V1QaB/QYWzNgSYu+TmMm5GVhKT47OBWR28kgnvxvKS/OjvuMGuTSr72FtBR/WctNe4l+H3GUt7DxB2TKe+CmnF5IZRzSZzFmS4wy9n2QGY2eR3Mx193DqAao+4vh04lZS2/EkQyqo7cWux4Kjwf4gKF3N5hEs+QsLlwVuVRPLP2FeTSh95hZSpSx6OOAkwWCWLSEqYWVz4JtLqd3GiuX0/oS6XKjd/BQbF6SRJynij4eJKpl7WSg8cCdzxjHjH3QuIsaorQx7NCx8QQdxCYM2kzxL423BbGN6SP+I6tmcO86hahqu4MA2To3mX+eTxbA2er6VJjcA/Yl2kOzlrutJxrDraaI1XH09j3fQVk7pcG5sCgIOttLVzejpmMPrnxJvYnIZXelwxGHTCOaX0PorsmUMOC/wpeNofg4fjg9EW3+k6CzcYJ99M7h6fSfxFFJrMZzFm0I+fzXxlTQ1EHf3eSlJyI3mlYGs/yEPx4F7/NkQ11zEymFhnDoY9RnwcHmIZ34Q1CcTkBD9FSM58gu8SmUHbmVuJbYRt2AiE/cwZT/tG3h+Gh29lH3A+VPZ+zMq1rHwcq6tY1U31ReQXPgFt3M+/9+xJRvM9f5S3NnX6btLqfqYt1p44xQrFnH0aX6zmBXIj+Hae0N95qG+ea/PJjrB7tV47csE7CzEJqKXyTcW8CquaibfwTOX0FjPLSfYk+G8XWyb+rlTUcndVUQjWXOK+FiBn/QfQen/FVBVVdhoc4FIkczqM5WBvPMWp4fQMpzFHeEN2NCFCcyNSH2b1AiSl3nhVnrnkjpNkqP9jrBvdzX8G2rIlxvMK3a7AAAAInpUWHRTb2Z0d2FyZQAAeNorLy/Xy8zLLk5OLEjVyy9KBwA22AZYEFPKXAAAAABJRU5ErkJggg==", })) menuitem.setAttribute(...args); var desc = Object.getOwnPropertyDescriptor(XULElement.prototype, "hidden"); var {set} = desc; desc.set = () => { var entry = PlacesTransactions.topUndoEntry; var vis = entry && g[key](entry); vis && menuitem.removeAttribute("disabled"); set.call(menuitem, !vis); } Object.defineProperty(menuitem, "hidden", desc); sep.before(menuitem); })(document.getElementById("placesContext_deleteSeparator"));
Отсутствует
Заведи уже наконец "новый" UCF.
Нет, я не трус, но я боюсь. Боюсь, смогу ли я, способен ли?
2. Работает, спасибо.
Отсутствует
2. Работает
Не понял. А 1. что, не работает что ли?
Нет, я не трус, но я боюсь. Боюсь, смогу ли я, способен ли?
Так склонируй браузер, и там пробуй разобраться.
Никто не торопит, ни чем не рискуешь.
В отношении скриптов в "новом" вообще ничего не поменялось.
Не нравится встроенный загрузчик — не используй, делай как привык.
Со стилями да, наверно придётся почесать репу.
Отсутствует
Не понял. А 1. что, не работает что ли?
Работает в боковой панели. На панели закладок не спрашивает.
Я почему об этом вспомнил? Случайно удалил закладку, потом вспомнил, что там пост обновляемый. Пришлось лезть на форум, вспоминать тему, формулировать запрос, искать... А с подсказкой подумал бы второй раз, стоит ли удалять.
Что касается "нового" UCF. Там слишком много для меня слов, смысл которых не понимаю. И файлы непонятные со страшными словами CustomStylesScripts.jsm, CustomStylesScriptsChild.jsm. Что куда пихать не понял тогда, не понимаю и сейчас. Даже пробовать боюсь, да и зачем, если всё работает.
Отсутствует
Вобщем, пока Cu.import() еще с нами, такой вариант
В панели закладок вернуть удалённое работает. А как насчёт окна "Управление закладками"?
Dumby - возможно добавить восстановление удалённых закладок было и в окне Библиотеки?
Ещё вопрос по стилям UCF в CustomStylesScripts.jsm - подскажите, как подключать стили в зависимости от операционной системы?
Хотелка такая - подключать общие AGENT_SHEET и USER_SHEET стили как обычно, но добавить ещё пару CSS в зависимости от OS.
То есть чтобы на macos подключались ещё пара своих AGENT_SHEET и USER_SHEET стилей, на linux пара своих, на windows тоже.
var UcfStylesScripts = { /** ************************▼ Настройки ▼************************ */ …………………………… stylesall: [ // Для всех документов - ЗДЕСЬ разделить стили по типу операционной системы { path: "custom_styles_all_agent.css", type: "AGENT_SHEET", sheet() { registerSheet(this); }, }, { path: "custom_styles_all_user.css", type: "USER_SHEET", sheet() { registerSheet(this); }, }, ],
Отредактировано Dobrov (14-09-2022 15:26:30)
Отсутствует
Dobrov
Это можно в самих стилях указать
@media (-moz-platform: windows) { /* some rules targeting windows OS */ } @media (-moz-platform: osx) { /* some rules targeting mac OS */ } @media (-moz-platform: linux) { /* some rules targeting linux (by which I think we normally mean gtk in practice? */ }
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует