vending_machine пишетНу что же, можно констатировать, что в теме Custom Buttons отсутствует внятный гайд по установке расширения. Похоже вход в Клуб Знатоков простым смертным закрыт.
Для установки CB_https://forum.mozilla-russia.org/viewto … 17#p776517 -> необходимо отключить...https://forum.mozilla-russia.org/viewtopic.php?id=70326.
Тут такой нюанс.. почему-то два xpi. файла. Это.... странно Т.е можно было бы это упомянуть. Потому что, bootstrap.xpi, нопремер, не установился у меня. А paxmod.xpi установился, но не видно самой кнопки расширения.
Отсутствует
А paxmod.xpi установился, но не видно самой кнопки расширения.
У меня тоже только этот установился. Так у Custom Buttons нет и никогда не было собственной кнопки для панели инструментов, если ты об этом. Но в списке расширений должен присутствовать и даже иметь собственный раздел с кнопками.
Отсутствует
Dumby подскажи насчет диалоговых окон для 73, конструкция типа
var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(data); if (parseInt(Services.appinfo.platformVersion) >= 69 && Services.appinfo.browserTabsRemoteAutostart) { var chromeURL = `chrome://custombuttons/content/cbdialog${Date.now()}.xul`; Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup).registerChrome( Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)), [["override", chromeURL, url]] ); url = chromeURL; } dialog = window.openDialog(url, "_blank", "chrome,centerscreen,resizable=yes");
Отсутствует
vending_machine пишетА paxmod.xpi установился, но не видно самой кнопки расширения.
У меня тоже только этот установился. Так у Custom Buttons нет и никогда не было собственной кнопки для панели инструментов, если ты об этом. Но в списке расширений должен присутствовать и даже иметь собственный раздел с кнопками.
Присутствует, но и только. Нет окошка, какого-либо, куда вводить код.
Отсутствует
Нет окошка, какого-либо, куда вводить код.
Не там смотришь. ПКМ на панели инструментов, панели вкладок, строке меню -> Добавить новую кнопку...
Отсутствует
vending_machine пишетНет окошка, какого-либо, куда вводить код.
Не там смотришь. ПКМ на панели инструментов, панели вкладок, строке меню -> Добавить новую кнопку...
Всё равно оно какое-то кривое. Не реагирует на клик
Отсутствует
Значит, не работает эта версия Custom Buttons на твоей версии Firefox. Попроси, чтобы тебе сгенерировали новую версию (9->10), может, поможет. Окно должно выглядеть так
https://jpegshare.net/d3/9f/d39f8e43e3e … a.png.html
Отсутствует
подскажи насчет диалоговых окон для 73
В Firefox 73, всё связанное с XUL-документом уничтожено окончательно,
и не осталось ни одного документа с адресом, заканчивающимся на «.xul»
Поэтому, примерно так
//var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(data); //if (parseInt(Services.appinfo.platformVersion) >= 69 && Services.appinfo.browserTabsRemoteAutostart) { var pv = parseInt(Services.appinfo.platformVersion); var url = `data:application/${pv >= 73 ? "xhtm" : "vnd.mozilla.xu"}l+xml,${encodeURIComponent(data)}`; if (pv >= 69 && Services.appinfo.browserTabsRemoteAutostart) {
Отсутствует
Dumby спасибо работает и еще вопрос, вот есть код для менеджера паролей (для текущего сайта)
var eTLDsvc = Cc["@mozilla.org/network/effective-tld-service;1"]. getService(Ci.nsIEffectiveTLDService); var eTLD; var uri = gBrowser.currentURI; try { eTLD = eTLDsvc.getBaseDomain(uri); } catch (e) { eTLD = uri.asciiHost; } var win = Cc["@mozilla.org/appshell/window-mediator;1"] .getService(Ci.nsIWindowMediator) .getMostRecentWindow("Browser:Cookies"); if (win) { win.gCookiesWindow.setFilter(domain); } else { openDialog("chrome://passwordmgr/content/passwordManager.xhtml", "Toolkit:PasswordManager", "", {filterString: eTLD}); }
Отредактировано Andrey_Krropotkin (11-02-2020 23:23:06)
Отсутствует
Dumby
Добавить закладку кнопка того ...Xul/Xhtml , короче , черт те поймет..
/*Initialization Code*/ ((popup, {lastChild} = popup, pref = "CB.bookmarks") => addDestructor(reason => reason == "delete" && Services.prefs.clearUserPref(pref)) + addEventListener("popupshowing", { index: 0, // 0 - первой, PlacesUtils.bookmarks.DEFAULT_INDEX - последней width: 500, height: 640, nodePosition: .35, handleEvent(e) { if (this.shouldHide) return; var menuitem = document.createElementNS(xulns, "menuitem"); menuitem.id = "context-addBookmark"; menuitem.className = "menuitem-iconic"; menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACD0lEQVR42oWTXUhTYRiAP89qziAYepG6TfAiyV1JsFojMJrVjf3dDOsmMoOwCwnSXLSJXgWDqAWBF7aGoFGGV0EUrL9FERoh1bQsqeiXfrzoB0N6es8528ncaC88fOfwnff53vN976eUUprafJk8lPIKS1XRkI8LRVayUVgmLBFsQklBwfhb8rAkRauSidQLDK49/zvqFKmqxBKcn4BzDzBGnU39BVZfTMOxQ6ZIXk6msdh7wUz+9IP/RraaLYYgfAUL73Fz8tJjs5rBh3B2HPrvQ/P+N8TvYJAVdBqCfRcxWH8aYm0dpCIRxvr6SG7bSWLrDsZ6e7ke7SESaiV61UoeFVoMwfYEBrGWNr6NjEAmY5JKmUxPw9QU35NJDq/ekBOcEqoNQSAOnh5Ih0IwPAwJsQ0MSP2DMDTEfDTKV7+f904nN12uBavr/SECZ6dZ1u11Aejqgu5u2ZAwv9vbmfP5mLXZeK0UrzSNGy53bnWXdYw6K47CEX8znwMB5oNBvtTX87G0lA+SmEueqazkYHWdLtgl1OVaybvwfPd41vLI42HGbicjiZPCy7IyntTUcKBqpZ58Iru61dZ6a64RwkJMmGi022dv1dbyrKKCp+XlpOW5yeH4KXPvhMbs3fgndJtDqDJ3VjX4NO3MqNs9J/xapWn3sv/dlJfcGr+rFbijunC5EBQ6hN2C27j6i+IP/uDMhPNYgHUAAAAASUVORK5CYII="); menuitem.setAttribute("oncommand", "linkedObject.oncommand(event);"); menuitem.linkedObject = this; menuitem.oncontextmenu = e => this.pick(e.preventDefault()); lastChild.after(menuitem); addDestructor(() => menuitem.remove()); (this.handleEvent = e => e.target == popup && !(menuitem.hidden = this.shouldHide) && this.update(menuitem) )(e); }, ons: ["isContentSelected", "onTextInput", "onImage", "onVideo", "onCanvas", "onAudio"], get shouldHide() { if (gContextMenu.onLink) return false; return this.ons.some(on => gContextMenu[on]); }, oncommand(e) { this[e.ctrlKey || e.shiftKey ? "pick" : "bookmark"](e.target); }, get guid() { return Services.prefs.getStringPref(pref, PlacesUtils.bookmarks.toolbarGuid); }, async update(menuitem) { var info = await PlacesUtils.bookmarks.fetch(this.guid); var title = PlacesUtils.bookmarks.getLocalizedTitle(info); menuitem.label = "Добавить закладку в: " + ( menuitem.folderName = title || "[без заголовка]" ); }, pick() { var features = "chrome,all,resizable,centerscreen,modal"; window.openDialog(this.url, "_blank", features, this.guid); }, bookmark({folderName}) { if (gContextMenu.onLink) { var url = gContextMenu.linkURL; var title = gContextMenu.linkText(); } else { var url = gBrowser.currentURI.spec; var title = gBrowser.contentTitle || gBrowser.selectedTab.label; } var info = {url, title, parentGuid: this.guid, index: this.index}; PlacesUtils.bookmarks.insert(info).then( () => this.notify(title, "Добавил закладку в папку: " + folderName), err => this.notify("Ошибка", err) ); }, get alert() { var as = this.as = Cc["@mozilla.org/alerts-service;1"] .getService(Ci.nsIAlertsService); this.alertName = _id + "-bookmark-alert"; delete this.alert; return this.alert = as.showAlertNotification .bind(as, "chrome://global/skin/icons/warning.svg"); }, notify(title, msg) { this.alert(title, msg, false, null, null, this.alertName); setTimeout(() => this.as.closeAlert(this.alertName), 1800); }, get url() { var xul = `<?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <?xml-stylesheet href="chrome://browser/content/places/places.css"?> <?xml-stylesheet href="chrome://browser/skin/places/places.css"?> <?xml-stylesheet href="chrome://browser/skin/places/tree-icons.css"?> <dialog xmlns="${xulns}" id="bookmark-folder-saver-dialog" windowtype="bookmark-folder-saver:dialog" title="Выберите папку" buttons="accept,cancel" onload="init();" width="${this.width}" height="${this.height}"> <script type="application/javascript" src="chrome://global/content/globalOverlay.js"/> <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/> <script type="application/javascript"><![CDATA[ ChromeUtils.defineModuleGetter(window, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); ChromeUtils.defineModuleGetter(window, "PlacesUIUtils", "resource:///modules/PlacesUIUtils.jsm"); ChromeUtils.defineModuleGetter(window, "PlacesTransactions", "resource://gre/modules/PlacesTransactions.jsm"); ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyScriptGetter(window, "PlacesTreeView", "chrome://browser/content/places/treeView.js"); XPCOMUtils.defineLazyScriptGetter( window, ["PlacesInsertionPoint", "PlacesController", "PlacesControllerDragHelper"],\n\ "chrome://browser/content/places/controller.js"\n\ ); ]]></script> <script type="application/javascript" src="chrome://browser/content/places/places-tree.js"/> <tree id="tree" type="places" is="places-tree" place="place:type=${ Ci.nsINavHistoryQueryOptions.RESULTS_AS_ROOTS_QUERY }&excludeItems=1&excludeQueries=1" hidecolumnpicker="true" seltype="single" flex="1"> <treecols> <treecol id="title" flex="1" primary="true" hideheader="true" /> </treecols> <treechildren /> </tree> <script type="application/javascript"><![CDATA[ var tree = document.getElementById("tree"); function init() { tree.selectItems([window.arguments[0]]); var ind = tree.view.selection.currentIndex; ind != -1 && setTimeout(() => { if ("nsITreeBoxObject" in Ci) { var tbo = tree.treeBoxObject; var visibleRows = tbo.height/tbo.rowHeight; } else { var tbo = tree; var visibleRows = tbo.getPageLength(); } var cur = tbo.view.selection.currentIndex; var first = tbo.getFirstVisibleRow(); var newFirst = cur - ${this.nodePosition}*visibleRows + 1; tbo.scrollByLines(Math.round(newFirst - first)); }, 0); var onKeydown = e => e.ctrlKey && e.key == "Enter" && !e.shiftKey && document.documentElement.acceptDialog(e.stopPropagation()); addEventListener("keydown", onKeydown, true); addEventListener("dialogaccept", dialogCallback); window.onunload = () => { removeEventListener("keydown", onKeydown, true); removeEventListener("dialogaccept", dialogCallback); } } function dialogCallback() { var ind = tree.view.selection.currentIndex; if (ind == -1) return; var item = tree.view.nodeForTreeIndex(ind); item && Services.prefs.setStringPref( "${pref}", PlacesUtils.getConcreteItemGuid(item) ); } ]]></script> </dialog>`; var url, type = "application/vnd.mozilla.xul+xml"; if (parseInt(Services.appinfo.platformVersion) >= 69 && Services.appinfo.browserTabsRemoteAutostart) { url = `chrome://custombuttons/content/cbfolderpicker${Date.now()}.xul`; var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup); this.helper = ams.registerChrome( Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)), [["override", url, `data:${type},${encodeURIComponent(xul)}`]] ); addDestructor(this.helper.destruct); } else { url = URL.createObjectURL(new Blob([xul], {type})); addDestructor(() => URL.revokeObjectURL(url)); } delete this.url; return this.url = url; } }, false, popup || 1))(document.getElementById("contentAreaContextMenu"));
Отсутствует
Dumby, можете посмотреть №14256, пробовал через запятой и кавычки, походу там код написан на одно действие? и хотел сюда готовый пак залить config, только не понял как залить на put.re
Отсутствует
как сделать то же самое для about:logins (Firefox Lockwise) в новой вкладке
Сомневаюсь, что ты не знаешь как открыть
новую вкладку с адресом вида about:logins?filter=example.com
Значит давай код, и, может, ситуация прояснится.
С указанием того, что именно вызывает затруднение, разумеется.
Со вставкой текста по СКМ можешь помочь?
Нет, не думаю. Описание такой хотелки должно быть очень подробным и большим.
Выканючивать его, с моей стороны, было бы неправильно, ведь если распишешь,
а я всё равно не смогу сделать, то будет обидно, типа зря старался, объяснял.
Впрочем, может попробую что-нибудь сочинить под middlemouse.paste = true
и для user_chrome_files, если у тебя развёрнуто.
Xul/Xhtml , короче , черт те поймет..
Неужели так тяжело заменить vnd.mozilla.xu на xhtm
можете посмотреть №14256
Да, видел. Показалось, что я не понял что требуется.
Хотя, под это: «как сделать чтобы, несколько аддонов отключить?»
вроде должен подходить код типа
var opt = {allowSystemAddons: true}; var args = [addon => addon.disable(opt), Cu.reportError]; for(var id of [ "{ae3cc3e4-1091-48d0-91e0-446601bc2e22}", "webcompat-reporter@mozilla.org", "{801ff3eb-b13e-4f18-86c7-da231710b8f5}", "{cdfc901b-b110-4086-8f14-b8a2966cb6b9}", ]) AddonManager.getAddonByID(id).then(...args);
хотел сюда готовый пак залить config, только не понял как залить на put.re
put.re перестал работать для меня, пишет «Uploading disabled»,
а то и сам бы воспользовался. Может на upload.ee попробуй,
он довольно популярен, и для скачивания дружественный.
Отсутствует
Со вставкой текста по СКМ можешь помочь? Чтобы вставляемый текст заменял выделенный, а не во внутрь его.
Я как раз тоже питаюсь сделать такой код, но пока застрял на блокировке по умолчанию для события click. Вот mousedown если его загрузить через loadFrameScript отлично блокируется, а click нет. Ну там и других проблем хватает. Вот может кому надо:
// Ставить текст в текстовое поле ............. function insertText(text) { var docShell = "docShell" in document && document.docShell instanceof Ci.nsIDocShell ? document.docShell : window.docShell; function insert(text) { var params = "createCommandParams" in Components.utils ? Cu.createCommandParams() : Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams); params.setStringValue("state_data", text); docShell.doCommandWithParams("cmd_insertText", params); }; var br = document.activeElement; !br || br.localName != "browser" || !br.isRemoteBrowser ? insert(text) : br.messageManager.loadFrameScript(`data:,(${insert})(`+encodeURIComponent(text.toSource())+`)`, false, true); }; insertText(gClipboard.read());
Добавлено 12-02-2020 11:31:27
Но без СКМ!
Отредактировано bunda1 (12-02-2020 11:31:27)
Отсутствует
Dumby
Неужели так тяжело заменить vnd.mozilla.xu на xhtm
А то не менял...Никак. А, вот так заработало без гемморов.
Отредактировано solombala (12-02-2020 12:18:49)
Отсутствует
Описание такой хотелки должно быть очень подробным и большим.
Ну речь о том, что делала кнопка от bunda1 №14231
Впрочем, может попробую что-нибудь сочинить под middlemouse.paste = true
и для user_chrome_files, если у тебя развёрнуто.
Да любыми способами, я на всё согласен, лишь бы вставляла.
Я как раз тоже питаюсь сделать такой код, но пока застрял на блокировке по умолчанию для события click.
Это радует, что работа кипит и даёт надежду.
Вот может кому надо:
Что-то у меня ничего не изменилось, всё равно вставляет во внутрь существующего текста.
Отсутствует
Что-то у меня ничего не изменилось, всё равно вставляет во внутрь существующего текста.
Это код для вставки текста из кнопки по клику или из меню кнопки, по СКМ он не должен работать. Пытался его запускать по СКМ:
(()=> { var code = ` function handleEvent(e) { if (e.button != 1) return; e.preventDefault(); e.stopPropagation(); sendSyncMessage("response",{},{}); } addEventListener('mousedown', handleEvent, false); function removeListener() { removeMessageListener("destroy", removeListener); removeEventListener("mousedown", handleEvent, false); } addMessageListener("destroy", removeListener); `; var url = "data:," + encodeURIComponent(code); var mm = window.getGroupMessageManager("browsers"); mm.loadFrameScript(url, true); function run(message) { insertText(gClipboard.read()); Services.console.logStringMessage(message.name); } mm.addMessageListener("response", run); addDestructor(() => { mm.removeDelayedFrameScript(url); mm.broadcastAsyncMessage("destroy"); mm.removeMessageListener("response", run); }); })(); // Ставить текст в текстовое поле ............. function insertText(text) { var docShell = "docShell" in document && document.docShell instanceof Ci.nsIDocShell ? document.docShell : window.docShell; function insert(text) { var params = "createCommandParams" in Components.utils ? Cu.createCommandParams() : Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams); params.setStringValue("state_data", text); docShell.doCommandWithParams("cmd_insertText", params); }; var br = document.activeElement; !br || br.localName != "browser" || !br.isRemoteBrowser ? insert(text) : br.messageManager.loadFrameScript(`data:,(${insert})(`+encodeURIComponent(text.toSource())+`)`, false, true); };;
Но не получается заблокировать действие СКМ по умолчанию. А с click вобще не работает. Не понятно в чём дело. Может кто подскажет?
Отсутствует
FF72-3 CustomButtons
Сразу пак, чтобы не искать и не перепаковывать, просто разархивируйте и по папкам.
upload.ee/files/11121542/config.rar
Dumby, а этот код работает только в одну сторону? на откллючение, как сделать чтобы в обе нажал откючилось, снова включилась.
Сам виноват, написал только на отключение, но функций у того кода были в обе стороны.
addon.disable||addon.userDisabled?"enable":"disable|| пробовал эти параметры по разному, что-то не получается
Вроде сделал, можешь проверить на ошибки? все ли правильно? внутри [] может быть еще такая конструкция? [[]] как то меня это смущает.
var args=[addon=>addon[addon.userDisabled?"enable":"disable"]({allowSystemAddons:true}),Cu.reportError];
for(var id of["{cdfc901b-b110-4086-8f14-b8a2966cb6b9}","...","..."])AddonManager.getAddonByID(id).then(...args);
/*Initialization Code*/self.label="SwitchAddons[Fx]";self.image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABy0lEQVQ4jbWTz2sUMRiGn2Qmmewy47LLzir0D1BaQYUea/EwBQ9OFNuoFF2x0kHwoKgnLwYsXr0LHvQgKhbBivSk0n8sXjYlXdijuX3J+7xf3vyA/zCuAB+Brq7rM13XKe99HkIQieYysJFCfeAB8Bq4CvwdDAarRVE8Vkq9zbKsBWpgF3gGXAJupKZPgArAey+Vyv8sLdUXrbWV914Cz4EjYBiBLMtuee/zWN+NsLW2Kgp9OJlMLsxggC3gfRR776UxZtp1nYpzt0MIwlpbNU0z0FofFkVxNom4CXxImxhjdtIdbDvnek3TDKy1lRDiF3AuMbgGfIlw0zQDY8zO8RkopXbbtu0nmX8Ay4lBK4T4HmFrbZVl2fR4VSnVOed6SeZPwEpyYK3W+iDCM9291OD+3D3vA+dj5rIsN4tCHyQwJwyAbU6Ob8BKzFyW5ZbWej+BAaYpMG/wWWu9HDNXVXVdSvl1TjNdVNRCiKOyLO/EzHmerwM/E80IeJrGfgisAq+klC/H4/HqcDhcM8bsSSlfzBr8Bm4Cb4BHo9HoVPoONoA17710zvXatu0753qzDqeBPeAdsA4QQhDOuV76EgkhCO99vuD3LdT9A4TPkK2vNlObAAAAAElFTkSuQmCC"; this.onclick=e=> {if(e.button==0&&!e.ctrlKey)AddP(); //L //if(e.button==0&& e.ctrlKey)f(); //Ctrl+L //if(e.button==2&& e.ctrlKey){e.preventDefault();f();}; //Ctrl+R if(e.button==2&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){e.preventDefault();AddO();}}; //R this.tooltipText=self.label+"\nL: On/Off ProxyAddons\nR: On/Off OtherAddons"; //////////////////////////////////////////////////////////////////// //forum.mozilla-russia.org/viewtopic.php?pid=777986#p777986 function AddP(){var args=[addon=>addon[addon.userDisabled?"enable":"disable"]({allowSystemAddons:true}),Cu.reportError]; for(var id of["IDproxy1","IDproxy2"])AddonManager.getAddonByID(id).then(...args);}; function AddO(){var args=[addon=>addon[addon.userDisabled?"enable":"disable"]({allowSystemAddons:true}),Cu.reportError]; for(var id of["webscrapbook@danny0838.addons.mozilla.org","{561906d8-e22f-4a6c-a201-8097b48a7a63}"])AddonManager.getAddonByID(id).then(...args);}; ////////////////////////////////////////////////////////////////////
Отредактировано func4ptch4 (13-02-2020 10:37:54)
Отсутствует
на всё согласен
Ну, тогда вот набросок, добро пожаловать(ся).
в границах выделенного — вставка с заменой, если ничего не выделено
или за границами выделенного — обычная вставка middlemouse.paste
Код для добавления в
%Папка_Профиля%\chrome\user_chrome_files\custom_scripts\custom_script.js
Напомню:
В папке custom_scripts находятся скрипты которые при необходимости можно подключить в настройках
и добавить свой код (после редактирования перезапустить кнопкой Перезагрузка - ПКМ: Отключить загрузку содержимого из кеша и перезапустить).
Множественное выделение даже не рассматривалось.
Не будет работать в Fission OOP-фреймах.
try {((id, code, gmon) => { var d = "data:,", ref = "globalThis." + id, dref = d + ref; var psi = `${dref} = ${encodeURIComponent(code)};`; var psd = `${d}delete ${ref};`; var e10s = Services.appinfo.browserTabsRemoteAutostart; if (e10s) var fsi = `${dref}.listen(this, "add");`, fsd = `${dref}.listen(this);`; var g = Cu.getGlobalForObject(Cu), pref = "middlemouse.paste"; var obs = { pref: Services.prefs.getBoolPref.bind(null, pref), startup() { Services.prefs.addObserver(pref, this); Services.obs.addObserver(this, "quit-application-granted", false); this.pref() && this.init(); this.gmon(); }, async gmon() { Cu.importGlobalProperties(["fetch"]); var url = "chrome://custombuttons/content/editExternal.js"; try {var src = await (await fetch(url)).text();} catch(ex) {return;} src = src.replace(/function gmon_edit_mouseclick[^}]+?}/, gmon); var arr = [["override", url, "data:," + encodeURIComponent(src)]]; url = Services.io.getProtocolHandler("resource").getSubstitution("gre"); this.gmonHelper = Cc["@mozilla.org/addons/addon-manager-startup;1"] .getService(Ci.amIAddonManagerStartup).registerChrome(url, arr); }, shutdown() { this.pref() && this.destroy(); e10s && Services.ppmm.removeDelayedProcessScript(psi), Services.ppmm.loadProcessScript(psd, false); Services.prefs.removeObserver(pref, this); Services.obs.removeObserver(this, "quit-application-granted"); this.gmonHelper && this.gmonHelper.destruct(); }, init() { e10s && Services.mm.loadFrameScript(fsi, true); Services.obs.addObserver(this, "widget-first-paint", false); this.wins("add"); }, destroy() { if (e10s) Services.mm.removeDelayedFrameScript(fsi), Services.mm.loadFrameScript(fsd, false); Services.obs.removeObserver(this, "widget-first-paint"); this.wins(); }, observe(subj, topic) { var char = topic[0]; if (char == "w") return this.call(subj, "add"); if (char == "q") return this.shutdown(); this[this.pref() ? "init" : "destroy"](); }, wins(arg) { for(var win of Services.wm.getEnumerator(null)) this.call(win, arg); }, listen() {} }; Services.ppmm.loadProcessScript(psi, e10s); g[id].call = g[id].listen; Object.assign(g[id], obs).startup(); })("ucf_custom_script_js_MiddleMousePaste", `{ listen(trg, prfx = "remove") { var meth = prfx + "EventListener"; trg[meth]("auxclick", this, true); trg[meth]("unload", this); }, handleEvent(e) {this[e.type](e);}, unload(e) {this.listen(e.target);}, sn: Ci.nsISelectionController.SELECTION_NORMAL, inRect: (r, x, y) => y > r.top && y < r.bottom && x < r.right && x > r.left, auxclick(e) { if (e.button != 1) return; var trg = (e.originalTarget || e.target).closest( "input:not([disabled]),textarea:not([disabled])" ); if (!trg) return; var ed = trg.editor; if (!ed || ed.selection.isCollapsed || !ed.canPaste(this.sn)) return; var x = e.clientX, y = e.clientY, rng = ed.selection.getRangeAt(0); if (!this.inRect(rng.getBoundingClientRect(), x, y)) return; var list = rng.getClientRects(); if (list.length == 1 || Array.from(list).some( rect => this.inRect(rect, x, y) )) ed.paste(this.sn, e.preventDefault()); } }`, `\ function gmon_edit_mouseclick(e) { var mmp = Cc["@mozilla.org/preferences-service;1"] .getService(Ci.nsIPrefBranch).getBoolPref.bind(null, "middlemouse.paste"); (gmon_edit_mouseclick = e => e.button != 1 || mmp() || edittarget(e.target))(e); }`); } catch(ex) {Cu.reportError(ex);}
А с click вобще не работает.
Странно, я попробовал проверить на 74.0b1, заменив mousedown на click.
И response есть, и вставка есть, и вставка не в точке клика СКМ,
а там же, где если бы вставилось по Ctrl+V. То есть работает.
все ли правильно?
Выглядит нормально. Непонятно зачем {allowSystemAddons:true}
переместил, но это, разумеется, не ошибка, дело хозяйское.
Отредактировано Dumby (13-02-2020 10:35:31)
Отсутствует
Dumby
Да, похоже старая сборка была сломлена. Я проверил код с на другой сборке и он заработал. Спасибо.
(()=> { var code = ` function handleEvent(e) { if (e.button != 1) return; e.preventDefault(); e.stopPropagation(); sendSyncMessage("response",{},{}); } addEventListener('click', handleEvent, false); function removeListener() { removeMessageListener("destroy", removeListener); removeEventListener("click", handleEvent, false); } addMessageListener("destroy", removeListener); `; var url = "data:," + encodeURIComponent(code); var mm = window.getGroupMessageManager("browsers"); mm.loadFrameScript(url, true); function run(message) { insertText(gClipboard.read()); Services.console.logStringMessage(message.name); } mm.addMessageListener("response", run); addDestructor(() => { mm.removeDelayedFrameScript(url); mm.broadcastAsyncMessage("destroy"); mm.removeMessageListener("response", run); }); })(); // Ставить текст в текстовое поле ............. function insertText(text) { var docShell = "docShell" in document && document.docShell instanceof Ci.nsIDocShell ? document.docShell : window.docShell; function insert(text) { var params = "createCommandParams" in Components.utils ? Cu.createCommandParams() : Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams); params.setStringValue("state_data", text); docShell.doCommandWithParams("cmd_insertText", params); }; var br = document.activeElement; !br || br.localName != "browser" || !br.isRemoteBrowser ? insert(text) : br.messageManager.loadFrameScript(`data:,(${insert})(`+encodeURIComponent(text.toSource())+`)`, false, true); };
Отсутствует
Ну, тогда вот набросок, добро пожаловать
Вот спасибо, вот порадовал. Всё просто великолепно работает.
Добавлено 13-02-2020 13:10:30
bunda1
Я проверил код с на другой сборке и он заработал. Спасибо.
Как я понимаю, теперь у нас два рабочих варианта образовалось. То ни одного, а теперь..., просто праздник какой-то.
bunda1, у тебя, если не ошибаюсь, ещё была очень полезная кнопка - очистка текстовых полей прокруткой колесом. Можешь её востановить.
Отредактировано voqabuhe (13-02-2020 13:10:30)
Отсутствует
bunda1, у тебя, если не ошибаюсь, ещё была очень полезная кнопка - очистка текстовых полей прокруткой колесом. Можешь её востановить.
Сделаем, вроде это не трудно.
Отсутствует
у тебя, если не ошибаюсь, ещё была очень полезная кнопка - очистка текстовых полей прокруткой колесом. Можешь её востановить.
Забыл спросить. Каких именно текстовых полей?
Отсутствует