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

Общайтесь со знакомыми и друзьями в нашей группе в Контакте.

№5102-10-2023 23:45:35

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

Re: userChrome.js

rubel пишет

скачивается файл размером 159 кб. А раньше я качал этот файл размером 13 кб.

SingleHTML.0.png

rubel пишет

Это поправимо ?

Да конечно, этот файл весит всего 11,9 KB, и его можно забрать здесь
Рекомендую, перезагрузить ваше устройство с полной переустановкой системы, на макос это делается так...


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

На форуме

 

№5203-10-2023 00:23:39

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

Re: userChrome.js

rubel пишет

Да, глючит этот скрипт с загрузкой метод Aris-t2  и метод Endor8, хотя в UCF работает прекрасно.

хотя рекомендую, хотя в UCF работает прекрасно


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

На форуме

 

№5303-10-2023 01:09:38

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 476
UA: unknown 0.0

Re: userChrome.js

Видимо, UCF скрипты в неизменном виде нормально работать не будут.
Кроме того, один SingleHTML.jsm мало полезен! Из меню запускать скрипт неудобно.
Нужен ucf_hookClicks.js, чтобы сохранять страницы по клику на кнопке Загрузки или по сочетанию клавиш.


Farby пишет

Рекомендую, перезагрузить ваше устройство с полной переустановкой системы, на макос это делается так...

Это шутка? Только винда требует перестановки при различных глюках системы. МакOS, также как Линукс, не имеет таких недостатков.

Отредактировано Dobrov (03-10-2023 01:15:07)

Отсутствует

 

№5403-10-2023 04:19:25

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: userChrome.js

Farby

Да конечно, этот файл весит всего 11,9 KB, и его можно забрать здесь...

Его и использую сейчас.
Dobrov

Ясно. Может быть уважаемый Dumby поможет в этом вопросе. Подождем.

Отсутствует

 

№5503-10-2023 04:47:45

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 476
UA: Firefox 118.0

Re: userChrome.js

rubel - под [System Principal] есть много полезных .
Переделка UCF и CustomButtons скриптов под userChrome.js не гарантирует их правильную работу. Может лучше установить UCF ???

Отсутствует

 

№5603-10-2023 05:29:46

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: userChrome.js

Dobrov
Дело в том, что UCF уже давно не обновляется автором. А искать его исправленную версию разными умельцами под новые выпуски Firefox тот ещё гемморой. Как то так.
Хотя я его использую на 91esr и на тестовой 115esr.

Отсутствует

 

№5703-10-2023 08:32:41

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

Re: userChrome.js

rubel пишет

Открываю  Firefox, открываю вкладку, на ней скрипт работает. Можно сохранить. Открываю вторую вкладку, на ней скрипт не работает.

Хмм :/, я вижу это. Слетает хром-регистрация.
Она и должна слетать, а чтобы не слетала нужно где-то сохранить на неё ссылку.
И так и сделано, ссылка добавлена в ucfBox, но это, почему-то, не помогает.


Перенёс ссылку из ucfBox'а в конфигский сандбокс, и теперь, вроде, не слетает.
Вобщем, попробуй заменить sb[Symbol()] на globalThis[Symbol()]

Отсутствует

 

№5803-10-2023 09:26:19

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 476
UA: Firefox 118.0

Re: userChrome.js

rubel пишет

Дело в том, что UCF уже давно не обновляется автором. А искать его исправленную версию разными умельцами под новые выпуски Firefox тот ещё гемморой.

UCF (по ссылке в родной теме) работает на версиях Firefox 78-118.
посмотрел код поддержки методов Aris-t2 и Endor8. По моему, их качество проигрывают по сравнению с UCF,
да и обновлялись они в 2018 году, а UCF на 2 года новее.

Отсутствует

 

№5903-10-2023 10:34:07

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: userChrome.js

Dumby

Вобщем, попробуй заменить sb[Symbol()] на globalThis[Symbol()]

Заменил, теперь скрипт прекрасно заработал на всех открытых вкладках, как и в UCF !
Спасибо Вам за ваше внимание. :)
Dobrov
Вам тоже спасибо.

Отсутствует

 

№6004-10-2023 09:54:05

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 130
UA: Firefox 119.0

Re: userChrome.js

Dobrov пишет

посмотрел код поддержки методов Aris-t2 и Endor8. По моему, их качество проигрывают по сравнению с UCF,

Они просты, они работают, а ucf это целый комплекс, досконально разбирающихся в нем дай бог чтобы с десяток нашелся, вследствие чего при любом катаклизме все мольбы к Dumby, и в те моменты оба форума забиты постами, почему перестало работать.

Dobrov пишет

да и обновлялись они в 2018 году, а UCF на 2 года новее.

А нужны ли обновления ради обновлений? Aris-t2 держит руку на пульсе, свои скрипты регулярно обновляет, проблемы с ними и с активацией практически отсутствуют, в поддержании работоспособности при смене версий браузера практически не нуждается, вроде больше ничего и не надо. Скрипты этих двух товарищей очень популярны среди иноязычных пользователей, и они совсем ничего не знают о ucf, такое сложилось мнение.
В конечном счете у юзера есть альтернативный выбор, каждый возьмет, что его устроит.

Отсутствует

 

№6104-10-2023 12:30:55

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: userChrome.js

Dumby
Вот здесь Вы мне помогли со скриптом google-translate.js.
Возможно ли его сделать для загрузчика метода Endor8.?
Сейчас в контекстном меню появляется пункт Перевод из буфера, да и он не работает.
977e376bb9c8c3671ee43b986758cdf6.png 
Код скрипта google-translate.js там .

Скрипт google-translate-loader.js у меня сейчас такой:

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

Выделить код

Код:

