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

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№62612-01-2023 12:28:49

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

unter_officer
Да, вижу. Можно вместо (или вместе с)

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

Выделить код

Код:

//
		var gBrowserBundle = {
			GetStringFromName: () => "Скопировано в буфер обмена!"
		};


подкинуть подобного же фейка, типа
скрытый текст

Выделить код

Код:

//
		var MozXULElement = {insertFTLIfNeeded() {}};
		var document = {l10n: {setAttributes: msg => msg.textContent = "Скопировано в буфер обмена!"}};


Ну, или править уже сам код для eval()

Отсутствует

 

№62712-01-2023 13:59:49

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 370
UA: Firefox 109.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby, большое спасибо!


«The Truth Is Out There»

Отсутствует

 

№62816-01-2023 18:11:45

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 296
UA: Firefox 109.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby посмотрите пожалуйста эти 2 кнопки что то они не работают в [firefox] 109.0

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

Выделить код

Код:

// Switch Keyboard Layout
try {(keybUtils => CustomizableUI.createWidget({
    type: "custom",
    id: "SwitchKeyboardLayout",
    onBuild(doc) {
        var btn = doc.createXULElement("toolbarbutton");
        btn.id = this.id;
        btn.label = btn.tooltipText = "Switch Keyboard Layout";
        btn.image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAk1BMVEX///8/Pz8BAQF8fHwJCQkCAgIJCQl8fHx9fX0AAABJSUkBAQENDQ0wMDBVVVUAAABra2t0dHR7e3thYWEBAQEAAAAAAAABAQEAAAAgICABAQEBAQH8/Pzw8PDp6en39/fj4+Pe3t41V9I/YeWKioqDg4N9fX0jRa8wUrVoaGhkhuxWeNx1dXVCZMhvb28kRqsqTL4KidXxAAAAHHRSTlMAAABndwAAAAA0blVZcm1naWhNa6hrcJ8AAKRU4jk/3gAAAHVJREFUeF6FyMUCwjAUBdEbaQupUMOjqMv/fx1dQN6yZ3aDcWnyw6ezoRWNYc15kqKQZCFlgTKQQwgllL/dn5f3+bPb+6P3CpWNw56srdCZOMzDmA61i8O9nKvRaHLVukEryFKIFtnkj7ENYxmNdd5v+5xj1BcJ/w9Kj6K7ZAAAAABJRU5ErkJggg==";

        btn.setAttribute("oncommand", "linkedObj.switch(document);");
        btn.className = "toolbarbutton-1 chromeclass-toolbar-additional";
        btn.linkedObj = this;
        return btn;
    },
    switch(doc) {
        var br = doc.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 def = "let{KeyEvent,HTMLInputElement,HTMLTextAreaElement}=Cu.getGlobalForObject(Services);";
        var url = `data:;charset=utf-8,${def}%0Athis.keybUtils=${encodeURIComponent(keybUtils)}`;
        Services.scriptloader.loadSubScript(url, this);
        var {id} = this;
        this.keybUtils.getFocusedElement = function(_subCall, _focusFixed) {
            var window = Services.focus.activeWindow, {document} = window;
            var button = document.getElementById(id);
            if(
                !_focusFixed
                && "closeMenus" in window
                && document.commandDispatcher.focusedElement == button
            ) {
                window.closeMenus(button);
                window.setTimeout(function(_this) {
                    _this.switchSelKeybLayout(_subCall, true);
                }, 0, this);
                return;
            }
            return document.commandDispatcher.focusedElement;
        }
        return this.keybUtils;
    }
}))(`{
    //== 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:

    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);
            var primary = c in this.convTableForward;
            if(primary ^ c in this.convTableBackward)
                return primary;
        }
        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.isInstance(x)) {
                    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;
		
        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", {bubbles: true, cancelable: true, ...e}
        ));
    },
    beh2cmd: { // Ctrl_Shift_VK
        false_true_36: "cmd_selectLinePrevious", // Shift+Home
    },
    insertText: function(ta, text) {
        //var editor = ta.QueryInterface(Components.interfaces.nsIDOMNSEditableElement).editor
        var editor = ta.editor
            .QueryInterface(Components.interfaces.nsIPlaintextEditor || Ci.nsIEditor);
        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);
    }
}`)} catch(ex) {Cu.reportError(ex);}

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

Выделить код

Код:

