Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№1702616-01-2024 19:18:35

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 121.0

Re: Custom Buttons

ВВП. Слишком сложно) Форум еще живой? Что-то совсем тихо стало, раньше активности было больше.

Отредактировано b0ttle (16-01-2024 19:20:28)

Отсутствует

 

№1702726-01-2024 11:38:05

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 113.0

Re: Custom Buttons

Dumby
Здравствуйте, вы бы не могли помочь, если можно создать кнопку переименования контейнера в контекстном меню страницы, чтобы при выделении любого текста на странице, появлялся пункт "Переименовать контейнер"(в контекстном меню) и изменять название на такое, какой текст выделен

Отсутствует

 

№1702826-01-2024 19:29:52

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

Stkvsky
Вот, не совсем выделенный текст, а не больше 150 символов,
и каждый whitespace-кусок заменён одним пробелом,
но для названия контейнера, думаю, должно подойти.

скрытый текст

Выделить код

Код:

(sel => {
	var menuitem = document.createXULElement("menuitem")
	addDestructor(() => menuitem.remove());
	menuitem.hidden = true;
	contentAreaContextMenu.querySelector(sel).after(menuitem);

	var id, txt, shouldHide = () => {
		var cd = nsContextMenu.contentData;
		return !(id = cd.userContextId) || !(txt = cd.selectionInfo.text);
	}
	menuitem.render = () => {
		if (shouldHide()) return;

		menuitem.setAttribute("oncommand", "renameContainer()");
		menuitem.setAttribute("label", "Переименовать контейнер");

		delete menuitem.render;
		menuitem.render();
		menuitem.hidden = false;
		menuitem.render = () => menuitem.hidden = shouldHide();

		menuitem.renameContainer = () => {
			var cd = ContextualIdentityService.getPublicIdentityFromId(id);
			ContextualIdentityService.update(id, txt, cd.icon, cd.color);
			document.getElementById("userContext-label").setAttribute("value", txt);
			document.getElementById("userContext-icons").setAttribute("tooltiptext", txt);
		}
	}
})("#context-sep-navigation");


И, если где-то открыта страница about:preferences#containers,
то там смена названия контейнера не отобразится, пока её не перезагрузишь.
Просто городить для этого кучу кода не охота, и, надеюсь, не сто́ит, но упомянуть следует.

Отсутствует

 

№1702927-01-2024 09:53:12

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 113.0

Re: Custom Buttons

Dumby
Прекрасно работает, то что нужно, спасибо

Отсутствует

 

№1703001-02-2024 17:20:06

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

Bug 1836480 - Convert toolkit/mozapps/extensions/internal/XPI* to ES modules (Firefox 124+)


Антиподписячий код с поправкой

скрытый текст

Выделить код

Код:

//
try {(jsval => {
	var dbg, gref, genv = func => {
		var sandbox = new Cu.Sandbox(g, {freshCompartment: true});
		Cc["@mozilla.org/jsdebugger;1"].createInstance(Ci.IJSDebugger).addClass(sandbox);
		(dbg = new sandbox.Debugger()).addDebuggee(g);
		gref = dbg.makeGlobalObjectReference(g);
		return (genv = func => func && gref.makeDebuggeeValue(func).environment)(func);
	}
	var g = Cu.getGlobalForObject(jsval), o = g.Object, {freeze} = o, disleg;

	var lexp = () => lockPref("extensions.experiments.enabled", true);
	var MRS = "MOZ_REQUIRE_SIGNING", AC = "AppConstants", uac = `resource://gre/modules/${AC}.`;

	if (o.isFrozen(o)) { // Fx 102.0b7+
		lexp(); disleg = true; genv();

		dbg.onEnterFrame = frame => {
			var {script} = frame;
			try {if (!script.url.startsWith(uac)) return;} catch {return;}
			dbg.onEnterFrame = undefined;

			if (script.isModule) { // ESM, Fx 108+
				var env = frame.environment;
				frame.onPop = () => env.setVariable(AC, gref.makeDebuggeeValue(freeze(
					o.assign(new o(), env.getVariable(AC).unsafeDereference(), {[MRS]: false})
				)));
			}
			else { // JSM
				var nsvo = frame.this.unsafeDereference();
				nsvo.Object = {freeze(ac) {
					ac[MRS] = false;
					delete nsvo.Object;
					return freeze(ac);
				}};
			}
		}
	}
	else o.freeze = obj => {
		if (!Components.stack.caller.filename.startsWith(uac)) return freeze(obj);
		obj[MRS] = false;

		if ((disleg = "MOZ_ALLOW_ADDON_SIDELOAD" in obj)) lexp();
		else
			obj.MOZ_ALLOW_LEGACY_EXTENSIONS = true,
			lockPref("extensions.legacy.enabled", true);

		return (o.freeze = freeze)(obj);
	}
	lockPref("xpinstall.signatures.required", false);
	lockPref("extensions.langpacks.signatures.required", false);

	var useDbg = true, xpii = "resource://gre/modules/addons/XPIInstall.";
	if (Ci.nsINativeFileWatcherService) { // Fx < 100
		jsval = Cu.import(xpii + "jsm", {});
		var shouldVerify = jsval.shouldVerifySignedState;
		if (shouldVerify.length == 1)
			useDbg = false,
			jsval.shouldVerifySignedState = addon => !addon.id && shouldVerify(addon);
	}
	if (useDbg) { // Fx 99+
		try {var exp = ChromeUtils.importESModule(xpii + "sys.mjs");}
		catch {exp = g.ChromeUtils.import(xpii + "jsm");}
		jsval = o.assign({}, exp);

		var env = genv(jsval.XPIInstall.installTemporaryAddon);
		var ref = name => {try {return env.find(name).getVariable(name).unsafeDereference();} catch {}}
		jsval.XPIDatabase = (ref("XPIExports") || ref("lazy") || {}).XPIDatabase || ref("XPIDatabase");

		var proto = ref("Package").prototype;
		var verify = proto.verifySignedState;
		proto.verifySignedState = function(id) {
			return id ? {cert: null, signedState: undefined} : verify.apply(this, arguments);
		}
		dbg.removeAllDebuggees();
	}
	if (disleg) jsval.XPIDatabase.isDisabledLegacy = () => false;
})(
	"permitCPOWsInScope" in Cu ? Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}) : Cu
);}
catch(ex) {Cu.reportError(ex);}

Отсутствует

 

