Алексей78 пишетвозможно этот вопрос уже поднимался, а я просто не внимательно эту тему читал
Да нет, вроде никто не спрашивал.
Я когда-то давно его в jsm'ку перекладывал, а затем родили баг ,
и пришлось на mousedown переделывать.Вобщем, сейчас такой. В новом UCF, импортировать созданный модуль
можно добавив в конфигурационный CustomStylesScripts.jsm
в массив UcfStylesScripts.scriptsbackground объект вида
{ func: 'ChromeUtils.import("chrome://user_chrome_files/content/custom_scripts/MMPaste.jsm");' },MMPaste.jsmВыделить кодКод:
var MMPasteChild, EXPORTED_SYMBOLS = ["MMPasteChild"]; var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); var sel = ":is(textarea,input):not([readonly],[disabled])"; var x, y, sn = Ci.nsISelectionController.SELECTION_NORMAL; var inRect = r => y > r.top && y < r.bottom && x < r.right && x > r.left; var mousedown = e => { if (e.button != 1) return; var trg = (e.originalTarget || e.target).closest(sel); if (!trg) return; var ed = trg.editor; if (!ed || ed.selection.isCollapsed || !ed.canPaste(sn)) return; x = e.clientX; y = e.clientY; var rng = ed.selection.getRangeAt(0); if (!inRect(rng.getBoundingClientRect())) return; var list = rng.getClientRects(); if (list.length == 1 || Array.from(list).some(inRect)) ed.paste(sn), trg.ownerGlobal.addEventListener(...args); } var args = ["auxclick", e => e.preventDefault(), {once: true, capture: true}]; if (ChromeUtils.domProcessChild.childID) (MMPasteChild = class extends JSWindowActorChild {}).prototype.handleEvent = mousedown; else ((pref, gmon) => ({ mousedown, get pref() { return Services.prefs.getBoolPref(pref); }, startup() { this.handleEvent = e => this[e.type](e); this.unload = e => this.listen(e.target.ownerGlobal); this.e10s = Services.appinfo.browserTabsRemoteAutostart; 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 {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(); Services.prefs.removeObserver(pref, this); Services.obs.removeObserver(this, "quit-application-granted"); this.gmonHelper?.destruct(); }, opts: { allFrames: true, remoteTypes: ["w", "file", "extension", "privileged"], child: {moduleURI: __URI__, events: {mousedown: {capture: true}}} }, init() { this.e10s && ChromeUtils.registerWindowActor("MMPaste", this.opts); Services.obs.addObserver(this, "widget-first-paint", false); this.wins("addEventListener"); }, destroy() { this.e10s && ChromeUtils.unregisterWindowActor("MMPaste"); Services.obs.removeObserver(this, "widget-first-paint"); this.wins(); }, observe(subj, topic, data) { var char = topic[0]; if (char == "w") return this.listen(subj, "addEventListener"); if (char == "q") return this.shutdown(); data == pref && this[this.pref ? "init" : "destroy"](); }, wins(arg) { for(var win of Services.wm.getEnumerator(null)) this.listen(win, arg); }, listen(trg, meth = "removeEventListener") { trg[meth]("mousedown", this, true); trg[meth]("unload", this); } }).startup())("middlemouse.paste", `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); }`);
Спасибо Вам за Ваш ответ! Но к сожалению, я в скриптах как свинья в апельсинах. Не могли бы Вы подробнее описать, как это все сделать. Спасибо
Отсутствует
Не могли бы Вы подробнее описать, как это все сделать.
Лучше бы наоборот, мне почитать что уже сделано и что не получается.
Ладно, допустим UCF уже развёрнут, обновлён и работает.
2. Теперь редактируем файл CustomStylesScripts.jsm (лежит в той же папке).
Добавляем предложенную строку после scriptsbackground: [ в скобки ], сохраняем.
Скриншот.
3. Осталось убедиться, что вкючена настройка middlemouse.paste
и в настройках UCF чтоб стояла галка
Включить скрипты:
[✔] В фоне [System Principal]
Всё. Там же, в настройках, жмём «Перезапустить*», и должно работать
как написано, только вставка не по клику СКМ, а по нажатию.
И в Fission OOP-фреймах теперь тоже должно работать.
Не могу поисковик сделать
Да мне особо проверить негде. Попробуй так
Services.search.addPolicyEngine({ iconURL: "data:image/x-icon;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P8A/NL8APm0+QD2lvYA83jzAPBa8ADtPO0A6h7qAOcA5wDPAM8AtwC3AJ8AnwCHAIcAbwBvAFcAVwBAAEAA9Ov/AOjO/ADcsfkA0JT2AMR38wC4WvAArD3tAKAg6gCRAOcAggDPAHMAtwBkAJ8AVQCHAEYAbwA3AFcAKABAAODg/wDExPwAqKj5AIyM9gBwcPMAVFTwADg47QAcHOoAAADnAAAAzwAAALcAAACfAAAAhwAAAG8AAABXAAAAQADg9f8AxOj8AKjc+QCM0PYAcMTzAFS48AA4rO0AHKDqAACR5wAAgs8AAHO3AABknwAAVYcAAEZvAAA3VwAAKEAA4P//AMT8/ACo+fkAjPb2AHDz8wBU8PAAOO3tABzq6gAA5+cAAM/PAAC3twAAn58AAIeHAABvbwAAV1cAAEBAAOD/8ADE/OsAqPnmAIz24QBw89wAVPDXADjt0gAc6s0AAOfJAADPsgAAt5sAAJ+EAACHbQAAb1YAAFc/AABAKADg/+AAxPzEAKj5qACM9owAcPNwAFTwVAA47TgAHOocAADnAAAAzwAAALcAAACfAAAAhwAAAG8AAABXAAAAQAAA8P/gAOv8xADm+agA4faMANzzcADX8FQA0u04AM3qHADJ5wAAss8AAJu3AACEnwAAbYcAAFZvAAA/VwAAKEAAAP//4AD8/MQA+fmoAPb2jADz83AA8PBUAO3tOADq6hwA5+cAAM/PAAC3twAAn58AAIeHAABvbwAAV1cAAEBAAAD/+OAA/PLEAPnsqAD25owA8+BwAPDaVADt1DgA6s4cAOfLAADPtgAAt6EAAJ+MAACHdwAAb2IAAFdNAABANwAA//DgAPzoxAD54KgA9tiMAPPQcADwyFQA7cA4AOq4HADnrgAAz5wAALeKAACfeAAAh2YAAG9UAABXQgAAQDAAAP/o4AD82sQA+cyoAPa+jADzsHAA8KJUAO2UOADqhhwA53QAAM9oAAC3XAAAn1AAAIdEAABvOAAAVywAAEAcAAD/4OAA/MTEAPmoqAD2jIwA83BwAPBUVADtODgA6hwcAOcAAADPAAAAtwAAAJ8AAACHAAAAbwAAAFcAAABAAAAA/+jwAPzL5AD5rtgA9pHMAPN0wADwV7QA7TqoAOodnADnAJEAzwCCALcAcwCfAGQAhwBVAG8ARgBXADcAQAAoAP///wDw8PAA6OjoAODg4ADY2NgA0NDQAMjIyADAwMAAuLi4ALCwsACoqKgAoKCgAJiYmACQkJAAiIiIAICAgACAgIAAcHBwAGhoaABgYGAAWFhYAFBQUABISEgAQEBAADg4OAAwMDAAKCgoACAgIAAYGBgAEBAQAAgICAAAAAAA4ODg4ODg4ODgLS0tLeDg4ODg4ODg4ODg4C0tLS3g4ODg4ODg4ODg4OAdLS0t4ODg4ODg4ODg4ODgLC0tLeDg4ODg4ODg4ODg4C0tLS3g4ODg4ODg4ODg4OAdLS0t4ODg4ODg4ODgLC0tLS0tLS0tLPHx8eDg4P7+/vItLS0tLS3x8fHg4OD+/v7+LS0tLS0t8fHx4O7x8fHx4ODg4ODg4PHx8fHx8fHv4ODg4ODg4ODx8fHx8fHp4ODg4ODg4ODg8fHx8fHx6eDg4ODg4ODg4PHx8fHx8fHx4ODg4ODg4OD+/vHg5fHx8fHx4ODg4ODg8fHx4ODg6fHx8eDg4ODg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAA=", chrome_settings_overrides: { search_provider: { encoding: "WINDOWS-1251", name: "Поиск по сайту - Кино-Театр.Ру", search_form: "https://www.kino-teatr.ru/", search_url: "https://www.kino-teatr.ru/search", search_url_post_params: "text={searchTerms}" } } });
Отсутствует
Ладно, допустим UCF уже развёрнут, обновлён и работает.
Развернут, но не обновлен и соответственно не работает. Обновил, сделал все как Вы описали и аллилуя - все заработало! Большое спасибо!
Отсутствует
Доброго дня.
Есть у меня старая кнопка - Switch Keyboard Layout
(keybUtils => { var btn = this; var listener = { handleEvent(e) { if(e.target != btn) return; e.preventDefault(); e.stopPropagation(); this.switch(); }, switch() { var br = document.activeElement; br && br.localName == "browser" && br.isRemoteBrowser ? br.messageManager.loadFrameScript(this.url, false) : this.keybUtils.switchSelKeybLayout(); }, get url() { delete this.url; return this.url = `data:;charset=utf-8,(${ encodeURIComponent(keybUtils) }).switchSelKeybLayout()`; }, get keybUtils() { delete this.keybUtils; var url = "data:;charset=utf-8,this.keybUtils = " + encodeURIComponent(keybUtils); Services.scriptloader.loadSubScript(url, this); this.keybUtils.button = btn; this.keybUtils.getFocusedElement = function(_subCall, _focusFixed) { if( !_focusFixed && "closeMenus" in window && document.commandDispatcher.focusedElement == this.button ) { closeMenus(this.button); setTimeout(function(_this) { _this.switchSelKeybLayout(_subCall, true); }, 0, this); return; } return document.commandDispatcher.focusedElement; } return this.keybUtils; } }; if(btn instanceof XULElement && addEventListener.length > 3) { addEventListener("command", listener, true, this.parentNode); } listener.switch(); })(`{ //== Options noSelBehavior: { // Shift+Home ctrlKey: false, altKey: false, shiftKey: true, metaKey: false, keyCode: KeyEvent.DOM_VK_HOME, charCode: 0 }, // 0 - do nothing // 1 - convert all text // Or use object like following to simulate "keypress" event: /* noSelBehavior: { // Ctrl+Shift+Left ctrlKey: true, altKey: false, shiftKey: true, metaKey: false, keyCode: KeyEvent.DOM_VK_LEFT, charCode: 0 } */ convTableForward: { // ru -> en "\\"": "@", ":": "^", ";": "$", "?": "&", ",": "?", "/": "|", ".": "/", "э": "'", "б": ",", "ю": ".", "Ж": ":", "ж": ";", "Б": "<", "Ю": ">", "Э": "\\"", "х": "[", "ъ": "]", "ё": "\`", "Х": "{", "Ъ": "}", "Ё": "~", "№": "#", "Ф": "A", "ф": "a", "И": "B", "и": "b", "С": "C", "с": "c", "В": "D", "в": "d", "У": "E", "у": "e", "А": "F", "а": "f", "П": "G", "п": "g", "Р": "H", "р": "h", "Ш": "I", "ш": "i", "О": "J", "о": "j", "Л": "K", "л": "k", "Д": "L", "д": "l", "Ь": "M", "ь": "m", "Т": "N", "т": "n", "Щ": "O", "щ": "o", "З": "P", "з": "p", "Й": "Q", "й": "q", "К": "R", "к": "r", "Ы": "S", "ы": "s", "Е": "T", "е": "t", "Г": "U", "г": "u", "М": "V", "м": "v", "Ц": "W", "ц": "w", "Ч": "X", "ч": "x", "Н": "Y", "н": "y", "Я": "Z", "я": "z", __proto__: null }, //== End of options get convTableBackward() { var ctb = { __proto__: null }; var ctf = this.convTableForward; for(var c in ctf) ctb[ctf[c]] = c; delete this.convTableBackward; return this.convTableBackward = ctb; }, inPrimaryLayout: function(s) { for(var i = 0, l = s.length; i < l; ++i) { var c = s.charAt(i); if(c in this.convTableForward) return true; if(c in this.convTableBackward) return false; } return false; }, switchKeybLayout: function(s, convTable) { var res = ""; for(var i = 0, l = s.length; i < l; ++i) { var c = s.charAt(i); res += c in convTable ? convTable[c] : c; } return res; }, getFocusedElement: function() { return Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager) .getFocusedElementForWindow(content, true, {}); }, switchSelKeybLayout: function(_subCall, _focusFixed) { var fe = this.getFocusedElement(_subCall, _focusFixed); if(!fe) return; if(fe instanceof HTMLInputElement || fe instanceof HTMLTextAreaElement) { var ta = fe; try { var val = ta.value; var sel = val.substring(ta.selectionStart, ta.selectionEnd); } catch(e) { // Non-text HTMLInputElement return; } if(!sel && val && this.noSelBehavior && !_subCall) { if(this.noSelBehavior == 1) { ta.selectionStart = 0; ta.selectionEnd = val.length; sel = val; } else { this.handleNoSel(ta); return; } } if(!sel) return; var res = this.switchKeybLayout( sel, this.inPrimaryLayout(sel) ? this.convTableForward : this.convTableBackward ); if(res != sel) this.insertText(ta, res); } else if(fe.contentEditable == "true") { var doc = fe.ownerDocument; var docURI = doc.documentURI; if( docURI.substr(0, 5) == "data:" && docURI.indexOf("chrome://browser/skin/devtools/") != -1 ) { //~ todo: seems like we only can use paste from clipboard here... return; } var sel = doc.defaultView.getSelection(); var rng = sel.rangeCount && sel.getRangeAt(0); var tmpNode; if(!rng || rng.collapsed) { if(!this.noSelBehavior || _subCall) return; if(this.noSelBehavior == 1) { var r = doc.createRange(); r.selectNodeContents(fe); sel.removeAllRanges(); sel.addRange(r); tmpNode = fe.cloneNode(true); } else { this.handleNoSel(fe); return; } } else { tmpNode = doc.createElementNS("http://www.w3.org/1999/xhtml", "div"); tmpNode.appendChild(rng.cloneContents()); } var orig = tmpNode.innerHTML; var convTable = this.inPrimaryLayout(tmpNode.textContent) ? this.convTableForward : this.convTableBackward; var _this = this; var parseChildNodes = function(node) { if(node instanceof Element) { var childNodes = node.childNodes; for(var i = childNodes.length - 1; i >= 0; --i) parseChildNodes(childNodes[i]); } else if(node.nodeType == node.TEXT_NODE) { var text = node.nodeValue; var newText = _this.switchKeybLayout(node.nodeValue, convTable); if(newText != text) node.parentNode.replaceChild(doc.createTextNode(newText), node); } } parseChildNodes(tmpNode); var res = tmpNode.innerHTML; if(res != orig) doc.execCommand("insertHTML", false, res); } }, handleNoSel: function(node) { this.select(node); this.switchSelKeybLayout(true); }, select: function(node) { var e = this.noSelBehavior; if(!e || typeof e != "object") return; var evt = node.ownerDocument.createEvent("KeyboardEvent"); evt.initKeyEvent( "keypress", true /*bubbles*/, true /*cancelable*/, node.ownerDocument.defaultView, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.keyCode, e.charCode ); node.dispatchEvent(evt); }, insertText: function(ta, text) { //var editor = ta.QueryInterface(Components.interfaces.nsIDOMNSEditableElement).editor var editor = ta.editor .QueryInterface(Components.interfaces.nsIPlaintextEditor); if(editor.flags & editor.eEditorReadonlyMask) return; var sTop = ta.scrollTop; var sHeight = ta.scrollHeight; var sLeft = ta.scrollLeft; // var sWidth = ta.scrollWidth; if(text) editor.insertText(text); else editor.deleteSelection(0, 0); ta.scrollTop = sTop + (ta.scrollHeight - sHeight); ta.scrollLeft = sLeft; // + (ta.scrollWidth - sWidth); } }`);
Отсутствует
Да мне особо проверить негде. Попробуй так
скрытый текст
попробовал, в панели поиска не появился ...
Отредактировано ALEX_45_ORP (10-10-2021 16:46:02)
Win 10х64
Отсутствует
Можно починить,чтоб с 91й версией заработало?
Удалить строку, на которую ругается консоль.
попробовал, в панели поиска не появился ...
«Проверить» и «попробовать» — имелось в виду как поиск пойдёт.
А «не появиться» в панели поиска он не может, не сочиняй.
Отсутствует
Dumby
Вот честно - я вообще без понятия о чём ты.Пальцем ткни
Так быстро всё меняется...
Без обид, но, похоже, я не успеваю следить и не понимаю о чём речь.
Отредактировано VORON (10-10-2021 22:11:11)
Отсутствует
ALEX_45_ORP пишет
попробовал, в панели поиска не появился ...
«Проверить» и «попробовать» — имелось в виду как поиск пойдёт.
А «не появиться» в панели поиска он не может, не сочиняй.
Уважаемый Dumby, у меня 92 сборка ВВП, я сделал из вашего кода manifest .json, положил его в папку, добавил иконку и сунул эту папку в omni.ja - не появилось в панели поиска, а youtube после таких манипуляций - появился там, вот я о чем ...
upd.
вставил код в кнопку СВ, появился в панели адреса - работает как положено, всем спасибо.
Отредактировано ALEX_45_ORP (11-10-2021 15:33:10)
Win 10х64
Отсутствует
вставил код в кнопку СВ, появился в панели
Да, это код-установщик. Предназначен быть запущенным единожды.
Устанавливает поисковик как пользовательский, то есть данные,
в конечном итоге, пишутся в search.json.mozlz4 в профиле.
Держать код в кнопке не нужно, разве что во вкладке Код, если потребуется поставить снова
(удаление и установка [просто заново, или со сменой иконки и/или названия]).
Я новичок
По рукам бы следовало шлёпать некоторых любителей втягивать непричастных,
даже несмотря на присутствующую там оговорку «если ...».
Как лучше сделать ожидание, к примеру несколько секунд. setTimeout не совсем то...
Ты свои вопросы со стороны видел? Буквы что ли по талонам выдают?
Вот отстранись, и представь, что это спросили тебя. Что бы ты ответил?
Как вы можете видеть, здесь применяется метод window.setTimeout();
Однако, мне кажется, что это «не совсем то» по следующим причинам:
1. ...
2. ...
3. ...
Полагаю, что можно сделать лучше, исходя из задачи достижения следующих целей:
1. ...
2. ...
3. ...
Какие будут комментарии?
Отсутствует
Okralis
ну вот, сейчас мне по рукам настучат. )))) в общем - вот тут https://forum.mozilla-russia.org/viewtopic.php?pid=794132#p794132 добрый человек написал инструкцию, только .xpi надо брать отсюда https://forum.mozilla-russia.org/viewtopic.php?pid=795196#p795196 дублирую прямую ссылку на архив - https://a.pomf.cat/upgmgy.zip и еще, обычно CustomButton используют на ветке ESR, на релизах нужно будет все это дело переустанавливать раз в месяц и исправлять несовместимости, копаясь в ветках этого ресурса.
Отредактировано sonyas75 (11-10-2021 20:49:24)
Отсутствует
Dumby
...в конечном итоге, пишутся в search.json.mozlz4 в профиле.
Держать код в кнопке не нужно...
спасибо за инфу, буду иметь ввиду.
Win 10х64
Отсутствует
Okralis
ну вот, сейчас мне по рукам настучат. )))) в общем - вот тут https://forum.mozilla-russia.org/viewtopic.php?pid=794132#p794132 добрый человек написал инструкцию, только .xpi надо брать отсюда https://forum.mozilla-russia.org/viewtopic.php?pid=795196#p795196 дублирую прямую ссылку на архив - https://a.pomf.cat/upgmgy.zip и еще, обычно CustomButton используют на ветке ESR, на релизах нужно будет все это дело переустанавливать раз в месяц и исправлять несовместимости, копаясь в ветках этого ресурса.
спасибо, всё установил!
Отсутствует
Кто тут за поисковик нагнетал...В search-extensions закинуть и профиль почистить.https://www.upload.ee/files/13542403/kino.rar.html
проверил на чистой сборке, да тоже работает, теперь в раздумье - чей вариант предпочтительней?
.
upd. а ты смотрю не стоишь на месте, уже 93 кастрировал? или еще только примеряешься?
Отредактировано ALEX_45_ORP (12-10-2021 19:44:40)
Win 10х64
Отсутствует