({
	async init() {
		await delayedStartupPromise;
		var code = Cu.readUTF8URI(Services.io.newURI(
			"chrome://scripts/google-translate.js"
		));
		var addEventListener = (...args) => {
			var trg = args[3];
			if (!trg) trg = args[3] = window;
			trg.addEventListener(...args);
			this.handlers.push(args);
		}
		new Function(
			"_id,xhtmlns,addDestructor,addEventListener,gClipboard", code
		).call(
			this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml",
			() => {}, addEventListener, {read: () => readFromClipboard()}
		);
		addEventListener("unload", this, {once: true});
	},
	handlers: [],
	handleEvent() {
		for(var args of this.handlers)
			args.pop().removeEventListener(...args);
		delete this.handlers;
	}
}).init();

Отсутствует

 

№6204-10-2023 14:05:22

6e73epo
Участник
 
Группа: Members
Зарегистрирован: 06-05-2022
Сообщений: 207
UA: Firefox 118.0

Re: userChrome.js

Dumby, на счет urlbar-memory-indicator заметил, что в 117 звездочка была левее индикатора, как в 118.0 - не знаю, а в 118.0.1 уже правее, причем без разницы - after или before
win.document.getElementById("star-button-box").after(clone);
Пока поправил стилем

Отсутствует

 

№6304-10-2023 22:22:22

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

Re: userChrome.js

rubel пишет

Возможно ли его сделать для загрузчика метода Endor8.?
Сейчас в контекстном меню появляется пункт Перевод из буфера, да и он не работает.
Скрипт google-translate-loader.js у меня сейчас такой

Это что ещё такое: «chrome://scripts/google-translate.js»?
Даже если бы метод Endor8 содержал какую-то свою хром-регистрацию,
а он не содержит, то такой адрес просто невозможен сам по себе.
Да и зачем это вообще, можно ведь прямо из файла читать.


И, нужно говорить где у тебя эти файлы лежат и что прописано в userChrome.js
а то непонятно. Такой google-translate-loader.js работать не может,
но какой-то пункт появляется, значит google-translate.js в авто-папке лежит,
а это неправильно, нужно либо сменить расширение, либо положить в другую папку.


Ладно, вот совмещённый вариант. Не слишком оптимально, зато гадать не надо.

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

Выделить код

Код:

location.href.endsWith("://browser/content/browser.xhtml") && ({
	async init(func) {
		await delayedStartupPromise;
		var code = func.toString();
		code = code.slice(code.indexOf("{") + 1, -1).trim();

		var addEventListener = (...args) => {
			var trg = args[3];
			if (!trg) trg = args[3] = window;
			trg.addEventListener(...args);
			this.handlers.push(args);
		}
		new Function(
			"_id,xhtmlns,addDestructor,addEventListener,gClipboard,LOG", code
		).call(
			this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml",
			() => {}, addEventListener, {read: readFromClipboard}, Cu.reportError
		);
		window.addEventListener("unload", this, {once: true});
	},
	handlers: [],
	handleEvent() {
		for(var args of this.handlers)
			args.pop().removeEventListener(...args);
		delete this.handlers;
	}
}).init(() => {

	// Здесь код google-translate.js

});

Код скрипта google-translate.js там .

