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

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

№1342629-06-2019 18:14:26

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

Re: Custom Buttons

Dumby пишет

Так обычное контекстное меню страниц, вроде ничего особенного.

я имел ввиду не контекстное меню страницы и фрейма, а меню когда нажимаешь на три точки у дополнения

Отсутствует

 

№1342730-06-2019 22:32:54

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

Re: Custom Buttons

Andrey_Krropotkin

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

Выделить код

Код:

addEventListener("shown", {
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        e.target.baseURI == this.url && !e.target.contains(this.item)
        && requestAnimationFrame(() => e.target.prepend(this.item));
    },
    get item() {
        var item = document.createElementNS(xhtmlns, "panel-item");
        item.append("addon item");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this.onAddon(item.closest("addon-card").addon);
        }
        addDestructor(() => item.remove());
        delete this.item; return this.item = item;
    },
    onAddon(addon) {
        alert(addon.id);
    }
}, true, gBrowser.tabpanels || 1);

Отсутствует

 

№1342830-06-2019 22:45:45

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

Re: Custom Buttons

Dumby спасибо, все работает.

Отсутствует

 

№1342901-07-2019 10:14:31

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Кнопка "open With " - можно не только браузеры , но и плееры, Кстати, как убрать в "open With "  пункт страницы ?.Хочу только ссылки.

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

Выделить код

Код:

/*Initialization Code*/
// Открыть страницу или ссылку в другом браузере или плеере из контекстного меню, от 27.12.2015. ..................
((contextMenu, savepage)=> {

   var menu = contextMenu.insertBefore(document.createElement("menu"), savepage);
   menu.setAttribute("label", "Открыть в другом браузере...");
   menu.setAttribute("class", "menu-iconic");
   menu.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQkJP8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/+ysrL/5OTk/+Pj4//i4uL/4eHh/97e3nAAAAAAAAAAAAAAAAAVFRX/FRUV/xUVFf8VFRX/FRUV/xUVFf8VFRX/tbW1/+jo6P/n5+f/5+fn/+bm5v/l5eX/3t7ecAAAAAAAAAAAGBgY/xgYGP8YGBj/GBgY/xgYGP8YGBj/GBgY/7a2tv/p6en/6Ojo/+fn5//m5ub/5ubm/97e3v8AAAAAAAAAABsbG/8bGxv/Gxsb/xsbG/8bGxv/Gxsb/xsbG/+3t7f/6urq/+np6f/o6Oj/5+fn/+fn5//e3t7/AAAAAAAAAAAeHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/uLi4/+rq6v/p6en/6enp/+jo6P/n5+f/39/f/wAAAAAAAAAAISEh/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/7m5uf/r6+v/6urq/+rq6v/p6en/6Ojo/+Dg4P8AAAAAAAAAACEhIf8hISH/ISEh/yEhIf8hISH/ISEh/yEhIf+Wlpb/u7u7/7u7u/+6urr/ubm5/7m5uf+zs7P/AAAAAAAAAAC9vb3/v7+//7+/v/++vr7/vr6+/729vf+Wlpb/KCgo/ygoKP8oKCj/KCgo/ygoKP8oKCj/KCgo/wAAAAAAAAAA7+/v//Pz8//y8vL/8fHx//Hx8f/w8PD/vb29/ywsLP8sLCz/LCws/ywsLP8sLCz/LCws/ywsLP8AAAAAAAAAAPDw8P/09PT/8/Pz//Ly8v/x8fH/8fHx/729vf8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//AAAAAAAAAADx8fH/9PT0//T09P/z8/P/8vLy//Hx8f+/v7//MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/wAAAAAAAAAA8vLy//X19f/09PT/9PT0//Pz8//y8vL/wMDA/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf8AAAAAAAAAAN7e3nD29vb/9fX1//T09P/09PT/8/Pz/8HBwf84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP83Nzf/AAAAAAAAAAAAAAAA3t7ecPPz8//y8vL/8vLy//Hx8f/BwcH/ODg4/zk5Of85OTn/OTk5/zk5Of84ODj/Pj4+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAIADAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAADAAQAA//8AAA==");
   menu.onclick =e=> e.target == menu && openWith(array[0][1]);
   addEventListener("popupshowing", ()=> menu.hidden = !gContextMenu, false, contextMenu);
   addDestructor(()=> menu.remove() );

   var arr = [
      [ "KMP", "C:\\Program Files\\KMPlayer\\KMPlayer.exe"],
      [ "Youtube.dl", "D:\\tube\\youtube-dl.exe.lnk"],
      [ "PotPlayer", "C:\\PotPlayer\\PotPlayer.exe"]                                              
     
               ]
   var menuPopup = menu.appendChild( document.createElement("menupopup") );              
   arr.forEach((m)=>{
      var label = m[0], path = m[1];
      var mItem = document.createElement("menuitem");
      mItem.setAttribute("label", label);
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.setAttribute("image", "moz-icon://file://" + path); 
      mItem.onclick =()=> openWith(path);
      menuPopup.appendChild( mItem );
   });

   function openWith(path) {  
      var loc = content.document.location;
      var url = (loc.host.slice(-3) == '.рф') ? Services.io.newURI(loc.href, null, null).asciiSpec : loc;  
     
      var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);    
      file.initWithPath(path);
      var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
      process.init(file);

      !gContextMenu.onLink
      ? process.run(false, [content.location.href], 1)
      : process.run(false, [gContextMenu.linkURL], 1);
   };

})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-savepage"));


Поэтому кн "Видео в плеер" , можно без контекста
скрытый текст

Выделить код

Код:

/*Initialization Code*/
var path = 'C:\\PotPlayer\\PotPlayer.exe'

var sysPlayerName = "POTlayer";

var openIn = "Откыть в "+sysPlayerName;
var videoMoved = "Видео перенесено в "+sysPlayerName;
var noFound = "Не найдено видео на странице, доступное для переноса в "+sysPlayerName;

var YoutubeID = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})(?:\W|$)/;



