Перестала работать кнопка "количество закладок"
Можно исправить?
Dumby ЗДЕСЬ приводил пример, может подойдёт:
var statement = PlacesUtils.history.DBConnection .createStatement("SELECT count(fk) FROM moz_bookmarks"); statement.executeStep(); var bkmcnt = statement.getInt32(0); statement.finalize(); alert("Общее количество закладок=" + bkmcnt);
«The Truth Is Out There»
Отсутствует
unter_officer, спасибо!
Отсутствует
Приветствую, нужен совет.
Сейчас использую 56.0.2 и все существующие кнопки и т.д. работают.
На какую версию поновее перейти, чтобы максимально все работало из Custom Buttons.
Спасибо.
ps
вообще, есть смысл повышать версию 56.0.2, или никаких преимуществ не получу?
Отредактировано firepox (10-04-2019 00:48:25)
Отсутствует
Как открывать на панели Закладок Журнал за текущий месяц? т.е добавить папку: Журнал за месяц?
Добавляю (открыв Журнал в Библиотеке) на панель закладок папку журнала «Этот месяц».
Через месяц папка становится пустой. Как сделать, чтобы добавленная папка журнала всегда открывала текущий месяц?
Может есть код, отслеживающий клик по папке Избраного? Отдельная кнопка [CB] открытия журнала не нужна.
Удобнее открыть подменю: Журнал за месяц (неделю) из панели Закладок, чем открывать History в боковой панели.
Отсутствует
Приветствую, нужен совет.Сейчас использую 56.0.2 и все существующие кнопки и т.д. работают.На какую версию поновее перейти, чтобы максимально все работало из Custom Buttons.Спасибо.ps вообще, есть смысл повышать версию 56.0.2, или никаких преимуществ не получу?
присоединяюсь к вопросу
Отсутствует
intersk
Большинство ваших кнопок на последних версиях работать не будут, но местные умельцы их регулярно правят.
Если хотите оценить, попробуйте портабельную сборку FF66
Отредактировано Garalf (14-04-2019 10:41:20)
Отсутствует
кнопка Видео в PotPlayer
/*Initialization Code*/ var path = "C:\\Program Files\\PotPlayer\\PotPlayerMini64.exe"; var addToPlaylistKey = "/add"; var sysPlayerName = "POTPlayer"; var openIn = "Откыть в "+sysPlayerName; var videoMoved = "Видео перенесено в "+sysPlayerName; var noFound = "Не найдено видео на странице, доступное для переноса в "+sysPlayerName; var Menu_n_TooltipTxts = [{ label: "Действие кнопки: Запустить видео сразу в "+sysPlayerName, radio: '', value: 'videotoplayer', tooltipTxt: 'Запустить видео сразу в '+sysPlayerName }, { label: "Действие кнопки: Перенести видео в плейлист "+sysPlayerName, radio: '', value: 'videotoplaylist', tooltipTxt: 'Перенести видео в плейлист '+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.videoout.action")) || cbu.getPrefs("CB.videoout.action").length < 9) cbu.setPrefs("CB.videoout.action", "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;"> ' + 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.videoout.action") == "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.videoout.action") == "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.videoout.action") == "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;"> ' + videoMoved + '</div>'; return true; }; }; } }; }; return false; }; this.onclick = this.oncontextmenu = e => { if (e.target != this) return; if(e.button == 0) { if(cbu.getPrefs("CB.videoout.action").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 == 1) gShowPopup(self); }; 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); }; function resizeObjs(objs) { if(!objs) return; LEVELS = 3; dir = (cbu.getPrefs("CB.videoout.action") == "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(/&/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, '&'); 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.videoout.action") == m.value); if(cbu.getPrefs("CB.videoout.action") == m.value) { self.tooltipText = m.tooltipTxt; } mItem.onclick = () => { cbu.setPrefs("CB.videoout.action", 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); var contextMenu = document.getElementById("contentAreaContextMenu"); var menuitem = contextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-sep-open")); menuitem.setAttribute("label", "Открыть в " +sysPlayerName); menuitem.setAttribute("class", "menuitem-iconic"); menuitem.setAttribute("image", "moz-icon://file://" + path); menuitem.onclick = () => play(gContextMenu.linkURL); 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.videoout.action") == "videotoplaylist" ? addToPlaylistKey : ""], 2); };
Отсутствует
Если хотите оценить, попробуйте портабельную сборку FF66 https://www.upload.ee/files/9813755/FF66.rar.html
Интересная сборка, спасибо.
Отсутствует
Есть кнопка которая выделяет название вкладки(жирным) добавленой в закладки
Но вот беда, если вкладка не загружена (после перезапуска браузера) она не выделяется
Возможно ли это исправить?
// Выделение вкладки добавленой в закладки .......... ({ style: ` @namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul); .tabbrowser-tab[inbookmarks] .tab-text.tab-label { font-weight: bold !important; } `.trim(), addProcessingInstruction: function(add) { if (add) { this.pi = document.createProcessingInstruction("xml-stylesheet", `type="text/css" href="data:text/css,${encodeURIComponent(this.style)}"` ); document.insertBefore(this.pi, document.firstChild); } else this.pi.remove(); }, init: function() { this.addProcessingInstruction(true); this.setAttributeForAllTabs(true); gBrowser.addTabsProgressListener(this); PlacesUtils.addLazyBookmarkObserver(this); addDestructor(this.destroy, this); }, destroy: function() { this.addProcessingInstruction(false); this.setAttributeForAllTabs(false); gBrowser.removeTabsProgressListener(this); PlacesUtils.removeLazyBookmarkObserver(this); }, isBookmarked: uri => Boolean(PlacesUtils.getBookmarksForURI(uri).length), onIlebedevdded: function(id, parent, ind, type, uri) this.onItem(type, uri), onItemRemoved: function(id, parent, ind, type, uri) this.onItem(type, uri), onItemChanged: function(id, property, isAnno, value, lm, type) property == "uri" && this.onItem(type), onItem: function(type, uri) { type == Ci.nsINavBookmarksService.TYPE_BOOKMARK && this.setAttributeForAllTabs(true, uri); }, onLocationChange: function(browser, wp, req, uri) { var tab = gBrowser.getTabForBrowser(browser); this.setAttributeForTab(tab, this.isBookmarked(uri)); }, setAttributeForAllTabs: function(set, uri) { for(var tab of gBrowser.tabs) { var curr = tab.linkedBrowser.currentURI; if (uri && !uri.equals(curr)) continue; var state = set && this.isBookmarked(curr); this.setAttributeForTab(tab, state); } }, setAttributeForTab: function(tab, set) { set ? tab.setAttribute("inbookmarks", true) : tab.removeAttribute("inbookmarks"); } }).init();
Отредактировано Stkvsky (23-04-2019 17:18:48)
Отсутствует
Здравствуйте!
Кнопка - открыть выделенный текст в внешнем текстовом редакторе:
// Записать выделенный текст в файл в папке профиля и открыть файл в внешнем редакторе .......... var file = Services.dirsvc.get('Desk', Ci.nsIFile); file.append("TextToEditor.txt"); custombuttonsUtils.writeFile( file.path, convertFromUnicode("UTF-16", getSelect()) ); file.launch(); // Конвертировать текст в юникод .......... function convertFromUnicode(charset, str) { var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = charset; str = converter.ConvertFromUnicode(str); return str + converter.Finish(); }; // Получить выделенный текст из страницы или false .......... function getSelect() { var el = document.commandDispatcher.focusedElement; try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {}; var sel = document.commandDispatcher.focusedWindow.getSelection(); return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,""); };
/* ДОПИСАТЬ выделенный текст в файл в папке профиля (с зазором в пару пустых строк от уже записанного текста, разделить для нагладности - *****************) */ //Файл можно не открывать
Планируется этот файл потом, целиком, конвертнуть - в EPUB или FB2.
Отсутствует
bunda1, подправьте пожалуйста, на не работает:
Сохранить выделенный текст в файл из контекстного меню, от 23.02.2017. .............
Метка времени: 26.04.2019 23:52:33
Ошибка: NS_ERROR_FAILURE: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsILocalFile.initWithPath]
Источник: chrome://custombuttons-context/content/button.js?windowId=SeaMonkey&id=custombuttons-button9@init line 1 > Function
Строка: 19
Отсутствует
На некоторых сайтах при наборе текста в окне для сообщений работает автоматическое выравнивание текста и эту функцию не отключить.
Я выкладываю туда vbs скрипт но после публикации удаляются все пробелы с левых сторон строчек, нарушая синтаксис. И соответственно если скопировать этот код то он не будет работать.
Есть ли вариант пользовательского кода СВ для определенного сайта чтобы отключить выравнивание текста при публикации?
Отсутствует
Подскажите пожалуйста, что не так в этом:
this.url2xul = 'chrome://mozapps/content/extensions/extensions.xul'; this.onClick = function (e) { switch (e.button) { case 0: try { BrowserOpenAddonsMgr(); } catch(e) { BrowserOpenExtensions('extensions'); } break; case 1: { if (e.ctrlKey) { var t = gBrowser.mTabs; var current = content.document.location.href; var i = t.length; if (current == this.url2xul) gBrowser.removeCurrentTab(); else while (true) { if (--i < 0) { if (current == 'about:blank') // replace blank tab loadURI(this.url2xul); else // add new tab gBrowser.selectedTab = gBrowser.addTab(this.url2xul); break; }; if (t[i].linkedBrowser.currentURI.spec == this.url2xul) // popup loaded { gBrowser.selectedTab = gBrowser.tabContainer.childNodes[i]; break; }; }; } else openWebPanel(this.tooltipText, this.url2xul); }; break; }; }; this.setAttribute('onclick', 'this.onClick(event);'); const Cb = custombuttons; const EXTENSION = Ci.nsIUpdateItem.TYPE_EXTENSION; function prop(aElement, aString) { var emRDF = "http://www.mozilla.org/2004/em-rdf#"; var arc = RDFService.GetResource(emRDF + aString); var target = extensionDS.GetTarget(aElement, arc, true); if (target instanceof Ci.nsIRDFLiteral) return target.Value; if (target instanceof Ci.nsIRDFInt) return target.Value; return null; } var cloneCBcontext = { cloneItems: function (aNode, aID, aSeparate) { var menupopup = document.getElementById(aID).cloneNode(true); var menuitems = menupopup.childNodes.length; for (var i = 0; i < menuitems; i++) aNode.appendChild(menupopup.firstChild); if (aSeparate) aNode.appendChild(document.createElement("menuseparator")); }, makeMenu: function (aNode) { var m = aNode.appendChild(document.createElement("menu")); m.setAttribute("label", "Custom Button"); m.setAttribute("oncommand", "event.stopPropagation()"); var mp = m.appendChild(document.createElement("menupopup")); cloneCBcontext.cloneItems(mp, "custombuttons-contextpopup"); aNode.insertBefore(document.createElement("menuseparator"), m); } } const popupID = "cbContext-extensionsButton"; var test = document.getElementById(popupID); if (test) test.parentNode.removeChild(test); var main = document.getElementById("mainPopupSet"); var cPopup = main.appendChild(document.createElement("popup")); cPopup.id = popupID; cPopup.setAttribute("oncommand", "event.stopPropagation(); document.popupNode.openPrefs(event);") var RDFService = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService); var Container = Cc["@mozilla.org/rdf/container;1"].getService(Ci.nsIRDFContainer); var extensionDS = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager).datasource; var root; try { root = RDFService.GetResource("urn:mozilla:item:root"); } catch(err) { root = RDFService.GetResource("urn:mozilla:extension:root"); } Container.Init(extensionDS, root); var elements = Container.GetElements(); var extensionArray = []; var i = -1; while (elements.hasMoreElements()) { i++; var element = elements.getNext(); element.QueryInterface(Components.interfaces.nsIRDFResource); var prop_OptionsURL = prop(element, "optionsURL"); if (prop(element, "type") == EXTENSION && prop_OptionsURL) { var prop_name = prop(element, "name"); extensionArray[i] = []; extensionArray[i][0] = prop_name.charAt(0).toUpperCase() + prop_name.substr(1); extensionArray[i][1] = prop_OptionsURL; extensionArray[i][2] = prop(element, "userDisabled"); extensionArray[i][3] = prop(element, "version"); extensionArray[i][4] = prop(element, "iconURL"); if (!extensionArray[i][4]) extensionArray[i][4] = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png"; } } extensionArray.sort(); var features = "chrome, dialog = 0, resizable, titlebar, toolbar, centerscreen"; var extCommand = "window.openDialog('ZZZ', '', '" + features + "');"; for (var i = 0; i < extensionArray.length; i++) { var extArray = extensionArray[i]; try { var mItem = document.createElement("menuitem"); mItem.setAttribute("label", extArray[0] + " " + extArray[3]); if (extArray[4]) { mItem.setAttribute("class", "menuitem-iconic bookmark-item"); mItem.setAttribute("image", extArray[4]); } if (extArray[1]) mItem.setAttribute("oncommand", extCommand.replace("ZZZ", extArray[1])); if (extArray[2]) mItem.setAttribute("disabled", true); cPopup.appendChild(mItem); } catch(e) {} } cloneCBcontext.makeMenu(cPopup); this.setAttribute("context", popupID); if (typeof Local_Install != "object") return; var test = document.getElementById("cbContext-extensions"); if (test) test.parentNode.removeChild(test); var cbPopup = document.getElementById("custombuttons-contextpopup-subCall").cloneNode(true); // Cb context var subMenu = document.createElement("menu"); subMenu.setAttribute("label", "Custom Button"); subMenu.appendChild(cbPopup.lastChild); var extensionsPopup = document.getElementById("emb-context"); var popup = extensionsPopup.cloneNode(true); popup.id = "cbContext-extensions"; popup.appendChild(document.createElement("menuseparator")); popup.appendChild(subMenu); extensionsPopup.parentNode.appendChild(popup); this.setAttribute("context", popup.id);
Win7
Отсутствует
Приветствую,
Кнопка "Блокнот в вкладке"
// Настройка функций кликов мыши для кнопки ............................................... this.onclick = function(e) { if ( e.button == 0 ) gBrowser.selectedTab = gBrowser.addTab( notepad ); if ( e.button == 1 ) { // запомнить текст из буфера обмена и скопировать текст на странице .... var clip = gClipboard.read(); window.content.focus(); goDoCommand("cmd_copy"); gBrowser.selectedTab = gBrowser.addTab( notepad ); // открыть блокнот // oбработчик ждет пока откроется блокнот, вставит текст из буфера обмена и удаляет себя .... gBrowser.addEventListener("pageshow", function(e) { this.removeEventListener("pageshow", arguments.callee, true); content.document.getElementsByTagName("textarea")[0].value = gClipboard.read(); if ( clip ) gClipboard.write( clip ); // вернуть текст в буфер обмена }, true); } }; // Объявляем переменные для этой вкладки ................................................... const notepad = "data:text/html;base64,CgoKPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+IDxURVhUQVJFQT48L1RFWFRBUkVBPiA8c3R5bGU+IGh0bWwgeyBiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyBvdmVyZmxvdzpoaWRkZW47IH10ZXh0YXJlYSB7IGJhY2tncm91bmQ6IzM4MzgzODsgb3ZlcmZsb3cteTphdXRvOyB3aWR0aDoxMDAlOyBoZWlnaHQ6MTAwJTsgLW1vei1ib3JkZXItcmFkaXVzOiAycHg7IGJvcmRlcjogMnB4IGluc2V0IHdoaXRlOyBjb2xvcjogd2hpdGU7IH0gPC9zdHlsZT4K"; var button = this; // Обработчик следит за изменениями табов и меняет название и иконку нужного таба .......... function tabHandler(e) { // меняем название и иконку нужного таба .... if ( e.target.linkedBrowser.currentURI.spec !== notepad ) return; var tabIndex = gBrowser.getBrowserIndexForDocument( e.target.linkedBrowser.contentDocument ); var tab = gBrowser.mTabContainer.childNodes[tabIndex]; tab.label = "Notepad"; tab.image = button.image; // очистить адресную строку если это блокнот .... if ( content.location == notepad ) gURLBar.value = ""; }; gBrowser.tabContainer.addEventListener("TabAttrModified", tabHandler, true); this.onDestroy = function() { gBrowser.tabContainer.removeEventListener("TabAttrModified", tabHandler, true); }; // Подсказка у кнопки ...................................................................... this.tooltipText = "Блокнот в вкладке \nЛ: Открыть блокнот \nС: Открыть блокнот с текстом( выделенным или из буфера ) \nП: CB меню";
Отредактировано firepox (07-05-2019 21:01:32)
Отсутствует
firepox
У меня есть рабочая кнопка, но без копирования выделенного или вставки из буфера.
// Настройка функций кликов мыши для кнопки ........... this.onclick =e=> { if ( e.button === 0 ) gBrowser.selectedTab = gBrowser.addTab(notepad, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }); // открыть блокнот }; // Обновить блокнот в текущей вкладке после обновления кнопки ........... if ( gBrowser.currentURI.spec == notepad ) { var val = content.document.getElementsByTagName("textarea")[0].value; loadURI(notepad); setTimeout(()=> content.document.getElementsByTagName("textarea")[0].value = val, 500); }; // Очистить адресную строку в кладке блокнота ........... addEventListener("TabAttrModified", ()=> gBrowser.currentURI.spec == notepad && gURLBar.reset()); // Получаем адрес блокнота как base64 из вкладки Справка и добавляем иконку для вкладки блокнота ........... var notepad = "data:text/html;base64," + window.btoa(self.getAttribute('Help').replace('selfImage', self.image)); // Подсказка у кнопки ........... this.tooltipText = "Блокнот во вкладке \nЛ: Открыть блокнот \nП: CB меню";
<TEXTAREA></TEXTAREA>
<style>
html {
background-color: black;
overflow: hidden;
}
textarea {
background: #383838;
overflow-y: auto;
width: 100%;
height: 100%;
border-radius: 2px;
border: 2px inset white;
color: white;
}
</style>
Отсутствует
bunda1, подправьте пожалуйста, на не работает:
Сохранить выделенный текст в файл из контекстного меню, от 23.02.2017. .............
// Сохранить выделенный текст в файл из контекстного меню, от 10.05.2019. ............. ((contextMenu, el)=> { var menuitem = contextMenu.insertBefore(document.createElement("menuitem"), el); menuitem.id = "content-saveTextItem"; menuitem.setAttribute("label", "Сохранить выделенный текст в файл"); addDestructor(()=> menuitem.remove()); addEventListener('popupshowing', e=> menuitem.hidden = !gContextMenu.isTextSelected, false, contextMenu); menuitem.onclick =e=> e.button ? setPathToFile() : saveSelectionToFile(); function saveSelectionToFile() { var s = "CB.saveSelectionToFile", pref = Services.prefs; try { var pathToFile = pref.getStringPref ? pref.getStringPref(s) : pref.getComplexValue(s, Ci.nsISupportsString).data; } catch(e) { setPathToFile() }; var title = convertFromUnicode("UTF-8", getTabLabel()); var selection = gBrowser.contentDocument.defaultView.getSelection().toString(); var text = convertFromUnicode("UTF-8", selection) + "\n\n\n\n\n"; var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); file.initWithPath(pathToFile); var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); file.exists() ? foStream.init(file, 0x02 | 0x10, 0664, 0) : foStream.init(file, 0x02|0x08|0x20, 0666, 0); foStream.write(text, text.length); foStream.close(); document.activeElement.blur(); setTimeout(()=> window.content.focus(), 300); }; function setPathToFile() { var fp = window.makeFilePicker(); fp.init(window, "Создайте текстовой файл для сохранения текста!", fp.modeSave); fp.appendFilters(fp.filterText); fp.defaultString = getTabLabel(); fp.open(result => result == fp.returnOK && cbu.setPrefs("CB.saveSelectionToFile", convertFromUnicode("UTF-8", fp.file.path) + ".txt")); }; function convertFromUnicode(charset, str) { var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = charset; str = converter.ConvertFromUnicode(str); return str + converter.Finish(); }; function getTabLabel() { var label = gBrowser.mCurrentTab.label; var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " "); return label.substring(0, 50); }; })(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-open"));
Отсутствует
Вопрос знающим людям. Как из кнопки сохранить текст в вкладку Справка, на последних версиях Firefox. Код:
var text = "Internet Explorer" var dir = Services.dirsvc.get("ProfD", Ci.nsIFile); dir.initWithPath(dir.path + "\extensions\custombuttons@xsms.org\components\CustomButtonsService.js"); var url = Services.io.newFileURI(dir).spec, cbs = {}; Services.scriptloader.loadSubScript(url, cbs); var AO = new cbs.AppObject(), btn = AO.getButton(_id); self.setAttribute("Help", text); btn.setAttribute("Help", text); AO.overlay.saveOverlayToProfile();
уже не работает, а показывает ошибку:
Метка времени: 11.05.2019 9:35:28 Ошибка: uncaught exception: Error opening input stream (invalid filename?): file:///C:/Program%20Files/Pale%20Moon/User/Palemoon/Profiles/Default/extensions/custombuttons@xsms.org/components/CustomButtonsService.js
Наверно не может записать текст в архив xpi.
Отсутствует
Шикарно вышло, спасибо!
Теперь можно этот текстовой документ, на смартфоне - в fbreader открывать, без всякой конвертации работает.
Поменял кодировку utf-8 на windows-1251 кракозябры исчезли, может кому пригодится:
// Добавить выделенный текст в файл из контекстного меню, от 10.05.2019. ............. ((contextMenu, el)=> { var menuitem = contextMenu.insertBefore(document.createElement("menuitem"), el); menuitem.id = "content-saveTextItem"; menuitem.setAttribute("label", "Сохранить выделенный текст в файл"); menuitem.setAttribute("class", "menuitem-iconic"); menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABuklEQVR42oXQTyiDYRwH8O+717+JgxOO40hKc5mEKJRdHGhRa8jm4kBubnLYheaETWgXGWMTLlqKA8kOJH+SaYqQrWWJse31vP9s4xlPvf1+7/O87+f59mMgraMZcHzdg1N4VzAcOE48YxVRaOI6oa8ygUHSYuSf1UY7nK4CYbOxoQHg4uRU/Pb8yi9UjdoLr1WfgnwDlcYQHK4DKHMLkcnGpSMxAqNghVpfdoEzl44OqI0PuL3ew919AMos7vt2nmBJX1FZjujLJY5XetIBJ6R7kreoKxr0/wV4SHcnbNbZatIiE1xJOsCdBLTA06dCiPT8NJRJgNZ2g11jCQ1wALFHEZhrxSoBnN7fCZrVgD4JSQCGeeD9SQSW2rFMgGCEmCQCm5GKmBZoQNc08PYsAmudWCTABiVBLUlgoibosACvQRHYMsDOJwgDnzEy/ahYP0nNyQdGlmhAmxkIS4CnH7ME2KEkKFUBo04aoB0DgtIQ9wcx1UsSBBI3f/BJyJOdB5jdNKB6AJG8mAA0bQ9jUq/C4envBEXFwPjmD0BG5H6I8cHSnUjA3/whzYKfwfg6BUiZtNXH4Z8lA19Kh9YRwR0sPwAAAABJRU5ErkJggg=="); addDestructor(()=> menuitem.remove()); addEventListener('popupshowing', e=> menuitem.hidden = !gContextMenu.isTextSelected, false, contextMenu); menuitem.onclick =e=> e.button ? setPathToFile() : saveSelectionToFile(); function saveSelectionToFile() { var s = "CB.saveSelectionToFile", pref = Services.prefs; try { var pathToFile = pref.getStringPref ? pref.getStringPref(s) : pref.getComplexValue(s, Ci.nsISupportsString).data; } catch(e) { setPathToFile() }; var title = convertFromUnicode("windows-1251", getTabLabel()); var selection = gBrowser.contentDocument.defaultView.getSelection().toString(); var text = convertFromUnicode("windows-1251", selection) + "\n\n\n\n\n"; var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); file.initWithPath(pathToFile); var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); file.exists() ? foStream.init(file, 0x02 | 0x10, 0664, 0) : foStream.init(file, 0x02|0x08|0x20, 0666, 0); foStream.write(text, text.length); foStream.close(); document.activeElement.blur(); setTimeout(()=> window.content.focus(), 300); }; function setPathToFile() { var fp = window.makeFilePicker(); fp.init(window, "Создайте текстовой файл для сохранения текста!", fp.modeSave); fp.appendFilters(fp.filterText); fp.defaultString = getTabLabel(); fp.open(result => result == fp.returnOK && cbu.setPrefs("CB.saveSelectionToFile", convertFromUnicode("windows-1251", fp.file.path) + ".txt")); }; function convertFromUnicode(charset, str) { var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = charset; str = converter.ConvertFromUnicode(str); return str + converter.Finish(); }; function getTabLabel() { var label = gBrowser.mCurrentTab.label; var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " "); return label.substring(0, 50); }; })(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-open"));
Отредактировано fokanik (11-05-2019 16:20:05)
Отсутствует
bunda1 пишет:
Шикарно вышло, спасибо!
bunda1, а можно, пожалуйста, все это дело - с добавлением текста в файл, к горячей клавише подключить/назначить?
Очень много раз залезать в контекстное меню приходится, при этом копируется текста иногда - по строчке (схема записи текста в документ):
//Заголовок //***** //Текст... //***** //Заголовок //***** //Текст... //***** //Текст... //*****
Контекстное меню можно освободить, без разницы, на Ваше усмотрение.
Отсутствует