Там loadURI(url, торчит, надо заменить, например, на fixupAndLoadURIString(url,


Ещё вот этот кусок совсем какой-то левый, возможно так подойдёт

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

Выделить код

Код:

/*
((id, g) => addDestructor(reason => id in g && g[id].destroy(reason)) || id in g || ({
    actions: [{
        title: "Перевод из буфера",
        tooltip: "Перевод из буфера",
        iconURL: gticon,
     
        id: "TranslateBufer1",
        _insertBeforeActionID: "copyURL",
        
     // onCommand: (e, btn) => e.view.BrowserReloadOrDuplicate(e)
        onCommand: (e, btn) => ujs_google_translat('auto|ru')
    }],
    init() {
        g[id] = this;
        this.actions = this.actions.map(action => {
            action.extensionID = "custombuttons@xsms.org";
            return g.PageActions.addAction(new g.PageActions.Action(action));
        });
    },
    destroy(reason) {
        if (reason[5] != "e") return;
        delete g[id];
        for(var action of this.actions) action.remove();
    }
}).init())(
    "CBPageActionsMaker", Cu.import("resource:///modules/PageActions.jsm", {})
);
*/
(id => {
    var action = PageActions.actionForID(id);
    if (!action) {
        var obj = {id, iconURL: gticon, onCommand(e) {this[e.view.browsingContext.id]("auto|ru");}};
        obj.title = obj.tooltip = "Перевод из буфера";
        action = PageActions.addAction(new PageActions.Action(obj));
    }
    action[id = browsingContext.id] = ujs_google_translat;
    addEventListener("unload", () => delete action[id]);
})("TranslateBufer1");


Может ещё что-то вылезет, надо смотреть.
Кстати, перетаскивание окошка «Google Translate» показалось мне
слегка глюковатым, сделал такую замену
скрытый текст

Выделить код

Код:

/*
            var grabX = e.clientX, grabY = e.clientY, origX = parseInt(w.style.left), origY = parseInt(w.style.top);
            var mouseMove = function(ev){
                w.style.left = origX+ev.clientX-grabX+'px';
                w.style.top = origY+ev.clientY-grabY+'px';
            };
*/
            var st = w.style;
            var mouseMove = e => {
                st.top = parseInt(st.top) + e.movementY + "px";
                st.left = parseInt(st.left) + e.movementX + "px";
            }

6e73epo пишет

заметил, что в 117 звездочка была левее индикатора, как в 118.0 - не знаю, а в 118.0.1 уже правее

Странно, я попробовал на 117 добавить код в custom_script_win.js по событию "load",
и у меня звёздочка справа от индикатора.
Добавляется то всё правильно, а затем инициализируется модуль PageActions
и переставляет звёздочку в конец.


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

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

Выделить код

Код:

/*
			(this.init = win => {
*/
			(this.init = async win => {
				await win.delayedStartupPromise;

Отсутствует

 

№6405-10-2023 05:36:28

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: userChrome.js

Dumby

Ладно, вот совмещённый вариант.

Все сделал как Вы сказали, сделал все правки, работает прекрасно.
В userChrome.js прописано так:

Выделить код

Код:

userChrome.import("scripts", "UChrm");

Поместил его в папку с остальными скриптами.
Огромное спасибо Вам за помощь !
Вот такой у меня сейчас google_translate.js

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

Выделить код

Код:

location.href.endsWith("://browser/content/browser.xhtml") && ({
	async init(func) {
		await delayedStartupPromise;
		var code = func.toString();
		code = code.slice(code.indexOf("{") + 1, -1).trim();

		var addEventListener = (...args) => {
			var trg = args[3];
			if (!trg) trg = args[3] = window;
			trg.addEventListener(...args);
			this.handlers.push(args);
		}
		new Function(
			"_id,xhtmlns,addDestructor,addEventListener,gClipboard,LOG", code
		).call(
			this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml",
			() => {}, addEventListener, {read: readFromClipboard}, Cu.reportError
		);
		window.addEventListener("unload", this, {once: true});
	},
	handlers: [],
	handleEvent() {
		for(var args of this.handlers)
			args.pop().removeEventListener(...args);
		delete this.handlers;
	}
}).init(() => {

	// Здесь код google-translate.js

//Google,
var langFrom_google_text = "auto";//авто
var langTo_google_text = "ru"; 

      
//Назначаем иконки
var mainicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUKM9VkSFOhFEQg799/CjEihWAwKDgIFwAyWHgLDjuAGfZgMCQDQkG8abtQ/z8u9A0k4rOTCez2u0GB0gCsLELbCuxLduJy0zAZgOQBBqQALEbtOQoyRgjSZLt9nOaJyf5K2zPjr01SWst8ermZtzd5euLhCQ2Y9iOHXssIvZYr1f39x/T87Ourtr7O3ZUyK6KlN5HVRaOqlxcNGACJKRItigdHFXpFdXoPVWRGmSac0suRYWUWhz7zt5/BXh65Pi6Hr7rI/IopZyqpSqldLsq9onPX3iabuHYr6o3pCVHP2Sa11nIzZdnMAmOSpyejiocVEhtjrwc15L5l4HVDgReCGTR+V9n/AAByma0J+vVwwAAAABJRU5ErkJggg==";
var gticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADKElEQVR42p2TX2hTdxTHPzfJTW6T3qQmapvWabUbog+udp3kYeLQ4f6wiZQNtjlXHyZaBYe6TekYVGRQYexFscOtuD7UdWxzMtAXEbZStKIbDsaUCbVj9o8mTW+aNrlJbu5vJ8Ex2OMO/Lj87jnne873nO9PSyTV3tkAfYi5NhQ1MB1Ijc3ijN+D7CQh28YK+GHDMyxpjlJTkmAdQi5dWvOsUrYkGB5QC5Kcg/aFBxxqqycmcY38a/1yTqYgMw8ByfFKjtZ4V6myCeW8IApyfOw2155fw1DG4dOJJK1r45x5BPDUpZuMr2uXSuAvgBMQgOitjLJNn7iDSJP0rIJ35dt19TeGoi0Es1MMP72KFvm3+88phuYM3HCd3ObQizpa/cW7Kh020E0Tz1yOUxvjdIr7o6t/cLpkEJqZp7s5zN62ZewfnWLQ9VIIBqodBdI5tIbBG8oKhSAaJZDN8tpSP5+3L8eVgLbeAdKal7NH3mKL3FcOXCfV1ITjc7FLFrWZIlpt/4+qEA7hLRrCwk/RusOXu7ax8xHvGTkVgi/89As/T8ia9EUyghKOWSaYyqNx8oIiuEgcshetsooceibJinvTfNH1DpseD3LHSZE4eprs6k24NQaevI1fF8q5FJqv9xvlmFLdkKZlhb77E8TdIlFD54OOl3mzdXm1k+sP0jzbdwF7cRhsj8ysAWYnpYPeQfXPnn3JJG8/sZT+PW8gkuDbkWEiRh3b29dV/edujNE5dB4nHJSCUrQsTdP9mUKrCKHA5piHK+918quVp/VoD9W9uhGejNRx6+N9VZAmoTJZmhbK4vR7BGDPCQEQ/qU8R15aT2/Hi/R8PcyxyyMyVBmaXwIfPiTVf5yYHiF28ARpOyuqk3nJ4DV2HFc4SamUZ3vrGr7vPlitFNraQc4SzZZt6ptWMv3DAOdGrrGj7yvR+2KYr5A0BeCVAwqvBQuyMG+MTzp3cvj15/ivfXfzNq++/yFEIlD7GFjZ6uPRaE4oGuNQI68jIINJu0QbTFoadIJlL7lSgb8sxbSVEb8geUUVtkh55r50MY5Wec6jibV9/A9LjP7e9TdFQScjW9P1XAAAAABJRU5ErkJggg==";


function GetXmlHttpObject(){
         if (window.XMLHttpRequest){ return new XMLHttpRequest();}
         if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP");}
        return null;
        };

var lc = navigator.lastClick = {};
addEventListener("mouseup", e => {
    if (e.button) return;
    lc.X = e.screenX - mozInnerScreenX;
    lc.Y = e.screenY - mozInnerScreenY;
}, false, gBrowser.tabpanels || 1);

var createWindow = function(text, status, title, id, pos, size){
var win = window, doc = win.document, wId = 'ujs_window'+(id || ''), w = doc.getElementById(wId);
    var keyDown = function(e){if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 27)doc.getElementById(wId).closeWin()};
    if(w)w.closeWin();
    w = doc.createElementNS(xhtmlns, 'div');
     w.setAttribute('style', 'position:fixed;display:block;visibility:hidden;left:0;top:0;width:auto;height:auto;border:1px solid gray;padding:2px;margin:0;z-index:99999;overflow:hidden;cursor:move;'+(typeof w.style.borderRadius === 'string' ? 'background-color:#eaeaea;padding-top:0px;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);' : 'background:-o-skin("Window Skin");'));
    w.id = wId;
    w.closeWin = function(){
        doc.removeEventListener('keydown', keyDown, false);
        this.parentNode.removeChild(this);
    };
    w.addEle = function(str, style){
        var ele = doc.createElementNS(xhtmlns, 'div');
        ele.setAttribute('style', style);
        if(str){
            ele.innerHTML = str;
            for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
                el = all[i];
                if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
                    el.parentNode.removeChild(el);
                }
                else{
                    for(var att = el.attributes, j = att.length; j--;){
                        if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
                    }
                }
            }
        };
        return this.appendChild(ele);
    };
     w.addEle1 = function(str, style){
        var ele = doc.createElementNS(xhtmlns, 'textarea');
        ele.setAttribute('style', style);
        if(str){
            ele.innerHTML = str;
            for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
                el = all[i];
                if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
                    el.parentNode.removeChild(el);
                }else{
                    for(var att = el.attributes, j = att.length; j--;){
                        if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
                    }
                }
            }
        };
        return this.appendChild(ele);
    };
    var img = doc.createElementNS(xhtmlns, 'div');
    img.setAttribute('style', 'display:block;float:right;width:16px;height:16px;padding:0;margin-top:2px;margin-right:1px;border:none;cursor:pointer;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQUlEQVR4Xm2SPUhbURTHfzfNJ4nU0Axx7CJCN2kQtIgVCtq6OdQuBUftWIQqFNsKDo6iHTqIqN3a0kklUKTS2AZrcOjioFtRjFWUfH+803cS9GHwB4dzcu75/+8L9xgaSEDbLXhaASzAyXAMn5/DHxwwjeJgKLRxd3Q0atxuLhGgWqmQmp9PJ7LZJ5Ow3WhQFweDG20LC1FfRwc3kUsm+T48fPIzl3s8VTdxxLt+/2FhdlZkc1MkmdR8Pba2ajlrz3z1+9OvIOaIfb7DwsSEyNKSyM6OSLksEo/rbw2ttadntV7Gnv3k86VfqskvmDzv7hZ580Zkelrk4kJqFIsii4satVrRs+rYmBQHBuRvS4u8g/fuCmDOz+HgAIWpKRgfh3AYhoZQ8Hqxjo4o9PdT3d1FcQEl8KoBnJ7C/j6KZkZGYG4OIhEUFed7erD29q69jGrd1qVBqcQVKgwEuMSEQhjtXRk4JvW/kM1i2WGMga4uzMoKBIOIfbNiolEC6+uU+/qQRALFA1QBlwVYxmBcLmhuxqytQSgEKu7t1dBavwKvbeINh/Has2IMqnXpem4bky6qWLdvZgaOj2FwEHNyoqG19vRMZ8jZs1+NOfsNcZS3EFvzeNL51laRe/dEYrFadsLpZeyZDx7P6QN4Btwx1OE1xO4HAquP2tsjAZ+Pm8gWi3xMpc6W8/kXPyAO/DM4oOsZa2pafdjZGXF7PAgOpXKZL4nE2XImcyUGMDSg63kbhgvgtYCq8+akIL4J3y7Fyn+DokZOnLlMyQAAAABJRU5ErkJggg==");background:-o-skin("Caption Close Button Skin");');
    img.title = (win.navigator.language.indexOf('ru') == 0) ? '\u0417\u0430\u043A\u0440\u044B\u0442\u044C' : 'Close';
    img.addEventListener('click', function(){this.parentNode.closeWin()}, false);
    w.appendChild(img);
    var title = w.addEle(title, 'display:table;color:#000;font:17px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
        title.onclick = e => {
        e.preventDefault();
        var url = e.target.href;
        // Здесь открываем url как хотим.
        var ctabpos = gBrowser.selectedTab._tPos +1;
        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
        doc.getElementById(wId).closeWin();    
    }
    var cnt = w.addEle1(text, 'display:block;border:1px solid #aaa;padding-bottom:3px;padding-left:3px;background-color:#fafcfe;color:#000;font:17px Times New Roman;width:310px;height:160px;overflow:auto;cursor:text;-moz-user-focus:normal;-moz-user-select:text;');
    cnt.contentEditable="true";
    cnt.context="contentAreaContextMenu";
    w.addEle(status, 'display:table;font:12px Times New Roman;font-weight:bold;color:blue;width:auto;height:auto;padding-top:2px;margin:0 3px;cursor:pointer;');
    w.addEventListener('mousedown', function(e){
        if(e.target == w){
            e.preventDefault();
            var st = w.style;
            var mouseMove = e => {
                st.top = parseInt(st.top) + e.movementY + "px";
                st.left = parseInt(st.left) + e.movementX + "px";
            }
            doc.addEventListener('mousemove', mouseMove, false);
            doc.addEventListener('mouseup', function(){doc.removeEventListener('mousemove', mouseMove, false)}, false);
        }
    }, false);
    doc.documentElement.appendChild(w);
  
    if(size){
        cnt.style.height = size.height;
        cnt.style.width = size.width;
    }
    else{
        for(var i = 3; i < 10; i++){
            if(cnt.scrollHeight > cnt.offsetHeight || cnt.scrollWidth > cnt.offsetWidth){
                cnt.style.height = 80*i+'px';
                cnt.style.width = 160*i+'px';
            }
            else break;
        }
    };

    var docEle = (doc.compatMode == 'CSS1Compat' && win.postMessage) ? doc.documentElement : doc.body;
    var mX = docEle.clientWidth-w.offsetWidth, mY = docEle.clientHeight-w.offsetHeight;
    if(mX < 0){cnt.style.width = parseInt(cnt.style.width)+mX+'px'; mX = 0};
    if(mY < 0){cnt.style.height = parseInt(cnt.style.height)+mY+'px'; mY =0};
    var hW = parseInt(w.offsetWidth/2);
    w.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px';
    w.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px';
    w.style.visibility = 'visible';
    doc.addEventListener('keydown', keyDown, false);
    return w;
};

var getHash = function (txt) {
    TKK=eval('((function(){var a\x3d817046147;var b\x3d-335196159;return 410049+\x27.\x27+(a+b)})())');
    function sM(a) {
        var b;
        if (null !== yr)
            b = yr;
        else {
            b = wr(String.fromCharCode(84));
            var c = wr(String.fromCharCode(75));
            b = [b(), b()];
            b[1] = c();
            b = (yr = window[b.join(c())] || "") || ""
        }
        var d = wr(String.fromCharCode(116))
            , c = wr(String.fromCharCode(107))
            , d = [d(), d()];
        d[1] = c();
        c = "&" + d.join("") + "=";
        d = b.split(".");
        b = Number(d[0]) || 0;
        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var l = a.charCodeAt(g);
            128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 == (l & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023),
                e[f++] = l >> 18 | 240,
                e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224,
                e[f++] = l >> 6 & 63 | 128),
                e[f++] = l & 63 | 128)
        }
        a = b;
        for (f = 0; f < e.length; f++)
            a += e[f],
                a = xr(a, "+-a^+6");
        a = xr(a, "+-3^+b+-f");
        a ^= Number(d[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return c + (a.toString() + "." + (a ^ b))
    }

    var yr = null;
    var wr = function(a) {
        return function() {
            return a
        }
    }
        , xr = function(a, b) {
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2)
                , d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d)
                , d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
            a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
        }
        return a
    };

    return sM(txt);
};

