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

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

№1407620-01-2020 22:13:35

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 70.0

Re: Custom Buttons

Отсутствует

 

№1407721-01-2020 07:43:17

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

Re: Custom Buttons

egorsemenov06 пишет

не гляните вот эту кнопку в ней не работает правый клик проверка обновлений доролнений

Не, не моя тема, совсем. Но можно приглядывать за страницей
Check_for_Addons_Updates, прогресс возможен, наверно.

egorsemenov06 пишет

сделать autopopup на эту кнопку

Хорошо, попробую

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

Выделить код

Код:

(async obj => {
    Services.search.isInitialized || await Services.search.init();
    obj.observe();
    this.type = "menu";
    obj.popup = this.appendChild(document.createXULElement("menupopup"));
    addEventListener("popupshowing", obj, false, obj.popup);

    // https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/autoOpenCloseMenu.js
    // Automatically open menu on mouse over (and hide it on mouse out)

    //=======[ Start Autoopen/close feature ]=======
    var openDelay = 200;
    var closeDelay = 350;

    var _openTimer = 0;
    var _closeTimer = 0;
    this.onmouseover = function(e) {
        clearTimeout(_closeTimer);
        if(e.target == this && closeOtherMenus()) {
            this.open = true;
            return;
        }
        _openTimer = setTimeout(function() {
            self.open = true;
        }, openDelay);
    };
    this.onmouseout = function(e) {
        clearTimeout(_openTimer);
        _closeTimer = setTimeout(function() {
            if(!isContextOpened())
                self.open = false;
        }, closeDelay);
    };
    function closeOtherMenus() {
        return Array.prototype.some.call(
            self.parentNode.getElementsByTagName("*"),
            function(node) {
                if(
                    node != self
                    && node.namespaceURI == xulns
                    // See https://github.com/Infocatcher/Custom_Buttons/issues/28
                    //&& node.boxObject
                    //&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
                    && "open" in node
                    && node.open
                    && node.getElementsByTagName("menupopup").length
                ) {
                    node.open = false;
                    return true;
                }
                return false;
            }
        );
    }
    function isContextOpened() {
        return inBtn(document.popupNode);
    }
    function inBtn(node) {
        for(; node; node = node.parentNode)
            if(node == self)
                return true;
        return false;
    }
    //=======[ End Autoopen/close feature ]=======

    var topic = "browser-search-engine-modified";
    Services.obs.addObserver(obj, topic, false);
    addDestructor(() => Services.obs.removeObserver(obj, topic));
    if (!obj.excludeHiddenOneOffs) return;
    var obs = () => obj.upd = true;
    Services.prefs.addObserver(obj.pref, obs);
    addDestructor(() => Services.prefs.removeObserver(obj.pref, obs));
})({
    excludeHiddenOneOffs: false,

    handleEvent() {
        var {popup} = this;
        popup.setAttribute("context", "");
        popup.setAttribute("position", "after_start");
        popup.setAttribute("oncommand", "Services.search.defaultEngine = event.target.engine");
        (this.handleEvent = () => this.upd && this.rebuild())();
    },
    async rebuild() {
        this.popup.textContent = "";
        var df = document.createDocumentFragment();
        var de = Services.search.defaultEngine.wrappedJSObject, jsde = this.json(de);
        if (this.excludeHiddenOneOffs)
            var ex = Services.prefs.getStringPref(this.pref, "").split(",");
        var check = true;
        for(var engine of await Services.search.getVisibleEngines()) {
            if (check && engine.name == de.name && this.json(engine) == jsde) {
                check = false; continue;
            }
            if (this.excludeHiddenOneOffs && ex.includes(engine.name)) continue;
            var menuitem = df.appendChild(document.createXULElement("menuitem"));
            menuitem.engine = engine;
            menuitem.label = engine.name;
            menuitem.image = this.img(engine);
            menuitem.className = "menuitem-iconic";
        }
        this.upd = this.popup.append(df);
    },
    observe() {
        var engine = Services.search.defaultEngine;
        (self.icon || document.getAnonymousElementByAttribute(
            self, "class", "toolbarbutton-icon"
        )).src = this.img(engine);
        self.tooltipText = engine.name;
        this.upd = true;
    },
    pref: "browser.search.hiddenOneOffs",
    json: e => JSON.stringify(e.toJSON()),
    img: e => e.iconURI ? e.iconURI.spec : "chrome://browser/skin/search-engine-placeholder.png"
});

solombala пишет

Может знаете...?

WFM

Отсутствует

 

№1407821-01-2020 09:19:15

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 72.0

Re: Custom Buttons

Dumby

Dumby пишет

WFM

Это что ? Радио-УКВ ? Кстати, странно эта 72 ведет, после очистки профиля , кэша запуска и т.д. Зависает прилично...

Отредактировано solombala (21-01-2020 09:23:38)

Отсутствует

 

№1407921-01-2020 12:01:07

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 72.0

Re: Custom Buttons

ничего не понимаю, поэтому вопрос, вот такой код работает в принципе?

Выделить код

Код:

addEventListener("click", function(e) {
   if ( e.button == 0 && e.target.nodeName == "tab" ) BrowserReload();
}, true, gBrowser.mTabContainer );

у меня не фурычит, а хотелось бы :blush:

Отсутствует

 

№1408021-01-2020 18:16:16

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 72.0

Re: Custom Buttons

Dumby, вроде сделал, но vertical не пашет, а так все остальное правильно? и в uc.js тоже этот код попробывать применить, для автопопапа?

Quick toggle for about:config preferences

Выделить код

Код:

// Быстрое переключение параметров about:config от 24.07.2016
this.type="menu";
var menuPopup=self.appendChild(document.createXULElement("menupopup"));
//var menuPopup=document.createXULElement("menupopup");self.prepend(menuPopup); //var menuPopup=self.appendChild(document.createXULElement("menupopup")); [old autopopup]
//menuPopup.id='quick-aboutconfig-menupopup';

// Изменить иконку при несоответствие любого параметра пользовательскому предпочтению (см.ниже)||Иконка меняется только при изменеии параметров через меню кнопки, либо после его открытия.
  var s='CB.hasNotUserChoice';function toggleImage(){var val=custombuttons.getPrefs(s);self.image=val
//var s='CB.hasNotUserChoice';function toggleImage(){        custombuttons.getPrefs(s)?self.style.cssText='':self.style.cssText='filter:grayscale(100%)';};
? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB6klEQVQ4jZWTv2tUQRDHv8ntd28GLLQQfwS5VkuDSgRF/wlRiIiCQQQhhZ1VII1/wDUWkkLTBAsbC0FJYZGQ3NuZRcHYW6UQEQzoeXkW791xXh5CptodZr8z85kd4BBWRJwDgB5wyoCjh3mLbfK8C/ddW11XJlduNgYaeTFpvJWA0+P+BBx3Cf2sLEy5m4WrS8A0AGANaBUSrgKAKzdcY5k0PF4HJGm47NK6nSUMXOIXAEgSrrnG0oU/AGDKNb6qHe9c+Ms1lqbxqws/uoTfWVp3ksRll/DTJM6bcMWEn1KbDysBCW+zsnSNpWssTbg3PNf3uw7MuHDgym8uoW8aX496SxKXs7J0iTsFObcGRBfey8rShP1EXthSnDHhShJ0vM0H1uYiAKBSHWZqLYyDc+H7sSpeNlMX9l1jWWebEAgjgSxcbRRYB46YhCcVxH9bqDP3nbyUBB0XPk+Cjgnvj1qoqohvJqDtTUBdcGAmSzgIEQBM2R0fY/U41GPkwNpcTBKfmnDPNN4w4TOX+NnbfAQAWAKmXcMVAMgaNqrM1UfqkbMmrXkT/nGJO1XF4Xod8/0Ak4KcKzTe3AROjPs/AMdM2M8atk25a8IXAKYawTZZj5jNEvZN2TVldg3Ny/RfkYizALAFnByu819tzvCRWXKqTwAAAABJRU5ErkJggg=='
: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAACXBIWXMAAABnAAAAZwHVKNQmAAADGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6egY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBA3y7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBwgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJAwMDg3N+QWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8EgX3xMw8BUMDVQYqg4jIKAX08EGIIUByaVEZhMXIwMDAoM2Qw7CDkY8xi/EskynTYmYR5i4WFpZGVibWNjYetmnsyuybOVw5bnIWcHFyLeV24n7E08KrwXuOr4xfnv+0QIWguuANoS5hO+EvIqtFU8TkxW6Jz5AIlxSXvCE1RzpBRk3mrexWuXp5LwUxhSeKm5SalENU1FR+qp5TW6JerRGsqaPFpvVIe5/ObN0qvSh9KwMZg3+Gj4yOG68xmWxaZZZs7mNhbqlkxWf12/qlzQ3bE3Y77Vc7zHWc6NTqXOVS4JruFuce7hHg6eXl6u3oY+dr7WfpbxFgEWgRZBlsHWIX6hTmFu4dERgZHhUfnR5TEFsZ1xzflzArcVnS5uSDKedT76W9S/+XKZClmG2S454bnZef31owq3Bj0YniByU/ygTLtStcKxOqaqpn1GytvVT3oYG/Ua/Jrzm/ZULrprYr7d87pbvsu5N7OnvX9V3t/zNRZZLP5JIp86aemPZphuxMz1mlsxfOOT/3z3ztBVELOxftXPxqqfQyn+V1KzaufLJaYo3P2sZ129a/2ai0KXLzxC0ntjFut9pRvHPtrhd7lPbG7Zu1/9pB4UOBh/uPnD3Gc9z7RPfJM6d5zvidnXDu0gXRixGX5lx+cFXlWtb19Te+3rK53Xzn1D2h+9EPljx8+9j8SePTM8/FXyS9XPfq9xuPt1PfPf5g+LHh0/kv8l/zv+3/IfAz6deWP2x/I/6t/v8fAATCIM0IpJTRAAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAEOSURBVHjabJGtS0MBFMXPJojBMMPwC1nV6FCZoGj/ZVGYiIJDBOEFm3XFP2DFIAu6ZrAYBM0OREEUnN20ICI40OfbsTzYB48b7oF74J4PWUnDjMU4GSv5PEubCo/UuwjMs8FEjLOEPNCkRloWAyxb3GEOGWKRTSLeLFYwXyLFBeaGH8w7z/yyRZlvilR5YV+kuMYY04r3NpNEfBByaYksZUyDAoPsYELmmKJKjj0CS0QYU4rl3WLMeceRCBMItW7CMEd9LxbIcUqOXQJLFld9Iks9Ii0qPTYjAo5pscYJrxzIIs1SV1B5ivzRsFjFfHaiLrDOaIxHCLmnyRmp5LLytKnw1FNWH2XaYoyM9T8AOvnw3YUOg90AAAAASUVORK5CYII=';};
    toggleImage();Services.prefs.addObserver(s,toggleImage,false);
addDestructor(()=>Services.prefs.removeObserver(s,toggleImage));

[{nodeName:"menu", name:"User Agent", pref:"general.useragent.override", key:'u', strValues:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Firefox/60.0,,,Firefox 60/MacOSX 10.13|||Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36,,,Chrome 66/MacOSX 10.13.5|||Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36,,,Chrome 57/MacOSX|||Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30,,,Safari Generic/MacOSX|||Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36,,,Chrome57/W7|||Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12 Version/12.16,,,Opera12/W8|||Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Safari/537.36,,,Chrome61/W10|||Mozilla/5.0 (Linux; Android 7.0; PLUS Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Mobile Safari/537.36,,,Chrome61/Android7|||Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html),,,GoogleBot|||Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots),,,YandexBot|||Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp),,,YahooBot|||Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm),,,BingBot|||DuckDuck bot/1.0; (+http://duckduckgo.com/duckduckbot.html),,,DuckDuckBot|||Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html),,,BaiduspiderBot|||ia_archiver (+http://www.alexa.com/site/help/webmasters; crawler@alexa.com),,,AlexaCrawlerBot|||Mozilla/5.0 (Linux; Android 5.1.1; SM-G928X Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Mobile Safari/537.36,,,Samsung Galaxy S6 Edge Plus|||Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586,,,Microsoft Lumia 950|||Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586,,,Xbox One|||Mozilla/5.0 (PlayStation 4 3.11) AppleWebKit/537.73 (KHTML, like Gecko),,,Playstation 4|||,,,Пустое значение"},
]