//переключение раскладки клавиатуры по F8
try {(id => {
    var listener = {
        get obj() {
            var obj = document.getElementById(id);
            if (obj) obj = obj.linkedObj;
            else {
                obj = Cu.import("resource:///modules/CustomizableUI.jsm", {})
                    .gPalette.get(id);
                if (obj) obj = obj.implementation;
                else {
                    Services.console.logStringMessage(id + " not found");
                    return this.destroy() || {switch() {}};
                }
            }
            delete this.obj; return this.obj = obj;
        },
        handleEvent(e) {
            if (e.key != "F8" || e.ctrlKey || e.shiftKey || e.altKey || e.repeat)
                return;
            //e.preventDefault();
            //e.stopPropagation();
            this.obj.switch(document);
        },
        destroy: function destroy() {
            removeEventListener("keydown", this, true);
            removeEventListener("unload", destroy);
        }
    };
    addEventListener("keydown", listener, true);
    addEventListener("unload", listener.destroy);
})("SwitchKeyboardLayout");} catch(ex) {Cu.reportError(ex);}

Отсутствует

 

№62916-01-2023 20:15:30

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

egorsemenov06

Dumby пишет

x instanceof *Element лучше заменить на *Element.isInstance(x)
Там три вхождения (поиск по «instanceof»).

Сделано не только неполно (только третье), да ещё и неправильно.

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

Выделить код

Код:

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


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

Отсутствует

 

№63016-01-2023 20:40:43

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 296
UA: Firefox 109.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

egorsemenov06

Dumby пишет

x instanceof *Element лучше заменить на *Element.isInstance(x)
Там три вхождения (поиск по «instanceof»).

Сделано не только неполно (только третье), да ещё и неправильно.

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

Выделить код

Код:

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


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

Спасибо большое!!!А что неправильно где не полно я так и не понял заработало и слава Dumby

Отсутствует

 

№63120-01-2023 15:46:08

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 34
UA: Firefox 78.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby, а вы не можете придумать способ, который позволял бы открывать закладки и историю в новой вкладке, когда открыта одна вкладка about:newtab..?  Т.е, если поподробнее, то сейчас, когда запускаю фокс, то открыта только вкладка about:newtab, и , если жмякнуть по закладке, например, в боковой панели, то она откроется в текущей вкладке, а не в новой. То же самое и с историей. Меня почему-то это сильно напрягает... нужно, чтобы about:newtab (она же домашняя с плитками)  не "затиралась", а оставалась "нетронутой". Привычка, может и вредная.

Добавлено 20-01-2023 16:14:11
Под способом, естественно, скрипт подразумевается, а не какие-нибудь клавиши и СКМ.

Отредактировано LGS (20-01-2023 16:14:11)

Отсутствует

 

№63220-01-2023 19:24:36

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1432
UA: Firefox 109.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS
https://forum.mozilla-russia.org/viewto … 05#p797605

Отредактировано kokoss (20-01-2023 19:25:18)


Win7

Отсутствует

 

№63320-01-2023 19:57:37

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 34
UA: Firefox 78.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

kokoss
Я это пробовал, и это - у меня не работает. Именно после запуска ФФ, когда еще ни одна закладка не открывалась и ничего не посещалось. В этом случае закладка или история откроются в текущей about:newtab вкладке. Если вернуться обратно на about:newtab, то уже  будет открываться в новых вкладках. Насколько я понял - нужна хотя бы одна посещенная вкладка, чтобы фокс начал открывать в новой вкладке. Может, Dumby что-нибудь придумает типа такого как здесь.

Отсутствует

 

№63420-01-2023 20:34:28

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 34
UA: Firefox 78.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Это тоже не сработало.

Отсутствует

 

№63520-01-2023 21:08:28

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1432
UA: Firefox 109.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS пишет

а вы не можете придумать способ, который позволял бы открывать закладки и историю в новой вкладке, когда открыта одна вкладка about:newtab..?  Т.е, если поподробнее, то сейчас, когда запускаю фокс, то открыта только вкладка about:newtab, и , если жмякнуть по закладке, например, в боковой панели, то она откроется в текущей вкладке, а не в новой. То же самое и с историей. Меня почему-то это сильно напрягает...

Этот -> https://forum.mozilla-russia.org/viewto … 05#p797605 скрипт так и работает, открывает( кроме дилов, в хотелке  про открытие дилов в новой вкладке нет) закладки и историю в новой вкладке + user_pref("browser.tabs.loadBookmarksInTabs", true);

Добавлено 20-01-2023 21:32:15

LGS пишет

у меня не работает. Именно после запуска ФФ, когда еще ни одна закладка не открывалась и ничего не посещалось. В этом случае закладка или история откроются в текущей about:newtab вкладке.