//----------Перевести  текст  из буфера в окне Google------------
var ujs_google_translat = function (dir){
   var lng = 'ru';
   var txt = gClipboard.read(); 
   var l = dir.split('|');
   var encTxt = encodeURIComponent(txt);
   var winWait = function(lng){createWindow('', (lng == 'ru' ? 'Подождите идет перевод' : 'Wait, is going Translating')+'\u2026', 'Google Translate', '_gt', window.navigator.lastClick)};
    if (txt) {
    winWait(lng);
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        var urlt = "http://translate.google.com/translate_t?text="+encTxt+"&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&ujs=gtt";
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />"));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                  //  result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();

                    createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', window.navigator.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
    };
};



//----------Перевести выделенный текст в окне Google------------
function ujs_google_translate (){
    var lng = 'ru';
    var txt = gContextMenu.selectionInfo.fullText;
    var encTxt = encodeURIComponent(txt);
    var winWait = function(lng){createWindow('', (lng == 'ru' ? 'Подождите идет перевод' : 'Wait, is going Translating')+'\u2026', 'Google Translate', '_gt', window.navigator.lastClick)};
    if (txt) {
    winWait(lng);
        var xhr = new XMLHttpRequest();
       // var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + langFrom_google_text + '&tl=' + langTo_google_text + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        var urlt = "http://translate.google.com/translate_t?text="+encTxt+"&sl='  + langFrom_google_text + '&tl=' + langTo_google_text +'&hl=' + lng + '&eotf=0&ujs=gtt";
      
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />"));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                   // result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    //status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();
                     status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + langTo_google_text.toUpperCase();
                     createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', window.navigator.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
     };
};


