Dumby
Наверно считается, что это удобно.
Так, а шо делать ? Рихтую,рихтую и никак...Вру, сделал...Похожая шняга с editBMPanel_namePicker , от тут не знаю.
Да нет, нашел в editBookmark.js ,короче, меняю на focused
Отредактировано ВВП (16-01-2022 12:41:45)
Отсутствует
Как заархивировать папку? Есть папка по пути C:\\Папка нужно через CB превратить в Папка.rar
Запустить программу-архиватор с аргументами, очевидно же.
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.startHidden = true; process.init(FileUtils.File("C:\\Program Files (x86)\\WinRAR\\rar.exe")); var args = ["a", "-ep1", "-r", "Y:\\Папка.rar", "C:\\Папка\\*"]; process.runw(false, args, args.length);
Отсутствует
Dumby
Переделайте пожалуйста кнопочку для UCF.
/*Initialization Code*/ // Сохранить как PNG .......... ((main, parts) => this._handleClick = () => { var df = MozXULElement.parseXULToFragment(` <menupopup> <menuitem class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOwSURBVHjaYmBiYuJvamo+xiIsLLL3uaazMUAAMTY3txxjAAFubq7/ZiYm/wECACIA3f8AGhobzGhoaP8QFRr/6enp/wT5+fgBLS0tAOLi4gCnp6cAAoixtrbuFBsb6x+QNnZ2jo0MXz9/+Qdk/wfhO3fu/Gc5cuwoA4NqHEOoszjDrVu3GFiAogxJtiwMagrCQHMeMgAEoHhsdRCG4Tj463+rxGFIqN2CYI7wBpiaWhzPheF5SMhIKliCYiQtyTC4hvSLcu7cHYQQl5SSDyFGa23UWkfvfXTORWNMpiIYH2NV1xXN5gvq9kfqNjtSStF7mkAhBPTXHm3TYL1qsV2+8LyfIaXEbRjAyuzpUOCcI+cMYgzp31hCnft+fgII6Cm95oiICOd///4CFTAwAOWBgBFIM7Lw8vLZM5w7d+7/t2/fwA4DOfDp02d/QQ4GWv1z6tSpU5g+ffrI8OnTJyagFUx2Tu5MsnIyTDk52UyfPn5k/vXr9x+mjx8+MsTFxTGERMUzVK09yCAsn8AwY+ZMhlevX0Pc9PTZM4a3b94wXHjwmaEsu5th87GpQIcyMdy+fZvh79+/DEwfP35giIuPZ3hzbTeDCtcjhngnEwZVVRWGz58/g+ON5dOnz6BYYKioqGY4eOggg5SuBYORkRHDixcvQL5hZNTR0flnY2PD+O8fKAwYgGHwHyTMwMzMwrBt2zZHgAA9Uz1Lw1AUPWlKE1vFlEIFHRoKQgcRtDSLIAiCgoJuiovYP6DopnR1EdRYHO3W6tbg5K5LwclmVQviRwutpSaQtI3P+yIK7/Eu94t77jkPiqIcGUaZ5vlmlvXFbNui12LEBSPo/uU29/EYrYQ1m01WqVRYPn++FQiHI3Mj8RG4jst7wHFcFAoFaFoGsixBliRoGc338dg3AQuKojc2OoZ+vzcZ4JRwQNQAxVIJsVgMuVwO8/OL2D29xPjSHvpCHAf7+36M57iuSzUdnzISg4d3AvxgVqHrJ5BCIcxu7KCdWoLx3MFLaBjOxDJSC1lIsowzXUfVNFEnJflrJi2i1WrBtm1MpzNgAoN5U8TtySE61Sccb6/jIjuF3uMduo5DOWk/l9fwxQr0o+6J+rSqqlxjQq1WQ9kw8PH2CoF5cLtd8gaRSCSwsrqKZDJJu3A8WZbFer2hB2nLAc5ZNBplHFskEsEmSUcURV8q+GXTH5ffBo1OUzNFGUa7/cm4eGcEIbA2MBBW6df8VnC1s3/zv8mfScchaq+GhgavfwBr4dP0kYqtcwAAAABJRU5ErkJggg==" label="Сохранить всю страницу как PNG" value="all"/> <menuitem class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOwSURBVHjaYmBiYuJvamo+xiIsLLL3uaazMUAAMTY3txxjAAFubq7/ZiYm/wECACIA3f8AGhobzGhoaP8QFRr/6enp/wT5+fgBLS0tAOLi4gCnp6cAAoixtrbuFBsb6x+QNnZ2jo0MXz9/+Qdk/wfhO3fu/Gc5cuwoA4NqHEOoszjDrVu3GFiAogxJtiwMagrCQHMeMgAEoHhsdRCG4Tj463+rxGFIqN2CYI7wBpiaWhzPheF5SMhIKliCYiQtyTC4hvSLcu7cHYQQl5SSDyFGa23UWkfvfXTORWNMpiIYH2NV1xXN5gvq9kfqNjtSStF7mkAhBPTXHm3TYL1qsV2+8LyfIaXEbRjAyuzpUOCcI+cMYgzp31hCnft+fgII6Cm95oiICOd///4CFTAwAOWBgBFIM7Lw8vLZM5w7d+7/t2/fwA4DOfDp02d/QQ4GWv1z6tSpU5g+ffrI8OnTJyagFUx2Tu5MsnIyTDk52UyfPn5k/vXr9x+mjx8+MsTFxTGERMUzVK09yCAsn8AwY+ZMhlevX0Pc9PTZM4a3b94wXHjwmaEsu5th87GpQIcyMdy+fZvh79+/DEwfP35giIuPZ3hzbTeDCtcjhngnEwZVVRWGz58/g+ON5dOnz6BYYKioqGY4eOggg5SuBYORkRHDixcvQL5hZNTR0flnY2PD+O8fKAwYgGHwHyTMwMzMwrBt2zZHgAA9Uz1Lw1AUPWlKE1vFlEIFHRoKQgcRtDSLIAiCgoJuiovYP6DopnR1EdRYHO3W6tbg5K5LwclmVQviRwutpSaQtI3P+yIK7/Eu94t77jkPiqIcGUaZ5vlmlvXFbNui12LEBSPo/uU29/EYrYQ1m01WqVRYPn++FQiHI3Mj8RG4jst7wHFcFAoFaFoGsixBliRoGc338dg3AQuKojc2OoZ+vzcZ4JRwQNQAxVIJsVgMuVwO8/OL2D29xPjSHvpCHAf7+36M57iuSzUdnzISg4d3AvxgVqHrJ5BCIcxu7KCdWoLx3MFLaBjOxDJSC1lIsowzXUfVNFEnJflrJi2i1WrBtm1MpzNgAoN5U8TtySE61Sccb6/jIjuF3uMduo5DOWk/l9fwxQr0o+6J+rSqqlxjQq1WQ9kw8PH2CoF5cLtd8gaRSCSwsrqKZDJJu3A8WZbFer2hB2nLAc5ZNBplHFskEsEmSUcURV8q+GXTH5ffBo1OUzNFGUa7/cm4eGcEIbA2MBBW6df8VnC1s3/zv8mfScchaq+GhgavfwBr4dP0kYqtcwAAAABJRU5ErkJggg==" label="Сохранить видимую часть страницы как PNG" value="page"/> <menuitem class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKaSURBVHjaYpx94sPD44//CDG9+/SDp8bsBw9AADEmrX7zmQEIGF+//fD/w8dPDAABxNix6/nbcA0GIQYoYGJiZGSQFBdmOHnqLAMrKwsDQAAxJq958/n/f4jsm2//GBifP3v+/8cfiMDDj/8ZmHi5ORl4gPjPn18M///9ZWDh5uVm4GJkYfj56zcD9z9GBoAAYmwH2aL8UwimDRk8+fyfgYWRgZFBgI+b4TsWBR+BtoNcxcDDwwW2R1iQn2HvgcMMX799Y/j6/TvDzz+/GVj+/fvPvO0BC8N/oGpGhv8ML3m0GS59EwWbcP/9XwaAAGSRwQ3CMAxFfxq3TgrqiSMswARMwSJMxZEdGAXBAEiQquICJMFuekDqwTlY38/Wi9kf78OqNTO8kndretBh+1puuvl+R8Dpwm9iruG8xPP/tIGzhULc1OB6voJJXxGjQpumGpsKCc8wEqISwGJfA1P1IYCEmCegkTmqLIELT/8KC+/x+cbxBpEPOl8zbn0q5voWXdcipQQrgZiC/QlQORmzNBAEUfjt7N4ichBUDIKCWNsJhiBiZ2mZf5XC0v/gT7C10lqwNMVBkBC9kKAmt7e+uQtJxBS6cNwy7L2b981bTrz/fnmIxnHTYN081i1F8PQacddDzm0M+UfAYPw/gfyTlqMNVfOJVxIGpfxNgMcZRwoYpkVpe1ezLn/jplc7B2wWb+1gwwfuvxg31lwi7MAimOU4E+IevuXoXt+gILTE1aQ1VBJnwNYR9ltXFKCweM9RWFpYCnjWiukU7dYJLs7PUMyKuglNAZt6GVncZ7SgIU2ZJ8M/bLqVQEFYN9hJPQ5201pgvhztjnk2ZhOYh+esd/vY39ZPZYWBXlURqZ4Qwg8uZXU3gM7p3vAbsXveewxHZWUAAAAASUVORK5CYII=" label="Сохранить выбранный элемент страницы как PNG" value="click"/> <menuitem class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAL/SURBVHjaYijccvd25ZHvv5n4RSUVQs2vswAEECOIxwACy+8v/3/30Zv/AAHE0Hb6y+//UPDv4///LD/+MjJ8+PqF4cvnnww/vgkxAAQQY8Xhb78YgQCsj5mFgQGm/P+v///fvvj/n+n/fwaGe//vMexg2Mrw7BsDA8vXHwwMPN/5GdQ/mzG8BbIBAoiRfdqvX8xf/rBCDAEaAWL8ByOgmZwMLBXGvxnrzLgYVj9cyfCL+TfDj9+/Gd7//sAQw5vK8PEXAwMTRBsD0Li3DNKikgwC4twM3NIMDF9/fGf4CVTA8u0fM+ODjwwM7qJZDH8/MTBI/GFgUAba/QYo+fEnAwNAADKoXQVhIAjOJYfgsxIR/AwRi/yBlY3gz9j7FUI+wt7CwkbEzs7CNIo2Yl53t3duElDBhYXZZXaWGbHYKW0M4b+cex7WG9FaxmxGfNcfYNH3T+pr/LcSzu1h3Wx11EU2eOkYYRSi7jVgrQeb1TDtzFHkLgu13GQIBgGkJ6GFxva8h6XqX0kgRlF+AfkEw4S7ujEGbKnAzDa6GNEYLvOh2N6wOUGaVXHKayqQsHeiHgyfqKJ51sbxjvAWoG1qWWkYiKJnZhKTpgapK1tEslRw50+4camIGz/ObfcuBP0HBREEn12I+MBUadPM5HomqbWgi8kJydzHOfdctXmU29Vhbhqq8leNfxQyLP6lWgjjdxds9Yxs95ZRVAo+h8yFqEau2fHEKjpKqgojRDg+H0iw1gb212NY2oC/MCxz5DxGaYgPsKrGsnRYUEusnvKb4MNqnBlN5aZD8q54Hb2gP+gj62bohOyKdVxgobTBk3vE7cMzDhYPkVA0NW0xaBrlk6BZtRN20I16SMIWPt0CJlLQowqJStE2YwqnQRbE2ZwazrYURDquL5zcnCINU4xdiYo7QXXo4TesSMaIGGRTJ6jnqBxvkJNwfhFa2Ovu1jlrwXjD2gZ9wITeKVhImEFXgXcIgrvri/udqySztpDZemJurTzK70h/3h1xY3xpvwGLI42vrCwxmAAAAABJRU5ErkJggg==" label="Сохранить выбранную область страницы как PNG" value="clipping"/> </menupopup> `); var popup = df.firstChild; popup.setAttribute("context", ""); popup.setAttribute("oncommand", "handleCommand(event);"); popup.handleCommand = e => { var name = _id + ":DataURLReady"; main = main.replace("%MESSAGE_NAME%", name); var urls = {}, configurable = true, enumerable = true; Object.entries(parts).forEach(([key, part]) => Object.defineProperty(urls, key, { configurable, enumerable, get() { var value = `data:;charset=utf-8,({${ encodeURIComponent(main + part) }%0A}).init("${key}")`; Object.defineProperty(urls, key, {configurable, enumerable, value}); return value; }})); // Получить название вкладки без не сохраняемых символов и лишних пробелов ..... var getTabLabel = () => { var label = gBrowser.selectedTab.label; var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " "); return label.substring(0, 50); } var listener = msg => { var fp = makeFilePicker(); fp.init(window, "Сохранить как…", fp.modeSave); fp.appendFilter("", "*.png"); var fileName = getTabLabel(); fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '').replace(/\s+/g, '_').slice(0, 100).replace(/^\s+|\s+$/g, ''); var fileDate = (function () { var d = new Date(), z = function(n){return (n < 10 ? '0' : '') + n}; return '[' + z(d.getFullYear()) + '_' + z(d.getMonth()+1) + '_' + z(d.getDate()) + '\u00F7' + z(d.getHours()) + '_' + z(d.getMinutes()) + '_' + z(d.getSeconds()) + ']'; })(); fp.defaultString = fileName + "_" + fileDate + ".png"; fp.open(res => res == fp.returnCancel || !fp.file || makeWebBrowserPersist().saveURI( Services.io.newURI(msg.data), document.nodePrincipal, null, null, null, null, null, fp.file, null, null )); } messageManager.addMessageListener(name, listener); addDestructor(() => messageManager.removeMessageListener(name, listener)); (popup.handleCommand = e => gBrowser.selectedBrowser.messageManager .loadFrameScript(urls[e.target.value], false) )(e); } this.append(df); (this._handleClick = () => popup.openPopup(this, "after_start"))(); })(` init(cmd) { cmd.startsWith("c") ? this[cmd].init(this[cmd].parent = this) : this[cmd](); }, capture(win, x, y, width, height) { var canvas = win.document.createElementNS("${xhtmlns}", "canvas"); canvas.width = width; canvas.height = height; var ctx = canvas.getContext("2d"); var tryDraw = ind => { try {ctx.drawWindow(win, x, y, canvas.width, canvas.height, "white")} catch(ex) {canvas.height = ind * canvas.width; tryDraw(--ind);} } tryDraw(17); sendAsyncMessage("%MESSAGE_NAME%", canvas.toDataURL("image/png")); }, `, { all: `all() { var win = content; this.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY); }`, page: `page() { var win = content, doc = win.document, body = doc.body, html = doc.documentElement; var scrX = (body.scrollLeft || html.scrollLeft) - html.clientLeft; var scrY = (body.scrollTop || html.scrollTop) - html.clientTop; this.capture(win, scrX, scrY, win.innerWidth, win.innerHeight); }`, clipping: `clipping: { handleEvent(e) { if (e.button) return false; e.preventDefault(); e.stopPropagation(); switch(e.type) { case "mousedown": this.downX = e.pageX; this.downY = e.pageY; this.bs.left = this.downX + "px"; this.bs.top = this.downY + "px"; this.body.appendChild(this.box); this.flag = true; break; case "mousemove": if (!this.flag) return; this.moveX = e.pageX; this.moveY = e.pageY; if (this.downX > this.moveX) this.bs.left = this.moveX + "px"; if (this.downY > this.moveY) this.bs.top = this.moveY + "px"; this.bs.width = Math.abs(this.moveX - this.downX) + "px"; this.bs.height = Math.abs(this.moveY - this.downY) + "px"; break; case "mouseup": this.uninit(); break; } }, init() { var win = {}; Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager) .getFocusedElementForWindow(content, true, win); this.win = win.value; this.doc = this.win.document; this.body = this.doc.body; if (!HTMLBodyElement.isInstance(this.body)) { Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService) .showAlertNotification("${self.image}", ${JSON.stringify(self.label)}, "Не удается захватить!"); return false; } this.flag = null; this.box = this.doc.createElement("div"); this.bs = this.box.style; this.bs.border = "#0f0 dashed 1px"; this.bs.position = "absolute"; this.bs.zIndex = "2147483647"; this.defaultCursor = this.win.getComputedStyle(this.body, "").cursor; this.body.style.cursor = "crosshair"; ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.addEventListener(type, this, true)); }, uninit() { var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)]; this.body.style.cursor = this.defaultCursor; this.body.removeChild(this.box); this.parent.capture.apply(this, pos); ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.removeEventListener(type, this, true)); } }`, click: `click: { getPosition() { var html = this.doc.documentElement; var body = this.doc.body; var rect = this.target.getBoundingClientRect(); return [ this.win, Math.round(rect.left) + (body.scrollLeft || html.scrollLeft) - html.clientLeft, Math.round(rect.top) + (body.scrollTop || html.scrollTop) - html.clientTop, parseInt(rect.width), parseInt(rect.height) ]; }, highlight() { this.orgStyle = this.target.hasAttribute("style") ? this.target.style.cssText : false; this.target.style.cssText += "outline: red 1px solid; outline-offset: 1px; -moz-outline-radius: 2px;"; }, lowlight() { if (this.orgStyle) this.target.style.cssText = this.orgStyle; else this.target.removeAttribute("style"); }, handleEvent(e) { switch(e.type){ case "click": if (e.button) return; e.preventDefault(); e.stopPropagation(); this.lowlight(); this.parent.capture.apply(this, this.getPosition()); this.uninit(); break; case "mouseover": if (this.target) this.lowlight(); this.target = e.target; this.highlight(); break; } }, init() { this.win = content; this.doc = content.document; ["click", "mouseover"].forEach(type=> this.doc.addEventListener(type, this, true)); }, uninit() { this.target = false; ["click", "mouseover"].forEach(type=> this.doc.removeEventListener(type, this, true)); } }` });
«The Truth Is Out There»
Отсутствует
Переделайте пожалуйста кнопочку для UCF.
Нехочу. Можешь просто сам обернуть, типа
(async func => CustomizableUI.createWidget({ id: "797743", label: "Сохранить как PNG", tooltiptext: "Сохранить как PNG", localized: false, onCreated(btn) { var win = btn.ownerGlobal; new win.Function("_id, xhtmlns, addDestructor", func.toString().slice(7, -1)).call( btn, this.id, "http://www.w3.org/1999/xhtml", destructor => win.addEventListener("unload", destructor, {once: true}) ); btn.setAttribute("image", "resource://usercontext-content/pet.svg"); } }))(() => { // Здесь код });
Bug 1743099 - Remove unused AddonType bits (Firefox 98+)
Кнопки с about:addons тю-тю. Соберу сейчас, на всякий случай.
Custom Buttons 0.0.7.0.0.23, paxmod и bootstrap в zip-папке.
Отсутствует
Товарищи, есть пара вопросов по кнопкам (Windows 7, Fx 91.4.1 ESR (32 бита)).
1. Раньше, до WE, Attributes Inspector показывал BODY и все «внутренности», а теперь только browser,
(на страницах about:* продолжает показывать элементы html).
Элементы chrome продолжает нормально показывать. Подключён через ucf.
Так и должно быть или я что-то сломал?
2. Кнопка «Миниатюры страниц»
3. Полный ноль в скриптах решил таки сделать кнопку
Первый вариант:
var elem = document.getElementById("ucf-mem-indicator-label"); elem.onclick = doMMU; function doMMU() { Services.obs.notifyObservers(null, "child-mmu-request"); gMgr.minimizeMemoryUsage(() => updateMainAndFooter( "Memory minimization completed", SHOW_TIMESTAMP, HIDE_FOOTER ) ); }
Ошибка в консоли
Uncaught ReferenceError: gMgr is not defined
doMMU chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button9@init line 1 > Function:10
button.js:10:3
doMMU chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button9@init line 1 > Function:10
Второй вариант:
let gMgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService( Ci.nsIMemoryReporterManager ); var elem = document.getElementById("ucf-mem-indicator-label"); elem.onclick = doMMU; function doMMU() { Services.obs.notifyObservers(null, "child-mmu-request"); gMgr.minimizeMemoryUsage(() => updateMainAndFooter( "Memory minimization completed", SHOW_TIMESTAMP, HIDE_FOOTER ) ); }
Ошибка в консоли
Uncaught ReferenceError: updateMainAndFooter is not defined
doMMU chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button9@init line 1 > Function:15
button.js:15:5
Третий нерабочий вариант без ошибок
let gMgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService( Ci.nsIMemoryReporterManager ); var elem = document.getElementById("ucf-mem-indicator-label"); elem.onclick = doMMU; function doMMU() { Services.obs.notifyObservers(null, "child-mmu-request"); gMgr.minimizeMemoryUsage(() => alert('Да пошло всё в жопу!\nОпять ничего не очистилось.') ); }
Отсутствует
Раньше, до WE, Attributes Inspector показывал BODY и все «внутренности», а теперь только browser
Так и должно быть или я что-то сломал?
Да, так и должно быть.
Attributes Inspector показывает то, что есть.
В многопроцессном Firefox вэбские „BODY и все «внутренности»”
находятся в другом процессе, то есть показывать просто нечего.
Хочу скрыть иконку кнопки с панели.
Перестали отображаться миниатюры.
Можно что-то придумать?
Миниатюры отображаются в <menupopup>, который,
в случае CB, добавляется как дочерний элемент самой кнопки.
Если кнопку скрыть, то и menupopup, соответственно, тоже будет скрытым.
Неужели нет ни одной кнопки без menupopup,
которая не жертва «Хочу скрыть», чтобы просто дописать (добавить)
этот код ей в Инициализацию.
В конце концов, можно подключить этот код в UCF custom_script_win.js
Третий нерабочий вариант без ошибок
Вариант рабочий, просто елемента ещё пока нет.
Может заверни в таймаут setTimeout(() => {/* Здесь код*/}, 2500);
Отсутствует
Спасибо большое.
Про добавление в «чужую» инициализацию забыл, да для меня и не очень хорошо, если придётся обновлять кнопку, то ведь всю инициализацию смахну. Добавил код в custom_script_win.js. Работает.
Насчёт очистки памяти. Весь код завернул в таймаут, надеюсь, что это правильно.
Память, видимо из вредности, теперь сама отдаётся, не дожидаясь нажатия.
Отсутствует
Нехочу. Можешь просто сам обернуть, типа
скрытый текстВыделить кодКод:
(async func => CustomizableUI.createWidget({ id: "797743", label: "Сохранить как PNG", tooltiptext: "Сохранить как PNG", localized: false, onCreated(btn) { var win = btn.ownerGlobal; new win.Function("_id, xhtmlns, addDestructor", func.toString().slice(7, -1)).call( btn, this.id, "http://www.w3.org/1999/xhtml", destructor => win.addEventListener("unload", destructor, {once: true}) ); btn.setAttribute("image", "resource://usercontext-content/pet.svg"); } }))(() => { // Здесь код });
Большое спасибо.
«The Truth Is Out There»
Отсутствует
Здравствуйте! Кто-нибудь сталкивался с проблемой горячих клавиш? Есть ли способ назначить для СВ "Горячее" сочетание клавиш так, что бы она срабатывала даже если по каким-то причинам сменилась раскладка клавиатуры?
Отредактировано dedfor (22-01-2022 07:27:16)
Отсутствует
Dumby
Переделайте пожалуйста кнопочку для UCF.
/*Initialization Code*/ // Открывать ссылки длинным кликом .......... // https://forum.mozilla-russia.org/viewtopic.php?pid=720922#p720922 ..... (code => { var delay = 500; // время удержания в мс var inBackground = false; // открывать в фоновой вкладке var relatedToCurrent = false; // открывать рядом с related вкладкой var p = "CB" + _id.slice(20) + ":LongPressHandler:"; var msgDestroy = p + "Destroy", msgResponse = p + "Response"; code = code.replace(/%MD%/g, msgDestroy).replace("%MR%", msgResponse) .replace("%DL%", delay).replace("%BG%", inBackground); var url = "data:," + encodeURIComponent(code); var mm = window.getGroupMessageManager("browsers"); mm.loadFrameScript(url, true); function handleLongPress(msg) { var [link, ref, ctrl] = msg.data; var bg = inBackground != null ? inBackground : Services.prefs.getBoolPref("browser.tabs.loadInBackground"); gBrowser.loadOneTab(link, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }), { relatedToCurrent, inBackground: ctrl != bg, //referrerURI: makeURI(ref) }; } mm.addMessageListener(msgResponse, handleLongPress); addDestructor(() => { mm.removeDelayedFrameScript(url); mm.broadcastAsyncMessage(msgDestroy); mm.removeMessageListener(msgResponse, handleLongPress); }); })(`({ init() { addEventListener("mousedown", this, false); addMessageListener("%MD%", this); }, receiveMessage() { removeEventListener("mousedown", this, false); removeMessageListener("%MD%", this); }, handleEvent(e) { if (e.type == "mousedown") { if (e.button || e.shiftKey || e.altKey || e.detail != 1) return; var a = e.originalTarget.closest("a[href]"); if (!a || a.href.startsWith("javascript:")) return; this.ctrl = e.ctrlKey; this.initLongPress(a); } else { if (e.type == "click" && !this.link) e.preventDefault(); this.destroyLongPress(); } }, get timer() { delete this.timer; return this.timer = Cc["@mozilla.org/timer;1"] .createInstance(Ci.nsITimer); }, notify() { sendSyncMessage("%MR%", [this.link.href, this.link.ownerDocument.URL, this.ctrl]); this.link = null; if (!%BG%) this.destroyLongPress(); }, initLongPress(a) { addEventListener("click", this, true); addEventListener("dragstart", this, false); this.timer.initWithCallback(this, %DL%, this.timer.TYPE_ONE_SHOT); this.link = a; }, destroyLongPress() { removeEventListener("click", this, true); removeEventListener("dragstart", this, false); this.link && this.timer.cancel(); this.link = null; } }).init();`);
«The Truth Is Out There»
Отсутствует
Я хочу сделать следующее.
Нажимаю левую кнопку мыши, затем нажимаю правую, держу нажатыми в течение допустим 2 сек. После этого запускается нужная мне функция. Но если за эти 2 сек. была отпущена любая кнопка мыши, то всё сбрасывается, все таймауты обнуляются.
Можно это реализовать?
Отсутствует
Dumby
Нет ли кода стоп-видео ? Выкл. звук не то. Может в настройках ? Хочу при минимизации окна добавить ...Пока просто добавляю BrowserReload();
Вроде не кошерно как-то...
Отредактировано ВВП (24-01-2022 18:40:31)
Отсутствует
Переделайте пожалуйста кнопочку для UCF.
JSM'ка
var delay = 500; // время удержания в мс var inBackground = false; // открывать в фоновой вкладке var relatedToCurrent = false; // открывать рядом с related вкладкой var name = "LPA", EXPORTED_SYMBOLS = [name + "Child", name + "Parent"]; var u = {get timer() { delete this.timer; return this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); }}; inBackground == null ? Object.defineProperty(u, "bg", { get: Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch) .getBoolPref.bind(null, "browser.tabs.loadInBackground") }) : u.bg = inBackground; //ChromeUtils.defineModuleGetter(u, "E10SUtils", `resource://gre/modules/E10SUtils.jsm`); if (!ChromeUtils.domProcessChild.childID) { var triggeringPrincipal = Cu.getObjectPrincipal(Cu); var LPAParent = class extends JSWindowActorParent { receiveMessage(msg) { var [link, inBackground, ref] = msg.data; this.manager.browsingContext.top .embedderElement.ownerGlobal.gBrowser.loadOneTab(link, { triggeringPrincipal, relatedToCurrent, inBackground, //referrerInfo: u.E10SUtils.deserializeReferrerInfo(ref) }); } } ChromeUtils.registerWindowActor(name, { allFrames: true, parent: {moduleURI: __URI__}, messageManagerGroups: ["browsers"], child: {moduleURI: __URI__, events: {mousedown: {}}} }); } class LPAChild extends JSWindowActorChild { handleEvent(e) { if (e.type == "mousedown") { if (e.button || e.shiftKey || e.altKey || e.detail != 1) return; var a = e.originalTarget.closest("a[href]"); if (!a || a.href.startsWith("javascript:")) return; this.ctrl = e.ctrlKey; this.initLongPress(a); } else e.type == "click" && !this.link && e.preventDefault(), this.destroyLongPress(); } timeout() { var bg = this.ctrl != u.bg; var data = [this.link.href, bg]; //var referrerInfo = Cc["@mozilla.org/referrer-info;1"].createInstance(Ci.nsIReferrerInfo); //referrerInfo.initWithElement(this.link); //data.push(u.E10SUtils.serializeReferrerInfo(referrerInfo)); this.sendAsyncMessage("", data); this.link = null; bg || this.destroyLongPress() //|| this.contentWindow.windowUtils.sendMouseEventToWindow("mouseup", -1, -1, 0, 1, 0); // Linux (?) } initLongPress(a) { this.contentWindow.addEventListener("click", this, true); this.contentWindow.addEventListener("dragstart", this, false); u.timer.initWithCallback(() => this.timeout(), delay, u.timer.TYPE_ONE_SHOT); this.link = a; } destroyLongPress() { this.contentWindow.removeEventListener("click", this, true); this.contentWindow.removeEventListener("dragstart", this, false); this.link && u.timer.cancel(); this.link = null; } didDestroy() { this.link && this.destroyLongPress(); } }
Нажимаю левую кнопку мыши, затем нажимаю правую, держу нажатыми в течение допустим 2 сек. После этого запускается нужная мне функция. Но если за эти 2 сек. была отпущена любая кнопка мыши, то всё сбрасывается, все таймауты обнуляются.
Можно это реализовать?
Маловато информации, но, теоретически
возможность реализации не исключена, зависит от несказанного.
var myFunction = () => { gBrowser.selectedTab = gBrowser.addTrustedTab("about:robots"); } var tid; var launcher = () => { tid = null; myFunction(); } var mouseup = e => { var tn = tid === null; tn && e.button == 2 && e.preventDefault(); if (tid) tid = clearTimeout(tid); else if (!tn || e.button) window.removeEventListener("mouseup", mouseup); } addEventListener("mousedown", e => tid = e.button == 2 && e.buttons == 3 && ( window.addEventListener("mouseup", mouseup), setTimeout(launcher, 2e3) ));
Dumby
Нет ли кода стоп-видео ?
Вот жеж дичь, спрашивать про видео того, у кого его в баузере нет.
Ну <video src="…"> останавливает такой, например, код:
gBrowser.selectedBrowser.browsingContext.mediaController.stop();
если только это не сколько-то самых первых секунд воспроизведения.
Отсутствует
JSM'ка
скрытый текстВыделить кодКод:
var delay = 500; // время удержания в мс var inBackground = false; // открывать в фоновой вкладке var relatedToCurrent = false; // открывать рядом с related вкладкой var name = "LPA", EXPORTED_SYMBOLS = [name + "Child", name + "Parent"]; var u = {get timer() { delete this.timer; return this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); }}; inBackground == null ? Object.defineProperty(u, "bg", { get: Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch) .getBoolPref.bind(null, "browser.tabs.loadInBackground") }) : u.bg = inBackground; //ChromeUtils.defineModuleGetter(u, "E10SUtils", `resource://gre/modules/E10SUtils.jsm`); if (!ChromeUtils.domProcessChild.childID) { var triggeringPrincipal = Cu.getObjectPrincipal(Cu); var LPAParent = class extends JSWindowActorParent { receiveMessage(msg) { var [link, inBackground, ref] = msg.data; this.manager.browsingContext.top .embedderElement.ownerGlobal.gBrowser.loadOneTab(link, { triggeringPrincipal, relatedToCurrent, inBackground, //referrerInfo: u.E10SUtils.deserializeReferrerInfo(ref) }); } } ChromeUtils.registerWindowActor(name, { allFrames: true, parent: {moduleURI: __URI__}, messageManagerGroups: ["browsers"], child: {moduleURI: __URI__, events: {mousedown: {}}} }); } class LPAChild extends JSWindowActorChild { handleEvent(e) { if (e.type == "mousedown") { if (e.button || e.shiftKey || e.altKey || e.detail != 1) return; var a = e.originalTarget.closest("a[href]"); if (!a || a.href.startsWith("javascript:")) return; this.ctrl = e.ctrlKey; this.initLongPress(a); } else e.type == "click" && !this.link && e.preventDefault(), this.destroyLongPress(); } timeout() { var bg = this.ctrl != u.bg; var data = [this.link.href, bg]; //var referrerInfo = Cc["@mozilla.org/referrer-info;1"].createInstance(Ci.nsIReferrerInfo); //referrerInfo.initWithElement(this.link); //data.push(u.E10SUtils.serializeReferrerInfo(referrerInfo)); this.sendAsyncMessage("", data); this.link = null; bg || this.destroyLongPress() //|| this.contentWindow.windowUtils.sendMouseEventToWindow("mouseup", -1, -1, 0, 1, 0); // Linux (?) } initLongPress(a) { this.contentWindow.addEventListener("click", this, true); this.contentWindow.addEventListener("dragstart", this, false); u.timer.initWithCallback(() => this.timeout(), delay, u.timer.TYPE_ONE_SHOT); this.link = a; } destroyLongPress() { this.contentWindow.removeEventListener("click", this, true); this.contentWindow.removeEventListener("dragstart", this, false); this.link && u.timer.cancel(); this.link = null; } didDestroy() { this.link && this.destroyLongPress(); } }
Dumby, большое спасибо.
«The Truth Is Out There»
Отсутствует
Dumby
Мне нравиться gBrowser.selectedBrowser.browsingContext.mediaController.pause(); Куда бы вставить на развертывание окна: gBrowser.selectedBrowser.browsingContext.mediaController.play();
Отсутствует
Куда бы вставить на развертывание
Что-то сходу не смог найти.
А чего сразу вставить, может пробуем написать своё
(was => addEventListener("sizemodechange", e => { if (was == STATE_MINIMIZED) { setTimeout(Services.prompt.alert, 0, null, " ", "Welcome back"); } was = windowState; }))(windowState);
Отсутствует
Ki_rrrilll пишет
Нажимаю левую кнопку мыши, затем нажимаю правую, держу нажатыми в течение допустим 2 сек. После этого запускается нужная мне функция. Но если за эти 2 сек. была отпущена любая кнопка мыши, то всё сбрасывается, все таймауты обнуляются.
Можно это реализовать?
Маловато информации, но, теоретически
возможность реализации не исключена, зависит от несказанного.
Dumby, большое спасибо!
Может подскажете еще одну вещь. Это в однопроцессном режиме, чтоб не было вопросов..
Почему на некоторых сайтах этот NodeList всегда пуст?
Ведь если курсор находится над страницей, то какие то элементы доджны же соответствовать селектору :hover?
Отсутствует
Dumby, есть вот такой вопрос.
Я никогда не пользуюсь несколькими окнами браузера.
В старых версиях FF, например, в дополнении Tab Mix Plus, была такая настройка: "Разрешить использование принудительного однооконного режима браузера".
Эта настройка приводила к тому, что при попытке открыть новое окно, открывалась новая вкладка в текущем окне.
Возможно ли такое реализовать в версии FF91 ESR?
Если такое возможно, то сделайте пожалуйста это через config.js.
«The Truth Is Out There»
Отсутствует
Может подскажете еще одну вещь.
Не, в контентских делах я не помощник.
И «некоторые» сайты, видимо, настолько забористые,
что их адреса даже нельзя называть, а то, может,
у других заинтересованных ответить было бы больше шансов.
в дополнении Tab Mix Plus, была такая настройка
Она и сейчас есть. Только что-то в уе не смог найти.
Включил extensions.tabmix.singleWindow, рестарт.
И пара-тройка тестов:
1. Ctrl+N, вместо окна — вкладка (жесть какая).
Но Ctrl+Shift+P открывает окно, если таковое не имеется, что логично.
2. Вот инфа от LPP WE открывается во вкладке
поперёк настройки [✓] Открывать в окне,
но, например, с PT, увы, пустая вкладка, нелепый пример, но всё же.
3. Веб-консоль (Ctrl+Shift+K), запуск open(location, "", "width=500"); + разрешение,
вместо окна — вкладка.
Отсутствует
Она и сейчас есть. Только что-то в уе не смог найти.
Включил extensions.tabmix.singleWindow, рестарт.
И пара-тройка тестов:
1. Ctrl+N, вместо окна — вкладка (жесть какая).
Но Ctrl+Shift+P открывает окно, если таковое не имеется, что логично.
2. Вот инфа от LPP WE открывается во вкладке
поперёк настройки [✓] Открывать в окне,
но, например, с PT, увы, пустая вкладка, нелепый пример, но всё же.
3. Веб-консоль (Ctrl+Shift+K), запуск open(location, "", "width=500"); + разрешение,
вместо окна — вкладка.
Dumby, если честно, я ничего из вашего ответа не понял.
Возможно, мой вопрос был задан не совсем корректно, поэтому и ответ такой.
Собственно я спрашивал возможно ли реализовать в версии FF91 ESR принудительное использование однооконного режима браузера.
Чтобы при попытке открыть новое окно, открывалась новая вкладка в текущем окне.
И если такое возможно, то реализовать это через config.js.
«The Truth Is Out There»
Отсутствует