есть такое, тоже напрягает...

Отредактировано kokoss (20-01-2023 21:32:15)


Win7

Отсутствует

 

№63620-01-2023 21:39:18

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 34
UA: Firefox 102.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

kokoss пишет

Эти скрипты так и работают, открывают закладки и историю в новой вкладке + user_pref("browser.tabs.loadBookmarksInTabs", true);

Работают, если открыта хотя-бы одна вкладка. Если открыта только about:newtab (сразу после запуска фокса), то закладка или история откроются в текущей вкладке (в моем случае это about:newtab).
Вообщем, если не лень, то можно  воспроизвести:
1. Устанавливаем скрипт.
2. Запускаем ФФ.
3. Устанавливаем домашней страницей about:newtab.
4. Убираем (если включено) галку «Открыть предыдущие окна и вкладки» (или, в более старых версиях, «Восстанавливать предыдущую сессию».
5. Закрываем ФФ, запускаем снова. Фокс откроется с одной вкладкой (about:newtab).
6. Жмем, к примеру, закладку в боковой панели - она откроется в текущей вкладке, а не в новой.

Добавлено 20-01-2023 21:41:56

kokoss пишет

есть такое, тоже напрягает...

Ага, значит кое-как смог объяснить, что мне нужно...

Отредактировано LGS (21-01-2023 14:28:05)

Отсутствует

 

№63721-01-2023 09:17:32

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS пишет

когда запускаю фокс, то открыта только вкладка about:newtab

То есть, ты хочешь забрать эту вкладку себе,
чтобы в неё places-добро не грузилось?


Можно так попробовать, вроде не должно грузиться
пока в эту вкладку не будет загружено что-то другим образом.
Код для custom_script_win.js

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

Выделить код

Код:

(async place => {
	await gBrowserInit.idleTasksFinishedPromise;

	var tabs = gBrowser.visibleTabs;
	if (tabs.length > 1) return;

	var re = /^about:(?:newtab|home)$/;
	var [tab] = tabs, br = tab.linkedBrowser;

	if (re.test(br.currentURI.spec)) br.loadURI = function(url, params) {
		if (
			re.test(this.currentURI.spec) &&
			gBrowser.selectedBrowser == this &&
			Components.stack.formattedStack.includes(place)
		) {
			var e = window.event ||
				Services.focus.focusedWindow.event ||
				Services.wm.getMostRecentWindow("Places:Organizer")?.event;

			if (e) {
				var node, trg = e.target;

				if (trg.nodeName == "treechildren") node = trg.parentNode.selectedNode;
				else if (trg.id == "placesCmd_open") {
					var popup = trg.ownerDocument.getElementById("placesContext");
					node = popup._view.selectedNode || popup.triggerNode._placesNode;
				}
				else node = trg._placesNode;

				if (node) {
					PlacesUIUtils._openNodeIn(node, "tab", window);
					//gBrowser.selectedTab = tab; // force in background
					return;
				}
			}
		}
		delete this.loadURI;
		this.loadURI(url, params);
	}
})("_openNodeIn@resource:///modules/PlacesUIUtils.");

можно  воспроизвести

Не написано про галку «Открыть предыдущие окна и вкладки»
(или, в более старых версиях, «Восстанавливать предыдущую сессию»).


Кстати, можно прицепить что-нибудь к адресу, типа about:newtab#
тогда, вкладка с таким адресом, наверно, не будет рассматриваться как c «blank page url».
Не то же самое, что скрипт, но, при определённом раскладе, может представлять интерес.

Отсутствует

 

№63821-01-2023 11:57:55

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 34
UA: Firefox 78.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

Кстати, можно прицепить что-нибудь к адресу, типа about:newtab#
тогда, вкладка с таким адресом, наверно, не будет рассматриваться как c «blank page url».
Не то же самое, что скрипт, но, при определённом раскладе, может представлять интерес.

Скрипт почему-то не зашел, а вот ваша мысль про about:newtab# пришлась очень кстати. Назначил домашней about:newtab# - теперь открывает как мне надо в новой вкладке. Единственное, пришлось стили подправить, которые завязаны были на about:newtab, но это мелочи.
Большое спасибо!

Скрипт заработал... из custom_script_all_win.js.

Отредактировано LGS (21-01-2023 16:30:51)

Отсутствует

 

№639Сегодня 10:10:13

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 370
UA: Firefox 109.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby
Возможно ли сделать кнопочку - удалить (очистить) сессию.


«The Truth Is Out There»

Отсутствует

 

Board footer

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