//----------Заменить текст переводом Google------------
function ujs_google_TexReplace() {
    var lng = 'ru';
    var txt = gContextMenu.selectionInfo.fullText;
    if (txt) {
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + langFrom_google_text + '&tl=' + langTo_google_text + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
       
           function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open('POST', url, true);
           xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
           xmlhttp.send('q=' + encodeURIComponent(txt));
        }
        function stateChanged() {
            
           if (xmlhttp.readyState == 4 ) {
           var result = '';
           var data = JSON.parse(xmlhttp.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />"));
           for(var i = 0, n; n = data[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
        var msgName = _id + ":ReplaceSelectionRangeAt0";
        var url = "data:," + encodeURIComponent(
       `addMessageListener("${msgName}", function listener(msg) {
        removeMessageListener("${msgName}", listener);
        var win = {};
        Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager)
            .getFocusedElementForWindow(content, true, win);

        var sel = win.value.document.getSelection();
        if (sel.isCollapsed) return;
        var range = sel.getRangeAt(0);
        range.deleteContents();
        range.insertNode(range.createContextualFragment(msg.data));
    });`
);
function replace(tagString) {
    var mm = gBrowser.selectedBrowser.messageManager;
    mm.loadFrameScript(url, false);
    mm.sendAsyncMessage(msgName, tagString);
}
replace('<span>'+result+'</span>');
                }
        }  
        gettransdata();
    } 
};



//--------Перевести страницу с Google--------------
function ujs_googlePage_translate() {
   var urlt = gBrowser.currentURI.spec;  
   var url = "http://translate.google.com/translate?hl=ru&sl=auto&tl=ru&u="+ encodeURIComponent(urlt) + "&sandbox=1";
   gBrowser. fixupAndLoadURIString(url, {
   triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};


//Контекстное меню для перевода из буфера-------------------------------------------  

(function () {
 if ( document.getElementById("TranslateBufer") ) return; 
 var contextMenu = document.getElementById("contentAreaContextMenu");  
 var Item = document.createXULElement("menuitem");
       Item.setAttribute("Id", "TranslateBufer");
       Item.setAttribute("label", "Перевод из буфера");
       Item.setAttribute("class", "menuitem-iconic");
       Item.setAttribute("image", mainicon);
       Item.addEventListener("command", function(){ujs_google_translat('auto|ru')}, false);

    contextMenu.insertBefore(Item, document.getElementById("context-viewpartialsource-selection") ); 
    addDestructor(function() { contextMenu.removeChild( Item ) });
 })();

  (id => {
    var action = PageActions.actionForID(id);
    if (!action) {
        var obj = {id, iconURL: gticon, onCommand(e) {this[e.view.browsingContext.id]("auto|ru");}};
        obj.title = obj.tooltip = "Перевод из буфера";
        action = PageActions.addAction(new PageActions.Action(obj));
    }
    action[id = browsingContext.id] = ujs_google_translat;
    addEventListener("unload", () => delete action[id]);
})("TranslateBufer1");

 //Контекстное меню для перевода страниц-------------------------------------------  

(function () {
 if ( document.getElementById("TranslatePage") ) return; 
  
  var menu = document.createXULElement("menu");  
  var menuPopup = document.createXULElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu");  
  
    menu.id = "TranslatePage";
    menu.setAttribute("label", "Перевести страницу");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", mainicon);
   
  contextMenu.insertBefore(menu, document.getElementById("context-viewsource") ); 
  menu.appendChild( menuPopup );
  addDestructor(function() { contextMenu.removeChild( menu ) }); 

    var array = [
        {label:"Google", func: ujs_googlePage_translate, image:gticon},
        
        
        ];
        
   array.forEach(function( m ) {  
       if ( "separator" in m ) { menuPopup.appendChild( document.createXULElement("menuseparator") ); return };
       var mItem = document.createXULElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.image);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );

       });
   
     addEventListener("popupshowing", function() {
     menu.hidden = gContextMenu.isTextSelected || gContextMenu.onImage || gContextMenu.onTextInput ; 
  }, true, contextMenu );
})();



 //Контекстное меню для перевода текста-------------------------------------------  
(function () {
 if ( document.getElementById("TranslateSelected") ) return; 
  
  var menu = document.createXULElement("menu");  
  var menuPopup = document.createXULElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu");  
      
    menu.id = "TranslateSelected";
    menu.setAttribute("label", "Перевести выделенный текст");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", mainicon);

  contextMenu.insertBefore(menu, document.getElementById("context-viewpartialsource-selection") ); 
  menu.appendChild( menuPopup );
  addDestructor(function() { contextMenu.removeChild( menu ) });
     
    
  var array = [
        {label:"В окне Google", func: ujs_google_translate, image:gticon},
       
        { separator: ''},
        {label:"Заменить текст переводом Google", func: ujs_google_TexReplace, image:gticon},
        
        
        
              ];
  array.forEach(function( m ) {  
        if ( "separator" in m ) { menuPopup.appendChild( document.createXULElement("menuseparator") ); return };
       var mItem = document.createXULElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.image);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );
       });
 
     addEventListener("popupshowing", function() {
     menu.hidden = !gContextMenu.isTextSelected; 
  }, false, contextMenu ); 
 })();


});