.forEach(function(m){var mItem=document.createElementNS(xulns,m.nodeName);var browserRestart='';
if("restart"in m)browserRestart='if(custombuttons.confirmBox(null,"Restart?","Yes","Cancel"))Services.startup.quit(Services.startup.eAttemptQuit|Services.startup.eRestart);';
if("name"in m) mItem.setAttribute('name',m.name);
if("pref"in m){mItem.setAttribute('closemenu','none');
mItem.setAttribute('oncontextmenu','event.preventDefault();custombuttons.clearPrefs("'+m.pref+'");'+browserRestart);}
if("key"in m)  mItem.setAttribute('accesskey',m.key);
if(m.nodeName==="menuitem"){mItem.setAttribute('type','checkbox');
mItem.setAttribute('oncommand','custombuttons.setPrefs("'+m.pref+'",!custombuttons.getPrefs("'+m.pref+'"));if(event.shiftKey&&event.keyCode==event.DOM_VK_RETURN){event.preventDefault();custombuttons.clearPrefs("'+m.pref+'")};'+browserRestart);}
if(m.nodeName==="menu"){mItem.setAttribute('class','menu-iconic');

var subMenu=mItem.appendChild(document.createXULElement("menupopup"));

for (var value of m.strValues.split('|||')){var submItem=document.createXULElement("menuitem");
var smVal=value.split(',,,')[0];
var smValConv=convertFromUnicode("UTF-8",smVal);
var smName=value.split(',,,')[1];
var key=value.split(',,,')[2];

key&&submItem.setAttribute('accesskey',key);submItem.setAttribute('type','radio');
submItem.setAttribute('label',smName);submItem.setAttribute('tooltiptext',smVal);
submItem.setAttribute('closemenu','none');
submItem.setAttribute('oncommand','try{custombuttons.setPrefs("'+m.pref+'","'+smValConv.replace(/\\/g,'\\\\')+'")}catch(e){Services.prefs.setIntPref("'+m.pref+'","'+smValConv+'")};'+browserRestart);
subMenu.appendChild(submItem);}}
menuPopup.appendChild(mItem);

  // Листенеры отслеживающие переключение параметров
  // и устанавливающие соответствующие названия и чекбоксы для пунктов меню при открытии меню и кликах
  for (var type of ['command','popupshowing','contextmenu']){addEventListener(type,(e)=>{setTimeout(()=>{if ("pref" in m){var val,def;
   def=Services.prefs.prefHasUserValue(m.pref);
   try {val=Services.prefs.getComplexValue(m.pref,Ci.nsISupportsString).data;} catch(e) {
   if (Services.prefs.getPrefType(m.pref)==64) val=custombuttons.getPrefs(m.pref).toString();else val=custombuttons.getPrefs(m.pref);}
   def ? mItem.style.setProperty('font-weight', 'bold', 'important') : mItem.style.removeProperty('font-weight');}

     if (m.nodeName==='menuitem'){mItem.setAttribute('checked',val);mItem.label=(mItem.hasAttribute('name') ? mItem.getAttribute('name') : m.pref)+' - "'+val+'"';
     if ("userChoice" in m){try {var usrChc=(val.toString()===m.userChoice)} catch(e) {usrChc=false};

     mItem.setAttribute('user-choice',usrChc);usrChc ? mItem.style.removeProperty('color') : mItem.style.setProperty('color','orangered','important');}}
     if (subMenu){for (var smitem of subMenu.getElementsByTagName('menuitem')) {var smval=smitem.getAttribute('tooltiptext');smitem.setAttribute('checked',(val===smval) ? true : false);}}
     if (m.nodeName==="menu") {var vname;
     try {vname=subMenu.getElementsByAttribute('checked','true')[0].getAttribute('label');} catch(e) {if (!Services.prefs.prefHasUserValue(m.pref)) vname='Default';else vname='Other';}

     mItem.setAttribute('label',(mItem.hasAttribute('name') ? mItem.getAttribute('name') : m.pref)+' - "'+vname+'"');
     mItem.setAttribute('tooltiptext',val || 'This preferences has null value or does not exist.');

     if ("userChoice" in m) {var smUsrChc=(val===m.userChoice.toString());mItem.setAttribute('user-choice',smUsrChc);
     smUsrChc ? mItem.style.removeProperty('color') : mItem.style.setProperty('color','orangered','important');}}

     if ("userChoice" in m) {var hasNotUserChoice=menuPopup.getElementsByAttribute('user-choice','false')[0];custombuttons.setPrefs(s,hasNotUserChoice ? true : false);}}, 0)},false,menuPopup)}});

// Листенер позволяющий сброс параметров с субменю по Shift+Enter||За код спасибо Dumby
addEventListener("popupshown",{handleEvent:function(e){this[e.type](e);},
  popupshown:function(e){if(e.target!=menuPopup)return;menuPopup.addEventListener   ("popuphidden",this,false);window.addEventListener   ("keydown",this,true);},
 popuphidden:function(e){if(e.target!=menuPopup)return;menuPopup.removeEventListener("popuphidden",this,false);window.removeEventListener("keydown",this,true);},
popupshowing:function(e){e.target.parentNode.removeEventListener("popupshowing",this,false);e.preventDefault();},get old(){delete this.old;
this.e=new MouseEvent("contextmenu",{});return this.old=parseInt(Services.appinfo.platformVersion)<25;},get prop(){delete this.prop;
if("key"in KeyboardEvent.prototype)this.prop="key",this.val="Enter";else this.prop="keyCode",this.val=KeyboardEvent.DOM_VK_RETURN;return this.prop;},
keydown:function(e){if(!e.shiftKey||e.ctrlKey||e.altKey||e[this.prop]!=this.val)return;var target=menuPopup.querySelector("menu[_moz-menuactive]:not([open])");
if(!target)return;this.old ? target.addEventListener("popupshowing",this,false) : e.stopPropagation();target.dispatchEvent(this.e);menuPopup.dispatchEvent(this.e);}},false,menuPopup);

// Открыть меню кнопки по сочетанию клавиш Alt + M (не зависит от текущей раскладки клавиатуры)
// Посмотреть коды клавиш можно здесь: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#Constants_for_keyCode_value
addEventListener('keyup',(e)=>{if(e.altKey&&!e.shiftKey&&!e.ctrlKey&&e.keyCode==77){e.preventDefault();e.stopPropagation();
self.open=true;}},false,window);

//________________________
// Autoopen/close feature
var openDelay = 200;
var closeDelay = 350;

var _openTimer = 0;
var _closeTimer = 0;
this.onmouseover = function(e) {
    clearTimeout(_closeTimer);
    if(e.target == this && closeOtherMenus()) {
        this.open = true;
        return;
    }
    _openTimer = setTimeout(function() {
        self.open = true;
    }, openDelay);
};
this.onmouseout = function(e) {
    clearTimeout(_openTimer);
    _closeTimer = setTimeout(function() {
        if(!isContextOpened())
            self.open = false;
    }, closeDelay);
};
function closeOtherMenus() {
    return Array.prototype.some.call(
        self.parentNode.getElementsByTagName("*"),
        function(node) {
            if(
                node != self
                && node.namespaceURI == xulns
                // See https://github.com/Infocatcher/Custom_Buttons/issues/28
                //&& node.boxObject
                //&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
                && "open" in node
                && node.open
                && node.getElementsByTagName("menupopup").length
            ) {
                node.open = false;
                return true;
            }
            return false;
        }
    );
}
function isContextOpened() {
    return inBtn(document.popupNode);
}
function inBtn(node) {
    for(; node; node = node.parentNode)
        if(node == self)
            return true;
    return false;
}
//________________________

// Конвертировать текст в юникод .............
function convertFromUnicode(charset,str){var converter=Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
converter.charset=charset;str=converter.ConvertFromUnicode(str);return str+converter.Finish();};


еще как переделать alt+m, под этот код? тут коды не надо искать.
addEventListener("keydown",e=>e.altKey&&e.code=="KeyM"&&!e.shiftKey&&!e.ctrlKey&&e.preventDefault() + openPreferences()); //self.open=true;false,window);

Отредактировано func4ptch4 (21-01-2020 18:36:20)

Отсутствует

 

№1408121-01-2020 18:57:14

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 482
UA: Firefox 72.0

Re: Custom Buttons

sonyas75 пишет

и в этой кнопке   TypeError: gURLBar.reset is not a function
инициализация

еще давно Dumby правил

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

Выделить код

Код:

/*Initialization Code*/
gCBNotepad = this; // global obj