№1703106-02-2024 19:13:42

hartumov
Участник
 
Группа: Members
Зарегистрирован: 17-11-2013
Сообщений: 136
UA: Firefox 106.0

Re: Custom Buttons

Как программно кликнуть на пункте контекстного меню?
В меню картинки есть пункт "Открыть изображение в новой вкладке". Его id = "context-viewimage".
Если я открываю меню ПКМ, то программно кликается нормально.

Выделить код

Код:

document.getElementById('context-viewimage').click()

Но если открыть контекстное меню через

Выделить код

Код:

document.getElementById('contentAreaContextMenu').openPopup()

То вместо клика в консоли ошибка gContextMenu is null
Что надо поправить?

Отсутствует

 

№1703207-02-2024 11:58:46

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

hartumov
В контентских процессах событие "contextmenu" пасёт ContextMenuChild
resource:///actors/ContextMenuChild.jsm


При наступлении события он собирает информацию о кликнутом,
и отправляет её в родительский процесс, в ContextMenuParent
resource:///actors/ContextMenuParent.jsm


Тот вызывает window.openContextMenu(),
где информация сохраняется в nsContextMenu.contentData,
и открывается контекстное меню.


Меню имеет атрибут "onpopupshowing", где, при наступлении события,
из сохранённой информации формируется объект gContextMenu
chrome://browser/content/nsContextMenu.js


Ты хочешь всё это миновать и сразу кликнуть по пункту.
А какое именно изображение имеется в виду программно-кликающим,
видимо, должно определиться как-то телепатически.

Отсутствует

 

№1703307-02-2024 19:11:25

hartumov
Участник
 
Группа: Members
Зарегистрирован: 17-11-2013
Сообщений: 136
UA: Firefox 106.0

Re: Custom Buttons

Dumby пишет

hartumov
В контентских процессах событие "contextmenu" пасёт ContextMenuChild
resource:///actors/ContextMenuChild.jsm


При наступлении события он собирает информацию о кликнутом,
и отправляет её в родительский процесс, в ContextMenuParent
resource:///actors/ContextMenuParent.jsm


Тот вызывает window.openContextMenu(),
где информация сохраняется в nsContextMenu.contentData,
и открывается контекстное меню.


Меню имеет атрибут "onpopupshowing", где, при наступлении события,
из сохранённой информации формируется объект gContextMenu
chrome://browser/content/nsContextMenu.js


Ты хочешь всё это миновать и сразу кликнуть по пункту.
А какое именно изображение имеется в виду программно-кликающим,
видимо, должно определиться как-то телепатически.

Да любое изображение на любой веб странице, если в его контекстном меню есть пункт "Открыть изображение в новой вкладке". Хотя бы на этой странице иконка браузера там где указан UA пользователя.
И дело не только в том, чтобы программно именно открыть картинку. Вообще, возможность кликнуть на пункте контекстного меню очень полезная. В старых версиях ФФ это делалось намного проще.


Можно это как то реализовать?
Или иным путем выполнить то, что делает скажем команда  gContextMenu.copyMediaLocation() или gContextMenu.copyLink()

Отсутствует

 

№1703411-02-2024 11:19:10

VORON
Участник
 
Группа: Members
Зарегистрирован: 03-04-2013
Сообщений: 158
UA: Firefox 121.0

Re: Custom Buttons