if(!(cbu.getPrefs("CB.video")) || cbu.getPrefs("CB.video").length < 9) cbu.setPrefs("CB.video", "videotoplayer");
var tmp = '',
tmpp = '',
innerA = '<div style="display:block!important;color:#00ff00!important;width:250px!important;font:bold 16px serif!important;z-index:999!important;opacity:1!important;visibility: visible!important;',
innerB = 'left:5px!important;position:absolute!important;height:auto!important;box-sizing:border-box!important;padding:5px!important;margin:5px!important;',
stopPl = "javascript:(function(){v=document.getElementById('movie_player');if(v){v.stopVideo()}else{v=document.getElementsByTagName('video');if(v){v[0].src='';try{v[0].load()}catch(e){}};}})();",
ytIMGouter = function(ytID) {return '<div width="100%"><br /><a target="_blank" href="https://www.youtube.com/watch?v=' + ytID + '"><img src="https://i.ytimg.com/vi/' + ytID + '/hqdefault.jpg"></a><br />' + innerA + 'background-color:black!important;position:relative!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div><br /></div><br />'},
handlWin = function(currentWin) {
tmp = '';
var elem = currentWin.document.getElementsByTagName('video'), currLoc = currentWin.location;
if(elem.length > 0) {
if(currLoc.hostname.indexOf('youtu') != -1 && (tmp = currLoc.toString().match(YoutubeID)) && tmp[1].length == 11) {
play(cbu.getPrefs("CB.video") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
videoMovedbox = currentWin.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';
loadURI(stopPl);
currentWin.document.getElementById('eow-title').appendChild(videoMovedbox);
return true;
};
for(i = 0; i < elem.length; i++) {
if(((tmp = getSrc(elem[i].parentNode, currLoc)) && tmp.length > 2) || (i == 0 && currentWin.document.body.innerHTML.substring(0, 7) == '<video ' && (tmp = currLoc.toString()))) {
videoMovedbox = currentWin.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:20px!important;background-color:black!important;">' + videoMoved + '</div>';
play(tmp);                
if(currLoc.hostname == 'www.youtube.com') {
elem[i].parentNode.parentNode.appendChild(videoMovedbox);
} else {
elem[i].parentNode.appendChild(videoMovedbox);
};
elem[i].src = '';
try {
elem[i].load()
} catch(e) {};
return true;
}
}
};

currentWin._elems = currentWin.document.getElementsByTagName('iframe');
if(currentWin._elems.length > 0) {
for(currentWin._iCounter = 0; currentWin._iCounter < currentWin._elems.length; currentWin._iCounter++) {
if((currentWin._elems[currentWin._iCounter].src.indexOf('youtube.com') > -1) && (tmp = currentWin._elems[currentWin._iCounter].src.match(YoutubeID)) && (tmp[1].length == 11)) {
play(cbu.getPrefs("CB.video") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
currentWin._elems[currentWin._iCounter].outerHTML = ytIMGouter(tmp[1]);
return true;
};
if(currentWin._elems[currentWin._iCounter].clientWidth > 80 && currentWin._elems[currentWin._iCounter].clientHeight > 40 && handlWin(currentWin._elems[currentWin._iCounter].contentWindow))return true;
}
};

elem = currentWin.document.getElementsByTagName('object');
currLoc = currentWin.location;
if(elem.length == 0) {
elem = currentWin.document.getElementsByTagName('embed')
};
if(elem.length > 0) {
for(i = 0; i < elem.length; i++) {
if(elem[i].innerHTML.indexOf('youtu') != -1 && (tmp = elem[i].innerHTML.match(YoutubeID)) && tmp[1].length == 11) {
play(cbu.getPrefs("CB.video") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
elem[i].outerHTML = ytIMGouter(tmp[1]);
return true;
} else {
if(elem[i].clientWidth > 80 && elem[i].clientHeight > 40) {
if(((tmp = getSrc(elem[i].parentNode, currLoc)) || (tmp = getLink(elem[i], currLoc))) && tmp.length > 2) {
play(tmp);
elem[i].outerHTML = innerA + 'background-color:black!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div>';
return true;
};
};
}
};
};
return false;
};

this.onclick = this.oncontextmenu = e => {
if (e.target != this) return;
if(e.button == 0) {
if(cbu.getPrefs("CB.video").substring(0,6) == "videom"){
elem = content.document.getElementsByTagName('object');
if(elem.length == 0) {
elem = content.document.getElementsByTagName('embed')
};

resizeObjs(elem);
resizeObjs(content.document.getElementsByTagName('iframe'));
resizeObjs(content.document.getElementsByTagName('video'));
} else {
if(!handlWin(content))custombuttons.alertSlide1(noFound);
}
};

if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { // ПКМ
e.preventDefault();
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath('C:\\PotPlayer\\PotPlayer.exe');
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
var link = gClipboard.read();
var args = [link,"/play"];
process.init( file );
process.run( false, args, args.length );
}
};
this.oncontextmenu = e => e.target != this ? menu.hasAttribute("context")
    : e.ctrlKey || e.shiftKey || e.altKey || e.metaKey || (
        e.detail != 1 ? menu.hidePopup() : !!menu.openPopup(this, "after_start")
    );
custombuttons.alertSlide1 = function(sTitle) {
var as = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);
as.showAlertNotification('chrome://global/skin/icons/information-16.png', "", sTitle, false, "", null);
setTimeout(() => as.closeAlert(), 999);
};
this.tooltipText="Л: Видео в плеер\nП: Видео из Clipboard";
function resizeObjs(objs) {
if(!objs) return;
LEVELS = 3;
dir = (cbu.getPrefs("CB.video") == "videomaximize") ? 1 : -1;
for(i = 0; i < objs.length; i++) {
var Width = new Array(LEVELS)
var Height = new Array(LEVELS)
Width[0] = objs[i].clientWidth;
Height[0] = objs[i].clientHeight;
if((Width[0] > (-20 * dir + 100)) && (Height[0] > (-20 * dir + 60))) {
obj = objs[i];
for(var k = 1;
((k < LEVELS) && (obj.parentNode)); k++) {
obj = obj.parentNode
Width[k] = obj.clientWidth;
Height[k] = obj.clientHeight;
};
Width[0] = Width[0] + dir * (Width[0] / 5 | 0);
Height[0] = Height[0] + dir * (Height[0] / 5 | 0);
objs[i].style.width = Width[0] + "px";
objs[i].width = Width[0];
objs[i].style.height = Height[0] + "px";
objs[i].height = Height[0];
obj = objs[i];
for(var k = 1;
((k < LEVELS) && !(objs[i].tagName == 'IFRAME') && (obj.parentNode) && (Width[k]) && (Height[k]) && (Width[k] > (-20 * dir + 100)) && (Height[k] > (-20 * dir + 60))); k++) {
obj = obj.parentNode
Width[k] = Width[k] + dir * (Width[k] / 5 | 0);
Height[k] = Height[k] + dir * (Height[k] / 5 | 0);
obj.style.width = Width[k] + "px";
obj.width = Width[k];
obj.style.height = Height[k] + "px";
obj.height = Height[k];
}
}
};
};

function restProtHost(lnkR, curLoc) {
if(lnkR.length==0)return '';
let tr = lnkR.replace(/^:\/\//, curLoc.protocol + "//");
if(!tr.match(/^https?:\/\//i)){
lnkR = tr.replace(/^\/+/, '');
if(lnkR.split('/')[0].split('?')[0].split('#')[0].toLowerCase().match(/^(?:[-a-z\d]+\.)+[a-z\d]{2,6}$/)){
tr = curLoc.protocol + '//' + lnkR;
}else{
tr = curLoc.protocol + '//' + curLoc.host + "/" + lnkR;
}
};
return tr;
};

function getSrc(vobj, currentLoc) {
var t = '',
tt = '';
if((((t = vobj.innerHTML.match(/<video.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*))/i)) && (t) && (tt = t[1] || t[2] || t[3]) && tt.indexOf('blob:') == -1 ) || ((t = vobj.innerHTML.match(/<source.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*)).*?\stype=['"]?video\//i)) && (t) && (tt = t[1] || t[2] || t[3]))) && tt.length > 2 && tt.indexOf('blob:') == -1 ) {
if(tt.indexOf(".mp4/?") == -1) {
tt = tt.replace(/&amp;/g, "&")
};
t = restProtHost(tt, currentLoc);
return t;
};
return '';
};

function getLink(obj, curLocation) {


if(!obj || !obj.tagName) return '';
var flashvars = '',
//        src = '',
q = obj.tagName.toLowerCase();

var getParam = function(e, n) {
var v = '',
r = new RegExp('^(' + n + ')$', 'i'),
param = e.getElementsByTagName('param');
for(var igp = 0, p; p = param[igp]; igp++) {
if(p.hasAttribute('name') && p.getAttribute('name').match(r)) {
v = p.getAttribute('value');
break
};
};
return v;
};


if(q == 'object') {
//        src = obj.getAttribute('data') || obj.getAttribute('src') || getParam(obj, 'movie|data|src|code|filename|url') || (obj.getElementsByTagName('embed').length > 0 ? obj.getElementsByTagName('embed')[0].getAttribute('src') : '');
flashvars = getParam(obj, 'flashvars');
} else if(q == 'embed') {
//        src = obj.getAttribute('src');
flashvars = obj.getAttribute('flashvars');
} else return '';


if(!flashvars) return '';
//   src = restProtHost(src, curLocation);

var restPath = function(f, s) {
return(f.substring(0, 4) == 'http') ? f : s.replace(/[#?].*$/, '').replace(/[^\/]*$/, f)
};

function videoLinkExtract(fl) {
//alert(fl);
var linkArr = [],
outLinks = [],
jj = 0,
lba = '',
lbb = '',
decodeURL = function(s) {
try {
return decodeURIComponent(s)
} catch(e) {
return unescape(s)
}
};

for(var ij = 0; ij < 3; ij++) {
lba = lba + String.fromCharCode(parseInt((Math.random() * 15 + 1) + '', 10));
lbb = lbb + String.fromCharCode(parseInt((Math.random() * 15 + 16) + '', 10));
};

function pushWithMerit(lnk) {

var merit = -11;
if(lnk.match(/^https?:\/\//i)) merit = merit + 40;
if(outLinks.length == 0) merit = merit + 1;
if(lnk.match(/^\//)) merit = merit + 7;
if(lnk.match(/^\/\//)) merit = merit + 30;
if(lnk.match(/240p([^a-z]|$)/i)) merit = merit + 1;
if(lnk.match(/[^a-z]240([^a-z0-9]|$)/i)) merit = merit + 1;
if(lnk.match(/360p([^a-z]|$)/i)) merit = merit + 3;
if(lnk.match(/[^a-z]360([^a-z0-9]|$)/i)) merit = merit + 3;
if(lnk.match(/480p([^a-z]|$)/i)) merit = merit + 5;
if(lnk.match(/[^a-z]480([^a-z0-9]|$)/i)) merit = merit + 5;
if(lnk.match(/720p([^a-z]|$)/i)) merit = merit + 7;
if(lnk.match(/[^a-z]720([^a-z0-9]|$)/i)) merit = merit + 7;
if(lnk.match(/\.mp4([^a-z]|$)/i)) merit = merit + 8;
if(lnk.match(/_hd([^a-z]|$)/i)) merit = merit + 6;
if(lnk.match(/\.(jpg|xml)([^a-z]|$)/i)) merit = merit - 40;
if(merit > 0) outLinks.push(merit + lba + lnk);
Services.console.logStringMessage('merit:'+merit+' lnk->'+lnk);
};

linkArr.push(fl);
while(linkArr.length > jj && jj < 30) {

var testPaths = [];
testPaths = linkArr[jj].split(/(\.(?:flv|mp4|m3u8))/i);
if(testPaths[testPaths.length - 1] == '') testPaths.pop();

for(k = 1; k < testPaths.length; k = k + 2) {

if(testPaths[k - 1].indexOf(lba) > -1) {
pref = testPaths[k - 1];
} else {
var testAboutDom = testPaths[k - 1].toLowerCase().split(/(https?:\/\/)/); 
if(testAboutDom[testAboutDom.length - 1]=='') testAboutDom.pop();
var pTest = testAboutDom[testAboutDom.length - 1].split(/(\?[^\?]*?&)/);
if(pTest.length>2){
pTest.pop();
pTest.pop();
};
testAboutDom[testAboutDom.length - 1] = pTest.join('');
pref = testPaths[k - 1].substring(testAboutDom.join('').lastIndexOf("&") + 1);
};

t2 = pref.lastIndexOf(lbb);
if(t2 > -1) {
pref = pref.substring(t2 + 3);
} else {

t2 = pref.lastIndexOf('{"');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.lastIndexOf('["');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.lastIndexOf(',"');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.toLowerCase().lastIndexOf('"http://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf('"https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(',http://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(',https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(';http');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf('*https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(' or ');
if(t2 > -1) pref = pref.substring(t2 + 4);

pref = pref.substring(pref.split('/')[0].toLowerCase().split('%2f')[0].lastIndexOf('=') + 1);

}

if(pref.length > 0) {

if(pref.split('?')[0].toLowerCase().match(/%[2-3][0-9a-f]/)) {

t2 = pref.indexOf('"')
if(t2 > -1) pref = pref.substring(t2 + 1);
suff = testPaths[k + 1] ? testPaths[k + 1].split('&')[0].split('"')[0].split(';')[0].split(/,http/i)[0] : '';
if((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
if(testPaths.length > k + 1) {
testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
};
t2 = pref.lastIndexOf(lba);
if(t2 > -1) pref = pref.substring(t2 + 3)
linkArr.push(decodeURL(pref + testPaths[k] + suff));

} else {
testPaths[k + 1] = (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
}
} else {
suff = testPaths[k + 1] ? testPaths[k + 1].split(';')[0].split('"]')[0].split('"}')[0].split('",')[0].split(/,https?:\/\//i)[0].split('*https://')[0].split(' or ')[0] : '';
t2 = suff.indexOf('&');
if((t2 > -1) && (pref != testPaths[k - 1])) {
if(t2 == 0) suff = '';
if(suff.charAt(0) != '?') suff = suff.split(/(&[^&]+=https?:\/\/)/i)[0];
};
if((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
if(testPaths.length > k + 1) {
testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
};
t2 = pref.lastIndexOf(lba);
if(t2 > -1) pref = pref.substring(t2 + 3);
pushWithMerit(pref + testPaths[k] + suff);

} else {
testPaths[k + 1] = lba + (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
}
}
}
};
jj = jj + 1;
};

if(outLinks.length == 0) return '';
function srt(a, b) {
a = parseInt(a.substr(0, a.indexOf(lba)), 10);
b = parseInt(b.substr(0, b.indexOf(lba)), 10);
if(a < b) return 1;
if(a > b) return -1;
return 0
};
outLinks.sort(srt);
outLinks[0] = outLinks[0].substr(outLinks[0].indexOf(lba) + 3)
if(outLinks[0].indexOf('_hq.mp4/?time=') > 0) outLinks[0] = outLinks[0].replace(/&/g, '&amp;');
return outLinks[0];
};
ol = videoLinkExtract(flashvars);
if(!ol) return '';
//    ol = ol.replace(/^:?\/\//, curLocation.protocol + "//");
//    return restPath(ol, src);
return restProtHost(ol, curLocation);
};


var menu = self.appendChild(document.createElement("menupopup"));
self.image = "moz-icon://file://" + path;
var playerName = path.split("\\").pop().replace(".exe","");
self.label = "Открыть видео в " +sysPlayerName;
setTimeout(() => {
Menu_n_TooltipTxts.forEach((m) => {
if("separator" in m) {
menu.appendChild(document.createElement("menuseparator"));
return
};
var mItem = document.createElement("menuitem");
mItem.setAttribute("label", m.label);

if("radio" in m) {
mItem.setAttribute("type", "radio");
mItem.setAttribute('checked', cbu.getPrefs("CB.video") == m.value);
if(cbu.getPrefs("CB.video") == m.value) {
self.tooltipText = m.tooltipTxt;
}
mItem.onclick = () => {
cbu.setPrefs("CB.video", m.value);
tmp = (self.image == imgFlashToPlayer || self.image == imgFlashMinimize ||  self.image == imgFlashMaximize);
if(m.value.substring(0,9)=='videotopl'){
self.image = tmp ? imgFlashToPlayer : imgHTML5ToPlayer;
} else if(m.value=='videominimize') {
self.image = tmp ? imgFlashMinimize : imgHTML5Minimize;
} else self.image = tmp ? imgFlashMaximize : imgHTML5Maximize;
self.tooltipText = m.tooltipTxt;
};
}
if("checkbox" in m) {
mItem.setAttribute('type', 'checkbox');
mItem.setAttribute('checked', (self.image == imgFlashToPlayer || self.image == imgFlashMinimize ||  self.image == imgFlashMaximize ));
mItem.onclick = function(e) {
e.stopPropagation();
e.preventDefault();
if(e.button == 0) toggleFlash();
}
}
menu.appendChild(mItem);
});
menu.onclick = function(e) {
e.stopPropagation();
if(e.button > 0) e.preventDefault();
};
}, 100);


addEventListener("popupshowing", ()=> menuitem.hidden = !gContextMenu.onLink, false, contextMenu);
addDestructor(()=> menuitem.remove() );
var contextMenu = document.getElementById("contentAreaContextMenu");
var mItem = contextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-copyvideourl"));
mItem.setAttribute("label", openIn);
mItem.onclick = () => {
var vurl = gContextMenu.mediaURL, videoelem = gContextMenu.target;
if(videoelem && videoelem.nodeName.toLowerCase() == 'video') {
if(content.location.hostname.indexOf('youtu') != -1 && (tmp = content.location.toString().match(YoutubeID)) && tmp[1].length == 11) {
play(vurl);
videoMovedbox = content.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';
loadURI(stopPl);
content.document.getElementById('eow-title').appendChild(videoMovedbox);
return;
};
if(content.location.hostname == 'www.youtube.com') {
videoelem.parentNode.parentNode.appendChild(videoMovedbox);
} else {
var inFrameHref = inFrameWin.location.href, found = false;
if(inFrameWin.location.hostname == 'www.youtube.com' && (tmp = inFrameHref.match(YoutubeID)) && tmp[1].length == 11){//и значит во фрейме
elem = inFrameWin.parent.document.getElementsByTagName('iframe');
if(elem.length > 0) {
for(i = 0; i < elem.length; i++) {
if(elem[i].contentWindow == inFrameWin) {
elem[i].outerHTML = ytIMGouter(tmp[1]);
found = true;
break;
};
};
};
if(!found)inFrameWin.document.body.innerHTML = ytIMGouter(tmp[1]);
return;
};
videoelem.parentNode.appendChild(videoMovedbox);
};
videoelem.src = '';
try {
videoelem.load()
} catch(e) {};
} else play(vurl);
};


addEventListener("popupshowing", () => {
mItem.hidden = !gContextMenu.onVideo || !gContextMenu.mediaURL;
mItem2.hidden = !gContextMenu.linkURL;
mItem3.hidden = framItem.hidden || gContextMenu.target.ownerDocument.location.hostname.indexOf('youtube.com') == -1;
}, false, contextMenu);
addDestructor(() => {mItem.remove();mItem2.remove();mItem3.remove()});


function play(link) {
var file = Services.dirsvc.get('CurProcD', Ci.nsIFile);
var MozExeDir = file.path.split('\\').slice(0,-1).join('\\');
file.initWithPath(path);
if(!file.exists()) {
custombuttons.alertBox("File not found!", MozExeDir + Path);
return;
};
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(file);
process.run(false, [link, cbu.getPrefs("CB.video") == "videotoplaylist" ? addToPlaylistKey : ""], 2);
};

Отредактировано anywho (01-07-2019 12:12:08)

Отсутствует

 

№1343001-07-2019 11:18:58

Quartz1t
Участник
 
Группа: Members
Зарегистрирован: 25-11-2013
Сообщений: 111
UA: Firefox 60.0

Re: Custom Buttons

Есть инструкция как подключить youtube-dl ?

Отсутствует

 

№1343101-07-2019 11:46:31

Rag
Участник
 
Группа: Members
Откуда: Краснодон
Зарегистрирован: 06-03-2017
Сообщений: 247
UA: Firefox 60.0

Re: Custom Buttons

Quartz1t пишет

Есть инструкция как подключить youtube-dl ?

Помести youtube-dl.exe в папку PotPlayer/Module
Проверь если играет, то всё OK если нет тогда не знаю.
https://www.dailymail.co.uk/video/tvshowbiz/video-1954806/Video-Caroline-Flack-preps-Love-Island-wearing-snakeskin-mini-dress.html
На версии 1.7.18958 играет а ниже не хочет.

Отредактировано Rag (01-07-2019 11:53:07)

Отсутствует

 

№1343201-07-2019 12:30:52

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

Re: Custom Buttons

А что он дает? скачивает к примеру 720-1080 с тюба, и скачивает по отдельности или сразу вместе?
Понятно что в плеер выводит и вопрос youtube-dl.exe работает без ffmpeg.exe? ну для склейки или там все есть.

Отсутствует

 

№1343301-07-2019 18:16:13

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Помоги, заманался и никак...как убрать в "open With "  пункт страницы ?.Хочу только ссылки.

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

Выделить код

Код:

/*Initialization Code*/
// Открыть страницу или ссылку в другом браузере или плеере из контекстного меню, от 27.12.2015. ..................
((contextMenu, savepage)=> {

   var menu = contextMenu.insertBefore(document.createElement("menu"), savepage);
   menu.setAttribute("label", "Открыть в другом браузере...");
   menu.setAttribute("class", "menu-iconic");
   menu.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQkJP8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/+ysrL/5OTk/+Pj4//i4uL/4eHh/97e3nAAAAAAAAAAAAAAAAAVFRX/FRUV/xUVFf8VFRX/FRUV/xUVFf8VFRX/tbW1/+jo6P/n5+f/5+fn/+bm5v/l5eX/3t7ecAAAAAAAAAAAGBgY/xgYGP8YGBj/GBgY/xgYGP8YGBj/GBgY/7a2tv/p6en/6Ojo/+fn5//m5ub/5ubm/97e3v8AAAAAAAAAABsbG/8bGxv/Gxsb/xsbG/8bGxv/Gxsb/xsbG/+3t7f/6urq/+np6f/o6Oj/5+fn/+fn5//e3t7/AAAAAAAAAAAeHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/uLi4/+rq6v/p6en/6enp/+jo6P/n5+f/39/f/wAAAAAAAAAAISEh/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/7m5uf/r6+v/6urq/+rq6v/p6en/6Ojo/+Dg4P8AAAAAAAAAACEhIf8hISH/ISEh/yEhIf8hISH/ISEh/yEhIf+Wlpb/u7u7/7u7u/+6urr/ubm5/7m5uf+zs7P/AAAAAAAAAAC9vb3/v7+//7+/v/++vr7/vr6+/729vf+Wlpb/KCgo/ygoKP8oKCj/KCgo/ygoKP8oKCj/KCgo/wAAAAAAAAAA7+/v//Pz8//y8vL/8fHx//Hx8f/w8PD/vb29/ywsLP8sLCz/LCws/ywsLP8sLCz/LCws/ywsLP8AAAAAAAAAAPDw8P/09PT/8/Pz//Ly8v/x8fH/8fHx/729vf8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//AAAAAAAAAADx8fH/9PT0//T09P/z8/P/8vLy//Hx8f+/v7//MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/wAAAAAAAAAA8vLy//X19f/09PT/9PT0//Pz8//y8vL/wMDA/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf8AAAAAAAAAAN7e3nD29vb/9fX1//T09P/09PT/8/Pz/8HBwf84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP83Nzf/AAAAAAAAAAAAAAAA3t7ecPPz8//y8vL/8vLy//Hx8f/BwcH/ODg4/zk5Of85OTn/OTk5/zk5Of84ODj/Pj4+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAIADAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAADAAQAA//8AAA==");
   menu.onclick =e=> e.target == menu && openWith(array[0][1]);
   addEventListener("popupshowing", ()=> menu.hidden = !gContextMenu, false, contextMenu);
   addDestructor(()=> menu.remove() );

   var arr = [
      [ "KMP", "C:\\Program Files\\KMPlayer\\KMPlayer.exe"],
      [ "Youtube.dl", "D:\\tube\\youtube-dl.exe.lnk"],
      [ "PotPlayer", "C:\\PotPlayer\\PotPlayer.exe"]                                              
     
               ]
   var menuPopup = menu.appendChild( document.createElement("menupopup") );              
   arr.forEach((m)=>{
      var label = m[0], path = m[1];
      var mItem = document.createElement("menuitem");
      mItem.setAttribute("label", label);
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.setAttribute("image", "moz-icon://file://" + path); 
      mItem.onclick =()=> openWith(path);
      menuPopup.appendChild( mItem );
   });

   function openWith(path) {  
      var loc = content.document.location;
      var url = (loc.host.slice(-3) == '.рф') ? Services.io.newURI(loc.href, null, null).asciiSpec : loc;  
     
      var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);    
      file.initWithPath(path);
      var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
      process.init(file);

      !gContextMenu.onLink
      ? process.run(false, [content.location.href], 1)
      : process.run(false, [gContextMenu.linkURL], 1);
   };

})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-savepage"));

Отсутствует

 

№1343401-07-2019 22:34:59

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

Re: Custom Buttons

anywho
Чтобы виднелось только на ссылках, в десятой строке после !gContextMenu допиши .onLink
А вообще, там много чего менять надо, по разным причинам.

Отсутствует

 

№1343501-07-2019 23:02:55

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Да, вреде, все в елочку....А, шо, еще какая-то поганка зарыта? Жаль, сдесь ссылка не появляется...Приходится копировать...
8qkqq9fx.png

Отредактировано anywho (01-07-2019 23:37:42)

Отсутствует

 

№1343602-07-2019 00:07:50

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

Re: Custom Buttons

anywho пишет

Жаль, сдесь ссылка не появляется

menu.hidden = !gContextMenu.onLink && !gContextMenu.onPlainTextLink

Отсутствует

 

№1343702-07-2019 00:54:17

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Класс,конечно...Но этот чертов фрейм...не дает выделенное в плеер отправить и автокопи не работает ...Или фрейм в новой вкладке и оттуда выделенную ссылку в плеер, или просто копировать и из буфера в плеер. А, так , нормально...Это я rutube разлохматил скриптом, вечно шифруются свом протоколом...
Впрочем, вставил в основную кнопку видео && !gContextMenu.onPlainTextLink , там был захвать с фрейма, и все заработало!

Отредактировано anywho (02-07-2019 01:48:06)

Отсутствует

 

№1343804-07-2019 12:51:48

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

Re: Custom Buttons

Можно ли установить отдельный useragent для сайтов которые открываются в боковой панели?

Отредактировано Stkvsky (04-07-2019 13:35:22)

Отсутствует

 

№1343904-07-2019 14:41:51

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

Re: Custom Buttons

Stkvsky пишет

Можно ли установить отдельный useragent для сайтов которые открываются в боковой панели?

Была кнопка когда-то, у себя удалил вроде перестала работать.
Он открывал сайты с мобильным useragent-ами, или раньше в свойствах можно было задавать точно не помню.

Update: Вроде она или нет, в общем найду старую сборку свою может нарою и кину.
Точно, открывает не так как я думал... ну может можно доработать?

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESidebar%20Sites%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAiEAAAIhAENVwL6AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAHqSURBVHjarJM9aBVBFIW/s2wkgmDnDxoUgoJWokXERlEbf5pY2AhCCkWUgCaNvs3b2Z335lmZoETRINhKLPxD0CZgI0GtLFQUG8FGmxSBmBRzbSYSJE2IB4b5u/cMc+65MjOWYsT57cAVM9sL7AIi8EnSuxjjWKdV/Vgar0WCRrPqknQDuAB0AR+BsbS+DOwEfku6GWNsdFpV/EvQaFa5pElJ+8xsFlhrZn2dVvUrkW+R9Bb4CWyW9CrGONBpVTEHkDQK9JvZHNADzEv6WpQ16R6gG9gELJjZ2SzLvgNNXRtx2yR9AS5JOmJmfcAQy+Me8Bz4AFw3s95cUi8wHLy7X5T1LPA4ePdkueyirNcDM8G7p0VZr5G0Q41mdTB497oo6/3Bu+mirA+b2beUEwGyLMuTXj0p9kDw7k1R1kfVaFYvgUfA3VSBfqANXAUMyNPsgQ7wEJgAzgOnMuA2MJ4O7gCjwbtpYKOkBUDAuuDd+/TIOHBxMTYzsxfAieDdA+BY8G4qKT8QYxyWNCjpHICZPQOOB+8mgJPBu6lc0iFgNzAFbCjK+nTwbrJdl5//FVHSGWAmbfcUZT2/6jLKzCjK+hYwCMwlw8ynsRTdydYLQLekdrsum3n625CkrSuw8mSM0f2/ZlpNO/8ZAGBFAEu2Gqq+AAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.onclick%20%3De%3D%3E%20%7Bif%28e.target%20%21%3D%20this%29%20return%3B%20let%20clipboard%20%3D%20gClipboard.read%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%28e.button%3D%3D0%29menuPopup.openPopup%28this%2C%27after_start%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%28e.button%3D%3D1%29openWebPanel%28clipboard%2Cclipboard%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%28e.button%3D%3D2%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%7Bdocument.getElementById%28%22custombuttons-contextpopup%22%29.hidePopup%28%29%3B%7D%2C0%29%3BopenWebPanel%28window.content.document.title%2C%20window.content.document.location%29%3B%7D%7D%3B%0Athis.tooltipText%3D%27%u041B%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u0441%u043E%20%u0441%u043F%u0438%u0441%u043A%u043E%u043C%20%u0437%u0430%u0434%u0430%u043D%u043D%u044B%u0445%20%u0430%u0434%u0440%u0435%u0441%u043E%u0432%5Cn%5C%u0421%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%5Cn%5C%u041F%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%27%3B%0A%0Avar%20menuPopup%20%3D%20createNode%28%22menupopup%22%2C%20self%2C%20false%2C%20%7Bcontext%3A%20%22%22%7D%29%2C%0A%20%20%20%20sbBox%20%3D%20SidebarUI._box%2C%0A%20%20%20%20sbClsBtn%20%3D%20sbBox.querySelector%28%22.close-icon.tabbable%22%29%2C%0A%20%20%20%20wps%20%3D%20%22SidebarUI.browser.contentDocument.querySelector%28%27browser%23web-panels-browser%27%29.%22%2C%0A%20%20%20%20sep%20%3D%20%22%5Cn%5Cn%22%2C%0A%20%20%20%20help%20%3D%20self.Help.trim%28%29%2C%0A%20%20%20%20items%20%3D%20help%0A%20%20%20%20%20%20%3F%20help.split%28sep%29%0A%20%20%20%20%20%20%3A%20%5B%22New%20Tab%5Cnabout%3Anewtab%5Cnchrome%3A//mozapps/skin/places/defaultFavicon.png%22%5D%2C%0A%20%20%20%20menugroup%20%3D%20createNode%28%22menugroup%22%2C%20menuPopup%2C%20false%2C%20%7B%0A%20%20%20%20%20%20orient%3A%20%22vertical%22%2C%0A%20%20%20%20%20%20oncommand%3A%20%22openPage%28event.target%29%3B%22%2C%0A%20%20%20%20%20%20oncontextmenu%3A%20%22removePage%28event.target%29%3B%22%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20cnMenu%20%3D%20document.getElementById%28%22contentAreaContextMenu%22%29%2C%0A%20%20%20%20cnOpen%20%3D%20document.getElementById%28%22context-sep-open%22%29%2C%0A%20%20%20%20cnItem%20%3D%20createNode%28%22menuitem%22%2C%20cnOpen%2C%20true%2C%20%7B%0A%20%20%20%20%20%20id%3A%20%22open-in-sidebar%22%2C%0A%20%20%20%20%20%20label%3A%20%22Open%20in%20Sidebar%22%2C%0A%20%20%20%20%20%20oncommand%3A%20%22openWebPanel%28gContextMenu.getLinkURL%28%29%2C%20gContextMenu.getLinkURL%28%29%29%3B%20document.getElementById%28%27verticaltoolbar-button%27%29.click%28%29%3B%22%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20cnListener%20%3D%20cnMenu.addEventListener%28%22popupshowing%22%2C%20%28%29%3D%3E%20cnItem.hidden%20%3D%20%21gContextMenu.onLink%29%2C%0A%20%20%20%20cnDestructor%20%3D%20addDestructor%28%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20cnMenu.removeEventListener%28%22popupshowing%22%2C%20cnListener%29%3B%0A%20%20%20%20%20%20cnMenu.removeChild%28cnItem%29%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20sbNav%20%3D%20%5B%0A%20%20%20%20%20%20%5B%22back%22%2C%20%22goBack%28%29%3B%22%2C%20%22back-button-tooltip%22%5D%2C%0A%20%20%20%20%20%20%5B%22forward%22%2C%20%22goForward%28%29%3B%22%2C%20%22forward-button-tooltip%22%5D%2C%0A%20%20%20%20%20%20%5B%22reload%22%2C%20%22reload%28%29%3B%22%2C%2C%20%22Reload%20current%20page%22%5D%2C%0A%20%20%20%20%20%20%5B%22stop%22%2C%20%22stop%28%29%3B%22%2C%2C%20%22Stop%20loading%20this%20page%22%5D%0A%20%20%20%20%5D%3B%0A%0Aitems.forEach%28%28item%2C%20index%29%20%3D%3E%20%7B%0A%20%20var%20%5Btitle%2C%20url%2C%20icon%5D%20%3D%20item.split%28%22%5Cn%22%29%3B%0A%20%20icon%20%3D%20%28icon.startsWith%28%27chrome%3A%27%29%20%7C%7C%20icon.startsWith%28%27data%3A%27%29%29%20%3F%20icon%20%3A%20%27moz-anno%3Afavicon%3A%27%20+%20icon%3B%0A%20%20createNode%28%22menuitem%22%2C%20menugroup%2C%20false%2C%20%7B%0A%20%20%20%20tooltiptext%3A%20url%2C%0A%20%20%20%20class%3A%20%22menuitem-iconic%22%2C%0A%20%20%20%20label%3A%20title%2C%0A%20%20%20%20image%3A%20icon%0A%20%20%7D%29.index%20%3D%20index%3B%0A%7D%29%3B%0Amenugroup.openPage%20%3D%20%28%7Bindex%7D%29%20%3D%3E%20openWebPanel%28...items%5Bindex%5D.split%28%22%5Cn%22%29%29%3B%0Amenugroup.removePage%20%3D%20%28%7Bindex%7D%29%20%3D%3E%20items.splice%28index%2C%201%29%20%26%26%20installButton%28items.join%28sep%29%29%3B%0A%0A%5B%0A%20%20%5B%27menuseparator%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0443%27%2C%20%27custombuttons.editButton%28this.parentNode.parentNode%29%3B%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%27%2C%20%27openWebPanel%28gClipboard.read%28%29%2C%20gClipboard.read%28%29%29%3B%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u0441%u0430%u0439%u0442%27%2C%20%27this.parentNode.parentNode.addPage%28window.content.document.title%2C%20window.content.document.location.href%2C%20gBrowser.mCurrentTab.image%29%3B%27%5D%0A%5D.forEach%28%28%5Btype%2C%20lbl%2C%20cmd%5D%29%20%3D%3E%20%0A%20%20%20%20%20%20%20%20%20%20createNode%28type%2C%20menuPopup%2C%20false%2C%20%7Blabel%3A%20lbl%2C%20oncommand%3A%20cmd%7D%29%29%3B%0A%0Aif%20%28%21sbBox.hasAttribute%28%22navbuttons%22%29%29%20%7B%0A%20%20sbNav.forEach%28%28%5Bid%2C%20cmd%2C%20tltp%2C%20ttxt%5D%29%20%3D%3E%20%7B%0A%20%20%20%20var%20icon%20%3D%20%22chrome%3A//browser/skin/content-contextmenu.svg%23%22%20+%20id%3B%0A%20%20%20%20id%20%3D%20%27sb-%27%20+%20id%20+%20%27-button%27%3B%0A%20%20%20%20createNode%28%22toolbarbutton%22%2C%20sbClsBtn%2C%20true%2C%20%7B%0A%20%20%20%20%20%20id%3A%20id%2C%0A%20%20%20%20%20%20oncommand%3A%20wps%20+%20cmd%2C%0A%20%20%20%20%20%20tooltip%3A%20tltp%2C%0A%20%20%20%20%20%20tooltiptext%3A%20ttxt%2C%0A%20%20%20%20%20%20style%3A%20%27list-style-image%3A%20url%28%22%27%20+%20icon%20+%20%27%22%29%3B%20-moz-image-region%3A%20rect%280%2011px%2011px%200%29%3B%27%0A%20%20%20%20%7D%29%0A%20%20%7D%29%0A%20%20sbBox.setAttribute%28%27navbuttons%27%2C%20%27true%27%29%3B%0A%7D%0A%0Afunction%20installButton%28help%29%20%7B%0A%20%20%20%20var%20link%20%3D%20custombuttons.makeButtonLink%28%22edit%22%2C%20_id%29%3B%0A%20%20%20%20var%20param%20%3D%20custombuttons.cbService.getButtonParameters%28link%29%3B%0A%20%20%20%20param%20%3D%20param.wrappedJSObject%20%7C%7C%20param%3B%0A%20%20%20%20param.help%20%3D%20help%3B%0A%20%20%20%20custombuttons.cbService.installButton%28param%29%3B%0A%7D%0A%0Afunction%20createNode%28type%2C%20elm%2C%20before%2C%20attrs%29%20%7B%0A%20%20var%20node%20%3D%20before%0A%20%20%3F%20elm.parentNode.insertBefore%28document.createElement%28type%29%2C%20elm%29%0A%20%20%3A%20elm.appendChild%28document.createElement%28type%29%29%3B%0A%20%20for%28var%20name%20in%20attrs%29%20%7B%0A%20%20%20%20if%20%28attrs%5Bname%5D%29%0A%20%20%20%20%20%20node.setAttribute%28name%2C%20attrs%5Bname%5D%29%3B%0A%20%20%7D%0A%20%20return%20node%3B%0A%7D%0A%0Athis.addPage%20%3D%28title%2C%20url%2C%20icon%29%3D%3E%20%7B%0A%20%20title%20%3D%20%21title%20%3F%20url%20%3A%20title%3B%0A%20%20icon%20%3D%20%21icon%20%3F%20%27chrome%3A//mozapps/skin/places/defaultFavicon.png%27%20%3A%20icon%3B%0A%20%20var%20newItem%20%3D%20%5Btitle%2C%20url%2C%20icon%5D.join%28%27%5Cn%27%29%3B%0A%20%20installButton%28%5Bhelp%2C%20newItem%5D.join%28sep%29%29%3B%0A%7D%0A%0A%28%28browser%2C%20listener%2C%20br%29%20%3D%3E%20%7B%20if%20%28browser%29%20%7B%0A%20%20addEventListener%28%22DOMFrameContentLoaded%22%2C%20listener%2C%20true%2C%20browser%29%3B%0A%20%20var%20getBr%20%3D%20%28%29%20%3D%3E%20browser.contentDocument.querySelector%28listener.selector%29%3B%0A%20%20if%20%28%28br%20%3D%20getBr%28%29%29%29%20br.window%20%3D%20%7Bparent%3A%20listener.parent%7D%3B%0A%20%20addDestructor%28%28%29%20%3D%3E%20%7B%0A%20%20%20%20if%20%28%28br%20%3D%20getBr%28%29%29%29%20delete%20br.window%3B%0A%20%20%7D%29%3B%0A%7D%7D%29%28SidebarUI.browser%2C%20%7B%0A%20%20selector%3A%20%22browser%23web-panels-browser%22%2C%0A%20%20handleEvent%28e%29%20%7B%0A%20%20%20%20if%20%28e.target.matches%28this.selector%29%20%26%26%20%21e.target.hasAttribute%28%22disableglobalhistory%22%29%29%20%7B%0A%20%20%20%20%20%20sbNav.forEach%28%28%5Bid%2C%20cmd%5D%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20id%20%3D%20%27%23context-%27%20+%20id%3B%0A%20%20%20%20%20%20%20%20var%20mItem%20%3D%20SidebarUI.browser.contentDocument.querySelector%28id%29%3B%0A%20%20%20%20%20%20%20%20if%20%28id%20%3D%3D%20%22%23context-reload%22%29%0A%20%20%20%20%20%20%20%20%20%20mItem.style.setProperty%28%27display%27%2C%20%27-moz-box%27%2C%20%27important%27%29%3B%0A%20%20%20%20%20%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20eval%28wps%20+%20cmd%29%3B%0A%20%20%20%20%20%20%7D%29%0A%20%20%20%20%20%20e.target.setAttribute%28%22disableglobalhistory%22%2C%20%27false%27%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28e.target.matches%28this.selector%29%20%26%26%20%21%28%22window%22%20in%20e.target%29%29%0A%20%20%20%20%20%20e.target.window%20%3D%20%7Bparent%3A%20this.parent%7D%3B%0A%20%20%7D%2C%0A%20%20get%20parent%28%29%20%7B%0A%20%20%20%20delete%20this.parent%3B%0A%20%20%20%20var%20parent%20%3D%20%7B%7D%3B%0A%20%20%20%20parent.contentAreaClick%20%3D%20eval%28%60%28%24%7B%0A%20%20%20%20%20%20contentAreaClick.toString%28%29.replace%28%0A%20%20%20%20%20%20%20%20%27linkNode.getAttribute%28%22onclick%22%29%27%2C%0A%20%20%20%20%20%20%20%20%22%21target%20%26%26%20this.shouldLoadInPanelBrowser%28linkNode%29%20%7C%7C%20%24%26%22%0A%20%20%20%20%20%20%29%0A%20%20%20%20%7D%29%60%29%3B%0A%20%20%20%20parent.shouldLoadInPanelBrowser%20%3D%20link%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20%28%21%28link.ownerDocument.location.protocol%20%3D%3D%20%22file%3A%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20link.className%20%3D%3D%20%27file%27%29%29%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20this.parent%20%3D%20parent%3B%0A%20%20%7D%0A%7D%29%3B%0A%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Avar%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28%0A%20%20%5B%0A%20%20%20%20%27@namespace%20xul%20url%28%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%29%3B%27%2C%0A%20%20%20%20%27@namespace%20html%20url%28%22http%3A//www.w3.org/1999/xhtml%22%29%3B%27%2C%0A%20%20%20%20%27@namespace%20svg%20url%28http%3A//www.w3.org/2000/svg%29%3B%27%2C%0A%20%20%20%20%27%27%2C%0A%20%20%20%20%27@-moz-document%20url%28%22chrome%3A//browser/content/browser.xul%22%29%20%7B%27%2C%0A%20%20%20%20%27%20%20%23sidebar-throbber%5Bloading%5D%20%7E%20%23sb-reload-button%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-throbber%3Anot%28%5Bloading%5D%29%20%7E%20%23sb-stop-button%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20-moz-appearance%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20padding%3A%203.5px%206px%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20margin%3A%20.5px%200%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20background%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20background-clip%3A%20border-box%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20border%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20border-radius%3A%200%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20box-shadow%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%3Anot%28%5Bsidebarcommand%3D%22viewWebPanelsSidebar%22%5D%29%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20.toolbarbutton-icon%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20opacity%3A%200.5%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20transition%3A%20opacity%20ease%20200ms%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%3Ahover%20.toolbarbutton-icon%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20opacity%3A%200.9%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%7D%27%0A%20%20%5D.join%28%27%5Cn%27%29%29%29%3B%0AaddDestructor%28%28%29%3D%3E%20sss.unregisterSheet%28this.uri%2C%200%20%7C%7C%20uri%2C%200%29%29%3B%0Athis.uri%20%3D%20uri%3B%0Asss.loadAndRegisterSheet%28uri%2C%200%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%0Aabout%3Aconfig%0Aabout%3Aconfig%0A-%0A%0Aabout%3Aabout%0Aabout%3Aabout%0A-%0A%0Achrome%3A//browser/content/preferences/cookies.xul%0Achrome%3A//browser/content/preferences/cookies.xul%0A-%0A%0Achrome%3A//browser/content/places/places.xul%0Achrome%3A//browser/content/places/places.xul%0A-%0A%0Achrome%3A//browser/content/preferences/connection.xul%0Achrome%3A//browser/content/preferences/connection.xul%0A-%0A%0A------------%0A------------%0A------------%0A%0AWatch%0Adata%3Atext/html%3Bbase64%2CPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCjx0aXRsZT5UaGUgQ2xvY2sgaXMgVGlja2luZyB8IE5ldyBUYWIgQmlnIENsb2NrIEJhY2tncm91bmQ8L3RpdGxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KCWZ1bmN0aW9uIHBhaW50VGltZSgpew0KCQl2YXIgbm93ICAgID0gbmV3IERhdGUoKTsNCgkJdmFyIGhvdXIgICA9IG5vdy5nZXRIb3VycygpOw0KCQl2YXIgbWludXRlID0gbm93LmdldE1pbnV0ZXMoKTsNCgkJdmFyIHNlY29uZCA9IG5vdy5nZXRTZWNvbmRzKCk7DQoJCWlmIChob3VyICAgPT0gMCkgeyBob3VyID0gMTI7ICAgICAgICAgICAgIH0NCgkJaWYgKDEwICAgPiBob3VyKSB7IGhvdXIgICA9ICIwIiArIGhvdXI7ICAgfQ0KCQlpZiAoMTAgPiBtaW51dGUpIHsgbWludXRlID0gIjAiICsgbWludXRlOyB9DQoJCQ0KCQlpZiAoMTAgPiBzZWNvbmQpIHsgc2Vjb25kID0gIjAiICsgc2Vjb25kOyB9DQoJCXZhciB0aW1lU3RyaW5nID0gaG91ciArDQoJCQkJCQknOicgKw0KCQkJCQkJbWludXRlICsNCgkJCQkJCSc6JyArDQoJCQkJCQlzZWNvbmQ7IA0KCQl2YXIgbW9udGhzID0gbmV3IEFycmF5KDEzKTsNCgkJbW9udGhzWzBdICA9ICJKYW51YXJ5IjsNCgkJbW9udGhzWzFdICA9ICJGZWJydWFyeSI7DQoJCW1vbnRoc1syXSAgPSAiTWFyY2giOw0KCQltb250aHNbM10gID0gIkFwcmlsIjsNCgkJbW9udGhzWzRdICA9ICJNYXkiOw0KCQltb250aHNbNV0gID0gIkp1bmUiOw0KCQltb250aHNbNl0gID0gIkp1bHkiOw0KCQltb250aHNbN10gID0gIkF1Z3VzdCI7DQoJCW1vbnRoc1s4XSAgPSAiU2VwdGVtYmVyIjsNCgkJbW9udGhzWzldICA9ICJPY3RvYmVyIjsNCgkJbW9udGhzWzEwXSA9ICJOb3ZlbWJlciI7DQoJCW1vbnRoc1sxMV0gPSAiRGVjZW1iZXIiOw0KCQl2YXIgbm93ICAgICAgICAgPSBuZXcgRGF0ZSgpOw0KCQl2YXIgbW9udGhudW1iZXIgPSBub3cuZ2V0TW9udGgoKTsNCgkJdmFyIG1vbnRobmFtZSAgID0gbW9udGhzW21vbnRobnVtYmVyXTsNCgkJdmFyIG1vbnRoZGF5ICAgID0gbm93LmdldERhdGUoKTsNCgkJdmFyIHllYXIgICAgICAgID0gbm93LmdldFllYXIoKTsNCgkJaWYoeWVhciA8IDIwMDApIHsgeWVhciA9IHllYXIgKyAxOTAwOyB9DQoJCXZhciBkYXRlU3RyaW5nID0gbW9udGhuYW1lICsNCgkJCQkJCScgJyArDQoJCQkJCQltb250aGRheSArDQoJCQkJCQknLCAnICsNCgkJCQkJCXllYXI7DQogICAJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0uaW5uZXJIVE1MID0gIjxkaXY+Iit0aW1lU3RyaW5nKyI8YnIvPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MzhweDsnPiIrZGF0ZVN0cmluZysiPC9zcGFuPjwvZGl2PiI7DQoJfQ0KCWZ1bmN0aW9uIGJnQ29sb3IoKXsNCgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0uc3R5bGUuYmFja2dyb3VuZENvbG9yID09ICJyZ2IoMjA2LCAyMDYsIDIwNikiKXsNCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIjMDAwIjsNCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLnN0eWxlLmNvbG9yID0gIiNDRUNFQ0UiOw0KCQkJfQ0KCQ0KCX0NCglmdW5jdGlvbiBvbmJvZHlsb2FkKCl7DQoJCXBhaW50VGltZSgpOw0KCQlpbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtwYWludFRpbWUoKTt9LCAxMDAwKTsNCgkJaW50ZXJ2YWxJRDIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpe2JnQ29sb3IoKTt9LCA1MDAwKTsNCgl9DQoJCTwvc2NyaXB0Pg0KPHN0eWxlPg0KYm9keSB7DQoJY29sb3I6ICMwMEZGMDA7DQoJZm9udDogOTRweCBBcmlhbDsNCgltYXJnaW46IGF1dG87DQoJcGFkZGluZzoxMDBweCAwIDAgMDsNCglsZWZ0OjA7DQoJcmlnaHQ6MDsNCgl0b3A6MDsNCglib3R0b206MDsNCgliYWNrZ3JvdW5kLWNvbG9yOiMwMDA7DQogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkOw0KCXRleHQtYWxpZ246Y2VudGVyOw0KCWhlaWdodDogMTAwJTsNCgl3aWR0aDogMTAwJTsNCn0NCjwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keSBvbkxvYWQ9Im9uYm9keWxvYWQoKTsiPg0KPGRpdiBpZD0iZG50Ij48L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4%0Adata%3Aimage/ico%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXpJREFUeNqkU7uKwkAUvUnMGlSIWNhql3Z/wG+wtBOExY8QbAT/YMFmK3/C1EJ6CwsftYKFqEUUk5jsPQMTYnZS7YHDTO7jzL13MlqSJPQfaOPx+JPXL2Y/64Dw7XYz6/V6qMibM38mk8mKRqPR9/F4fDGSLJ/PZ7JcLpO8HbxerzHycIjOhn6z2dTxkSVQqVQobwdrtZqGPMSUoiiiOI7/9qZpxOUrfQDyAD0MQxGk4na7LfQhLxXgcpTc7XaFPilQkgIq7Pf7Ql9awePxMAaDAc1mM9GXZBAEdDqd6HK5vNk9zyPE+77/IQS4n9d0OqVut0t8PXAIdewNw6DNZpP2fL/fyXEcQjwjEC3gJFmOXCWGwyEtFguybZuq1eqbD3npDPKJEo1Gg3q9Hh0OB2q1WsoZCAHceRFM06R2u108RGwQlKeu67Rer5U+MBXgyc55UFG5XKYsIeC6LuXt4Pl8fiFP/LGdTkf5GtGWZVkmX3Pha+THtvoVYADFFmv7Z4SugwAAAABJRU5ErkJggg%3D%3D%0A%0AMyRadio%20-%20Online%20Player%0Ahttp%3A//myradio.ua/flashplayer/53%0Adata%3Aimage/ico%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABMLAAATCwAAAAAAAAAAAABzChH/zQ8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/80PHf9zChH/0A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/zQ8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/3zZC/+t7gv/0uLz/9LS4/+p2ff/cKjb/1A8d/9QPHf/UDx3/1A8d/9EPHf/UDx3/1A8d/9QPHf/XFyT/8Jie///////2wMT/63uC/+2Ei//3ycz//////+t6gv/VEiD/1A8d/9QPHf/RDx3/1A8d/9QPHf/UER//9r3A//vi4v/fNkL/1A8d/9QPHf/UDx3/1A8d/+JHUf/98fP/8Jie/9QPHf/UDx3/0Q8d/9QPHf/UDx3/5FJc///////bKDT/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/4D5J///////fNkL/1A8d/9EPHf/UDx3/1A8d//a9wP/wmJ7/1A8d/9QPHf/ZHSr/8Z2i/9ojL//UDx3/1A8d/9QPHf/2wMT/75KX/9QPHf/RDx3/1A8d/9QPHf/+9fb/5ltk/9QPHf/UDx3/2yg0////////////5l1m/9QPHf/UDx3/63qC//fJzP/UDx3/0Q8d/9QPHf/UDx3//vX2/+ZbZP/UDx3/1A8d/9soNP///////vX2/+NKVP/UDx3/1A8d/+t6gv/3ycz/1A8d/9EPHf/UDx3/1A8d//a9wP/wmJ7/1A8d/9QPHf/YHCn/8Z2i/9kgLP/UDx3/1A8d/9QPHf/2wMT/7o2T/9QPHf/RDx3/1A8d/9QPHf/kUlz//////9wqNv/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/gPkn//////940P//UDx3/0Q8d/9QPHf/UDx3/1BEf//S4vP/74uL/3zpF/9QPHf/UDx3/1A8d/9QPHf/jTVf//fHz/++Sl//UDx3/1A8d/9EPHf/UDx3/1A8d/9QPHf/XFyT/7o2T///////2wMT/63uC/+2Ei//3ycz//////+p2ff/VEiD/1A8d/9QPHf/RDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/eND//63qC//S4vP/0sLX/6nR8/9wqNv/UDx3/1A8d/9QPHf/UDx3/0Q8d/9APHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/84PHf9rCQ//yQ8c/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/8gPHP9wChH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%0A%0A2ip.ru.Panel%0Ahttps%3A//2ip.ru/opera-panel/%0Adata%3Aimage/ico%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8AlF8AfJNfAP+TXwD/lF8A/5VgAP+VYAD/l2IA/5ZiAP+YYwD/mWUA/5tmAP+bZwD/m2cA/51qAP+jbwD/lF8AcZVgAP+UYAD/lV8A/5VhAP+WYgD/l2IA/5hjAP+YZAD/mmUA/5tnAP+bZwD/nWkA/51pAP+fawD/pnIA/5VgAO+WYgD/lmEA/5VgAP+VXwD/l2EA/5hkAP+ZZAD/mGMA/5plAP+daQD/nmoA/55qAP+fawD/o3AA/6p4AP+VYADvlmIA/5hjAP+VXwD/lF0A/5VgAP+bZwD/mGIA/5dgAP+aZAD/n2sA/6BsAP+fbAD/oG0A/6NwAP+pdwD/mGQA7ZplAP+XYQD/7ePW//bw6P/WwaH/lFwA/+rfz//18Oj/2cOi/55qAP+kcgD/pXIA/6Z0AP+pdgD/rn0A/5toAO2fawD/mGIA//Lr4P//////3cuy/5RbAP/v5db//////+DNrf+cZAD/pG8A/6h2AP+sewD/rn0A/7KFAP+gbQDtoGwA/55oAP/x6d3//////9zJq/+aYwD/7uXU///////28ej/5de8/9nCmv+9li3/rXsA/7SGAP+3iwD/o3AA7aRyAP+ibQD/8enb///////eyqv/oGkA/+/m0///////////////////////+/n0/7uSEP+1hwD/vJIA/6d2AO2ndwD/pXIA//Lr3f//////3cur/6VvAP/w5tT//////+vfyP/Or17/9O3d///////ZxJT/tYcA/8CWAP+qewDtq3sA/6t4AP/z693//////97Mq/+rdgD/8ejV///////j07L/tYkA/+3iyP//////382h/7iNAP/DnAD/r38A7bB/AP+tegD/9e7h///////h0bP/rnwA//Lr1////////////////////////////9G0W/++lQD/xaEA/7GDAO20hQD/soIA/+zgxf/z7d3/1rt5/7WGAP/r4L7/9O7e//Xv3v/28N//8ObL/9rGff+/mAD/w54A/8akAP+2hwDtt4gA/7mLAP+4igD/t4oA/7yPAP+9lQD/vJIA/7uSAP+9lAD/vJQA/76WAP+/lwD/w54A/8WiAP/IpwD/tYYA7beIAP+6jQD/u48A/7uRAP++lAD/vpcA/7+YAP+/lwD/v5gA/8GaAP/AmgD/w5wA/8WgAP/FogD/yKcA/7mLAPG7jgD/u48A/76UAP+/lwD/wJcA/7+ZAP/BmwD/wZwA/8KdAP/DnwD/w54A/8agAP/GogD/x6YA/8qqAH+9kADcvZMA7cCWAO3AmQDtw50A7cOcAO3EngDtxJ8A7cahAO3GogDtxqMA7ceiAO3HpADtyqcA7cuqAG////8AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA%3D%3D%0A%0AYandex.Panel%0Ahttp%3A//op.yandex.ru/%0Adata%3Aimage/ico%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAAsAAAAUwAAAF8AAABfAAAAXwAAAF8AAABfAAAAXwAAAF8AAABfAAAAXwAAADjBwcEAwcHBAMHBwQDBwcEAAAAAUbq6uurExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP9ubm6QAAAALcTExADExMQAxMTEAAAAAFrHx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/vr6+7h4eHmQAAAAQx8fHAMfHxwAAAABXy8vL/8vLy/+UlM3/AADU/4+Pzv/Ly8v/g4PO/wwM0//Ly8v/y8vL/8vLy/+kpKS6AAAAM8vLywDLy8sAAAAAU9DQ0P/Q0ND/0NDQ/05O2f8dHd3/y8vQ/4eH1f8MDN7/0NDQ/9DQ0P/Q0ND/0NDQ/2VlZXsAAAAk0NDQAAAAAE/U1NT/1NTU/9TU1P/Fxdb/FBTq/3Bw3/+Jidz/DAzr/9TU1P/U1NT/1NTU/9TU1P/JycnkDw8PUwAAAAcAAABL2dnZ/9nZ2f/Z2dn/2dnZ/4WF5f8KCvb/ODjv/w0N9f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6ioqKYAAAAqAAAASOLi4v/i4uL/4uLi/6io6v8LC/7/QkL2/zo69/8NDf3/4uLi/+Li4v/i4uL/4uLi/+Li4v/g4OD7AAAARgAAAETx8fH/8fHx//Hx8f81Ovz/bG/5//Hx8f+fovb/GB3+//Hx8f/x8fH/8fHx//Hx8f/x8fH/7+/v+wAAAEIAAABA9vb2//b29v/29vb/HSz//7K3+f/29vb/qK35/yUz/v/29vb/9vb2//b29v/29vb/9vb2/8jIyKMAAAAkAAAAPPn5+f/5+fn/+fn5/z5U/v+osvv/+fn5/6+4+/80TP//+fn5//n5+f/5+fn/+fn5//Dw8OMXFxdBAAAABgAAADj7+/v/+/v7//v7+/+Ro/3/UG7+/7/J/P+crf3/Q2P///v7+//7+/v/+/v7//v7+/+Tk5NnAAAAGfv7+wAAAAA1/f39//39/f/9/f3/9vj9/4yk/v9Td///QWn//05z///9/f3//f39//39/f/c3NysAAAAH/39/QD9/f0AAAAAMv7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/5+fnpPj4+PgAAAAn+/v4A/v7+AAAAACn39/fi////////////////////////////////////////////////tbW1cgAAABf///8A////AP///wAAAAAVAAAAKAAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAABv///8A////AP///wD///8AAA8AAAAHAAAAAwAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAADAAAABwAAAA8AAA%3D%3D%0A%0AYandex.Weather%0Ahttps%3A//yandex.kz/pogoda/almaty/%0Adata%3Aimage/ico%3Bbase64%2CAAABAAIAICAAAAEAIAAoEAAAJgAAABAQAAABACAAKAQAAE4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqqthWqr7FsqK+zk6iwsoGqr7M2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpr7JTqq6x8aqvsv+qr7L/qq+y/6qvsv+prrGhqqqqBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqK2yNaqvsvqqr7L/qq+y/6qvsv+qr7L/qq+y/6qvsv+pr7KSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqrbKyqq+y/6qvsv+pr7Hqqa+yj6mvscOqr7L/qq+y/6mvsvynsbEaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvs/Cqr7L/qq+y/6qusUUAAAAAv7+/BKmtstuqr7L/qq+y/6uusVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+y/6qvsv+qr7L/p7GxGgAAAAAAAAAAqq+ys6qvsv+qr7L/qa6xZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7L/qq+y/6qvsv+nsbEaAAAAAAAAAACqrbKyqq+y/6qvsv+qr7JmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvsv+qr7L/qq+y/6exsRoAAAAAAAAAAKmvso+qr7LMqq+yzKqws1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+y/6qvsv+qr7L/p7GxGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7L/qq+y/6qvsv+nsbEaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvsv+qr7L/qq+y/6exsRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+y/6qvsv+qr7L/p7GxGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7L/qq+y/6qvsv+nsbEaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvsv+qr7L/qq+y/6exsRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+y/6qvsv+qr7L/p7GxGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7L/qq+y/6qvsv+nsbEaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvsv+qr7L/qq+y/6exsRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP70AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+9QAAAAAAAAAAAAAAAAAA/t0AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP7fAAAAAAAAAAAAAAAAAAD+xAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/skAAAAAAAAAAAAAAAAAAP2VAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD9mgAAAAAAAAAAAAAAAAAA/1AAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP9XAAAAAAAAAAAAAAAAAAD/DgAA/vkAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+/AAA/xUAAAAAAAAAAAAAAAAAAAAAAAD9mwAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP2kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8jAAD++wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+/gAA/ywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2RAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP2ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wUAAP7GAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+0wAA/woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/yAAAP7dAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/uEAAP8lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/xMAAP7FAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP7RAAD/HQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/woAAP2PAAD++wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP78AAD9kQAA/wsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8jAAD9lAAA/uwAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP7sAAD9lQAA/yQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BAAA/zkAAP9uAAD9kgAA/6oAAP+qAAD/qgAA/ZIAAP9uAAD/OQAA/wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqA6qvsWypsLGkqa6za6qqqgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKuvsXmqr7L/qq+xzamusfuqrrN4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpr7HDqa6y2AAAAACrr7Kmqa+xwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+yzKqvsswAAAAAqK2ymaqvsswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvssyqr7LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7LMqq+yzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+yzKqvsswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvssyqr7LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP72AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+9QAAAAAAAAAAAAD+2wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/tkAAAAAAAAAAAAA/Z8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP2dAAAAAAAAAAAAAP9DAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/QAAAAAAAAAAAAAAAAAAA/rsAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+uAAAAAAAAAAAAAAAAAAAAAAAAP8aAAD+3QAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+3AAA/xkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/xsAAP63AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+tQAA/xkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/zYAAP2EAAD9pAAA/aQAAP2EAAD/NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано func4ptch4 (05-07-2019 00:14:29)

Отсутствует

 

№1344004-07-2019 18:31:09

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

Re: Custom Buttons

func4ptch4
У меня есть кнопка но открывает она с юзерагентом браузера
Вот:
ЛКМ - открыть список сайтов
СКМ - добавить сайт в список
ПКМ - открыть сайт в боковой панели (в мультипроцессном режиме ПКМ открывает последний открытый сайт а не текущий, так что нужно сначала добавить в список и открыть со списка)
Автор кнопки turbot

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

Выделить код

Код:

var menuPopup = self.appendChild(document.createElement("menupopup")),
    help = self.Help;

menuPopup.setAttribute('context', '');

for (var item of help.split('\n\n')) {
  var mItem = document.createElement("menuitem"),
      params = item.split('\n'),
      title = params[0],
      url = params[1],
      icon = !params[2] ? '' : params[2];

  mItem.setAttribute('label', title);
  mItem.setAttribute('tooltiptext', url);
  mItem.setAttribute('class', 'menuitem-iconic');
  mItem.setAttribute('image', icon || "chrome://mozapps/skin/places/defaultFavicon.png");
  mItem.setAttribute('oncommand', 'openWebPanel("' + title + '", "' + url + '")');
  mItem.setAttribute('oncontextmenu', 'this.parentNode.parentNode.removePage("' + encodeURIComponent(title) + '", "' + encodeURIComponent(url) + '", "' + encodeURIComponent(icon) + '");');

  menuPopup.appendChild(mItem);
}

[
  {sep: ''},
  {lbl: 'Редактировать кнопку', cmd: 'custombuttons.editButton(this.parentNode.parentNode);'},
  {lbl: 'Открыть адрес из буфера обмена', cmd: 'openWebPanel(gClipboard.read(), gClipboard.read());'},
  {lbl: 'Добавить текущий сайт', cmd: 'this.parentNode.parentNode.addPage();'}
].forEach(m=> {
  if ('sep' in m)
    menuPopup.appendChild(document.createElement("menuseparator"));
  else {
    var extraItems = menuPopup.appendChild(document.createElement("menuitem"));

    extraItems.setAttribute('label', m.lbl);
    extraItems.setAttribute('oncommand', m.cmd);
  }
});

this.addPage =()=> {
  var iconLink = gBrowser.mCurrentTab.image,
      icon = !iconLink ? '' : (!iconLink.startsWith('chrome:') ? '\nmoz-anno:favicon:' + iconLink : '\n' + iconLink),
      newItem = [,,window.content.document.title, window.content.document.location + icon].join('\n'),
      link = custombuttons.makeButtonLink("edit", _id),
      param = custombuttons.cbService.getButtonParameters(link);

  param = param.wrappedJSObject || param;
  param.help = param.help + newItem;

  custombuttons.cbService.installButton(param);
};

this.removePage =(aTitle, aURL, aIcon)=> {
  var itemsToRemove = [],
      link = custombuttons.makeButtonLink("edit", _id),
      param = custombuttons.cbService.getButtonParameters(link);

  aIcon = !aIcon ? '' : '\n' + aIcon;

  param = param.wrappedJSObject || param;
  itemsToRemove.push([,,aTitle, aURL + aIcon].join('\n'), [aTitle, aURL + aIcon,,,].join('\n'));

  for (var item of itemsToRemove)
    param.help = param.help.replace(decodeURIComponent(item), '');

  custombuttons.cbService.installButton(param);
};

this.onclick =e=> {
  if (e.target !== this) return;

  if (e.button == 0)
    menuPopup.openPopup(this, 'after_start')

  if (e.button == 1)
    this.addPage();

  if (e.button == 2 && !e.shiftKey && !e.ctrlKey && !e.altKey)
    e.preventDefault(), e.stopPropagation(),
      openWebPanel(window.content.document.title, window.content.document.location);;
};

this.tooltipText = 'ЛКМ: Открыть меню со списком заданных адресов\nСКМ: Добавить текущий сайт в спискок заданных адресов\nПКМ: Открыть адрес активной вкладки';

(contextMenu => {
  var menuitem = document.createElement("menuitem");

  menuitem.id = "open-in-sidebar";
  menuitem.setAttribute("label", "Open in Sidebar");
  menuitem.setAttribute("oncommand", "openWebPanel(gContextMenu.getLinkURL(), gContextMenu.getLinkURL())");
  contextMenu.insertBefore(menuitem, document.getElementById("context-sep-open"));

  addEventListener("popupshowing", ()=> menuitem.hidden = !gContextMenu.onLink, false, contextMenu);
  addDestructor(()=> contextMenu.removeChild(menuitem));
})(document.getElementById("contentAreaContextMenu"));

((browser, listener, br) => { if (browser) {
  addEventListener("DOMFrameContentLoaded", listener, true, browser);
  var getBr = () => browser.contentDocument.querySelector(listener.selector);
  if ((br = getBr())) br.window = {parent: listener.parent};
  addDestructor(() => {
    if ((br = getBr())) delete br.window;
  });
}})(SidebarUI.browser, {
  selector: "browser#web-panels-browser",
  handleEvent(e) {
    if (e.target.matches(this.selector)) {
      var wp = e.target;
      if (!wp.hasAttribute("disableglobalhistory"))
        wp.setAttribute("disableglobalhistory", "false");
      if (wp.hasAttribute("contextfixed")) return;
      [
        ["#context-back", "wp.goBack();"],
        ["#context-forward", "wp.goForward();"],
        ["#context-reload", "wp.reload();"],
        ["#context-stop", "wp.stop();"]
      ].forEach(m=> {
        var mItem = SidebarUI.browser.contentDocument.querySelector(m[0]);
        mItem.onclick =()=> eval(m[1]);
        SidebarUI.browser.contentDocument.querySelector("#context-reload")
          .style.setProperty('display', '-moz-box', 'important');
      });
      wp.setAttribute('contextfixed', 'true');
    }
    if (e.target.matches(this.selector) && !("window" in e.target))
      e.target.window = {parent: this.parent};
  },
  get parent() {
    delete this.parent;
    var parent = {};
    parent.contentAreaClick = eval(`(${
      contentAreaClick.toString().replace(
        'linkNode.getAttribute("onclick")',
         "!target && this.shouldLoadInPanelBrowser(linkNode) || $&"
      )
    })`);
    parent.shouldLoadInPanelBrowser = link => {
      if (!(link.ownerDocument.location.protocol == "file:"
            && link.className == 'file')) return true;
    }
    return this.parent = parent;
  }
});

Отредактировано Stkvsky (04-07-2019 18:33:52)

Отсутствует

 

№1344105-07-2019 12:55:32

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 316
UA: Firefox 66.0

Re: Custom Buttons

Dumby
У меня CB на 69b1 не работают с custom_buttons-0.0.7.0.0.5a1-fx-bootstrap.xpi и последним config.js.
Есть решение для этой версии или надо ждать 69b3?

Отсутствует

 

№1344205-07-2019 17:19:55

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Garalf
Отбрось надежду, всяк туда входящий... custombuttons.css ? и все user.css -  зарублены в 69 ...Всему есть предел, шустрее, чем 67 уже не будет, а вот гемморов - будет немерено.

Отсутствует

 

№1344305-07-2019 18:42:43

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 316
UA: Firefox 66.0

Re: Custom Buttons

anywho
А по мне твоя сборка CrazyFox 66 самая шустрая.

Отсутствует

 

№1344405-07-2019 18:53:19

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Garalf
67 шустрее. Хотя ии 66 доработана до предела...Без сonfig.js , без storage и т.д.

Отредактировано anywho (05-07-2019 18:57:28)

Отсутствует

 

№1344505-07-2019 19:15:18

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

Re: Custom Buttons

Garalf пишет

У меня CB на 69b1 не работают с custom_buttons-0.0.7.0.0.5a1-fx-bootstrap.xpi и последним config.js.
Есть решение для этой версии или надо ждать 69b3?

Да, вижу, спасибо. Хорошо, соберу сейчас, а если что, постараюсь заменить.

custom_buttons-0.0.7.0.0.5-fx-paxmod.xpi

config.js

Выделить код

Код:

//
try {(nsvo => {
    var o = Cu.getGlobalForObject(nsvo).Object, {freeze} = o;
    o.freeze = obj => {
        if (Components.stack.caller.filename != "resource://gre/modules/AppConstants.jsm")
            return freeze(obj);
        obj.MOZ_REQUIRE_SIGNING = false;
        obj.MOZ_ALLOW_LEGACY_EXTENSIONS = true;
        return (o.freeze = freeze)(obj);
    }
    lockPref("extensions.legacy.enabled", true);
    lockPref("xpinstall.signatures.required", false);
    lockPref("extensions.langpacks.signatures.required", false);

    nsvo = Cu.import("resource://gre/modules/addons/XPIInstall.jsm", {});
    var shouldVerify = nsvo.shouldVerifySignedState;
    nsvo.shouldVerifySignedState = addon => !addon.id && shouldVerify(addon);
    
})(Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}));}
catch(ex) {Cu.reportError(ex);}

//
try {({
    ids: [
        "custombuttons@xsms.org",
    ],
    init(xrt) {
        if (xrt.inSafeMode) return;
        Cu.import("resource://gre/modules/addons/XPIProvider.jsm", this);
        var load = async file => {
            var rootURI = this.XPIInternal.getURIForResourceInFile(file, "");
            Cu.import(rootURI.resolve("startup.jsm"), {}).start(rootURI);
        }
        var proto = this.XPIInternal.BootstrapScope.prototype;
        var func = proto._beforeCallBootstrapMethod;

        proto._beforeCallBootstrapMethod = () => {
            proto._beforeCallBootstrapMethod = func;
            for(var addon of this.XPIInternal.XPIStates.enabledAddons())
                this.ids.includes(addon.id) && !addon.loader && load(addon.file);
        }
    }
}).init(Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime));}
catch(ex) {Cu.reportError(ex);}


custom_buttons-0.0.7.0.0.5-fx-bootstrap.xpi
bootstrap-loader.js

Выделить код

Код:

//
try {
    Cu.createDocumentEncoder && Cc["@mozilla.org/moz/jssubscript-loader;1"]
        .getService(Ci.mozIJSSubScriptLoader).loadSubScript(String.raw`
            data:,var {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");%0Avar {AddonManager} = ChromeUtils.import("resource://gre/modules/AddonManager.jsm");%0A%0Athis.lazyModules = {%0A%09OS: "resource://gre/modules/osfile.jsm",%0A%09Services: "resource://gre/modules/Services.jsm",%0A%09ConsoleAPI: "resource://gre/modules/Console.jsm",%0A%09Blocklist: "resource://gre/modules/Blocklist.jsm",%0A%09AddonInternal: "resource://gre/modules/addons/XPIDatabase.jsm"%0A};%0Aif ("@mozilla.org/intl/domlocalization;1" in Cc)%0A%09this.lazyModules.RDFDataSource = "resource://gre/modules/addons/RDFDataSource.jsm";%0Aelse%0A%09// Firefox 67+%0A%09// Bug 1523194 - Remove XPIDL for DOMLocalization and use do_ImportModule instead%0A%09// https://bugzilla.mozilla.org/show_bug.cgi?id=1523194%0A%09//%0A%09// Bug 857458 - Remove support for update.rdf%0A%09// https://bugzilla.mozilla.org/show_bug.cgi?id=857458%0A%0A%09XPCOMUtils.defineLazyGetter(this, "RDFDataSource", () => {%0A%09%09var obs = {};%0A%09%09var scs = Cc["@mozilla.org/streamConverters;1"].getService(Ci.nsIStreamConverterService);%0A%09%09var sis = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);%0A%09%09var sl =  Cc["@mozilla.org/network/stream-loader;1"].createInstance(Ci.nsIStreamLoader);%0A%0A%09%09var gzip = "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";%0A%09%09sis.data = atob(gzip);%0A%09%09obs.onStreamComplete = (a, b, c, d, result) => Cu.evalInSandbox(String.fromCharCode(...result), this);%0A%09%09sl.init(obs);%0A%09%09var converter = scs.asyncConvertData("gzip", "uncompressed", sl, null);%0A%09%09converter.onStartRequest(null, null);%0A%0A%09%09var args = [null, null, sis, 0, sis.data.length];%0A%09%09// Bug 1525319 - Investigate if we can remove Context argument from Channel methods (Firefox 67+)%0A%09%09// https://bugzilla.mozilla.org/show_bug.cgi?id=1525319%0A%09%09if (converter.onDataAvailable.length == 4) args.shift();%0A%09%09converter.onDataAvailable(...args);%0A%0A%09%09converter.onStopRequest(null, null, null);%0A%0A%09%09return RDFDataSource;%0A%09});%0AXPCOMUtils.defineLazyModuleGetters(this, this.lazyModules);%0Adelete this.lazyModules;%0A%0AXPCOMUtils.defineLazyGetter(this, "BOOTSTRAP_REASONS", () =>%0A%09ChromeUtils.import("resource://gre/modules/addons/XPIProvider.jsm", {})%0A%09%09.XPIProvider.BOOTSTRAP_REASONS%0A);%0AXPCOMUtils.defineLazyGetter(this, "logger", () =>%0A%09ChromeUtils.import("resource://gre/modules/Log.jsm", {})%0A%09%09.Log.repository.getLogger("addons.bootstrap")%0A);%0A%0A%0A// RDFManifestConverter.jsm%0Aconst RDFURI_INSTALL_MANIFEST_ROOT = "urn:mozilla:install-manifest";%0A%0Afunction EM_R(aProperty) {%0A%09return %60http://www.mozilla.org/2004/em-rdf%23%24{aProperty}%60;%0A}%0Afunction getValue(literal) {%0A%09return literal && literal.getValue();%0A}%0Afunction getProperty(resource, property) {%0A%09return getValue(resource.getProperty(EM_R(property)));%0A}%0A%0Aclass Manifest {%0A%09constructor(ds) {%0A%09%09this.ds = ds;%0A%09}%0A%09static loadFromString(text) {%0A%09%09return new this(RDFDataSource.loadFromString(text));%0A%09}%0A%09static loadFromBuffer(buffer) {%0A%09%09return new this(RDFDataSource.loadFromBuffer(buffer));%0A%09}%0A%09static async loadFromFile(uri) {%0A%09%09return new this(await RDFDataSource.loadFromFile(uri));%0A%09}%0A}%0A%0Aclass InstallRDF extends Manifest {%0A%09_readProps(source, obj, props) {%0A%09%09for (let prop of props) {%0A%09%09%09let val = getProperty(source, prop);%0A%09%09%09if (val != null) {%0A%09%09%09%09obj[prop] = val;%0A%09%09%09}%0A%09%09}%0A%09}%0A%09_readArrayProp(source, obj, prop, target, decode = getValue) {%0A%09%09let result = Array.from(%0A%09%09%09source.getObjects(EM_R(prop)), target => decode(target)%0A%09%09);%0A%09%09if (result.length) {%0A%09%09%09obj[target] = result;%0A%09%09}%0A%09}%0A%09_readArrayProps(source, obj, props, decode = getValue) {%0A%09%09for (let [prop, target] of Object.entries(props)) {%0A%09%09%09this._readArrayProp(source, obj, prop, target, decode);%0A%09%09}%0A%09}%0A%09_readLocaleStrings(source, obj) {%0A%09%09this._readProps(source, obj, ["name", "description", "creator", "homepageURL"]);%0A%09%09this._readArrayProps(source, obj, {%0A%09%09%09locale: "locales",%0A%09%09%09developer: "developers",%0A%09%09%09translator: "translators",%0A%09%09%09contributor: "contributors",%0A%09%09});%0A%09}%0A%09decode() {%0A%09%09let root = this.ds.getResource(RDFURI_INSTALL_MANIFEST_ROOT);%0A%09%09let result = {};%0A%0A%09%09let props = [%0A%09%09%09"id", "version", "type", "updateURL", "optionsURL",%0A%09%09%09"optionsType", "aboutURL", "iconURL",%0A%09%09%09"bootstrap", "unpack", "strictCompatibility"%0A%09%09];%0A%09%09this._readProps(root, result, props);%0A%0A%09%09let decodeTargetApplication = source => {%0A%09%09%09let app = {maxVersion: "*"};%0A%09%09%09this._readProps(source, app, ["id", "minVersion"]);%0A%09%09%09return app;%0A%09%09};%0A%0A%09%09let decodeLocale = source => {%0A%09%09%09let localized = {};%0A%09%09%09this._readLocaleStrings(source, localized);%0A%09%09%09return localized;%0A%09%09};%0A%0A%09%09this._readLocaleStrings(root, result);%0A%0A%09%09this._readArrayProps(%0A%09%09%09root, result, {"targetPlatform": "targetPlatforms"}%0A%09%09);%0A%09%09this._readArrayProps(%0A%09%09%09root, result, {"targetApplication": "targetApplications"}, decodeTargetApplication%0A%09%09);%0A%09%09this._readArrayProps(%0A%09%09%09root, result, {"localized": "localized"}, decodeLocale%0A%09%09);%0A%09%09this._readArrayProps(%0A%09%09%09root, result, {"dependency": "dependencies"}, source => getProperty(source, "id")%0A%09%09);%0A%09%09return result;%0A%09}%0A}%0A// fim RDFManifestConverter.jsm%0A%0A%0A// BootstrapLoader.jsm%0A/**%0A * Valid IDs fit this pattern.%0A */%0Avar gIDTest = /^(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)$/i;%0A%0A// Properties that exist in the install manifest%0Aconst PROP_METADATA%09= [%0A%09"id", "version", "type", "internalName", "updateURL",%0A%09"optionsURL", "optionsType", "aboutURL", "iconURL"%0A];%0Aconst PROP_LOCALE_SINGLE = ["name", "description", "creator", "homepageURL"];%0Aconst PROP_LOCALE_MULTI%09= ["developers", "translators", "contributors"];%0A%0A// Map new string type identifiers to old style nsIUpdateItem types.%0A// Retired values:%0A// 32 = multipackage xpi file%0A// 8 = locale%0A// 256 = apiextension%0A// 128 = experiment%0A// theme = 4%0Aconst TYPES = {%0A%09extension: 2,%0A%09dictionary: 64,%0A};%0A%0Aconst COMPATIBLE_BY_DEFAULT_TYPES = {%0A%09extension: true,%0A%09dictionary: true,%0A};%0A%0Aconst hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);%0A%0Afunction isXPI(filename) {%0A%09let ext = filename.slice(-4).toLowerCase();%0A%09return ext === ".xpi" || ext === ".zip";%0A}%0A%0A/**%0A * Gets an nsIURI for a file within another file, either a directory or an XPI%0A * file. If aFile is a directory then this will return a file: URI, if it is an%0A * XPI file then it will return a jar: URI.%0A *%0A * @param {nsIFile} aFile%0A *%09%09The file containing the resources, must be either a directory or an XPI file%0A *%0A * @param {string} aPath%0A *%09%09The path to find the resource at, "/" separated. If aPath is empty%0A *%09%09then the uri to the root of the contained files will be returned%0A *%0A * @returns {nsIURI}%0A *%09%09An nsIURI pointing at the resource%0A */%0Afunction getURIForResourceInFile(aFile, aPath) {%0A%09if (!isXPI(aFile.leafName)) {%0A%09%09let resource = aFile.clone();%0A%09%09if (aPath)%0A%09%09%09aPath.split("/").forEach(part => resource.append(part));%0A%0A%09%09return Services.io.newFileURI(resource);%0A%09}%0A%09return buildJarURI(aFile, aPath);%0A}%0A%0A/**%0A * Creates a jar: URI for a file inside a ZIP file.%0A *%0A * @param {nsIFile} aJarfile%0A *%09%09The ZIP file as an nsIFile%0A *%0A * @param {string} aPath%0A *%09%09The path inside the ZIP file%0A *%0A * @returns {nsIURI}%0A *%09%09An nsIURI for the file%0A */%0Afunction buildJarURI(aJarfile, aPath) {%0A%09let uri = Services.io.newFileURI(aJarfile);%0A%09uri = "jar:" + uri.spec + "!/" + aPath;%0A%09return Services.io.newURI(uri);%0A}%0A%0Avar BootstrapLoader = {%0A%09name: "bootstrap",%0A%09manifestFile: "install.rdf",%0A%09async loadManifest(pkg) {%0A%09%09/**%0A%09%09 * Reads locale properties from either the main install manifest root%0A%09%09 * or an em:localized section in the install manifest.%0A%09%09 *%0A%09%09 * @param {Object} aSource%0A%09%09 *%09%09The resource to read the properties from.%0A%09%09 *%0A%09%09 * @param {boolean} isDefault%0A%09%09 *%09%09True if the locale is to be read from the main install manifest root%0A%09%09 *%0A%09%09 * @param {string[]} aSeenLocales%0A%09%09 *%09%09An array of locale names already seen for this install manifest.%0A%09%09 *%09%09Any locale names seen as a part of this function will be added to this array%0A%09%09 *%0A%09%09 * @returns {Object}%0A%09%09 *%09%09An object containing the locale properties%0A%09%09 */%0A%09%09function readLocale(aSource, isDefault, aSeenLocales) {%0A%09%09%09let locale = {};%0A%09%09%09if (!isDefault) {%0A%09%09%09%09locale.locales = [];%0A%09%09%09%09for (let localeName of aSource.locales || []) {%0A%09%09%09%09%09if (!localeName) {%0A%09%09%09%09%09%09logger.warn("Ignoring empty locale in localized properties");%0A%09%09%09%09%09%09continue;%0A%09%09%09%09%09}%0A%09%09%09%09%09if (aSeenLocales.includes(localeName)) {%0A%09%09%09%09%09%09logger.warn("Ignoring duplicate locale in localized properties");%0A%09%09%09%09%09%09continue;%0A%09%09%09%09%09}%0A%09%09%09%09%09aSeenLocales.push(localeName);%0A%09%09%09%09%09locale.locales.push(localeName);%0A%09%09%09%09}%0A%0A%09%09%09%09if (locale.locales.length == 0) {%0A%09%09%09%09%09logger.warn("Ignoring localized properties with no listed locales");%0A%09%09%09%09%09return null;%0A%09%09%09%09}%0A%09%09%09}%0A%09%09%09for (let prop of [...PROP_LOCALE_SINGLE, ...PROP_LOCALE_MULTI]) {%0A%09%09%09%09if (hasOwnProperty(aSource, prop)) {%0A%09%09%09%09%09locale[prop] = aSource[prop];%0A%09%09%09%09}%0A%09%09%09}%0A%09%09%09return locale;%0A%09%09}%0A%0A%09%09let manifestData = await pkg.readString("install.rdf");%0A%09%09let manifest = InstallRDF.loadFromString(manifestData).decode();%0A%0A%09%09let addon = new AddonInternal();%0A%09%09for (let prop of PROP_METADATA) {%0A%09%09%09if (hasOwnProperty(manifest, prop)) {%0A%09%09%09%09addon[prop] = manifest[prop];%0A%09%09%09}%0A%09%09}%0A%09%09if (!addon.type) {%0A%09%09%09addon.type = "extension";%0A%09%09} else {%0A%09%09%09let type = addon.type;%0A%09%09%09addon.type = null;%0A%09%09%09for (let name in TYPES) {%0A%09%09%09%09if (TYPES[name] == type) {%0A%09%09%09%09%09addon.type = name;%0A%09%09%09%09%09break;%0A%09%09%09%09}%0A%09%09%09}%0A%09%09}%0A%09%09if (!(addon.type in TYPES))%0A%09%09%09throw new Error("Install manifest specifies unknown type: " + addon.type);%0A%0A%09%09if (!addon.id)%0A%09%09%09throw new Error("No ID in install manifest");%0A%09%09if (!gIDTest.test(addon.id))%0A%09%09%09throw new Error("Illegal add-on ID " + addon.id);%0A%09%09if (!addon.version)%0A%09%09%09throw new Error("No version in install manifest");%0A%0A%09%09addon.strictCompatibility =%0A%09%09%09!(addon.type in COMPATIBLE_BY_DEFAULT_TYPES) ||%0A%09%09%09"strictCompatibility" in manifest && manifest.strictCompatibility == "true";%0A%0A%09%09// Only read these properties for extensions.%0A%09%09if (addon.type == "extension") {%0A%09%09%09if (manifest.bootstrap != "true") {%0A%09%09%09%09throw new Error("Non-restartless extensions no longer supported");%0A%09%09%09}%0A%09%09%09if (%0A%09%09%09%09addon.optionsType &&%0A%09%09%09%09addon.optionsType != AddonManager.OPTIONS_TYPE_INLINE_BROWSER &&%0A%09%09%09%09addon.optionsType != AddonManager.OPTIONS_TYPE_TAB%0A%09%09%09) {%0A%09%09%09%09throw new Error("Install manifest specifies unknown optionsType: " + addon.optionsType);%0A%09%09%09}%0A%09%09} else {%0A%09%09%09// Convert legacy dictionaries into a format the WebExtension%0A%09%09%09// dictionary loader can process.%0A%09%09%09if (addon.type === "dictionary") {%0A%09%09%09%09addon.loader = null;%0A%09%09%09%09let dictionaries = {};%0A%09%09%09%09await pkg.iterFiles(({path}) => {%0A%09%09%09%09%09let match = /^dictionaries\/([^\/]+)\.dic$/.exec(path);%0A%09%09%09%09%09if (match) {%0A%09%09%09%09%09%09let lang = match[1].replace(/_/g, "-");%0A%09%09%09%09%09%09dictionaries[lang] = match[0];%0A%09%09%09%09%09}%0A%09%09%09%09});%0A%09%09%09%09addon.startupData = {dictionaries};%0A%09%09%09}%0A%0A%09%09%09// Only extensions are allowed to provide an optionsURL, optionsType,%0A%09%09%09// optionsBrowserStyle, or aboutURL. For all other types they are silently ignored%0A%09%09%09addon.aboutURL = null;%0A%09%09%09addon.optionsBrowserStyle = null;%0A%09%09%09addon.optionsType = null;%0A%09%09%09addon.optionsURL = null;%0A%09%09}%0A%0A%09%09addon.defaultLocale = readLocale(manifest, true);%0A%09%09let defaultLocaleEntries = Object.entries(addon.defaultLocale);%0A%0A%09%09let seenLocales = [];%0A%09%09addon.locales = [];%0A%09%09for (let localeData of manifest.localized || []) {%0A%09%09%09let locale = readLocale(localeData, false, seenLocales);%0A%09%09%09if (locale) {%0A%09%09%09%09for(let [key, val] of defaultLocaleEntries)%0A%09%09%09%09%09key in locale || Reflect.set(locale, key, val);%0A%09%09%09%09addon.locales.push(locale);%0A%09%09%09}%0A%09%09}%0A%0A%09%09addon.dependencies = Object.freeze(%0A%09%09%09"dependencies" in manifest ? Array.from(new Set(manifest.dependencies)) : []%0A%09%09);%0A%0A%09%09let seenApplications = [];%0A%09%09addon.targetApplications = [];%0A%09%09for (let targetApp of manifest.targetApplications || []) {%0A%09%09%09if (!targetApp.id || !targetApp.minVersion || !targetApp.maxVersion) {%0A%09%09%09%09logger.warn("Ignoring invalid targetApplication entry in install manifest");%0A%09%09%09%09continue;%0A%09%09%09}%0A%09%09%09if (seenApplications.includes(targetApp.id)) {%0A%09%09%09%09logger.warn(%0A%09%09%09%09%09"Ignoring duplicate targetApplication entry for " + targetApp.id + " in install manifest"%0A%09%09%09%09);%0A%09%09%09%09continue;%0A%09%09%09}%0A%09%09%09seenApplications.push(targetApp.id);%0A%09%09%09addon.targetApplications.push(targetApp);%0A%09%09}%0A%0A%09%09// Note that we don't need to check for duplicate targetPlatform entries since%0A%09%09// the RDF service coalesces them for us.%0A%09%09addon.targetPlatforms = [];%0A%09%09for (let targetPlatform of manifest.targetPlatforms || []) {%0A%09%09%09let platform = {%0A%09%09%09%09os: null,%0A%09%09%09%09abi: null,%0A%09%09%09};%0A%0A%09%09%09let pos = targetPlatform.indexOf("_");%0A%09%09%09if (pos != -1) {%0A%09%09%09%09platform.os = targetPlatform.substring(0, pos);%0A%09%09%09%09platform.abi = targetPlatform.substring(pos + 1);%0A%09%09%09} else {%0A%09%09%09%09platform.os = targetPlatform;%0A%09%09%09}%0A%09%09%09addon.targetPlatforms.push(platform);%0A%09%09}%0A%0A%09%09addon.userDisabled = false;%0A%09%09addon.softDisabled = addon.blocklistState == Blocklist.STATE_SOFTBLOCKED;%0A%09%09addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;%0A%0A%09%09addon.userPermissions = null;%0A%0A%09%09addon.icons = {};%0A%09%09if (await pkg.hasResource("icon.png")) {%0A%09%09%09addon.icons[32] = "icon.png";%0A%09%09%09addon.icons[48] = "icon.png";%0A%09%09}%0A%0A%09%09if (await pkg.hasResource("icon64.png")) {%0A%09%09%09addon.icons[64] = "icon64.png";%0A%09%09}%0A%0A%09%09return addon;%0A%09},%0A%0A%09// Bug 1512436 - Add new install location for built in search web extensions (Firefox 67+)%0A%09// https://bugzilla.mozilla.org/show_bug.cgi?id=1512436%0A%09// https://hg.mozilla.org/mozilla-central/diff/e3e75697e98c/toolkit/mozapps/extensions/internal/XPIProvider.jsm%23l1.396%0A%09//loadScope(addon, file) {%0A%09loadScope(addon, file = addon.file || addon._sourceBundle) {%0A%0A%09%09let uri = getURIForResourceInFile(file, "bootstrap.js").spec;%0A%09%09let principal = Services.scriptSecurityManager.getSystemPrincipal();%0A%0A%09%09let sandbox = new Cu.Sandbox(principal, {%0A%09%09%09sandboxName: uri,%0A%09%09%09addonId: addon.id,%0A%09%09%09wantGlobalProperties: ["ChromeUtils"],%0A%09%09%09metadata: { addonID: addon.id, URI: uri },%0A%09%09});%0A%0A%09%09try {%0A%09%09%09Object.assign(sandbox, BOOTSTRAP_REASONS);%0A%0A%09%09%09XPCOMUtils.defineLazyGetter(%0A%09%09%09%09sandbox, "console", () => new ConsoleAPI({ consoleID: %60addon/%24{addon.id}%60 })%0A%09%09%09);%0A%09%09%09Services.scriptloader.loadSubScript(uri, sandbox);%0A%0A%09%09} catch (e) {%0A%09%09%09logger.warn(%60Error loading bootstrap.js for %24{addon.id}%60, e);%0A%09%09}%0A%0A%09%09function findMethod(name) {%0A%09%09%09if (sandbox.name) {%0A%09%09%09%09return sandbox.name;%0A%09%09%09}%0A%09%09%09try {%0A%09%09%09%09let method = Cu.evalInSandbox(name, sandbox);%0A%09%09%09%09return method;%0A%09%09%09} catch (err) { }%0A%0A%09%09%09return () => {%0A%09%09%09%09logger.warn(%60Add-on %24{addon.id} is missing bootstrap method %24{name}%60);%0A%09%09%09};%0A%09%09}%0A%0A%09%09let install = findMethod("install");%0A%09%09let uninstall = findMethod("uninstall");%0A%09%09let startup = findMethod("startup");%0A%09%09let shutdown = findMethod("shutdown");%0A%0A%09%09return {%0A%09%09%09install: (...args) => install(...args),%0A%0A%09%09%09// https://github.com/xiaoxiaoflood/firefox-scripts/commit/b509dd0089dc7245e9797e0068b8fcff6ae3c776%0A%09%09%09//uninstall: (...args) => uninstall(...args),%0A%09%09%09uninstall(...args) {%0A%09%09%09%09var res = uninstall(...args);%0A%09%09%09%09// Forget any cached files we might've had from this extension.%0A%09%09%09%09Services.obs.notifyObservers(null, "startupcache-invalidate");%0A%09%09%09%09return res;%0A%09%09%09},%0A%0A%09%09%09startup(...args) {%0A%09%09%09%09if (addon.type == "extension") {%0A%09%09%09%09%09logger.debug(%60Registering manifest for %24{file.path}\n%60);%0A%09%09%09%09%09Components.manager.addBootstrappedManifestLocation(file);%0A%09%09%09%09}%0A%09%09%09%09return startup(...args);%0A%09%09%09},%0A%0A%09%09%09shutdown(data, reason) {%0A%09%09%09%09try {%0A%09%09%09%09%09return shutdown(data, reason);%0A%09%09%09%09} catch (err) {%0A%09%09%09%09%09throw err;%0A%09%09%09%09} finally {%0A%09%09%09%09%09if (reason != BOOTSTRAP_REASONS.APP_SHUTDOWN) {%0A%09%09%09%09%09%09logger.debug(%60Removing manifest for %24{file.path}\n%60);%0A%09%09%09%09%09%09Components.manager.removeBootstrappedManifestLocation(file);%0A%09%09%09%09%09}%0A%09%09%09%09}%0A%09%09%09},%0A%09%09};%0A%09},%0A};%0A// fim BootstrapLoader.jsm%0A%0A%0AAddonManager.addExternalExtensionLoader(BootstrapLoader);%0AObject.defineProperty(%0A%09AddonInternal.prototype,%0A%09"providesUpdatesSecurely",%0A%09{enumerable: true, value: true}%0A);%0A
        `.trim(), new Cu.Sandbox(Cu.getObjectPrincipal(this), {wantGlobalProperties: ["ChromeUtils", "atob"]}));
} catch(ex) {Cu.reportError(ex);}


Конфигурация, надеюсь, всё еще прежняя, просто перепост, чтоб не ссылаться.
В bootstrap-loader добавлен коммит от Ксяо.

Отсутствует

 

№1344605-07-2019 20:41:57

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 322
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Приветствую!
Я пытаюсь написать код чтобы вообще скрыть стандартную кнопку поиска в контекстом меню.  Она вообще там не нужна так как есть иконки двигателей для поиска.

Пытался сделать вот так

Выделить код

Код:

searchSelect.collapsed = true;

и вот так

Выделить код

Код:

#context-searchSelect {display:none!important;}

Но к сожалению кнопка "Искать в .."  не скрывается

Отсутствует

 

№1344705-07-2019 21:32:40

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

leex
menuitem[id="context-searchselect"] {display:none !important}
или
#context-searchselect {display: none !important}

Отредактировано anywho (05-07-2019 21:34:49)

Отсутствует

 

№1344805-07-2019 21:54:41

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 316
UA: Firefox 69.0

Re: Custom Buttons

Dumby
Огромное Спасибо! Все работает. Великолепно!

Косяк всплыл. Контекстное меню страницы стало горизонтальным. Это лечится?

Отредактировано Garalf (05-07-2019 22:07:10)

Отсутствует

 

№1344906-07-2019 00:53:35

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 322
UA: Firefox 67.0

Re: Custom Buttons

anywho

Спасибо, работает в userChrome.css
А в CВ нет

Отсутствует

 

№1345006-07-2019 02:09:59

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

Re: Custom Buttons

leex пишет

А в CВ нет

И не должно.
В CB, если нужно именно сделать пункт collapsed, тогда так:
document.getElementById("context-searchselect").collapsed = true;

или с деструктором:
(ss => ss.collapsed = !addDestructor(() => ss.collapsed = false))(
    document.getElementById("context-searchselect")
);

Garalf пишет

Косяк всплыл. Контекстное меню страницы стало горизонтальным. Это лечится?

Расширение Custom Buttons никак не взаимодействует с контекстным меню страницы.

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

Не так давно это обсуждалось. Здесь, под спойлером, немного подробностей, и,
далее, следущим постом, Андрей приводит примеры необходимых исправлений.

Отсутствует

 

Board footer

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