(id => {
    var label = "Блокнот";
    var url = "chrome://browser/content/webext-panels.xul?" + id;
    var icon = this.image;
    var defaultURL = "data:text/html;base64," + window.btoa(unescape(encodeURIComponent( this.Help )));

    var e = (name, attrs, node, append) => {
        var elm = document.createXULElement (name);
        for(var a in attrs) elm.setAttribute(a, attrs[a]);
        append ? node.append(elm) : node.before(elm);
        return elm;
    }
    var menuitem = e("menuitem", {
        label,
        type: "checkbox",
        id: "menu_CBNotepadLoader",
        oncommand: `SidebarUI.toggle("${id}");`,
    }, document.getElementById("viewSidebarMenu"), true);

    var btn = e("toolbarbutton", {
        label,
        type: "checkbox",
        oncommand: "handleCommand();",
        id: "sidebar-switcher-CBNotepadLoader",
        class: "subviewbutton subviewbutton-iconic"
    }, document.querySelector('toolbarbutton[id^="sidebar-switcher-"] + toolbarseparator'));

    SidebarUI.sidebars.set(id, {
        url,
        title: label,
        buttonId: btn.id,
        menuId: menuitem.id,
    });
    var css = `\
        #${btn.id} > .toolbarbutton-icon,
        #sidebar-box[sidebarcommand="${id}"] > #sidebar-header > #sidebar-switcher-target > #sidebar-icon {
            width: 16px;
            height: 16px;
            opacity: 0.8;
            fill: currentColor;
            -moz-context-properties: fill;
            list-style-image: url(${icon});
        }`;
    var str = "data:text/css," + encodeURIComponent(css), type = windowUtils.USER_SHEET;
    windowUtils.loadSheetUsingURIString(str, type);

    addDestructor(() => {
        btn.remove(); menuitem.remove();
        SidebarUI.sidebars.delete(id);
        windowUtils.removeSheetUsingURIString(str, type);
    });
    var isActive = () => SidebarUI.isOpen && SidebarUI.currentID == id;

    if (isActive()) {
        SidebarUI.selectMenuItem(id);
        var doc = SidebarUI.browser.contentDocument;
        if (doc.readyState != "complete") return;
        var br = doc.getElementById("webext-panels-browser");
        if (br) defaultURL = br.currentURI.spec;
    }
    btn.handleCommand = () => {
        if (!btn.hasAttribute("checked")) {
            SidebarUI._switcherPanel.hidePopup();
            btn.setAttribute("checked", true);
        }
        loadURL(gBrowser.currentURI.spec);
    }

var leftClick = () => {
    var msg = _id + ":NotepadPageShowAndPaste";
    var url = "data:," + encodeURIComponent(`addEventListener("pageshow", () => {
        content.document.getElementById("req_message").focus();
        docShell.doCommand("cmd_paste");
        sendAsyncMessage("${msg}");
    }, {once: true})`);

    var busy = 0, clip, listener = () => {
        if (clip) clip = gClipboard.write(clip);
        busy = 0;
    }
    messageManager.addMessageListener(msg, listener);
    addDestructor(() => messageManager.removeMessageListener(msg, listener));

    var openTab = () => gBrowser.getBrowserForTab(
        gBrowser.selectedTab = gBrowser.addTrustedTab(defaultURL)
    ).messageManager.loadFrameScript(url, false);

    (leftClick = () => {
        if (busy && Date.now() - busy < 4e3) return;
        busy = Date.now();
        // запомнить текст из буфера обмена и скопировать текст на странице ....
        clip = gClipboard.read();
        goDoCommand("cmd_copy");
        // открыть блокнот в новой вкладке
        setTimeout(openTab, 50);
    })();
}

    this.onclick = e => {

       if (e.button == 0) {
              if (gMultiProcessBrowser){  leftClick(); } 
              else {
             // запомнить текст из буфера обмена и скопировать текст на странице ....
               var clip = gClipboard.read();
               goDoCommand("cmd_copy");
             // открыть блокнот в новой вкладке
               gBrowser.selectedTab = gBrowser.addTrustedTab(defaultURL); 
               gBrowser.addEventListener("pageshow", function(event) {
               this.removeEventListener("pageshow", arguments.callee, true);
               content.document.getElementById("req_message").value = gClipboard.read(); 
               if (clip) gClipboard.write(clip);
               }, true);
                } ;
               }

        if (e.button == 1)   SidebarUI.toggle(id);
     }

    // Обработчик следит за изменениями табов и меняет название и иконку нужного таба ......................................................
gBrowser.tabContainer.addEventListener("TabAttrModified", function(event) {
         // очистить адресную строку если это блокнот ....
         if ( gBrowser.currentURI.spec == defaultURL) gURLBar.value = "Notepad";
}, true);

    addEventListener("load", e =>
        e.target.documentURI == url && load(defaultURL)
    , true, SidebarUI.browser);

    var loadURL = url => {
        defaultURL = defaultURL;
        isActive() ? load(url) : SidebarUI.show(id);
    }

    var principal = {triggeringPrincipal: document.nodePrincipal};
    var config = {browserStyle: false, extension: {remote: false}};

        var e10sFox69 = Services.appinfo.browserTabsRemoteAutostart
        && parseInt(Services.appinfo.platformVersion) >= 69;
    var load = async url => {
        if (e10sFox69) {
            config.uri = url;
            config.extension.remote = E10SUtils.getRemoteTypeForURI(url, true) != E10SUtils.NOT_REMOTE;
        }
        var win = SidebarUI.browser.contentWindow;
        var br = win.document.getElementById("webext-panels-browser");
        if (br) {
            if (br.currentURI.spec === url) return;
            br.parentNode.remove();
        }
        var br = await win.getBrowser(config);
        win.onunload = () => defaultURL = br.currentURI.spec;
        br.loadURI(url, principal);
    }
})("viewCBNotepadLoader");

//Всплывающие подсказки 

this.tooltipText = "\n\
ЛКМ: открыть в новой вкладке с текстом( выделенным или из буфера )\n\n\
СКМ: открыть в боковой панели\n\n\
ПКМ: меню кнопки\n\n";

Отсутствует

 

№1408221-01-2020 19:33:21

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 72.0

Re: Custom Buttons

Andrey_Krropotkin
ой, я дико извиняюсь, это Вы наверное привели какой-то пример, а я в нем ничего не понял. вот тот код

Выделить код

Код:

addEventListener("click", function(e) {
   if ( e.button == 0 && e.target.nodeName == "tab" ) BrowserReload();
}, true, gBrowser.mTabContainer );

просто напросто перегружал вкладку кликом по ней. в 72 он у меня не работает. это вторая по значимости и глобальности функция в СВ, ради которых я и ставлю СВ. два непоколебимых столпа - релоад кликом по вкладке и активация вкладки наведением курсора.

Отсутствует

 

№1408321-01-2020 20:02:09

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 69.0

Re: Custom Buttons

sonyas75 пишет

два непоколебимых столпа - релоад кликом по вкладке и активация вкладки наведением курсора

Дополнение tabs_focus.2019.6.30.xpi, для установки естественно требуется костыль. Сам использую для активации вкладки наведением курсора.

скрытый текст
67959568c89f.png

Отсутствует

 

№1408421-01-2020 20:07:09

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 72.0

Re: Custom Buttons

sandro79
работает, спасибо. только вот активация вкладки наведением курсора

Выделить код

Код:

((lst, trg) => trg && addEventListener("mouseover", lst, false, trg))({
    id: 0,
    tab: null,
    handleEvent(e) {
        var tab = e.target.closest("tab:not([selected]");
        if (tab && this.tab != tab)
            clearTimeout(this.id),
            this.id = setTimeout(this.onTimeout, 450, this.tab = tab, tab.screenX);
    },
    get onTimeout() {
        delete this.onTimeout;
        return this.onTimeout = (tab, x) => {
            if (tab.matches(":hover") && Math.abs(x - tab.screenX) < 50)
                gBrowser.selectedTab = tab;
            this.tab = null;
        }
    }
}, gBrowser.tabs[0].flattenedTreeParentNode);

у меня и так работает. всунуть бы туда перезагрузку таба по клику :blush:

Добавлено 21-01-2020 20:32:24
ну и до кучи...
существует ли в природе кнопка рестарт/перезагрузка Файрфокс?

в вот этой кнопке Исправленная для многопроцессорного режима кнопка Save, от 07.03.2017. ............. у меня не работает только один пункт "Сохранить ярлык страницы как...". Это лечится?

Отредактировано sonyas75 (21-01-2020 20:34:43)

Отсутствует

 

№1408521-01-2020 21:28:37

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 482
UA: Firefox 72.0

Re: Custom Buttons

sonyas75 я привел код инициализации открыть блокнот в новой вкладке или в боковой панели для многопроцессорного
У меня такой код для рестарта: Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart)

Отсутствует

 

№1408621-01-2020 21:35:57

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 72.0

Re: Custom Buttons

Andrey_Krropotkin пишет

У меня такой код для рестарта

не пашет. точнее делает какой-то ужас ужасный. я эту кнопу не могу даже перетащить на панель из окна персонализации, браузер уходит в кому. грохаешь процесс, кнопка висит под курсором, остается на рабочем столе винды, приходится перезапускать проводник. содом и гоморра какие-то :D подозреваю, что возможно у меня config.js или неполный или неполноценный )
а "Сохранить ярлык страницы как..." в Save работает?

Отредактировано sonyas75 (21-01-2020 21:37:11)

Отсутствует

 

№1408721-01-2020 22:32:24

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 482
UA: Firefox 72.0

Re: Custom Buttons

sonyas75 положить в код, а не в инициализацию, а "Сохранить ярлык страницы как..." в Save - работает

Отсутствует

 

№1408821-01-2020 22:36:27

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 72.0

Re: Custom Buttons

Andrey_Krropotkin пишет

положить в код, а не в инициализацию