Помогите с кнопкой 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
            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);
    }
}`);


Что нужно поправить,чтоб заработала на 121й лисе?
И,вдогонку, эта тоже перестала работать...
скрытый текст

Выделить код

Код:

gBrowser.selectedBrowser.messageManager.loadFrameScript(this.fsURL || (
    this.fsURL = `data:,(match => {\n${encodeURIComponent(this.Help)}\n})()`
), false);

Отредактировано VORON (11-02-2024 11:33:26)

Отсутствует

 

№1703511-02-2024 14:07:27

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 301
UA: Google 2.1

Re: Custom Buttons

Dumby пишет

Антиподписячий код с поправкой

Спасибо, :beer: от тех кто пользуется...


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№1703611-02-2024 19:18:14

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

VORON пишет

Помогите с кнопкой Switch Keyboard Layout
скрытый текст
Что нужно поправить,чтоб заработала на 121й лисе?

И откуда такое только берётся, этот код уже обсуждался не раз и не два.
Поправить, как минимум

скрытый текст

Выделить код

Код:

/*
            if(c in this.convTableForward)
                return true;
            if(c in this.convTableBackward)
                return false;
*/
            var primary = c in this.convTableForward;
            if(primary ^ c in this.convTableBackward)
                return primary;


скрытый текст

Выделить код

Код:

\`/*
        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);
   },
*/\`;
        if(ChromeUtils.domProcessChild.childID) {
            var cmd = this.beh2cmd[e.ctrlKey + "_" + e.shiftKey + "_" + e.keyCode];
            cmd && docShell.doCommand(cmd);
        }
        else node.dispatchEvent(new node.ownerGlobal.KeyboardEvent("keypress", e));
    },
    beh2cmd: { // Ctrl_Shift_VK
        false_true_36: "cmd_selectBeginLine", // Shift+Home
    },


скрытый текст

Выделить код

Код:

/*
        if(fe instanceof HTMLInputElement || fe instanceof HTMLTextAreaElement) {
*/
        if(HTMLInputElement.isInstance(fe) || HTMLTextAreaElement.isInstance(fe)) {

//.....

/*
                if(node instanceof Element) {
*/
                if(Element.isInstance(node)) {

И,вдогонку, эта тоже перестала работать...

Положил на Справку content.alert(2+2);
Жму кнопку — алертится четыре.

Отсутствует

 

№1703711-02-2024 19:33:39

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 122.0

Re: Custom Buttons

VORON
Это что-то вроде транслита? Транслитерация? Как его использовать, пробовал к ucf добавить, но понять не могу как его запустить.

Отсутствует

 

№1703811-02-2024 19:56:51

VORON
Участник
 
Группа: Members
Зарегистрирован: 03-04-2013
Сообщений: 158
UA: Firefox 121.0

Re: Custom Buttons

b0ttle
эта кнопка спасает,когда забыл переключить раскладку  и написал ghbdtn вместо привет

Добавлено 11-02-2024 20:05:56
Dumby
Там же в справке ещё куча всего лежит,что ты когда то советовал туда переложить

скрытый текст

Выделить код

Код:

/*
    Linkification
    Original script by Misha Splurov
    http://userscripts.org/scripts/show/67744
*/

// (c) http://data.iana.org/TLD/tlds-alpha-by-domain.txt
var domains = [
  "ac", "ad", "ae", "aero", "af", "ag", "ai", "al", "am", "an", "ao", "aq",
  "ar", "arpa", "as", "asia", "atif(ChromeUtils.domProcessChild.childID) {
            var cmd = this.beh2cmd[e.ctrlKey + "_" + e.shiftKey + "_" + e.keyCode];
            cmd && docShell.doCommand(cmd);
        }
        else node.dispatchEvent(new node.ownerGlobal.KeyboardEvent("keypress", e));
    },
    beh2cmd: { // Ctrl_Shift_VK
        false_true_36: "cmd_selectBeginLine", // Shift+Home", "au", "aw", "ax", "az", "ba", "bb", "bd",
  "be", "bf", "bg", "bh", "bi", "biz", "bj", "bm", "bn", "bo", "br", "bs",
  "bt", "bv", "bw", "by", "bz", "ca", "cat", "cc", "cd", "cf", "cg", "ch",
  "ci", "ck", "cl", "cm", "cn", "co", "com", "coop", "cr", "cu", "cv", "cx",
  "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "edu", "ee", "eg",
  "er", "es", "et", "eu", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb",
  "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gov", "gp", "gq",
  "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu",
  "id", "ie", "il", "im", "in", "info", "int", "io", "iq", "ir", "is", "it",
  "je", "jm", "jo", "jobs", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp",
  "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt",
  "lu", "lv", "ly", "ma", "mc", "md", "me", "mg", "mh", "mil", "mk", "ml",
  "mm", "mn", "mo", "mobi", "mp", "mq", "mr", "ms", "mt", "mu", "museum",
  "mv", "mw", "mx", "my", "mz", "na", "name", "nc", "ne", "net", "nf", "ng",
  "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "org", "pa", "pe", "pf",
  "pg", "ph", "pk", "pl", "pm", "pn", "pr", "pro", "ps", "pt", "pw", "py",
  "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg",
  "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "su", "sv",
  "sy", "sz", "tc", "td", "tel", "tf", "tg", "th", "tj", "tk", "tl", "tm",
  "tn", "to", "tp", "tr", "travel", "tt", "tv", "tw", "tz", "ua", "ug", "uk",
  "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws",
  "ye", "yt", "yu", "za", "zm", "zw"
];

// (c) http://yellow5.us/firefox/linkification/
var tagsForSkip = [
  "a", "applet", "area", "embed", "frame", "frameset", "head", "iframe",
  "img", "map", "meta", "noscript", "object", "option", "param", "script",
  "select", "style", "textarea", "title"
];

var inArray = function(value, items) {
  for (var i = 0; items[i] && value != items[i]; i++);
  return value == items[i];
}

var urlsRegExp = /(^|[\s()\[\]_:~+@*"'>])((?:https?|ftp|irc):\/\/)?([-a-z\d;:&=+$,%_.!~*'()]+@)?((?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:(www|irc|ftp)\.)?(?:(?:[a-z\d]|[a-z\d][a-z\d-]*[a-z\d])\.)+([a-z]{2,6}))(:\d+)?(\/(?:[-\w.!~*'()%:@&=+$,;\/]*[\w~*%@&=+$\/])?(?:\?(?:[-\w;\/?:@&=+$,.!~*'()%\[\]|]*[\w\/@&=+$~*%])?)?(?:#(?:[-\w;\/?:@&=+$,.!~*'()%]*[\w\/@&=+$~*%])?)?|\b)/i

var linksCounter = 0;

var current = content.document.body;
while (current) {
  if (current.nodeName == "#text" && (match = current.nodeValue.match(urlsRegExp)) && inArray(match[6], domains)) {
    var url;
    if (match[3] && ! match[2] && ! match[5] && ! match[8] && (match[3].indexOf(":") == -1 || match[3].indexOf("mailto:") == 0)) {
      url = (match[3].indexOf("mailto:") == -1 ? "mailto:" : "")
          + match[3]
          + match[4];
    }
    else {
      url = (match[2] ? match[2] : (! match[5] || match[5] == "www" ? "http" : match[5]) + "://")
          + (match[3] ? match[3] : "")
          + match[4]
          + (match[7] ? match[7] : "")
          + (match[8] ? match[8] : "");
    }
    if (url) {
      var range = content.document.createRange();
      range.setStart(current, match.index + match[1].length);
      range.setEnd(current, match.index + match[0].length);
      var a = content.document.createElement("a");
      a.setAttribute("href", url);
      a.setAttribute("target", "_blank");
      a.setAttribute("class", "linkified");
      a.appendChild(range.extractContents());
      range.insertNode(a);
      range.detach();
      linksCounter++;
    }
  }
  if (current.tagName && !inArray(current.tagName.toLowerCase(), tagsForSkip) && current.firstChild) {
    current = current.firstChild;
  }
  else if (current.nextSibling) {
    current = current.nextSibling;
  }
  else {
    do {
      current = current.parentNode;
    } while (!current.nextSibling && current.parentNode);
    current = current.nextSibling;
  }
}

/*
if (linksCounter > 0) {
  var style = content.document.createElement("style");
  style.type = "text/css";
  style.appendChild(content.document.createTextNode("a.linkified:before {content: "~"; color: #e00;}"));
  content.document.getElementsByTagName("head")[0].appendChild(style);
}
*/

,это просто добавить?

Отредактировано VORON (11-02-2024 20:10:47)

Отсутствует

 

№1703911-02-2024 20:08:39

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 122.0

Re: Custom Buttons

VORON
Тогда мимо, я уже обрадовался) Искал что-то подобное https://addons.mozilla.org/en-US/firefo … e-translit. Он норм, но некоторые буквы не мешало бы перенастроить.

Отредактировано b0ttle (11-02-2024 20:10:48)

Отсутствует

 

№1704011-02-2024 21:36:33

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

VORON пишет

ещё куча всего лежит

Да неужели :D.


Хорошо, почистил кучу от непонятно зачем туда
всунутого кода из среднего патча для Switch Keyboard Layout.


Кладу кучу на Справку. Топаю по адресу:
data:text/plain;charset=utf-8,example.com


Жму кнопку — текст example.com превращается в ссылку example.com

Отсутствует

 

№1704112-02-2024 19:37:45

VORON
Участник
 
Группа: Members
Зарегистрирован: 03-04-2013
Сообщений: 158
UA: Firefox 121.0

Re: Custom Buttons

Dumby пишет

Жму кнопку

А ненадо было там ничего нажимать, она автоматом в ссылки превращала.
Например тут, у меня не работает,хоть нажимай,хоть не нажимай.
А скажи,а у тебя вот эта кнопка ещё живая или альтернативу подскажи? На 91й у меня работало расширение от Виталия,вроде оно давало выезжающую боковую панель,на 121й не работает.
И,последнее,без чего тяжело - эта кнопка отремонтированное опять перестало фурычить...

Отредактировано VORON (12-02-2024 19:53:28)

Отсутствует

 

№1704213-02-2024 01:14:19

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1219
UA: Firefox 122.0

Re: Custom Buttons

VORON
Скрипт работает, если это нужно постоянно. Если вкл/выкл, есть кнопка в ATB от Виталия, но работает своеобразно.

Отсутствует

 

№1704313-02-2024 18:21:23

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

VORON пишет

А ненадо было там ничего нажимать, она автоматом в ссылки превращала.

Этого не может быть. Ни приведённый тобой код, ни тот, что в «Готовых»,
определённо не рассчитан ни на какую автоматизацию, линкификация только по клику.

Например тут, у меня не работает,хоть нажимай,хоть не нажимай.

Не работает кнопка 2013 года? Удивительно, правда?
С тех давних пор, как контент выслали от пользователя к лису на кулички — в другой процесс,
Custom Buttons больше не является удобным инструментом для взаимодействия со страницами.
Как правильно сказал xrun1, следует использовать какую-нибудь обезьяну.

А скажи,а у тебя вот эта кнопка ещё живая или альтернативу подскажи? На 91й у меня работало расширение от Виталия,вроде оно давало выезжающую боковую

Ну, расширение-то вряд ли. Видимо имеется в виду UCF, и да,
там есть вертикальный тулбар, и можно настроить чтобы выезжал.
А кнопка, конечно, мёртвая, да она и не требуется по вышеупомянутой причине.

на 121й не работает

Ещё бы, прыгать через тридцать версий. Хромский код столько не живёт, обновлять нужно.
Можно, например, в первом посте укфской темы, у Dobrov'а взять с гитхаба.
Я проверил на Firefox 122.0 — работает. Автоскрытие надо поднастроить.


Говорят, есть и отдельные коды для дополнительных тулбаров,
но всё равно нужно выбирать и разворачивать какой-то скриптоприёмик,
и не знаю есть ли среди них именно вертикальный выдвигающийся.
Топик здесь уже юзерхромский, ну и на руборде есть довольно общий.

И,последнее,без чего тяжело - эта кнопка отремонтированное опять перестало фурычить...

Я попробовал «отремонтированное» на Firefox 124.0a1 и у меня работает.
Ну, только в fission oop-фреймах не работает.

Отсутствует

 

№1704413-02-2024 20:07:24

VORON
Участник
 
Группа: Members
Зарегистрирован: 03-04-2013
Сообщений: 158
UA: Chrome 119.0

Re: Custom Buttons

xrun1
Спасибо,возьмём на вооружение.

Dumby пишет

Ещё бы, прыгать через тридцать версий

Так вот из-за этих гемороев,с восстановлением удобств и неохота на новые версии переходить.

Dumby пишет

Не работает кнопка 2013 года? Удивительно, правда?

Не,не-я ту ссылку для примера привёл,ибо те адреса,что там есть у меня не активируются почему то,даже  по клику.

Добавлено 13-02-2024 20:14:30
Dumby
Switch Keyboard Layout после твоих правок-работает,а вот ни Linkification, ни Автоматически добавлять выделенный текст в SearchBar(и в код ложил отремонтированное и в инициализацию,толку-0) категорически не хотят.

Отредактировано VORON (13-02-2024 20:14:30)

Отсутствует

 

№1704514-02-2024 18:48:14

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

VORON пишет

ни Linkification, ни Автоматически добавлять выделенный текст в SearchBar(и в код ложил отремонтированное и в инициализацию,толку-0) категорически не хотят

В SearchBar'ской кнопке не надо ничего во вкладку Код класть,
только во вкладку Инициализация.
И кнопку нажимать надо, чтобы включать/выключать добавление,
оно ведь не должно постоянно работать (так задумано в оригинале).


И, лучше перезапустить браузер, а то мало ли что могло заклинить
от ненужных перестановок кодов по вкладкам.


В Linkification я вообще не представляю что может не работать.


Вобщем, остаётся разве что только выложить URL неработающих кнопок.
ПКМ по кнопке —> «Копировать код в буфер», а я посмотрю, вдруг там что-то обнаружится.

Отсутствует

 

№1704614-02-2024 18:58:27

VORON
Участник
 
Группа: Members
Зарегистрирован: 03-04-2013
Сообщений: 158
UA: Firefox 121.0

Re: Custom Buttons

Dumby
Linkification поборол,создав с нуля,а вот SearchBar нивкакую...

скрытый текст

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%20%u0410%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20SearchBar%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABcAAAAVCAYAAACt4nWrAAADQklEQVQ4ja3V/08adxzHcf+t/bT90HTLtmT7F5Ym/XUsy4Uu7mdKYiawudaq04DWjVoFxWgRrU5txDL5clKkIDVBVpE77j5wgPW45LkfTMgOf1gb98Pjt/fr+fntbkAIgdfrxel04nA4bszpdOL1ehFCMHDf7cbn81GtVrEs68aq1So+n4/7bjcDkiRRq9UwTZNms3ljpmlSq9WQJIkBh8OBZVnXjlRVJZFIMB9eZPr3IMG5efb399E07T8fsCwLh8NxFe92uzQajZ5qtcrCUoRYKkv8TGfzbZtQ7oyxyBaBQIBarWa779ftdu1xIQRCCBRFYSES4ZWic37Z5fTCJK29Y+20RfC14NHzQ6ZnHqPrem/T71pc13V0XSeZTLL0UqbSucToWpxemCS1dzwrGwRfCyZljeHAArlcrrfpZ4ubpkm9XqderxNaWiZaUik0LjluXpLSLtg+axE5aTKT05jMaDxYP2RlZaW36Weapj2uqiqqqvI4OEe4JNh+a7B71mLz7xbLJ02CeZ3fMnUmUnUebBUIh0K9Tb9rcUVRUBSFpwth/AenPC00WDhuMF8QzB5pTMp1Rv5S8Wc0RqJpVldXe5t+tnin06FUKlEqldjc3MQ7/5zxpMJEWmU8pTB6oOCNnzPyUuFRQmVoNEAymext+nU6HXu8WCxSLBbJ5/OMjY8zHM0wvHeOJ36OZ++chwmFX+M1PE/WGRwcZGpqio1YrLf7t2vxQqHQc3h4yMPRMYb8YX56JjO8cczPUZmhsRnu3XOSTqdZW5wl+90tTrbXbNtCoWCPt9tt8vm8zdHREbFYjIDfz9TkJIGAn52dHaanp4nMz/Bm6Q7WzJdc/vAJb/6M2rbtdtsez+Vy7yUWi7H/7ReYE59C/A4Ev8J0fkRpY7l3Y4u3Wi2y2ex7y+9s0HbegqnP4MU3MPc16o+3iS4tks1mabVa9rgsyx8k92KLzvcfw8RtrL27HKw/4Y9gEFmW7XHDMMhkMh/s1e4Wdefn7AZ/IRQKMTs7SyaTwTCMq7gkSZTLZVRVJZVK3ZiqqpTL5avvudvtxuPxUKlUMAzjxiqVCh6PB7fbzYAQApfLhSRJ/8s/VJIkXC4XQgj+AW9cSYbbZ7hEAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28%28id%2C%20code%29%20%3D%3E%20%7B%0A%20%20%20%20var%20pref%20%3D%20%22CB.pasteIntoSearchBar%22%3B%0A%20%20%20%20var%20checker%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20val%20%3D%20Services.prefs.getBoolPref%28pref%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20this.checked%20%3D%20val%3B%0A%20%20%20%20%20%20%20%20var%20has%20%3D%20id%20in%20g%3B%0A%20%20%20%20%20%20%20%20val%20%3F%20has%20%7C%7C%20init%28%29%20%3A%20has%20%26%26%20destroy%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20Services.prefs.addObserver%28pref%2C%20checker%29%3B%0A%20%20%20%20this._handleClick%20%3D%20%28%29%20%3D%3E%20Services.prefs.setBoolPref%28%0A%20%20%20%20%20%20%20%20pref%2C%20%21Services.prefs.getBoolPref%28pref%2C%20false%29%0A%20%20%20%20%29%3B%0A%20%20%20%20var%20gs%20%3D%20%22Cu.getGlobalForObject%28Cu%29%22%2C%20g%20%3D%20eval%28gs%29%3B%0A%0A%20%20%20%20var%20psi%2C%20psd%2C%20fsi%2C%20fsd%2C%20receiver%2C%20vars%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20d%20%3D%20%22data%3A%2C%22%2C%20ref%20%3D%20gs%20+%20%22.%22%20+%20id%2C%20dref%20%3D%20d%20+%20ref%3B%0A%20%20%20%20%20%20%20%20psi%20%3D%20dref%20+%20%22%3D%22%20+%20encodeURIComponent%28code.replace%28%22%25MSG%25%22%2C%20id%29%29%3B%0A%20%20%20%20%20%20%20%20psd%20%3D%20d%20+%20%22delete%20%22%20+%20ref%3B%0A%20%20%20%20%20%20%20%20fsi%20%3D%20dref%20+%20%22.init%28this%29%22%3B%0A%20%20%20%20%20%20%20%20fsd%20%3D%20dref%20+%20%22.destroy%28this%29%22%3B%0A%20%20%20%20%20%20%20%20receiver%20%3D%20msg%20%3D%3E%20%7Btry%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20msg.target.ownerGlobal.windowRoot.ownerGlobal%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.BrowserSearch.searchBar._textbox.value%20%3D%20msg.data%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28ex%29%20%7B%7D%7D%0A%20%20%20%20%20%20%20%20vars%20%3D%20%28%29%20%3D%3E%20%7B%7D%0A%20%20%20%20%7D%0A%20%20%20%20var%20init%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20vars%28%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.loadProcessScript%28psi%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.loadFrameScript%28fsi%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20g%5Bid%5D.receiveMessage%20%3D%20receiver%3B%0A%20%20%20%20%20%20%20%20Services.mm.addMessageListener%28id%2C%20g%5Bid%5D%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20destroy%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20vars%28%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.removeDelayedFrameScript%28fsi%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.removeDelayedProcessScript%28psi%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.loadFrameScript%28fsd%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.removeMessageListener%28id%2C%20g%5Bid%5D%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.loadProcessScript%28psd%2C%20false%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20checker%28%29%3B%0A%0A%20%20%20%20addDestructor%28reason%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20Services.prefs.removeObserver%28pref%2C%20checker%29%3B%0A%20%20%20%20%20%20%20%20reason%5B5%5D%20%3D%3D%20%22e%22%20%26%26%20id%20in%20g%20%26%26%20destroy%28%29%3B%0A%20%20%20%20%7D%29%3B%0A%7D%29%28%22CB_ButtonCodeFragmentIdentifier_PasteIntoSearchBar%22%2C%20%60%7B%0A%20%20%20%20init%28cfmm%29%20%7B%0A%20%20%20%20%20%20%20%20cfmm.addEventListener%28%22selectstart%22%2C%20this%29%3B%0A%20%20%20%20%20%20%20%20cfmm.addEventListener%28%22unload%22%2C%20this%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20destroy%28cfmm%29%20%7B%0A%20%20%20%20%20%20%20%20cfmm.removeEventListener%28%22selectstart%22%2C%20this%29%3B%0A%20%20%20%20%20%20%20%20cfmm.removeEventListener%28%22unload%22%2C%20this%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20handleEvent%28e%29%20%7B%0A%20%20%20%20%20%20%20%20this%5Be.type%5D%28e%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20selectstart%28e%29%20%7B%0A%20%20%20%20%20%20%20%20e.target.ownerGlobal.addEventListener%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mouseup%22%2C%20this%2C%20%7Bonce%3A%20true%7D%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20mouseup%28e%29%20%7B%0A%20%20%20%20%20%20%20%20var%20win%20%3D%20e.target.ownerGlobal%3B%0A%20%20%20%20%20%20%20%20var%20sel%20%3D%20win.getSelection%28%29%3B%0A%20%20%20%20%20%20%20%20sel%20%3D%20%21sel.isCollapsed%20%26%26%20sel.toString%28%29%3B%0A%20%20%20%20%20%20%20%20/%5C%5CS/.test%28sel%29%20%26%26%20win.docShell.messageManager%0A%20%20%20%20%20%20%20%20%20%20%20%20.sendAsyncMessage%28%22%25MSG%25%22%2C%20sel%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20unload%28e%29%20%7B%0A%20%20%20%20%20%20%20%20this.destroy%28e.target%29%3B%0A%20%20%20%20%7D%0A%7D%60%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3Ecustombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%20%u0410%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20SearchBar%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABcAAAAVCAYAAACt4nWrAAADQklEQVQ4ja3V/08adxzHcf+t/bT90HTLtmT7F5Ym/XUsy4Uu7mdKYiawudaq04DWjVoFxWgRrU5txDL5clKkIDVBVpE77j5wgPW45LkfTMgOf1gb98Pjt/fr+fntbkAIgdfrxel04nA4bszpdOL1ehFCMHDf7cbn81GtVrEs68aq1So+n4/7bjcDkiRRq9UwTZNms3ljpmlSq9WQJIkBh8OBZVnXjlRVJZFIMB9eZPr3IMG5efb399E07T8fsCwLh8NxFe92uzQajZ5qtcrCUoRYKkv8TGfzbZtQ7oyxyBaBQIBarWa779ftdu1xIQRCCBRFYSES4ZWic37Z5fTCJK29Y+20RfC14NHzQ6ZnHqPrem/T71pc13V0XSeZTLL0UqbSucToWpxemCS1dzwrGwRfCyZljeHAArlcrrfpZ4ubpkm9XqderxNaWiZaUik0LjluXpLSLtg+axE5aTKT05jMaDxYP2RlZaW36Weapj2uqiqqqvI4OEe4JNh+a7B71mLz7xbLJ02CeZ3fMnUmUnUebBUIh0K9Tb9rcUVRUBSFpwth/AenPC00WDhuMF8QzB5pTMp1Rv5S8Wc0RqJpVldXe5t+tnin06FUKlEqldjc3MQ7/5zxpMJEWmU8pTB6oOCNnzPyUuFRQmVoNEAymext+nU6HXu8WCxSLBbJ5/OMjY8zHM0wvHeOJ36OZ++chwmFX+M1PE/WGRwcZGpqio1YrLf7t2vxQqHQc3h4yMPRMYb8YX56JjO8cczPUZmhsRnu3XOSTqdZW5wl+90tTrbXbNtCoWCPt9tt8vm8zdHREbFYjIDfz9TkJIGAn52dHaanp4nMz/Bm6Q7WzJdc/vAJb/6M2rbtdtsez+Vy7yUWi7H/7ReYE59C/A4Ev8J0fkRpY7l3Y4u3Wi2y2ex7y+9s0HbegqnP4MU3MPc16o+3iS4tks1mabVa9rgsyx8k92KLzvcfw8RtrL27HKw/4Y9gEFmW7XHDMMhkMh/s1e4Wdefn7AZ/IRQKMTs7SyaTwTCMq7gkSZTLZVRVJZVK3ZiqqpTL5avvudvtxuPxUKlUMAzjxiqVCh6PB7fbzYAQApfLhSRJ/8s/VJIkXC4XQgj+AW9cSYbbZ7hEAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28%28id%2C%20code%29%20%3D%3E%20%7B%0A%20%20%20%20var%20pref%20%3D%20%22CB.pasteIntoSearchBar%22%3B%0A%20%20%20%20var%20checker%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20val%20%3D%20Services.prefs.getBoolPref%28pref%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20this.checked%20%3D%20val%3B%0A%20%20%20%20%20%20%20%20var%20has%20%3D%20id%20in%20g%3B%0A%20%20%20%20%20%20%20%20val%20%3F%20has%20%7C%7C%20init%28%29%20%3A%20has%20%26%26%20destroy%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20Services.prefs.addObserver%28pref%2C%20checker%29%3B%0A%20%20%20%20this._handleClick%20%3D%20%28%29%20%3D%3E%20Services.prefs.setBoolPref%28%0A%20%20%20%20%20%20%20%20pref%2C%20%21Services.prefs.getBoolPref%28pref%2C%20false%29%0A%20%20%20%20%29%3B%0A%20%20%20%20var%20gs%20%3D%20%22Cu.getGlobalForObject%28Cu%29%22%2C%20g%20%3D%20eval%28gs%29%3B%0A%0A%20%20%20%20var%20psi%2C%20psd%2C%20fsi%2C%20fsd%2C%20receiver%2C%20vars%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20d%20%3D%20%22data%3A%2C%22%2C%20ref%20%3D%20gs%20+%20%22.%22%20+%20id%2C%20dref%20%3D%20d%20+%20ref%3B%0A%20%20%20%20%20%20%20%20psi%20%3D%20dref%20+%20%22%3D%22%20+%20encodeURIComponent%28code.replace%28%22%25MSG%25%22%2C%20id%29%29%3B%0A%20%20%20%20%20%20%20%20psd%20%3D%20d%20+%20%22delete%20%22%20+%20ref%3B%0A%20%20%20%20%20%20%20%20fsi%20%3D%20dref%20+%20%22.init%28this%29%22%3B%0A%20%20%20%20%20%20%20%20fsd%20%3D%20dref%20+%20%22.destroy%28this%29%22%3B%0A%20%20%20%20%20%20%20%20receiver%20%3D%20msg%20%3D%3E%20%7Btry%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20msg.target.ownerGlobal.windowRoot.ownerGlobal%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.BrowserSearch.searchBar._textbox.value%20%3D%20msg.data%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28ex%29%20%7B%7D%7D%0A%20%20%20%20%20%20%20%20vars%20%3D%20%28%29%20%3D%3E%20%7B%7D%0A%20%20%20%20%7D%0A%20%20%20%20var%20init%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20vars%28%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.loadProcessScript%28psi%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.loadFrameScript%28fsi%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20g%5Bid%5D.receiveMessage%20%3D%20receiver%3B%0A%20%20%20%20%20%20%20%20Services.mm.addMessageListener%28id%2C%20g%5Bid%5D%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20destroy%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20vars%28%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.removeDelayedFrameScript%28fsi%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.removeDelayedProcessScript%28psi%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.loadFrameScript%28fsd%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.removeMessageListener%28id%2C%20g%5Bid%5D%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.loadProcessScript%28psd%2C%20false%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20checker%28%29%3B%0A%0A%20%20%20%20addDestructor%28reason%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20Services.prefs.removeObserver%28pref%2C%20checker%29%3B%0A%20%20%20%20%20%20%20%20reason%5B5%5D%20%3D%3D%20%22e%22%20%26%26%20id%20in%20g%20%26%26%20destroy%28%29%3B%0A%20%20%20%20%7D%29%3B%0A%7D%29%28%22CB_ButtonCodeFragmentIdentifier_PasteIntoSearchBar%22%2C%20%60%7B%0A%20%20%20%20init%28cfmm%29%20%7B%0A%20%20%20%20%20%20%20%20cfmm.addEventListener%28%22selectstart%22%2C%20this%29%3B%0A%20%20%20%20%20%20%20%20cfmm.addEventListener%28%22unload%22%2C%20this%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20destroy%28cfmm%29%20%7B%0A%20%20%20%20%20%20%20%20cfmm.removeEventListener%28%22selectstart%22%2C%20this%29%3B%0A%20%20%20%20%20%20%20%20cfmm.removeEventListener%28%22unload%22%2C%20this%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20handleEvent%28e%29%20%7B%0A%20%20%20%20%20%20%20%20this%5Be.type%5D%28e%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20selectstart%28e%29%20%7B%0A%20%20%20%20%20%20%20%20e.target.ownerGlobal.addEventListener%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mouseup%22%2C%20this%2C%20%7Bonce%3A%20true%7D%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20mouseup%28e%29%20%7B%0A%20%20%20%20%20%20%20%20var%20win%20%3D%20e.target.ownerGlobal%3B%0A%20%20%20%20%20%20%20%20var%20sel%20%3D%20win.getSelection%28%29%3B%0A%20%20%20%20%20%20%20%20sel%20%3D%20%21sel.isCollapsed%20%26%26%20sel.toString%28%29%3B%0A%20%20%20%20%20%20%20%20/%5C%5CS/.test%28sel%29%20%26%26%20win.docShell.messageManager%0A%20%20%20%20%20%20%20%20%20%20%20%20.sendAsyncMessage%28%22%25MSG%25%22%2C%20sel%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20unload%28e%29%20%7B%0A%20%20%20%20%20%20%20%20this.destroy%28e.target%29%3B%0A%20%20%20%20%7D%0A%7D%60%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3Ecustombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%20%u0410%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20SearchBar%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABcAAAAVCAYAAACt4nWrAAADQklEQVQ4ja3V/08adxzHcf+t/bT90HTLtmT7F5Ym/XUsy4Uu7mdKYiawudaq04DWjVoFxWgRrU5txDL5clKkIDVBVpE77j5wgPW45LkfTMgOf1gb98Pjt/fr+fntbkAIgdfrxel04nA4bszpdOL1ehFCMHDf7cbn81GtVrEs68aq1So+n4/7bjcDkiRRq9UwTZNms3ljpmlSq9WQJIkBh8OBZVnXjlRVJZFIMB9eZPr3IMG5efb399E07T8fsCwLh8NxFe92uzQajZ5qtcrCUoRYKkv8TGfzbZtQ7oyxyBaBQIBarWa779ftdu1xIQRCCBRFYSES4ZWic37Z5fTCJK29Y+20RfC14NHzQ6ZnHqPrem/T71pc13V0XSeZTLL0UqbSucToWpxemCS1dzwrGwRfCyZljeHAArlcrrfpZ4ubpkm9XqderxNaWiZaUik0LjluXpLSLtg+axE5aTKT05jMaDxYP2RlZaW36Weapj2uqiqqqvI4OEe4JNh+a7B71mLz7xbLJ02CeZ3fMnUmUnUebBUIh0K9Tb9rcUVRUBSFpwth/AenPC00WDhuMF8QzB5pTMp1Rv5S8Wc0RqJpVldXe5t+tnin06FUKlEqldjc3MQ7/5zxpMJEWmU8pTB6oOCNnzPyUuFRQmVoNEAymext+nU6HXu8WCxSLBbJ5/OMjY8zHM0wvHeOJ36OZ++chwmFX+M1PE/WGRwcZGpqio1YrLf7t2vxQqHQc3h4yMPRMYb8YX56JjO8cczPUZmhsRnu3XOSTqdZW5wl+90tTrbXbNtCoWCPt9tt8vm8zdHREbFYjIDfz9TkJIGAn52dHaanp4nMz/Bm6Q7WzJdc/vAJb/6M2rbtdtsez+Vy7yUWi7H/7ReYE59C/A4Ev8J0fkRpY7l3Y4u3Wi2y2ex7y+9s0HbegqnP4MU3MPc16o+3iS4tks1mabVa9rgsyx8k92KLzvcfw8RtrL27HKw/4Y9gEFmW7XHDMMhkMh/s1e4Wdefn7AZ/IRQKMTs7SyaTwTCMq7gkSZTLZVRVJZVK3ZiqqpTL5avvudvtxuPxUKlUMAzjxiqVCh6PB7fbzYAQApfLhSRJ/8s/VJIkXC4XQgj+AW9cSYbbZ7hEAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28%28id%2C%20code%29%20%3D%3E%20%7B%0A%20%20%20%20var%20pref%20%3D%20%22CB.pasteIntoSearchBar%22%3B%0A%20%20%20%20var%20checker%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20val%20%3D%20Services.prefs.getBoolPref%28pref%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20this.checked%20%3D%20val%3B%0A%20%20%20%20%20%20%20%20var%20has%20%3D%20id%20in%20g%3B%0A%20%20%20%20%20%20%20%20val%20%3F%20has%20%7C%7C%20init%28%29%20%3A%20has%20%26%26%20destroy%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20Services.prefs.addObserver%28pref%2C%20checker%29%3B%0A%20%20%20%20this._handleClick%20%3D%20%28%29%20%3D%3E%20Services.prefs.setBoolPref%28%0A%20%20%20%20%20%20%20%20pref%2C%20%21Services.prefs.getBoolPref%28pref%2C%20false%29%0A%20%20%20%20%29%3B%0A%20%20%20%20var%20gs%20%3D%20%22Cu.getGlobalForObject%28Cu%29%22%2C%20g%20%3D%20eval%28gs%29%3B%0A%0A%20%20%20%20var%20psi%2C%20psd%2C%20fsi%2C%20fsd%2C%20receiver%2C%20vars%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20d%20%3D%20%22data%3A%2C%22%2C%20ref%20%3D%20gs%20+%20%22.%22%20+%20id%2C%20dref%20%3D%20d%20+%20ref%3B%0A%20%20%20%20%20%20%20%20psi%20%3D%20dref%20+%20%22%3D%22%20+%20encodeURIComponent%28code.replace%28%22%25MSG%25%22%2C%20id%29%29%3B%0A%20%20%20%20%20%20%20%20psd%20%3D%20d%20+%20%22delete%20%22%20+%20ref%3B%0A%20%20%20%20%20%20%20%20fsi%20%3D%20dref%20+%20%22.init%28this%29%22%3B%0A%20%20%20%20%20%20%20%20fsd%20%3D%20dref%20+%20%22.destroy%28this%29%22%3B%0A%20%20%20%20%20%20%20%20receiver%20%3D%20msg%20%3D%3E%20%7Btry%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20msg.target.ownerGlobal.windowRoot.ownerGlobal%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.BrowserSearch.searchBar._textbox.value%20%3D%20msg.data%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28ex%29%20%7B%7D%7D%0A%20%20%20%20%20%20%20%20vars%20%3D%20%28%29%20%3D%3E%20%7B%7D%0A%20%20%20%20%7D%0A%20%20%20%20var%20init%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20vars%28%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.loadProcessScript%28psi%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.loadFrameScript%28fsi%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20g%5Bid%5D.receiveMessage%20%3D%20receiver%3B%0A%20%20%20%20%20%20%20%20Services.mm.addMessageListener%28id%2C%20g%5Bid%5D%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20destroy%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20vars%28%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.removeDelayedFrameScript%28fsi%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.removeDelayedProcessScript%28psi%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.loadFrameScript%28fsd%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20Services.mm.removeMessageListener%28id%2C%20g%5Bid%5D%29%3B%0A%20%20%20%20%20%20%20%20Services.ppmm.loadProcessScript%28psd%2C%20false%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20checker%28%29%3B%0A%0A%20%20%20%20addDestructor%28reason%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20Services.prefs.removeObserver%28pref%2C%20checker%29%3B%0A%20%20%20%20%20%20%20%20reason%5B5%5D%20%3D%3D%20%22e%22%20%26%26%20id%20in%20g%20%26%26%20destroy%28%29%3B%0A%20%20%20%20%7D%29%3B%0A%7D%29%28%22CB_ButtonCodeFragmentIdentifier_PasteIntoSearchBar%22%2C%20%60%7B%0A%20%20%20%20init%28cfmm%29%20%7B%0A%20%20%20%20%20%20%20%20cfmm.addEventListener%28%22selectstart%22%2C%20this%29%3B%0A%20%20%20%20%20%20%20%20cfmm.addEventListener%28%22unload%22%2C%20this%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20destroy%28cfmm%29%20%7B%0A%20%20%20%20%20%20%20%20cfmm.removeEventListener%28%22selectstart%22%2C%20this%29%3B%0A%20%20%20%20%20%20%20%20cfmm.removeEventListener%28%22unload%22%2C%20this%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20handleEvent%28e%29%20%7B%0A%20%20%20%20%20%20%20%20this%5Be.type%5D%28e%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20selectstart%28e%29%20%7B%0A%20%20%20%20%20%20%20%20e.target.ownerGlobal.addEventListener%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mouseup%22%2C%20this%2C%20%7Bonce%3A%20true%7D%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20mouseup%28e%29%20%7B%0A%20%20%20%20%20%20%20%20var%20win%20%3D%20e.target.ownerGlobal%3B%0A%20%20%20%20%20%20%20%20var%20sel%20%3D%20win.getSelection%28%29%3B%0A%20%20%20%20%20%20%20%20sel%20%3D%20%21sel.isCollapsed%20%26%26%20sel.toString%28%29%3B%0A%20%20%20%20%20%20%20%20/%5C%5CS/.test%28sel%29%20%26%26%20win.docShell.messageManager%0A%20%20%20%20%20%20%20%20%20%20%20%20.sendAsyncMessage%28%22%25MSG%25%22%2C%20sel%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20unload%28e%29%20%7B%0A%20%20%20%20%20%20%20%20this.destroy%28e.target%29%3B%0A%20%20%20%20%7D%0A%7D%60%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано VORON (14-02-2024 18:59:05)

Отсутствует

 

№1704715-02-2024 18:12:49

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

VORON
Как странно, три custombutton:// ссылки, сцепленные, одинаковые, подряд.
Ссылки битые, с повреждённой процентной кодировкой. Повреждение в значении атрибута "name".
Совершенно непонятно откуда всё это взялось.


Попробуй удалить эту кнопку и создать новую, пустую.
Затем вытащи куда надо, и в CB-редакторе заполни текстовые поля вручную.
Сначала Инициализацию и Изображение.


Затем жмём кнопку (если она не в состоянии "checked"),
выделяем что-нибудь мышью на какой-нибудь простой странице,
и смотрим, появилось ли выделенное в SearchBar'е.


Далее уже попробовать заполнить Имя.

Отсутствует

 

№1704815-02-2024 19:49:16

VORON
Участник
 
Группа: Members
Зарегистрирован: 03-04-2013
Сообщений: 158
UA: Firefox 121.0

Re: Custom Buttons

Dumby
Всё, я опускаю руки.3 раза создавал новую,по твоей инструкции,реакции-0.В инициализацию же этот код вставлять?

Отсутствует

 

№1704917-02-2024 12:44:41

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 113.0

Re: Custom Buttons

Dumby
Вы бы не могли помочь если можно сделать чтобы со строки поиска, результат поиска открывался в новом контейнере с таким же названием как и введенный текст в строке поиска?

Отсутствует

 

№1705018-02-2024 08:12:43

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: Custom Buttons

Stkvsky

скрытый текст

Выделить код

Код:

(proto => {
	var ds = proto.doSearch;
	proto.doSearch = function(str, where, e, params) {
		if (where == "current") where = "tab";
		params.userContextId = ContextualIdentityService.create(str, "vacation", "purple").userContextId;
		ds.apply(this, arguments);
	}
	addDestructor(() => proto.doSearch = ds);
})(customElements.get("searchbar").prototype);

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]