Отсутствует

 

№6506-10-2023 10:39:01

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: userChrome.js

Dumby
А можно ли адаптировать кнопку Attributes_Inspector для загрузчика метода Endor8.?
Сейчас, если его поместить в папку со всеми скриптами и запустить браузер, то он сразу запускается и можно смотреть атрибуты. Кнопка не создается.

Отсутствует

 

№6606-10-2023 18:13:32

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

Re: userChrome.js

rubel пишет

Dumby
А можно ли адаптировать кнопку Attributes_Inspector для загрузчика метода Endor8.?
Сейчас, если его поместить в папку со всеми скриптами и запустить браузер, то он сразу запускается и можно смотреть атрибуты. Кнопка не создается.

Ну, например, переименовываешь его в AttributesInspector.txt (txt, не js),
и кладёшь рядом скрипт, который создаст кнопку.

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

Выделить код

Код:

(async (cui, id, self) => cui?.getWidget(id)?.provider != "api" && cui.createWidget(self = {
	id, label: "Attributes Inspector", localized: false,
	onCreated(btn) {
		btn._handleClick = this.click;
		btn.setAttribute("tooltiptext", this.label);
		btn.onmouseenter = btn.onmouseleave = this.onmouse;
		btn.image = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf///////////9EAKf/RACn/0QAp////////////0QAp///////////////////////RACn/0QAp/9EAKf/RACn////////////RACn/0QAp/9EAKf///////////9EAKf//////////////////////0QAp/9EAKf/RACn/0QAp////////////0QAp/9EAKf/RACn////////////RACn/0QAp////////////0QAp/9EAKf/RACn/0QAp/9EAKf///////////9EAKf/RACn/0QAp////////////0QAp/9EAKf///////////9EAKf/RACn/0QAp/9EAKf/RACn//////////////////////////////////////9EAKf/RACn////////////RACn/0QAp/9EAKf/RACn/0QAp///////////////////////////////////////RACn/0QAp////////////0QAp/9EAKf/RACn/0QAp/9EAKf///////////9EAKf/RACn/0QAp////////////0QAp/9EAKf///////////9EAKf/RACn/0QAp/9EAKf/RACn////////////RACn/0QAp/9EAKf///////////9EAKf/RACn////////////RACn/0QAp/9EAKf/RACn/0QAp/////////////////9EAKf/RACn////////////RACn/0QAp////////////0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/////////////////////////////////0QAp/9EAKf///////////9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf//////////////////////0QAp/9EAKf//////////////////////0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp////////////0QAp/9EAKf/RACn//////////////////////9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==";
	},
	click() {
		(this._handleClick = new this.ownerGlobal.Function(self.code).bind(this))();
	},
	get code() {
		delete this.code;
		var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
		["scripts", "AttributesInspector.txt"].forEach(file.append);
		return this.code = "this.focusedWindow && this.focusedWindow.focus();\n" + Cu.readUTF8File(file);
	},
	onmouse: e => e.target.focusedWindow = e.type.endsWith("r") && Services.wm.getMostRecentWindow(null)
}))(window.CustomizableUI, "AttributesInspector");