спасибо, спасибо, сработало :)
блин, у меня ярлык не сохраняется, точнее на клик по этому пункту вообще ничего не происходит. :(

Отсутствует

 

№1408921-01-2020 23:27:05

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

Re: Custom Buttons

solombala пишет

Это что ? Радио-УКВ ?

Аббревиатура от «Works For Me».

egorsemenov06 пишет

в консоли выдает ошибку   NS_ERROR_FILE_NOT_FOUND

Значит не найдено ничего по пути
%Папка Профиля%\_QTranslate\QTranslate.exe

func4ptch4 пишет

а так все остальное правильно?

Да. Странно, что vertical не пашет, говоришь. Попробуй добавить
(это если вертикальный тулбар создан библиотекой user_chrome_files)

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

Выделить код

Код:

var vStart = this.parentNode.parentNode.getAttribute("v_vertical_bar_start");
vStart && menuPopup.setAttribute("position", `${vStart == "true" ? "end" : "start"}_before`);

func4ptch4 пишет

еще как переделать alt+m, под этот код?

addEventListener("keydown",e=>{if(e.altKey&&e.code=="KeyM"&&!e.shiftKey&&!e.ctrlKey)e.preventDefault(),self.open=true},false,window);

sonyas75 пишет

всунуть бы туда перезагрузку таба по клику

Может так подойдёт

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

Выделить код

Код:

addEventListener("click", e => e.button || e.detail != 1 || !e.target.matches(
    "tab :scope:not(.tab-close-button):not(.tab-icon-sound), tab"
) || BrowserReload(), false, gBrowser.tabContainer || 1);

Отсутствует

 

№1409021-01-2020 23:30:11

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 72.0

Re: Custom Buttons

Dumby пишет

Может так подойдёт

конечно подойдет. Dumby, Вам уже говорили, что Вы - Мастер!?

Добавлено 21-01-2020 23:53:08
[̶b̶]̶D̶u̶m̶b̶y̶[̶/̶b̶]̶
я̶ ̶ч̶у̶т̶ь̶ ̶п̶о̶з̶а̶н̶у̶д̶с̶т̶в̶у̶ю̶ ̶:̶b̶l̶u̶s̶h̶:̶ ̶я̶ ̶п̶р̶а̶в̶и̶л̶ь̶н̶о̶ ̶п̶о̶н̶и̶м̶а̶ю̶,̶ ̶ч̶т̶о̶ ̶з̶а̶ ̶с̶о̶х̶р̶а̶н̶е̶н̶и̶е̶ ̶я̶р̶л̶ы̶к̶а̶ ̶в̶ ̶в̶ы̶ш̶е̶у̶п̶о̶м̶я̶н̶у̶т̶о̶й̶ ̶к̶н̶о̶п̶к̶е̶ ̶S̶a̶v̶e̶ ̶о̶т̶в̶е̶ч̶а̶е̶т̶ ̶в̶о̶т̶ ̶э̶т̶о̶т̶ ̶к̶у̶с̶о̶к̶ ̶к̶о̶д̶а̶?̶
[̶c̶o̶d̶e̶]̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶s̶a̶v̶e̶S̶h̶o̶r̶t̶c̶u̶t̶s̶(̶)̶ ̶{̶
v̶a̶r̶ ̶f̶i̶l̶e̶ ̶=̶ ̶C̶o̶m̶p̶o̶n̶e̶n̶t̶s̶.̶c̶l̶a̶s̶s̶e̶s̶[̶"̶@̶m̶o̶z̶i̶l̶l̶a̶.̶o̶r̶g̶/̶f̶i̶l̶e̶/̶l̶o̶c̶a̶l̶;̶1̶"̶]̶.̶
̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶c̶r̶e̶a̶t̶e̶I̶n̶s̶t̶a̶n̶c̶e̶(̶C̶o̶m̶p̶o̶n̶e̶n̶t̶s̶.̶i̶n̶t̶e̶r̶f̶a̶c̶e̶s̶.̶n̶s̶I̶F̶i̶l̶e̶)̶;̶
f̶i̶l̶e̶.̶i̶n̶i̶t̶W̶i̶t̶h̶P̶a̶t̶h̶(̶f̶o̶l̶d̶e̶r̶p̶a̶t̶h̶)̶;̶

i̶f̶(̶ ̶!̶f̶i̶l̶e̶.̶e̶x̶i̶s̶t̶s̶(̶)̶ ̶|̶|̶ ̶!̶f̶i̶l̶e̶.̶i̶s̶D̶i̶r̶e̶c̶t̶o̶r̶y̶(̶)̶ ̶)̶ ̶{̶ ̶ ̶ ̶f̶i̶l̶e̶.̶c̶r̶e̶a̶t̶e̶(̶C̶o̶m̶p̶o̶n̶e̶n̶t̶s̶.̶i̶n̶t̶e̶r̶f̶a̶c̶e̶s̶.̶n̶s̶I̶F̶i̶l̶e̶.̶D̶I̶R̶E̶C̶T̶O̶R̶Y̶_̶T̶Y̶P̶E̶,̶ ̶0̶x̶1̶B̶6̶)̶;̶}̶

v̶a̶r̶ ̶s̶a̶v̶e̶t̶o̶d̶i̶r̶=̶f̶o̶l̶d̶e̶r̶p̶a̶t̶h̶+̶"̶\̶\̶"̶;̶ ̶
v̶a̶r̶ ̶u̶r̶l̶l̶i̶n̶k̶=̶g̶B̶r̶o̶w̶s̶e̶r̶.̶c̶u̶r̶r̶e̶n̶t̶U̶R̶I̶.̶s̶p̶e̶c̶;̶
v̶a̶r̶ ̶o̶u̶t̶=̶g̶e̶t̶T̶a̶b̶L̶a̶b̶e̶l̶(̶)̶;̶
v̶a̶r̶ ̶f̶i̶l̶e̶n̶a̶m̶e̶=̶s̶a̶v̶e̶t̶o̶d̶i̶r̶+̶o̶u̶t̶+̶'̶.̶u̶r̶l̶'̶;̶
v̶a̶r̶ ̶d̶a̶t̶a̶=̶"̶[̶I̶n̶t̶e̶r̶n̶e̶t̶S̶h̶o̶r̶t̶c̶u̶t̶]̶\̶r̶\̶n̶U̶R̶L̶=̶"̶+̶u̶r̶l̶l̶i̶n̶k̶+̶"̶\̶r̶\̶n̶"̶;̶[̶/̶c̶o̶d̶e̶]̶н̶и̶ч̶ё̶ ̶т̶а̶м̶ ̶м̶е̶н̶я̶т̶ь̶ ̶д̶л̶я̶ ̶7̶2̶ ̶н̶е̶ ̶н̶а̶д̶о̶?̶ ̶б̶л̶и̶н̶,̶ ̶в̶с̶е̶ ̶п̶у̶н̶к̶т̶ы̶ ̶р̶а̶б̶о̶т̶а̶ю̶т̶,̶ ̶в̶с̶я̶к̶и̶е̶ ̶п̶н̶г̶,̶ ̶п̶д̶ф̶,̶ ̶х̶т̶м̶л̶,̶ ̶т̶х̶т̶ ̶с̶о̶х̶р̶а̶н̶я̶е̶т̶,̶ ̶а̶ ̶.̶u̶r̶l̶ ̶н̶е̶ ̶х̶о̶ч̶е̶т̶ ̶х̶о̶т̶ь̶ ̶у̶б̶е̶й̶.̶ ̶п̶р̶и̶ ̶э̶т̶о̶м̶ ̶р̶а̶с̶ш̶и̶р̶е̶н̶и̶е̶ ̶к̶а̶к̶о̶е̶-̶т̶о̶ ̶п̶е̶р̶в̶о̶е̶ ̶п̶о̶п̶а̶в̶ш̶е̶е̶с̶я̶ ̶п̶р̶е̶к̶р̶а̶с̶н̶о̶ ̶с̶о̶х̶р̶а̶н̶я̶е̶т̶.̶ ̶(̶(̶(̶

ну ёлки-палки, пропустил // папка для сохранения иконок для ярлыков и ярлыков сайтов(Ставьте свое) :dumb:

Отредактировано sonyas75 (22-01-2020 00:03:58)

Отсутствует

 

№1409122-01-2020 05:06:50

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 72.0

Re: Custom Buttons

Dumby, как сделать код более универсальнее(примерно id=toolbarbutton-1), чтобы не подставлять везде.

AutoPopup.uc.js

Выделить код

Код:

function MouseOver(e)
    {
        if (!AlwaysPop && !document.hasFocus())
            return;
        if (e.target.getAttribute('cb-name') == "Proxy") return;
        if (e.target.getAttribute('cb-name') == "Merge Custom Button") return;
        if (e.target.getAttribute('cb-name') == "Session Bookmarks") return;

        if (IsButton(e.target)) {
            type = e.target.getAttribute('type');
            if (type == 'menu-button') {
                if (e.originalTarget!=e.target)
                    return;
            }
            /*else {
                if (type != 'menu') return;
            }*/
        }
Выделить код

Код:

//с нового infocatcher
this.onmouseover=function(e){
    clearTimeout(_closeTimer);
    if(e.target==this&&closeOtherMenus()){this.open=true;return;}
    _openTimer=setTimeout(function(){self.open=true;},openDelay);
};


где-то еще видел this.orient="horizontal"; но ладно, попробую сам разобраться.

Отредактировано func4ptch4 (22-01-2020 06:17:54)

Отсутствует

 

№1409222-01-2020 16:53:26

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 72.0

Re: Custom Buttons

Чья кнопка?  "Увеличить изображение" ....Крякнула на 72

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

Выделить код

Код:

/*Initialization Code*/
addEventListener("popupshowing", {
    imgZoom: 190,   // на сколько увеличить изображение из меню
    scrollZoom: 20, // на сколько увеличивать/уменьшать колесиком мыши
    scrollTop: 1,   // или -1, переключение направление прокрутки для увеличение колёсиком

    receiveMessage(msg) {
        var container = document.documentElement.appendChild(
            document.createElementNS(xhtmlns, "div")
        );
        addDestructor(() => container.remove());
        var image = container.appendChild(document.createXULElement("image"));
        image.setAttribute("validate", "never");

        var st = container.style;
        var dz = this.scrollZoom/100 * this.scrollTop;
        var currScale = 1, x, y, initialZoom = this.imgZoom/100 - 1;

        var hide, props = ["width", "height", "left", "top"], p = n => n + "px";
        var set = (...args) => props.forEach((prop, ind) => st[prop] = p(args[ind]));

        (hide = () => {
            st.cssText = "position: fixed; display: none; z-index: 2147483647;";
            currScale = 1;
            image.src = null;
        })();
        container.onwheel = (e, ds = e.deltaY > 0 ? -dz : dz) => {
            if (currScale < .15 && ds < 0) return;
            st.transform = `scale(${currScale += ds})`;
            var {width, height, left, top, bottom, right} = container.getBoundingClientRect();

            if (height < innerHeight) {
                if (top < 0) st.top = p(y -= top);
                if (bottom > innerHeight) st.top = p(y -= bottom - innerHeight);
            }
            if (width < innerWidth) {
                if (left < 0) st.left = p(x -= left);
                if (right > innerWidth) st.left = p(x -= right - innerWidth);
            }
        }
        (this.receiveMessage = msg => {
            var {src, width, height, left, top} = msg.data;
            image.src = src;
            left -= mozInnerScreenX;
            top -= mozInnerScreenY;

            set(width, height, x = left, y = top);
            st.display = "block";
            container.onwheel(null, initialZoom);
            window.addEventListener("mousedown", hide, {once: true, capture: true});
        })(msg);
    },
    handleEvent(e) {
        if (!gContextMenu.onImage) return;
        var menuitem = document.createXULElement("menuitem");
        menuitem.setAttribute("label", "Увеличить размер");
        menuitem.className = "menuitem-iconic";
        menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADZElEQVR42oXSe0xbVRwH8N8597a35e7SAmUFukGhY66AMiNzw4GvTCQLCssc4pQsmTOa+ERMlrktW1zigpnEuWn8x2eMmiVGMBDCFjS+cJHEDIk8RoSNV1+3tLWX3t72nnO8sETJFrfvP7/k5Pw+Ob9fDoLrYi8ow9GFUbq+5aRLrGraqQcX6hlF2wkFEWn6EDIJAyQy9+3VT58cWb6PrmvmjGZS/FSHlxbXtbtLobGqJlPKMhNepWb0V8hKpi8FNd/gzCCogbdmvtg/8C9gz9+Eor5x5nn2tDOZ98Dx2i3C/uYai9mOGCxiDQIIg1/PgUCEhyvDMox9PXYBkPzaaoAzAFL0yle7ShtqO/eWJ9w1vJ1oGsVzYhTNATMQG4Q1G40ldDw6PB339fs7VgMmA0jnHfioo6F9Z3tDYYJzKSZKMYcDvAILiICfZUNYEYFixMKpKBk8MfTTasBsACnngU/6Wg4+VL/VFSOmBHAYY1BAhzAvgmyMEIkh0EUOBD1Eu49eStwA5D3z4TcPv9TYdHvxEhXSGgaEIMkJkKAS+ONmSKYolOVqMBlRSd8bv8v/AQXlJoiHUE5rZ1tFa/Nhj1uVrCaNMoQxYSaIqDxAGqAuQ2XZ1iS8HUTpkZMXe1eATOdtiCcJblGe1a3PnWp0uEvfv3tbeX5RhSet/q3wxh6xgAncZUmw2hxEryQx9/LHE7I2RV5HNudGFAtcZsuQd919u/kiz56JOwobcjd6xerqKnB4HIB4RvMzCM1DGj8X0GD64pL2Xdf850z+4djKC8wl24XUpj1P75sdfe/+sSHoq3uQnSuwa+s2Vy5uubd2jQWUTAYchJK8HpyIzvv7p/rMkV/OzPeeGEWi+x6LufiR573h8VO7Zr4n9fEZNeiqXHOofFvPsKPkS1fKsX5JU6uNZQh8Wh/hRcuvOC3/fLXrcGj52yOo7zzU9udvbzbN9uglggK2MhsnvfiE0tY9tfed7vM98D+x53tx1DdG0Z2b97Ejf3SRSiGGCysyENvdoipZa4+/8NmPp8+N+Ei2ZEVpQhG71rdcqFFozD+xcoQugFUvlDS8wWsl8Uebk5C79ujjHwyc6R/309ysDBRauEzhJkG9ErAdG0xEe6yVkwqcr+549/zZgcmQ7pAEkH2TDG6RfwCoJI0uEWJP5QAAAABJRU5ErkJggg==");
        menuitem.setAttribute("oncommand", "handleCommand();");
        e.target.append(menuitem);
        addDestructor(() => menuitem.remove());
        menuitem.handleCommand = () => this.cmd();
        
        this.handleEvent = () => menuitem.hidden = !gContextMenu.onImage;
    },
    cmd() {
        var msg = "CB:GetImageScreenRectForMosuseZoom";
        var code = `(selectors => {
            var doc = content.document;
            for(var sel of selectors) {
                var node = doc.querySelector(sel);
                node instanceof HTMLImageElement
                    ? sendAsyncMessage("${msg}", Object.assign(
                        {src: node.currentSrc}, BrowserUtils.getElementBoundingScreenRect(node)
                    )) : doc = node.contentDocument;
            }
        })(`;
        messageManager.addMessageListener(msg, this);
        addDestructor(() => messageManager.removeMessageListener(msg, this));

        (this.cmd = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(
            "data:," + encodeURIComponent(code + JSON.stringify(gContextMenu.targetSelectors) + ")"), false
        ))();
    }
}, false, document.getElementById("contentAreaContextMenu") || 1);

Отсутствует

 

№1409323-01-2020 16:34:00

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 72.0

Re: Custom Buttons

Dumby
Работаем, и сами и с вами...Такая проблема ...Видишь пустой пункт? Как бы убрать без поганки ? Рихтанул я,  так из Html плеер стал запускаться от кликов ( в about:addons , к примеру)
Снято... Вспомнил... Это и в СВ рихтануто и в  aboutaddons.js тоже ...Твоя же наколка.
onclick = () => {
e.preventDefault();
Да, на СВ опять ссылка выскочила...Сюда надо подставлять e.preventDefault(); ? Я подставил...

скрытый текст
makeAddBtn(e, method, label, action, onclick) {
        var item = document.createElement("panel-item");
        item.append(label);
        item.setAttribute("action", action);
        item.onclick = e => onclick(e, e.stopPropagation(), e.preventDefault());
        (this[method] = e.type.endsWith("n")
            ? e => e.target.contains(item) || e.target.prepend(item)
            : e => e.target.prepend(item)

Отредактировано solombala (23-01-2020 20:43:13)

Отсутствует

 

№1409423-01-2020 20:38:06

momo2000
Участник
 
Группа: Members
Зарегистрирован: 03-09-2015
Сообщений: 236
UA: Firefox 68.0

Re: Custom Buttons

Есть ли простейший код, чтобы стандартный финдбар отображался на всех вкладках?
По идее только этого и не хватает, особенно если его переместить наверх с помощью userChrome.css

Выделить код

Код:

.browserContainer findbar{-moz-box-ordinal-group:0!important}

и сделать закрытие по Ctrl+F через CB

Выделить код

Код:

addEventListener('keydown', e=> {if (e.ctrlKey && !e.altKey && !e.shiftKey && (e.keyCode == 70) && !gFindBar.hidden) {e.preventDefault(); gFindBar.close();}});

Есть кнопка FindBar, которая всё время отваливается и которую так не любит фиксить Dumby, т.к. она сложная.

Должен же быть такой код, чтобы FindBar был на всех вкладках, пусть даже и пустой.

Отсутствует

 

№1409523-01-2020 21:13:02

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

Re: Custom Buttons

Andrey_Krropotkin
Ваша кнопка Перевод совсем не работает на FF72 в мультипроцессе. Напрочь убивает контекстное меню всей страницы.
Может поправите её.

Отсутствует

 

№1409623-01-2020 21:14:20

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

Re: Custom Buttons

func4ptch4 пишет

как сделать код более универсальнее

Ну, можно попробовать переложить код в custom_script_win.js

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

Выделить код

Код:

// Based on
// https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/autoOpenCloseMenu.js
// Automatically open menu on mouse over (and hide it on mouse out)
(AutoPopup => custombuttons.initAutoPopup = (...args) => new AutoPopup(...args))(class {
    constructor(btn, openDelay = 200, closeDelay = 350) {
        this.btn = btn;
        this.openDelay = openDelay;
        this.closeDelay = closeDelay;
        this._openTimer = this._closeTimer = 0;
        btn.onmouseover = e => this.onmouseover(e);
        btn.onmouseout = e => this.onmouseout(e);
    }
    open(btn) {
        btn.open = true;
    }
    close(btn) {
        for(var node = document.popupNode; node; node = node.parentNode)
            if(node == btn) // context opened
                return;
        btn.open = false;
    }
    onmouseover(e) {
        clearTimeout(this._closeTimer);
        if(e.target == this.btn && this.closeOtherMenus())
            this.btn.open = true;
        else
            this._openTimer = setTimeout(this.open, this.openDelay, this.btn);
    }
    onmouseout(e) {
        clearTimeout(this._openTimer);
        this._closeTimer = setTimeout(this.close, this.closeDelay, this.btn);
    }
    maybeClose(node) {
        if(
            node != this.btn
            && XULElement.isInstance(node)
            && "open" in node
            && node.open
            && node.getElementsByTagName("menupopup").length
        ) {
            node.open = false;
            return true;
        }
        return false;
    }
    closeOtherMenus() {
        return Array.from(this.btn.parentNode.getElementsByTagName("*"))
            .some(this.maybeClose, this);
    }
});


а в кнопке только подключать, например
скрытый текст

Выделить код

Код:

this.append(MozXULElement.parseXULToFragment(`
    <menupopup>
        <menuitem label="menuitem"/>
        <menu label="menu">
            <menupopup>
                <menuitem label="menuitem"/>
                <menuitem label="menuitem"/>
                <menuitem label="menuitem"/>
            </menupopup>
        </menu>
        <menuitem label="menuitem"/>
    </menupopup>
`));
this.type = "menu";
custombuttons.initAutoPopup(self, 250, 375);

solombala пишет

"Увеличить изображение" ....Крякнула на 72

Так обсуждалось уже.
Вместо targetSelectors теперь используется
targetIdentifier + ContentDOMReference.resolve();

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

Выделить код

Код:

addEventListener("popupshowing", {
    imgZoom: 190,   // на сколько увеличить изображение из меню
    scrollZoom: 20, // на сколько увеличивать/уменьшать колесиком мыши
    scrollTop: 1,   // или -1, переключение направление прокрутки для увеличение колёсиком

    receiveMessage(msg) {
        var container = document.documentElement
            .appendChild(document.createElement("div"));
        addDestructor(() => container.remove());
        var image = container.appendChild(document.createXULElement("image"));
        image.style.cssText = "width: 100% !important; height: 100% !important;";
        image.setAttribute("validate", "never");

        var st = container.style;
        var dz = this.scrollZoom/100 * this.scrollTop;
        var currScale = 1, x, y, initialZoom = this.imgZoom/100 - 1;

        var hide, props = ["width", "height", "left", "top"], p = n => n + "px";
        var set = (...args) => props.forEach((prop, ind) => st[prop] = p(args[ind]));

        (hide = () => {
            st.cssText = "position: fixed; display: none; z-index: 2147483647;";
            currScale = 1;
            image.src = null;
        })();
        container.onwheel = (e, ds = e.deltaY > 0 ? -dz : dz) => {
            if (currScale < .15 && ds < 0) return;
            st.transform = `scale(${currScale += ds})`;
            var {width, height, left, top, bottom, right} = container.getBoundingClientRect();

            if (height < innerHeight) {
                if (top < 0) st.top = p(y -= top);
                if (bottom > innerHeight) st.top = p(y -= bottom - innerHeight);
            }
            if (width < innerWidth) {
                if (left < 0) st.left = p(x -= left);
                if (right > innerWidth) st.left = p(x -= right - innerWidth);
            }
        }
        (this.receiveMessage = msg => {
            var {src, width, height, left, top} = msg.data;
            image.src = src;
            left -= mozInnerScreenX;
            top -= mozInnerScreenY;

            set(width, height, x = left, y = top);
            st.display = "block";
            container.onwheel(null, initialZoom);
            window.addEventListener("mousedown", hide, {once: true, capture: true});
        })(msg);
    },
    handleEvent(e) {
        if (!gContextMenu.onImage) return;
        var menuitem = document.createXULElement("menuitem");
        menuitem.setAttribute("label", "Увеличить размер");
        menuitem.className = "menuitem-iconic";
        menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADZElEQVR42oXSe0xbVRwH8N8597a35e7SAmUFukGhY66AMiNzw4GvTCQLCssc4pQsmTOa+ERMlrktW1zigpnEuWn8x2eMmiVGMBDCFjS+cJHEDIk8RoSNV1+3tLWX3t72nnO8sETJFrfvP7/k5Pw+Ob9fDoLrYi8ow9GFUbq+5aRLrGraqQcX6hlF2wkFEWn6EDIJAyQy9+3VT58cWb6PrmvmjGZS/FSHlxbXtbtLobGqJlPKMhNepWb0V8hKpi8FNd/gzCCogbdmvtg/8C9gz9+Eor5x5nn2tDOZ98Dx2i3C/uYai9mOGCxiDQIIg1/PgUCEhyvDMox9PXYBkPzaaoAzAFL0yle7ShtqO/eWJ9w1vJ1oGsVzYhTNATMQG4Q1G40ldDw6PB339fs7VgMmA0jnHfioo6F9Z3tDYYJzKSZKMYcDvAILiICfZUNYEYFixMKpKBk8MfTTasBsACnngU/6Wg4+VL/VFSOmBHAYY1BAhzAvgmyMEIkh0EUOBD1Eu49eStwA5D3z4TcPv9TYdHvxEhXSGgaEIMkJkKAS+ONmSKYolOVqMBlRSd8bv8v/AQXlJoiHUE5rZ1tFa/Nhj1uVrCaNMoQxYSaIqDxAGqAuQ2XZ1iS8HUTpkZMXe1eATOdtiCcJblGe1a3PnWp0uEvfv3tbeX5RhSet/q3wxh6xgAncZUmw2hxEryQx9/LHE7I2RV5HNudGFAtcZsuQd919u/kiz56JOwobcjd6xerqKnB4HIB4RvMzCM1DGj8X0GD64pL2Xdf850z+4djKC8wl24XUpj1P75sdfe/+sSHoq3uQnSuwa+s2Vy5uubd2jQWUTAYchJK8HpyIzvv7p/rMkV/OzPeeGEWi+x6LufiR573h8VO7Zr4n9fEZNeiqXHOofFvPsKPkS1fKsX5JU6uNZQh8Wh/hRcuvOC3/fLXrcGj52yOo7zzU9udvbzbN9uglggK2MhsnvfiE0tY9tfed7vM98D+x53tx1DdG0Z2b97Ejf3SRSiGGCysyENvdoipZa4+/8NmPp8+N+Ei2ZEVpQhG71rdcqFFozD+xcoQugFUvlDS8wWsl8Uebk5C79ujjHwyc6R/309ysDBRauEzhJkG9ErAdG0xEe6yVkwqcr+549/zZgcmQ7pAEkH2TDG6RfwCoJI0uEWJP5QAAAABJRU5ErkJggg==");
        menuitem.setAttribute("oncommand", "handleCommand();");
        e.target.append(menuitem);
        addDestructor(() => menuitem.remove());
        menuitem.handleCommand = () => this.cmd();

        this.handleEvent = () => menuitem.hidden = !gContextMenu.onImage;
    },
    cmd() {
        var msg = "CB:GetImageScreenRectForMosuseZoom";
        var code = `(targetIdentifier => {

            var image = ChromeUtils.import("resource://gre/modules/ContentDOMReference.jsm")
                .ContentDOMReference.resolve(targetIdentifier);

            var mm = image.ownerGlobal.docShell.messageManager;
            var bu = mm.BrowserUtils || ChromeUtils
                .import("resource://gre/modules/BrowserUtils.jsm").BrowserUtils;

            mm.sendAsyncMessage("${msg}", Object.assign(
                {src: image.currentSrc}, bu.getElementBoundingScreenRect(image)
            ));
        })(`;
        messageManager.addMessageListener(msg, this);
        addDestructor(() => messageManager.removeMessageListener(msg, this));

        (this.cmd = () => {
            var {osPid} = gContextMenu.actor.manager.browsingContext.currentWindowGlobal;
            if (osPid == -1) osPid = Services.appinfo.processID;
            for(var ind = 0, len = Services.ppmm.childCount; ind < len; ind++) {
                var pmm = Services.ppmm.getChildAt(ind);
                if (pmm.osPid == osPid) break;
            }
            pmm.loadProcessScript("data:;charset=utf-8," + encodeURIComponent(
                code + JSON.stringify(gContextMenu.targetIdentifier) + ")"
            ), false);
        })();
    }
}, false, document.getElementById("contentAreaContextMenu") || 1);

Отсутствует

 

№1409723-01-2020 21:21:11

shadow_user
Участник
 
Группа: Members
Зарегистрирован: 14-02-2007
Сообщений: 244
UA: Firefox 68.0

Re: Custom Buttons

Разыскивается кнопка для бекапа и восстановления кнопок, созданных в Custom Buttons, работающая в Firefox v68.

Нашел. https://forum.mozilla-russia.org/viewto … 69#p752169

Отредактировано shadow_user (23-01-2020 21:36:01)

Отсутствует

 

№1409823-01-2020 22:14:31

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 72.0

Re: Custom Buttons

momo2000 пишет

чтобы стандартный финдбар отображался на всех вкладках?

Присоединяюсь к вопросу, любой бы способ, чтоб этот...  FindBar сам не закрывался никогда?

Да классная была кнопка, если не ошибаюсь от bunda1, жалко что не поддерживается.

Добавлено 23-01-2020 22:26:12
shadow_user

Разыскивается кнопка для бекапа и восстановления кнопок, созданных в Custom Buttons, работающая в Firefox v68.

Нашел. https://forum.mozilla-russia.org/viewto … 69#p752169

Дык она же не работает?

Отредактировано voqabuhe (23-01-2020 22:27:03)

Отсутствует

 

№1409923-01-2020 23:00:15

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 72.0

Re: Custom Buttons

Dumby

Dumby пишет

Так обсуждалось уже.
Вместо targetSelectors теперь используется
targetIdentifier + ContentDOMReference.resolve();

Прозевал , вернее знал, но найти не смог...Короче, меня этот about:addons с HTML приморил , кнопка видео в плеер, и та крякнула ...еле рихтанул.
Кстати, в UndоClose нет этого и работает она , а стиль нет...Hover и т.д.  Бледная она, как поганка...

скрытый текст
}\n\
        toolbar[iconsize="small"] %button%:hover {\n\
            -moz-image-region: rect(24px, 32px, 40px, 16px) !important;\n\

И не того...

Отредактировано solombala (23-01-2020 23:06:49)

Отсутствует

 

№1410024-01-2020 07:16:39

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 482
UA: Firefox 72.0

Re: Custom Buttons

rubel не знаю у меня все работает, на всякий случай вот код который у меня

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

Выделить код

Код:

/*Initialization Code*/ 
//--------------------------------Перевод---------------------------------------- 
//Здесь можно изменять парамеры:

//Ключи
//Яндекс
var keyuser = "________________________";
//Microsoft
var keyus = "_________________________";


//Выбираем язык перевода: 
//Google поддерживает 71 языков и auto
//Microsoft поддерживает 45 языков- "" : auto,"en","ar","bg","hu","vi","ht","nl","el","da","he","id","es","it","ca","zh-CHT","zh-CHS","tlh","tlh-Qaak","ko","lv","lt","ms","mt","de","no","fa","pl","pt","ro","ru","sk","sl","th","tr","uk","ur","fi","fr","hi","mww","cs","sv","et","ja" 
//Promt поддерживает 7 языков- "a": "auto", "e": "en", "s": "es", "i": "it", "g": "de", "p": "pt", "r": "ru", "f": "fr", 
//Яндекс поддерживает 33 языка- "": auto,"az","sq","en","hy","be","bg","hu","nl","el","da","es","it","ca","lv","lt","mk","de","no","pl","pt","ro","ru","sr","sk","sl","tr","uk","fi","fr","hr","cs","sv","et" 

//Варианты выбора языка переводчика для перевода текста в окне. Нужное разкоментировать. Остальное закоментировать.
//Google,
var langFrom_google_text = "auto";//авто
var langTo_google_text = "ru"; 
//Microsoft 
var langFrom_Microsoft_text = "";//авто 
var langTo_Microsoft_text = "ru"; 
//Promt 
var langFrom_PROMT_text = "a";//авто
var langTo_PROMT_text = "r"; 
//Яндекс 
var langFrom_yandex_text = ""; //авто
//var langFrom_yandex_text = "en-"; //английский и так же другие языки, тире обязательно
var langTo_yandex_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==";
var promticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADQ0lEQVQ4jX2TX2xTdRTHT7O4GWL0gSwKmphoi3SsdFXHZiRjDExGSIxGHoTgwzDAUoM4skgEE6ckmiiEB2D8GYqbo2LLrmxZ51rWlob+W1e2ua2z2tp1ZVzrunZr161r7/3drw9TCLr4Sc7b+Zycc3IO0QNkY4M333LrD19zGbSc64aWc/VoOZepnnOZD3KuHi3nNB9rCQQcW2kl7CPjH3tPF7OUjpAxEbKDhNwEQUgSxBRBiD8GYWY/UlONzHO76YJery+4LwcmJmrHZtL5tlOVmGsjzPcQFgcIuRBBmCaIaYKYJIip18HyHiylv2Ae5wUtERGFef5ZZzQWS4sSmjgO060yzBsJi/2E3G8E4Y/lDpajDJIwDEkMwW2rHvf5fI/QlZHQFc+CBO8CQ9efOVw8s225gIewFCDkeRnEuSKwzGqw7PuQWAySlMFcrJ4NeIyv0SFv+N5nvIjdgSx2+NLYZ/Sio7nW4uTqdE7jIZ3TfFzntH6u03ON9g/aq9DQvgkftlfg5A+1aGk50EG77MHEK3cyKLHPQm6aRrkljqYu+/V/L/mNjroual0HuqwAnVeAzsix9og6Rg23xjmlLQm5OQ65OQ7FzRlstUyJtoHB7f/Ivf6+2kdNKpFMSlC3EvTjepDhBexo3tNLY+Ep9YaeyaX1tiSU9llscKSw0TOPPTecQ8FgsCgYDBZtt789Sv6NoGEVaKAU5C5F4fWSrHPIW05ERMetQxfV/fPQ+Bbw8nAWFaM5vDq6iK9tt9+77Pnu8NOz20AJDSimAd0tA4XVOGhovHR/vkgksqbqVjC5+VcBVSGGLb8zbAkxVHe642+OvpuQiSqQoAblNaClF1Hs2jQdjUbXPrSks1bHR5UjWZQPZqDxpKFyzEJ17VNckr5HIZOD2HMgUQHKrsOpn84e+c8p8zy/6qVzvZFnDJN46moYxedM+HKyGUPSCOpZI9awUjzBFCjr2+zneX7Viv/Q2tm3t+CEixWccKC68ygmhCj8wi8wCr04JnyCkruqfHd/984V5b+RnbxqbNj11VHLzrZ9kRr9O9ka614orTXseUPZvW8s39b9n/wQfr+/MBwOP+n+2V3huOOoTCQSj6+U9xeWlBixn0UlkAAAAABJRU5ErkJggg==";
var yndicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC8UlEQVQ4jY2TTWgcZQCGv1OLgkX0UlChaC8iEUo1kNJV0UiTNl1SFasYk2pELeohVkOgWkILDSTR2tWGjRILhigVoxIbf1oaWkJtIokmYWOa3253t2T/Z2dnZmfnm5nv8RZIhdIXnst7eE7vK+oH5JvPfSe5HfZ963SImxPsL9E45PD6r/KWvDYsCfaXnN2nzYp1gt2nDZqGbJqGbJrP2ixrPpZU+AoMR5GxFCNRj6Yhmxe/t6j9uji6TvDsV3kaBk1az5XQy4q0pbia8WgYNMmVFA2DJhdWXCypaPrJJPhNgere/ME1wZM9aQ78oOMrGItJlIJIyiVf8rFdxWLW4+UzBfSyImv5vDCg8URPKlf1afw+IYQQO07eIGv5jMcc+v+2OPhjnqThkbV89g9kee9njZzlM5Fw+GXOpueKwa4vU1R9dmNACCHEY91RMqbH5Ws2ZVcR01ySRY/OCwXq+5LU9yWJaS5ayeeV/hQ5y6e+L8nOkzG2dy3vEYETK8Q0l7pwgpThURdOUBdOkLc89vYmiGkug9MGe3sTRHMSWyrqwgme+fw6FccXF0XFsTl026cmFGUx7VATilITihK+lKfsKjr/yKx1CymHklTUhKIEupd4uH32H/HQRzMYZZ94XlJ2FasFyWpBcmneIFN0CYZWqO5e4vlT15CeQrM8qruXeKQ9woOHp3aKB1onieccaj9ZIKW7PNVxdY1dXfOkiy77Ty2TNVzmV21az8R59MgM93842SuEEGJzyxjVx/9Fs1xe+mKB85ECgaMRAkcj1HbOYTk+17Nl9nTNkdIljx+ZZnPLldym5j/vEUIIce+7o1R9PEWwaxbD9nA9RVqXzMRMpqImTx+bwSx7pHVJoH2aLe+Pcfc7o6+uDWnT2yNUtk1Q2TbBjsOTXJzVsKVPseRxcVYjrUtOnI1T2TbB1pbL3PXWyPop3/nGebYdGmf7B3/dkm2Hxrmj+Zyzsfn3resEGxqHOzYc+I3bonH4f3f+Dz63ssfSaOz4AAAAAElFTkSuQmCC";
var bingicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABMUlEQVQ4jY2SsU7DMBCG/TJYYqpEPDojcbq0NGM7sXdnggnigYFOyVDqLLBAkRJLTIwJSwdYw8gj8AQ/Q0kaO6HNSZbPp/P332+ZkJ7hSo2uvNdFV2rwMEOVGw28UVjl5bZZaqi8hA3aqzB/KOBKDVWUrcZ6ir/dgLlSY/HxAx5mmD++d15u7jzMjDNxpcbZyzeE+mz563o4bteaY9nj2bktwP97F7upS72yUgdLfNDIA428g9SD/6APZG84SoDGwoDQeFurly3CEh+OEmBKIFgPcWwBCCHkKPJwt7nA+dvIFBg/C9wUV3VhsbnF4L4NmKYT0Fjg9HVoApgSSL/WBuBkZQKm6QQ08jDLgraF8ZPAdX6JJnCw3AFo5IHGArMs2NVsi44SYIkPlviozraFrvgFK3TyTsPvtF8AAAAASUVORK5CYII=";
var lmricon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADQ0lEQVQ4jX2TX2xTdRTHT7O4GWL0gSwKmphoi3SsdFXHZiRjDExGSIxGHoTgwzDAUoM4skgEE6ckmiiEB2D8GYqbo2LLrmxZ51rWlob+W1e2ua2z2tp1ZVzrunZr161r7/3drw9TCLr4Sc7b+Zycc3IO0QNkY4M333LrD19zGbSc64aWc/VoOZepnnOZD3KuHi3nNB9rCQQcW2kl7CPjH3tPF7OUjpAxEbKDhNwEQUgSxBRBiD8GYWY/UlONzHO76YJery+4LwcmJmrHZtL5tlOVmGsjzPcQFgcIuRBBmCaIaYKYJIip18HyHiylv2Ae5wUtERGFef5ZZzQWS4sSmjgO060yzBsJi/2E3G8E4Y/lDpajDJIwDEkMwW2rHvf5fI/QlZHQFc+CBO8CQ9efOVw8s225gIewFCDkeRnEuSKwzGqw7PuQWAySlMFcrJ4NeIyv0SFv+N5nvIjdgSx2+NLYZ/Sio7nW4uTqdE7jIZ3TfFzntH6u03ON9g/aq9DQvgkftlfg5A+1aGk50EG77MHEK3cyKLHPQm6aRrkljqYu+/V/L/mNjroual0HuqwAnVeAzsix9og6Rg23xjmlLQm5OQ65OQ7FzRlstUyJtoHB7f/Ivf6+2kdNKpFMSlC3EvTjepDhBexo3tNLY+Ep9YaeyaX1tiSU9llscKSw0TOPPTecQ8FgsCgYDBZtt789Sv6NoGEVaKAU5C5F4fWSrHPIW05ERMetQxfV/fPQ+Bbw8nAWFaM5vDq6iK9tt9+77Pnu8NOz20AJDSimAd0tA4XVOGhovHR/vkgksqbqVjC5+VcBVSGGLb8zbAkxVHe642+OvpuQiSqQoAblNaClF1Hs2jQdjUbXPrSks1bHR5UjWZQPZqDxpKFyzEJ17VNckr5HIZOD2HMgUQHKrsOpn84e+c8p8zy/6qVzvZFnDJN46moYxedM+HKyGUPSCOpZI9awUjzBFCjr2+zneX7Viv/Q2tm3t+CEixWccKC68ygmhCj8wi8wCr04JnyCkruqfHd/984V5b+RnbxqbNj11VHLzrZ9kRr9O9ka614orTXseUPZvW8s39b9n/wQfr+/MBwOP+n+2V3huOOoTCQSj6+U9xeWlBixn0UlkAAAAABJRU5ErkJggg==";


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 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';
            };
            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=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 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=t&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));
     };
};
//----------Перевести текст в окне Яндекс------------
function ujs_yandex_translate() {
         var txt = gContextMenu.selectionInfo.fullText;
         var encTxt = encodeURIComponent(txt);
         var lng = 'ru';
         var winWait = function(lng){createWindow('', (lng == 'ru' ? 'Подождите идет перевод' : 'Wait, is going Translating')+'\u2026', 'Яндекс', '_gt', window.navigator.lastClick)};
   
     if (txt) { 
     winWait(lng);
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt);
        var url ="https://translate.yandex.net/api/v1.5/tr.json/translate?key="+keyuser+"&lang="+langFrom_yandex_text+langTo_yandex_text+"&text=" + encTxt;

        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open('GET', url, true);
           xmlhttp.send(null);
        }
        function stateChanged(){
          if (xmlhttp.readyState==4)
           {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\\n/g, "<br />");
           var data = JSON.parse( tryain );
           var result,status;
           if (data.code == "401") {result = "Неправильный ключ API"; status = "";} 
           if (data.code == "402") {result = "Ключ API заблокирован"; status = "";} 
           if (data.code == "403") {result = "Превышено суточное ограничение на количество запросов"; status = "";} 
           if (data.code == "404") {result = "Превышено суточное ограничение на объем переведенного текста"; status = "";} 
           if (data.code == "413") {result = "Превышен максимально допустимый размер текста"; status = "";} 
           if (data.code == "422") {result = "Текст не может быть переведен"; status = "";} 
           if (data.code == "501") {result = "Заданное направление перевода не поддерживается"; status = "";} 
           if (data.code == "200") {result = data.text; var status1 = data.lang; status =(status1.replace(/\-/g, "-\u203A")).toUpperCase();}
           var urlt = 'http://translate.yandex.ru/?text=' + encTxt + '&lang=' + status1;
           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;">Яндекс</a>', '_gt', window.navigator.lastClick);
           }
        }  
        gettransdata();
    } 
};
//----------Перевести выделенный текст в окне PROMT------------
function ujs_PROMT_translate() {
         var txt = gContextMenu.selectionInfo.fullText;
         var lng = 'ru';
         var winWait = function(lng){createWindow('', (lng == 'ru' ? 'Подождите идет перевод' : 'Wait, is going Translating')+'\u2026', 'Промт', '_gt', window.navigator.lastClick)};

    if (txt) { 
        winWait(lng);
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt); 
        var url='http://www.translate.ru/?External=&formEncoding=utf-8&direction=ar&prmtlang=ru&status=translate&template=General&source=' + encTxt;

        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange = stateChanged;
           xmlhttp.open( "POST", "http://www.translate.ru/services/TranslationService.asmx/GetTranslation", true );

       var post = {};
       post.dirCode = "";
       post.template = "General";
       post.text = encTxt;
       post.lang = "ru";    
       post.limit = 3000;
       post.useAutoDetect = true;
       post.key = "";
       post.ts = "MainSite";
       post.tid = "";
 
       post.dirCode += langFrom_PROMT_text;
       post.dirCode += langTo_PROMT_text;

       post = JSON.stringify(post);

       xmlhttp.setRequestHeader("Referer", "http://www.translate.ru/");
       xmlhttp.setRequestHeader("Content-type", "application/json; charset=utf-8");
       xmlhttp.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
       xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       xmlhttp.setRequestHeader("DNT", "1");
       xmlhttp.setRequestHeader("Content-Length", post.length);
       xmlhttp.send( post );
       }
       function stateChanged(){
         if (xmlhttp.readyState==4)
          {
           var tryain=xmlhttp.responseText;
          //    alert(xmlhttp.responseText);
           var data = JSON.parse( tryain );
           var result1 = data.d.result;
           var status1 = data.d.ptsDirCode;
           status1=(status1).toUpperCase();
           createWindow(result1, status1, '<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Промт</a>', '_gt', window.navigator.lastClick);
          }
       }
        gettransdata();
    } 
};
//----------Перевести выделенный текст в окне Microsoft------------
function ujs_Microsoft_translate (){
    var txt = gContextMenu.selectionInfo.fullText;
    if (txt) { 
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt), post = encTxt.length > 1024;
        var urlt = 'http://www.bing.com/translator/?from='+langFrom_Microsoft_text+'&to='+langTo_Microsoft_text+'&Text=' + encTxt;       
        var uridetect = "http://api.microsofttranslator.com/V2/Ajax.svc/Detect?appId="+keyus+"&text="+ encTxt;
        var url="http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId="+keyus+"&from="+langFrom_Microsoft_text+"&to="+langTo_Microsoft_text+"&text="+ encTxt;

        if (txt && location. hostname != 'http://api.microsofttranslator.com/')
         { var result="", status="Подождите идет перевод";
            createWindow(result, status,'<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Bing</a>', '_gt', window.navigator.lastClick);
         }
        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open(post ? 'POST' : 'GET', url, true);
           if(post)xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           xmlhttp.send(post ? encTxt : null);
           xmlhttp1=GetXmlHttpObject();
           xmlhttp1.onreadystatechange=stateChanged;
           xmlhttp1.open('GET', uridetect, true);
           xmlhttp1.send(null);
        }
       function stateChanged(){
         if (xmlhttp.readyState==4 && xmlhttp1.readyState==4)
         {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\"/g, '').replace(/\\u000d/g, " ").replace(/\\u000a/g, "<br />").replace(/\//g, '').replace(/\\n/g, "<br/>").replace(/\\r/g, "");
           var tryain1=xmlhttp1.responseText;
           tryain1=tryain1.replace(/\"/g, '');
           var result = tryain;
          var status =(tryain1 +' -\u203A '+ "ru").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;">Bing</a>', '_gt', window.navigator.lastClick);
         }
       }  
      gettransdata();
   } 
};




//----------Заменить текст переводом 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=t&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();
    } 
};
//----------Заменить текст переводом Яндекс------------ 
function ujs_TexReplace_translate() {
      var txt = gContextMenu.selectionInfo.fullText;
       var encTxt = encodeURIComponent(txt);
       if (txt) { 
         var xhr = new XMLHttpRequest();
         var encTxt = encodeURIComponent(txt);
         var url ="https://translate.yandex.net/api/v1.5/tr.json/translate?key="+keyuser+"&lang="+langFrom_yandex_text+langTo_yandex_text+"&text=" + encTxt;

        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open('GET', url, true);
           xmlhttp.send(null);
        }
        function stateChanged(){
          if (xmlhttp.readyState==4)
           {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\\n/g, "<br />");
           var data = JSON.parse( tryain );
           var result = data.text;
        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();
      } 
};  
//----------Заменить текст переводом Microsoft------------
function ujs_Microsoft_TexReplace (){
      var txt = gContextMenu.selectionInfo.fullText;
      if (txt) { 
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt), post = encTxt.length > 1024;
        var urlt = 'http://www.bing.com/translator/?from='+langFrom_Microsoft_text+'&to='+langTo_Microsoft_text+'&SourceText=' + encTxt;       
        var uridetect = "http://api.microsofttranslator.com/V2/Ajax.svc/Detect?appId="+keyus+"&text="+ encTxt;
        var url="http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId="+keyus+"&from="+langFrom_Microsoft_text+"&to="+langTo_Microsoft_text+"&text="+ encTxt;
 
        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open(post ? 'POST' : 'GET', url, true);
           if(post)xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           xmlhttp.send(post ? encTxt : null);
           xmlhttp1=GetXmlHttpObject();
           xmlhttp1.onreadystatechange=stateChanged;
           xmlhttp1.open('GET', uridetect, true);
           xmlhttp1.send(null);
        }
       function stateChanged(){
         if (xmlhttp.readyState==4 && xmlhttp1.readyState==4)
         {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\"/g, '').replace(/\\u000d/g, " ").replace(/\\u000a/g, "<br />").replace(/\//g, '').replace(/\\n/g, "<br/>").replace(/\\r/g, "");
           var tryain1=xmlhttp1.responseText;
           tryain1=tryain1.replace(/\"/g, '');
           var result = tryain;
             
        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();
   } 
};
//----------Заменить текст переводом Промт------------
function ujs_PROMT_TexReplace (){
      var txt = gContextMenu.selectionInfo.fullText;
    var encTxt = encodeURIComponent(txt);
    if (txt) { 
        var xhr = new XMLHttpRequest();
        

 
        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange = stateChanged;
           xmlhttp.open( "POST", "http://www.translate.ru/services/TranslationService.asmx/GetTranslation", true );

       var post = {};
       post.dirCode = "";
       post.template = "General";
       post.text = encTxt;
       post.lang = "ru";    
       post.limit = 3000;
       post.useAutoDetect = true;
       post.key = "";
       post.ts = "MainSite";
       post.tid = "";
 
       post.dirCode += langFrom_PROMT_text;
       post.dirCode += langTo_PROMT_text;

       post = JSON.stringify(post);

       xmlhttp.setRequestHeader("Referer", "http://www.translate.ru/");
       xmlhttp.setRequestHeader("Content-type", "application/json; charset=utf-8");
       xmlhttp.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
       xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       xmlhttp.setRequestHeader("DNT", "1");
       xmlhttp.setRequestHeader("Content-Length", post.length);
       xmlhttp.send( post );
        }
       function stateChanged(){
         if (xmlhttp.readyState==4 && xmlhttp1.readyState==4)
         {
           var tryain=xmlhttp.responseText;
             tryain=tryain.replace(/\\n/g, "<br/>");
             var data = JSON.parse( tryain );
             var result = data.d.result;
             
        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_GoogleTextPageNew_translate() { 
  var txt = gContextMenu.selectionInfo.fullText;
   var encTxt = encodeURIComponent(txt);
   var ctabpos = gBrowser.selectedTab._tPos +1;
   var url="http://translate.google.com/translate_t?text="+encTxt+"&sl=auto&tl=ru&hl=ru&eotf=0&ujs=gtt";
   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//--------Перевести текст в Яндексе в новой вкладке--------------
function ujs_yandexTextPageNew_translate() { 
      var txt = gContextMenu.selectionInfo.fullText;
       var encTxt = encodeURIComponent(txt), post = encTxt.length > 1024;
       var ctabpos = gBrowser.selectedTab._tPos +1;
       if (txt) { 
          var xhr = new XMLHttpRequest();
          var url ="https://translate.yandex.net/api/v1.5/tr.json/detect?key="+keyuser+"&lang=ru&text=" + (post ? '' : encTxt);

       function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open(post ? 'POST' : 'GET', url, true);
           if(post)xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           xmlhttp.send(post ? encTxt : null);
        }
       function stateChanged(){
          if (xmlhttp.readyState==4)
           {
           var tryain=xmlhttp.responseText;
           var data = JSON.parse( tryain );
           var status1 = data.lang;
           var urlt="http://translate.yandex.ru/?text=" + encTxt + "&lang=" + status1 + "-ru";
           gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(urlt), ctabpos);
           }
        }  
        gettransdata();
       } 
};
//---------Перевести текст в PROMT в новой вкладке---------------
function ujs_PROMTTextPageNew_translate(){ 
 var txt = gContextMenu.selectionInfo.fullText;
   var encTxt = encodeURIComponent(txt); 
   var ctabpos = gBrowser.selectedTab._tPos +1;
   var url="http://www.translate.ru/?External=&formEncoding=utf-8&direction=ar&prmtlang=ru&status=translate&template=General&source="+encTxt;
   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//---------Перевести текст в Microsoft в новой вкладке---------------
function ujs_MicrosoftTextPageNew_translate(){
  var txt = gContextMenu.selectionInfo.fullText;
   var ctabpos = gBrowser.selectedTab._tPos +1;
     var encTxt = encodeURIComponent(txt);
   var url="http://www.bing.com/translator/?to=ru&Text="+encTxt;
   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};

//--------Перевести страницу с 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. loadURI(url, {
   triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};

//---------Перевести страницу с Promt---------------
function ujs_PromtPage_translate() {
   var urlt = gBrowser.currentURI.spec;
   var url = "http://www.translate.ru/siteTranslation/autolink/?direction=ar&template=General&sourceURL="+encodeURIComponent(urlt);
   gBrowser. loadURI(url, {
   triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};

//---------Перевести страницу с Yandex---------------
function ujs_YandexPage_translate() {
  // var urlt = content.document.location.href;
  var urlt = gBrowser.currentURI.spec;
   var url = "https://translate.yandex.com/translate?url=" + encodeURIComponent(urlt) + "&dir=&ui=ru&lang=auto-ru" ;
   gBrowser. loadURI(url, {
   triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};
//---------Перевести страницу с Microsoft---------------
function ujs_MicrosoftPage_translate() {
   var urlt = gBrowser.currentURI.spec;
   var url = "http://www.microsofttranslator.com/bv.aspx?from=&to=ru&a="+encodeURIComponent(urlt);
   gBrowser. loadURI(url, {
   triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};

//---------Перевести страницу с Yandex в новой вкладке --------------
function ujs_yandexPageNew_translate() {
   var urlt = gBrowser.currentURI.spec;
   var url = "https://translate.yandex.com/translate?url=" + encodeURIComponent(urlt) + "&dir=&ui=ru&lang=auto-ru" ;
   var ctabpos = gBrowser.selectedTab._tPos +1;
   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};

//---------Перевести страницу с Microsoft в новой вкладке ---------------
function ujs_MicrosoftPageNew_translate() {   
   var urlt = gBrowser.currentURI.spec;  
   var url = "http://www.microsofttranslator.com/bv.aspx?from=&to=ru&a="+encodeURIComponent(urlt);
   var ctabpos = gBrowser.selectedTab._tPos +1;
   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//---------Перевести страницу с Promt в новой вкладке ---------------
function ujs_PromtPageNew_translate() {                 
   var urlt = gBrowser.currentURI.spec;  
   var url = "http://www.translate.ru/site/General/au-ru/?url="+ encodeURIComponent(urlt) + "";
   var ctabpos = gBrowser.selectedTab._tPos +1;
   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//--------Перевести страницу с Google в новой вкладке --------------
  
function ujs_GooglePageNew_translate() {
   var urlt = gBrowser.currentURI.spec;  
   var url = "http://translate.google.com/translate?hl=ru&sl=auto&tl=ru&u="+ encodeURIComponent(urlt) + "&sandbox=1";
   var ctabpos = gBrowser.selectedTab._tPos +1;
     
   var css = '@-moz-document domain("translate.google.com") {\
   #gb, #gt-c:not([class="g-section"]) { display: none !important; }\
   #contentframe { top: 0 !important; }\
   }';
   var uri = makeURI("data:text/css," + encodeURIComponent(css));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"]. getService(Ci.nsIStyleSheetService);
   try { sss.unregisterSheet(uri, sss.AGENT_SHEET) }
   catch(e) { sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET) } 

   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
 };




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

(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, 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", {})
);

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

(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},
        {label:"Promt ", func: ujs_PromtPageNew_translate, image:promticon},
        {label:"Yandex ", func: ujs_YandexPage_translate, image:yndicon},
        {label:"Microsoft", func: ujs_MicrosoftPage_translate, image:bingicon},
        { separator: '' },
        {label:"Google в новой вкладке", func: ujs_GooglePageNew_translate, image:gticon},
        {label:"Promt в новой вкладке", func: ujs_PromtPageNew_translate, image:promticon},
        {label:"Yandex в новой вкладке", func: ujs_yandexPageNew_translate, image:yndicon},
        {label:"Microsoft в новой вкладке", func: ujs_MicrosoftPageNew_translate, image:bingicon}
        ];
        
   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},
        {label:"В окне Яндекс", func: ujs_yandex_translate, image:yndicon},
        {label:"В окне PROMT", func: ujs_PROMT_translate, image:promticon},
        {label:"В окне Microsoft", func: ujs_Microsoft_translate, image:bingicon},
        { separator: ''},
        {label:"Заменить текст переводом Google", func: ujs_google_TexReplace, image:gticon},
        {label:"Заменить текст переводом Яндекс", func: ujs_TexReplace_translate, image:yndicon},
        {label:"Заменить текст переводом Промт", func: ujs_PROMT_TexReplace, image:promticon},
        {label:"Заменить текст переводом Microsoft", func: ujs_Microsoft_TexReplace, image:bingicon},
        { separator: ''},
        {label:"В Google в новой вкладке", func: ujs_GoogleTextPageNew_translate, image:gticon},
        {label:"В Яндексе в новой вкладке", func: ujs_yandexTextPageNew_translate, image:yndicon},
        {label:"В PROMT в новой вкладке", func: ujs_PROMTTextPageNew_translate, image:promticon},
        {label:"В Microsoft в новой вкладке", func: ujs_MicrosoftTextPageNew_translate, image:bingicon}
              ];
  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 ); 
 })();

Отсутствует

 

Board footer

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