Кстати, тут есть чуть подправленный, надеюсь.

Отсутствует

 

№6707-10-2023 05:54:24

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: userChrome.js

Dumby
Спасибо Вам за помощь. Все работает прекрасно с вашим Мод-вриантом AttributesInspector.
Ctrl+Shift+C - copy tooltip's contents тоже работает, а в старом не работало.

Отсутствует

 

№6809-10-2023 00:53:23

6e73epo
Участник
 
Группа: Members
Зарегистрирован: 06-05-2022
Сообщений: 207
UA: Firefox 118.0

Re: userChrome.js

Dumby, теперь все норм при ожидании, звездочка относительно индикатора появляется там где нужно в зависимости от after или before.
Несколькими постами ранее обсуждался скрипт google_translate.js (userChrome загрузка) . Я переделал меню для перевода страниц в пункт меню и пару моментов не смог понять:
1. Строка с addDestructor. Комментировал ее и никаких негативных изменений или последствий визуально не увидел. При каких событиях они наступят?
2. Два addEventListener. true или false? Читал, но вникнуть не смог, наверное потому, что, меняя значени(е)(я), опять же не увидел никакой разницы

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

Выделить код

Код:

/** ------------------------- Пункт контекстного меню для перевода страниц ------------------------- **/
(function () {
	if (document.getElementById("TranslatePage")) return;
	var contextMenu = document.getElementById("contentAreaContextMenu");
	var Item = document.createXULElement("menuitem");
	Item.setAttribute("id", "TranslatePage");
	Item.setAttribute("label", "Translate Page");
	Item.setAttribute("class", "menuitem-iconic");
	Item.setAttribute("image", mainicon);
	Item.addEventListener("command", function() {ujs_googlePage_translate()}, false);

	contextMenu.insertBefore(Item, document.getElementById("context-viewsource"));
	addDestructor(function() {contextMenu.removeChild(Item)});

	contextMenu.addEventListener("popupshowing", function() {
		Item.hidden = document.getElementById("context-savepage").hidden
	}, false);
})();

Отредактировано 6e73epo (09-10-2023 00:54:57)

Отсутствует

 

№6909-10-2023 08:07:07

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 130
UA: Firefox 119.0

Re: userChrome.js

Dumby
Еще касательно google_translate.js
В окне перевода в конец текста добавляются 3, 5, 6 пустых строчек. Такая же проблема была с оригинальным кодом для Custom Buttons, но одна из его модификаций НЕ добавляла пустые строчки https://forum.mozilla-russia.org/viewto … 96#p777296
Спасибо, если исправите это в нашем случае.
Up
Хм, обнаружился баг. Наличие в переводимом тексте символа стрелки влево < приводит к падению окна перевода. Проверить можно здесь https://malwaretips.com/threads/testing … st-1052718

Отредактировано fuchsfan (09-10-2023 09:40:29)

Отсутствует

 

№7009-10-2023 09:39:28

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 130
UA: Firefox 115.0

Re: userChrome.js

Перенес в пост выше.

Отредактировано fuchsfan (09-10-2023 09:41:09)

Отсутствует

 

№7109-10-2023 13:11:06

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

Re: userChrome.js

6e73epo пишет

Несколькими постами ранее обсуждался скрипт google_translate.js (userChrome загрузка) . Я переделал меню для перевода страниц в пункт меню и пару моментов не смог понять:
1. Строка с addDestructor. Комментировал ее и никаких негативных изменений или последствий визуально не увидел. При каких событиях они наступят?

Нет, никакой «скрипт» google_translate.js не обсуждался.
Это просто код для Custom Buttons кнопки.


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


Функция addDestructor() — одна из таких вещей.
Предназначена для зачистки от результатов предыдущего исполнения кода
при переинициализации кнопки, например, удалить добавленные пункты меню,
ведь будут созданы новые, а то иначе будет эффект размножения.


Скрипты для большинства загрузчиков не restartless, исполняются в окне только раз,
поэтому, в данном случае, на addDestructor() просто поставлена заглушка — пустая функция.

скрытый текст
new Function(
        "_id,xhtmlns,addDestructor,addEventListener,gClipboard,LOG", code
).call(
        this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml",
        () => {}, addEventListener, {read: readFromClipboard}, Cu.reportError
);

Так что ответ — ни при каких.
Если есть желание сделать небольшой шаг на пути переделки в настоящий скрипт,
то можно удалить все вызовы addDestructor()
и убрать его из оболочки, то есть то, что выделено болдом (вместе с последующей запятой, конечно).

2. Два addEventListener. true или false? Читал, но вникнуть не смог

Да я тоже не особо это понимаю.
Событие как-то спускается сверху вниз до цели, а затем поднимается обратно.
Если true, можно перехватить пораньше, и, например, вызвать e.stopPropagation().
Может ещё что-то, не знаю.
В приведённом отрывке true, вроде как, совсем никчему.


fuchsfan пишет

В окне перевода в конец текста

Ещё раз повторю, негде мне взять никакой текст.

но одна из его модификаций НЕ добавляла пустые строчки https://forum.mozilla-russia.org/viewto … 96#p777296

Насколько я вижу, для сплошного текста в окне перевода,
Андрей предложил заменить .replace(/\\n/g, "<br />")); на .replace(/\\n/g, "").replace(/\\r/g, ""));
Так что можешь попробовать.

Проверить можно

Как теперь, надеюсь, понятно, проверить можно, но не мне.
Если бы дал xhr.responseText, то, может быть, попробовал бы посмотреть.


Ну, типа воткнуть после if (xhr.readyState == 4 && xhr.status == 200) {
строку console.log(xhr.responseText); и забрать responseText с консоли.

Отсутствует

 

№7209-10-2023 16:28:48

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

Re: userChrome.js

Dumby пишет

строку console.log(xhr.responseText); и забрать responseText с консоли.

console.log плюс ошибки

Выделить код

Код:

[[["Когда переключатели \u003cswh\u003e и \u003cwdac\u003e","When \u003c SWH \u003e and \u003c WDAC \u003e switches are ON",null,null,3,null,null,[[null,"offline"]],[[["edbff5b2398eeca464de2caaf36a7a7e","efficient_models_2022q2.md"]]]],[null,null,"Kogda pereklyuchateli \u003cswh\u003e i \u003cwdac\u003e"]],null,"en",null,null,[["When \u003c SWH \u003e and \u003c WDAC \u003e switches are ON",null,[["Когда переключатели \u003cswh\u003e и \u003cwdac\u003e",0,true,false,[3],null,[[3]]],["Когда переключатели \u003cswh\u003e и \u003cwdac\u003e включены",0,true,false,[8]]],[[0,41]],"When \u003c SWH \u003e and \u003c WDAC \u003e switches are ON",0,0]],1,[],[["en"],null,[1],["en"]]] google-translate.uc.js:257:29
Выделить код

Код:

XML Parsing Error: mismatched tag. Expected: </wdac>.
Location: 
Line Number 1, Column 93:
chrome://browser/content/browser.xhtml : Unable to run script because scripts are blocked internally. 2
SyntaxError: An invalid or illegal string was specified google-translate.uc.js:70:13
    addEle1 chrome://chrome/content/jsx/google-translate.uc.js?1696864250457 line 31 > Function:70
    createWindow chrome://chrome/content/jsx/google-translate.uc.js?1696864250457 line 31 > Function:98
    onreadystatechange chrome://chrome/content/jsx/google-translate.uc.js?1696864250457 line 31 > Function:266

Отредактировано Farby (09-10-2023 21:05:11)


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

На форуме

 

№7309-10-2023 23:44:39

6e73epo
Участник
 
Группа: Members
Зарегистрирован: 06-05-2022
Сообщений: 207
UA: Firefox 118.0

Re: userChrome.js

Dumby, благодарю, подчистил  от деструктора.


fuchsfan пишет

Хм, обнаружился баг. Наличие в переводимом тексте символа стрелки влево < приводит к падению окна перевода

Логично. Добавь перед созданием окна, что-то типа такого, а может Dumby подскажет куда правильнее вставить замену

result=result.replace(/</g, '&lt;');

Отсутствует

 

№7410-10-2023 03:07:17

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

Re: userChrome.js

fuchsfan пишет

Хм, обнаружился баг. Наличие в переводимом тексте символа стрелки влево < приводит к падению окна перевода.

Никогда не замечал раньше (просто не попадалось). Здесь так же.

Отсутствует

 

№7510-10-2023 09:31:59

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

Re: userChrome.js

6e73epo пишет

может Dumby подскажет куда правильнее вставить замену

Да я вообще не понимаю почему в коде на <textarea> устанавливается innerHTML
Гугл когда-нибудь отдаёт на запрос перевода простого текста что-нибудь HTML'ское?
Если нет, то почему бы не просто value, типа так

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

Выделить код

Код:

/*
     w.addEle1 = function(str, style){
        var ele = doc.createElementNS(xhtmlns, 'textarea');
        ele.setAttribute('style', style);
        if(str){
            ele.innerHTML = str;
            for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
                el = all[i];
                if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
                    el.parentNode.removeChild(el);
                }else{
                    for(var att = el.attributes, j = att.length; j--;){
                        if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
                    }
                }
            }
        };
        return this.appendChild(ele);
    };
*/

.......

/*
    var cnt = w.addEle1(text, 'display:block;border:1px solid #aaa;padding-bottom:3px;padding-left:3px;background-color:#fafcfe;color:#000;font:17px Times New Roman;width:310px;height:160px;overflow:auto;cursor:text;-moz-user-focus:normal;-moz-user-select:text;');
    cnt.contentEditable="true";
    cnt.context="contentAreaContextMenu";
*/
    var cnt = doc.createElement("textarea");
    cnt.style.cssText = `
        color: #000;
        width: 310px;
        height: 160px;
        outline: none;
        padding-left: 3px;
        padding-bottom: 3px;
        border: 1px solid #aaa;
        background-color: #fafcfe;
        font: 17px Times New Roman;
    `;
    if (text) cnt.value = text;
    w.append(cnt);


Но json responseText'а, который дал Farby, какой-то странный.
С него, в правленном окошке, отображается только
«Когда переключатели <swh> и <wdac>».
Причём, полный вариант в json есть, но не там, где код ожидает его собрать.

Отсутствует

 

Board footer

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