Dumby
Есть одна проблема. Начиная с 78 ,ютуб в текущей вкладке запускается сходу...media.autoplay.default - не помогает.Где поганка зарыта? Рихтовал BrowserGlue.jsm ,как в 77(там все норм)...
где-то в tab зарыто?
И еще, боюсь лезть в кнопку видео в плеер , но при отмене эта надпись остается , лучше бы она и не появлялась , вернее функция бы не срабатывала(видео перенесено в...), ну, пока плеер не запустился....
Может при "отмена" пусть вкладка перезапустится ? Сделал reload , так себе фишка...
Отредактировано Dragoljub (10-03-2021 15:12:10)
Отсутствует
А есть в многопроцессном режиме вообще возможность сделать одну глобальную функцию для всех вкладок,
Нет, нельзя. Можно только максимум на процесс.
чтобы ее можно было вызывать именно из страницы, не из кнопки? Объявляется она один раз скажем при запуске браузера, а дальше ее вызывают когда нужно и на любой странице.
Из страниц её видно не будет, всё равно придётся
на все страницы что-то принудительно экспортировать.
И всё ещё не понимаю зачем это нужно, в чём суть,
хорошо бы посмотреть на конкретную задачу.
боюсь лезть в кнопку видео в плеер , но при отмене эта надпись остается , лучше бы она и не появлялась
(func => { var sysPlayerName = "GOM Player"; var path = "D:\\gomplayer\\gom.exe"; var videoMoved = "Видео перенесено в " + sysPlayerName; var noFound = "Не найдено видео на странице, доступное для переноса в " + sysPlayerName; this.image = "moz-icon://file://" + path; this.label = "Открыть видео в " + sysPlayerName; this.tooltipText = "Л: Видео в плеер\nП: Видео из Clipboard"; this._handleClick = () => { var msgName = _id + ":Player"; var listener = ({data}) => data ? run([data]) : notify(); messageManager.addMessageListener(msgName, listener); addDestructor(() => messageManager.removeMessageListener(msgName, listener)); var url = "data:charset=utf-8," + encodeURIComponent( `(${func})()`.replace("MSG_NAME", msgName) .replace("VIDEO_MOVED", encodeURIComponent(videoMoved)) .replace("CONFIRM", encodeURIComponent("Открыть ссылку в плеере ?")) ); (this._handleClick = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false))(); } this.onauxclick = e => e.button != 1 || gShowPopup(this); this.oncontextmenu = e => { if (e.ctrlKey || e.shiftKey || e.altKey) return; e.preventDefault(); custombuttons.confirmBox(null, "Запустить плеер из буфера обмена ?", "Да", "Нет") && run([gClipboard.read(), "/play"]); } var popup = document.getElementById("contentAreaContextMenu"); addEventListener("popupshowing", { get hidden() { return !(gContextMenu.onLink || gContextMenu.onVideo || gContextMenu.onPlainTextLink); }, handleEvent() { if (this.hidden) return; var menuitem = document.createXULElement("menuitem"); for(var args of Object.entries({ image: self.image, oncommand: "play()", class: "menuitem-iconic", label: "Открыть в " + sysPlayerName })) menuitem.setAttribute(...args); menuitem.play = () => play(gContextMenu.linkURL || gContextMenu.mediaURL); document.getElementById("context-savelink").before(menuitem); addDestructor(() => menuitem.remove()); this.handleEvent = e => { if (e.target == popup) menuitem.hidden = this.hidden; } } }, false, popup || 1); var play = link => custombuttons.confirmBox(null, "Открыть ссылку в плеере ?", "Да", "Отмена") && run([link]); var run = args => { var file = FileUtils.File(path); (run = args => { if (!file.exists()) return custombuttons.alertBox("File not exists!", path); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(file); process.runwAsync(args, args.length); })(args); } var notify = () => { var name = _id + "-noFound"; var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); (notify = () => setTimeout(as.closeAlert, 1150, name, as.showAlertNotification( "chrome://global/skin/icons/info.svg", "", noFound, false, "", null, name )))(); } })(() => { var found, videoMoved, SEND = msg => { found = true; if (!msg || Cc["@mozilla.org/embedcomp/prompt-service;1"] .getService(Ci.nsIPromptService) .confirm(content, null, decodeURIComponent("CONFIRM")) ) { if (msg) videoMoved = decodeURIComponent("VIDEO_MOVED"); sendAsyncMessage("MSG_NAME", msg); } else return true; } var YoutubeID = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})(?:\W|$)/; 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) { if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return; videoMovedbox = currentWin.document.createElement('videoMoved'); videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>'; //loadURI(stopPl); (function(d){var v=d.getElementById('movie_player');if(v){try{v.stopVideo()}catch{}} else{v=d.getElementsByTagName('video');if(v[0]){v[0].src='';try{v[0].load()}catch{}};}})(currentWin.document); 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()))) { if (SEND(tmp)) return; videoMovedbox = currentWin.document.createElement('videoMoved'); videoMovedbox.innerHTML = innerA + innerB + 'top:20px!important;background-color:black!important;">' + videoMoved + '</div>'; 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)) { if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return; 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) { if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return; 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) { if (SEND(tmp)) return; elem[i].outerHTML = innerA + 'background-color:black!important;bottom:20px!important;"> ' + videoMoved + '</div>'; return true; }; }; } }; }; return false; }; 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 ''; 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; }; 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 = gBrowser.currentURI.spec; { 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]; }; if (!ol) return ''; //ol = ol.replace(/^:?\/\//, curLocation.protocol + "//"); //return restPath(ol, src); return restProtHost(ol, curLocation); }; try {handlWin(content);} finally {found || SEND();} });
А как бы ещё Увеличить изображение подключить в UCF?
;(async popup => { var listener = { imgZoom: 190, // на сколько увеличить изображение из меню scrollZoom: 20, // на сколько увеличивать/уменьшать колесиком мыши scrollTop: 1, // или -1, переключение направление прокрутки для увеличение колёсиком receiveMessage(msg) { var container = document.documentElement .appendChild(document.createElement("div")); var image = container.appendChild(document.createXULElement("image")); image.style.cssText = "width: 100% !important; height: 100% !important;"; image.setAttribute("validate", "never"); var st = container.style; var dz = this.scrollZoom/100 * this.scrollTop; var currScale = 1, x, y, initialZoom = this.imgZoom/100 - 1; var hide, props = ["width", "height", "left", "top"], p = n => n + "px"; var set = (...args) => props.forEach((prop, ind) => st[prop] = p(args[ind])); (hide = () => { st.cssText = "position: fixed; display: none; z-index: 2147483647;"; currScale = 1; image.src = null; })(); container.onwheel = (e, ds = e.deltaY > 0 ? -dz : dz) => { if (currScale < .15 && ds < 0) return; st.transform = `scale(${currScale += ds})`; var {width, height, left, top, bottom, right} = container.getBoundingClientRect(); if (height < innerHeight) { if (top < 0) st.top = p(y -= top); if (bottom > innerHeight) st.top = p(y -= bottom - innerHeight); } if (width < innerWidth) { if (left < 0) st.left = p(x -= left); if (right > innerWidth) st.left = p(x -= right - innerWidth); } } (this.receiveMessage = msg => { var [src, {width, height, left, top}] = msg.data; image.src = src; left -= mozInnerScreenX; top -= mozInnerScreenY; set(width, height, x = left, y = top); st.display = "block"; container.onwheel(null, initialZoom); window.addEventListener("mousedown", hide, {once: true, capture: true}); })(msg); }, handleEvent(e) { if (!gContextMenu.onImage) return; var menuitem = document.createXULElement("menuitem"); menuitem.setAttribute("label", "Увеличить размер"); menuitem.className = "menuitem-iconic"; menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADZElEQVR42oXSe0xbVRwH8N8597a35e7SAmUFukGhY66AMiNzw4GvTCQLCssc4pQsmTOa+ERMlrktW1zigpnEuWn8x2eMmiVGMBDCFjS+cJHEDIk8RoSNV1+3tLWX3t72nnO8sETJFrfvP7/k5Pw+Ob9fDoLrYi8ow9GFUbq+5aRLrGraqQcX6hlF2wkFEWn6EDIJAyQy9+3VT58cWb6PrmvmjGZS/FSHlxbXtbtLobGqJlPKMhNepWb0V8hKpi8FNd/gzCCogbdmvtg/8C9gz9+Eor5x5nn2tDOZ98Dx2i3C/uYai9mOGCxiDQIIg1/PgUCEhyvDMox9PXYBkPzaaoAzAFL0yle7ShtqO/eWJ9w1vJ1oGsVzYhTNATMQG4Q1G40ldDw6PB339fs7VgMmA0jnHfioo6F9Z3tDYYJzKSZKMYcDvAILiICfZUNYEYFixMKpKBk8MfTTasBsACnngU/6Wg4+VL/VFSOmBHAYY1BAhzAvgmyMEIkh0EUOBD1Eu49eStwA5D3z4TcPv9TYdHvxEhXSGgaEIMkJkKAS+ONmSKYolOVqMBlRSd8bv8v/AQXlJoiHUE5rZ1tFa/Nhj1uVrCaNMoQxYSaIqDxAGqAuQ2XZ1iS8HUTpkZMXe1eATOdtiCcJblGe1a3PnWp0uEvfv3tbeX5RhSet/q3wxh6xgAncZUmw2hxEryQx9/LHE7I2RV5HNudGFAtcZsuQd919u/kiz56JOwobcjd6xerqKnB4HIB4RvMzCM1DGj8X0GD64pL2Xdf850z+4djKC8wl24XUpj1P75sdfe/+sSHoq3uQnSuwa+s2Vy5uubd2jQWUTAYchJK8HpyIzvv7p/rMkV/OzPeeGEWi+x6LufiR573h8VO7Zr4n9fEZNeiqXHOofFvPsKPkS1fKsX5JU6uNZQh8Wh/hRcuvOC3/fLXrcGj52yOo7zzU9udvbzbN9uglggK2MhsnvfiE0tY9tfed7vM98D+x53tx1DdG0Z2b97Ejf3SRSiGGCysyENvdoipZa4+/8NmPp8+N+Ei2ZEVpQhG71rdcqFFozD+xcoQugFUvlDS8wWsl8Uebk5C79ujjHwyc6R/309ysDBRauEzhJkG9ErAdG0xEe6yVkwqcr+549/zZgcmQ7pAEkH2TDG6RfwCoJI0uEWJP5QAAAABJRU5ErkJggg=="); menuitem.setAttribute("oncommand", "handleCommand();"); e.target.append(menuitem); menuitem.handleCommand = () => this.cmd(); this.handleEvent = () => menuitem.hidden = !gContextMenu.onImage; }, cmd() { var msg = this.msg = "ucf:CB:GetImageScreenRectForMosuseZoom"; var bru = "restartApplication" in BrowserUtils, name = bru ? "Browser" : "Layout"; // Fx87+ var code = `(targetIdentifier => { var image = ChromeUtils.import("resource://gre/modules/ContentDOMReference.jsm") .ContentDOMReference.resolve(targetIdentifier); var mm = image.ownerGlobal.docShell.messageManager; var bu = ${bru ? "mm.BrowserUtils || " : ""}ChromeUtils .import("resource://gre/modules/${name}Utils.jsm").${name}Utils; mm.sendAsyncMessage("${msg}", [ image.currentSrc, bu.getElementBoundingScreenRect(image) ]); })(`; messageManager.addMessageListener(msg, this); (this.cmd = () => { var {osPid} = gContextMenu.actor.manager.browsingContext.currentWindowGlobal; if (osPid == -1) osPid = Services.appinfo.processID; for(var ind = 0, len = Services.ppmm.childCount; ind < len; ind++) { var pmm = Services.ppmm.getChildAt(ind); if (pmm.osPid == osPid) break; } pmm.loadProcessScript("data:;charset=utf-8," + encodeURIComponent( code + JSON.stringify(gContextMenu.targetIdentifier) + ")" ), false); })(); } }; popup.addEventListener("popupshowing", listener); var destructor = () => { popup.removeEventListener("popupshowing", listener); var {msg} = listener; msg && messageManager.removeMessageListener(msg, listener); } var ucf = window.ucf_custom_script_win || window.ucf_custom_script_all_win; if (ucf) { var id = "ucf-cbinit-context-img-zoomer"; ucf[id] = {destructor}; ucf.unloadlisteners.push(id); } else window.addEventListener("unload", destructor, {once: true}); })(document.getElementById("contentAreaContextMenu"));
Можно ли его получить и по нажатию ПКМ?
InspectorUtils.{set, remove}ContentState(button, 1);
Отсутствует
_zt
Да, если можно помогите подключить в custom_script.js
(async id => ({ delay: 2e3, val: "", init(topic, mm) { Services.obs.addObserver(mm = this, topic); Services.obs.addObserver(function quit(s, t) { this.timer?.cancel(); Services.obs.removeObserver(mm, topic); Services.obs.removeObserver(quit, t); }, "quit-application-granted"); }, observe(win) { var df = win.MozXULElement.parseXULToFragment( `<hbox id="${id}"><label id="${id += "-label"}"/></hbox>` ); this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); (this.observe = async win => { this.timer.cancel(); await new Promise(ChromeUtils.idleDispatch); win.document.getElementById("star-button-box") .after(win.document.importNode(df, true)); this.notify(); })(win); }, async notify() { var info = await ChromeUtils.requestProcInfo(); var bytes = info.residentSetSize; for(var child of info.children) bytes += child.residentUniqueSize; this.timer.initWithCallback(this, this.delay, this.timer.TYPE_ONE_SHOT); var prev = this.val; if ((this.val = this.mgb(bytes)) != prev) for(var win of CustomizableUI.windows) win.document.getElementById(id).value = this.val; }, mgb: bytes => bytes < 1073741824 ? Math.round(bytes / 1048576) + "MB" : (bytes / 1073741824).toFixed(2) + "GB" }).init("browser-delayed-startup-finished"))("ucf-mem-indicator"); });
Отредактировано Garalf (12-03-2021 10:33:28)
Отсутствует
Код:
(?) Каково происхождение последней строки «});»
Такого там быть не должно.
Если случайно вставил внутрь другого кода, а она как-бы осталась от него,
то вытащи код обратно и добавь уже как самостоятельный, отдельный.
А если (менее вероятно) это просто мусорная строка незвестно откуда, тогда удали её.
Просто пароли могу, но через host никак...
Нашёл кого спросить. Я этим не пользуюсь.
Если попроще, то, возможно(!), как-то так
var u = gBrowser.currentURI; var host = u.asciiHost && u.displayHost; host = host?.includes(".") ? host.replace(/^www\./, "") : "";
var u = gBrowser.currentURI, host; if (u.schemeIs("file")) host = "file://"; else host = u.asciiHost && u.displayHost, host = !host || host == "localhost" || u.schemeIs("moz-extension") // ??? ? host : host.includes(".") ? host.replace(/^www\./, "") : "";
Отсутствует
Garalf
В начале custom_script.js, со второй или третьей строки, добавляете такую конструкцию
(() => { var loadscript = name => { try { Services.scriptloader.loadSubScript(`chrome://user_chrome_files/content/custom_scripts/${name}`, globalThis, "UTF-8"); } catch(e) {} }; loadscript("custom_js/BBCode_Multi_ucf.js"); loadscript("custom_js/Attributes_Inspector_ucf.js"); loadscript("custom_js/Mem_Indicator_78_ucf.js"); // и т. д. })();
Отсутствует
Переделайте пожалуйста кнопку ночной режим для UCF
(async (css, on, bg, upd) => CustomizableUI.createWidget(({ label: "Ночной режим", id: "ucf-cbbtn-contentDarkMode", pref: "ucf.sheetreg.contentDarkMode", localized: false, init() { var {pref} = this; Services.prefs.addObserver(pref, this); Services.obs.addObserver(function quit(s, topic) { Services.prefs.removeObserver(pref, this); Services.obs.removeObserver(quit, topic); }, "quit-application-granted"); //upd = btn => btn.icon.style.backgroundColor = bg; upd = btn => btn.icon.style.cssText = `background-image: linear-gradient(${bg}, ${bg}); background-origin: content-box; background-repeat: no-repeat;`; this.click = () => Services.prefs.setBoolPref(pref, on = !on); this.tooltiptext = this.label + "\nЛ: Переключить черный фон страниц"; this.on && this.reg(); return delete this.init && this; }, onCreated(btn) { btn.render = this.render; btn._handleClick = this.click; btn.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDtAACsQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBAACsQQ=="); }, render() { this.constructor.prototype.render.call(this); upd(this); }, get on() { on = Services.prefs.getBoolPref(this.pref, false); bg = on ? "#696969" : "#CDBA96"; return on; }, observe() { this.on ? this.reg() : this.unreg(); for(var {node} of CustomizableUI.getWidget(this.id).instances) upd(node); }, reg() { var sss = this.sss = Cc["@mozilla.org/content/style-sheet-service;1"] .getService(Ci.nsIStyleSheetService); var type = sss.AGENT_SHEET, uri = Services.io.newURI( "data:text/css;charset=utf-8," + encodeURIComponent(css) ); this.unreg = () => sss.unregisterSheet(uri, type); (this.reg = () => sss.loadAndRegisterSheet(uri, type))(); } }).init()))(`\ @-moz-document url-prefix(http://), url-prefix(https://), url-prefix(ftp://), url-prefix(file://), url(about:blank), url-prefix("about:neterror") { /* Firefox Scrollbars */ scrollbar { opacity: .75 !important; } /* Base */ *, ::before, ::after { color: #CCC !important; border-color: #444 !important; outline-color: #444 !important; text-shadow: none !important; box-shadow: none !important; box-shadow: none !important; background-color: transparent !important; } html * { color: #CCC !important; } p::first-letter, h1::first-letter, h2::first-letter, p::first-line { color: inherit !important; background: none !important; } /* :: Give solid BG :: */ /* element */ html, body, li ul, ul li, table, header, article, section, nav, menu, aside, /* common */ [class*="nav"], [class*="open"], [id*="ropdown"], /*dropdown*/ [class*="ropdown"], div[class*="menu"], [class*="tooltip"], div[class*="popup"], div[id*="popup"], /* Notes, details, etc. Maybe useful */ div[class*="note"], span[class*="note"], div[id*="detail"],div[class*="detail"], div[class*="description"], /* Also common */ div[class*="content"], div[class*="container"], /* Popup divs that use visibility: hidden and display: none */ div[style*="display: block"], div[style*="visibility: visible"] { background-color: #404040 !important; } /*: No BG :*/ *:not(:empty):not(span):not([class="html5-volume-slider html5-draggable"]):not([class="html5-player-chrome html5-stop-propagation"]), *::before, *::after, td:empty, p:empty, div:empty:not([role]):not([style*="flashblock"]):not([class^="html5"]):not([class*="noscriptPlaceholder"]) { background-image: none !important; } /*: Filter non-icons :*/ span:not(:empty):not([class*="icon"]):not([id*="icon"]):not([class*="star"]):not([id*="star"]):not([id*="rating"]):not([class*="rating"]):not([class*="prite"]) { background-image: none !important; text-indent: 0 !important; } /*: Image opacity :*/ img:not([id="mpiv-preview"]), svg { opacity: .75 !important; } img:hover, svg:hover { opacity: 1 !important; } /* Highlight */ ::-moz-selection { background-color: #626F61 !important; color: #F6F7B9 !important; } /* ::: anchor/links ::: */ a { color: #71BAA5 !important; background-color: #696969 !important; opacity: 1 !important; text-indent: 0 !important; } a:link { /* hyperlink */ color: #ACC7F6 !important; } a:visited { color: #CDB4E7 !important; } a:hover { color: #FFE900 !important; background-color: #363037 !important; } a:active { color: #FFAE00 !important; } /* "Top level" div */ body > div { background-color: inherit !important; } /* :::::: Text Presentation :::::: */ summary, details { background-color: inherit !important; } kbd, time, label, .date { color: #B6D2AC !important; } acronym, abbr { border-bottom: 1px dotted !important; cursor: help !important; } mark, code, pre, samp, blockquote { background-color: #282826 !important; } /* :::::: Headings :::::: */ h1, h2, h3, h4, h5, h6 { background-image: none !important; border-radius: 5px !important; text-indent: 0 !important; } h1, h2 { background-color: #28313E !important; } h3, h4 { background-color: #2A3731 !important; } h5, h6 { background-color: #372A2A !important; } /* :::::: Tables, cells :::::: */ table table { background: #212121 !important; } th, caption { background: #404040 !important; } /* ::: Inputs, textareas ::: */ input, textarea, button, select, option, optgroup { color: #DDD !important; background: none #404046 !important; -moz-appearance: none !important; } input, textarea, button { border-color: #000 !important; border-width: 1px !important; } /* :::::: Button styling :::::: */ input[type="button"], input[type="submit"], input[type="reset"], button { background: #343855 !important; } input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover, button:hover { color: #FFF !important; background: #435B6B !important; } input[type="image"] { opacity: .85 !important; } input[type="image"]:hover { opacity: .95 !important; } /* Lightbox fix */ html [id*="lightbox"] * { background-color: transparent !important; } html [id*="lightbox"] img { opacity: 1 !important; } /* Youtube Annotation */ #movie_player-html5 .annotation { background: #333 !important; } /* Mozilla addons shrink/expand sections */ .expando a { background: none transparent !important; } } @-moz-document url(about:newtab) { window { background: #696969 !important; } #newtab-scrollbox { background: transparent none !important; } .newtab-title { background-color: rgba(0,0,0,.75) !important; color: #eee !important; } } @-moz-document url(chrome://browser/content/browser.xhtml) { /* Browser Background */ browser[type="content-primary"] { background-color: #1a1a1a !important; } } `);
Отсутствует
Отсутствует
voqabuhe
(async (id, sel) => { var g = Cu.getGlobalForObject(Cu), stt = g[id]; if (!stt) { var {obs, prefs} = Services, {bookmarks: bm, observers: pobs} = PlacesUtils; stt = g[id] = { bm, pref: `ucf.${id}Guid`, async init() { bm.addObserver(this); pobs.addListener(["bookmark-added"], this.added = events => { for(var e of events) this.record(e.itemType, e.source, e.parentGuid); }); obs.addObserver(this, "quit-application-granted"); this.args = [b => this.bguids.add(b.parentGuid), {concurrent: true}]; var guid = prefs.getStringPref(this.pref, ""); if (!guid) try {var [guid] = await PlacesUtils.metadata.get( PlacesUIUtils.LAST_USED_FOLDERS_META_KEY, [] )} catch {} this.guids.push(guid || await PlacesUIUtils.defaultParentGuid || bm.unfiledGuid); }, observe() { bm.removeObserver(this); pobs.removeListener(["bookmark-added"], this.added); obs.removeObserver(this, "quit-application-granted"); prefs.setStringPref(this.pref, this.guids[0]); }, skipTags: true, bguids: new g.Set(), guids: new g.Array(), QueryInterface: g.ChromeUtils.generateQI([Ci.nsINavBookmarkObserver]), record(type, src, guid) { if (type == bm.TYPE_BOOKMARK && src == bm.SOURCES.DEFAULT) this.guids[0] = guid; }, onItemMoved(a, b, c, d, e, itemType, f, oldParentGuid, newParentGuid, source) { newParentGuid != oldParentGuid && this.record(itemType, source, newParentGuid); }, fetch(win) { this.bguids.clear(); return bm.fetch({url: win.gBrowser.currentURI.spec}, ...this.args); }, tt(win) { var list = win.InspectorUtils .getChildrenForNode(win.document.documentElement, true); return list.item(list.length - 1); } }; var ps = ["onBeginUpdateBatch", "onEndUpdateBatch", "onItemChanged", "onItemVisited"]; var noop = () => {}; for(var p of ps) stt[p] = noop; stt.init(); var func = id => this[id].handleEvent = async function(e) { var win = e.view; var star = e.target; star.tooltipText = "\u3164"; var starred = star.hasAttribute("starred"); starred && await this.fetch(win); var result = []; for(var guid of (starred ? this.bguids : this.guids)) { var arr = [], num = 50; while(--num) { if (!star.matches(":hover")) return; var res = await this.bm.fetch(guid); if (!res) break; if ((guid = res.parentGuid) == this.bm.rootGuid) { arr.unshift(this.bm.getLocalizedTitle(res)); break; } arr.unshift(res.title || "[Безымянная папка]"); } arr.length && result.push(arr.join("\\")); } if (!star.matches(":hover")) return; if (!result.length) return win.document.l10n.translateElements([star]); var text = result.join("\n"); if (starred) { var m = result.length > 1; text = `Адрес${m ? "а" : ""} заклад${m ? "ок" : "ки"}:\n${text}`; } win.document.tooltipNode == star ? this.tt(win).label = text : star.tooltipText = text; } var url = "data:;charset=utf-8," + encodeURIComponent(`(${func})("${id}")`); g.ChromeUtils.compileScript(url).then(ps => ps.executeInGlobal(g)); } await delayedStartupPromise; var stars = Array.from(document.querySelectorAll(sel)); for(var star of stars) star.addEventListener("mouseenter", stt); var destructor = () => { for(var star of stars) star.removeEventListener("mouseenter", stt); } var ucf = window.ucf_custom_script_win || window.ucf_custom_script_all_win; if (ucf) ucf[id] = {destructor}, ucf.unloadlisteners.push(id); else window.addEventListener("unload", destructor, {once: true}); })("ucfBookmarksStarFTooltipHelper", "#star-button, #context-bookmarkpage");
Отсутствует
Dumby
Не могу этот красный hbox привязать к #BMB_unsortedBookmarksPopup , только отдельно...stylesheet ? custom_style_user.css - не помогает...Приходиться так:
hbox[part="innerbox"] {margin-left: 1px !important; border-left: none !important; margin-top: -3px !important; margin-bottom: 0px !important;} Вроде как фуфлыжно...
Это здесь:
Отредактировано ВВП (19-03-2021 12:09:35)
Отсутствует
Не могу этот красный hbox привязать к #BMB_unsortedBookmarksPopup
custom_style_user.css - не помогает
У меня в custom_style_author.css работает.
(Не забудь галку в ucf-настройках для author проставить).
@-moz-document url(chrome://browser/content/browser.xhtml) { #BMB_unsortedBookmarksPopup::part(innerbox) { background-color: yellow !important; outline: 7px solid blue !important; outline-offset: -7px !important; } }
Отредактировано Dumby (19-03-2021 14:52:49)
Отсутствует
Подскажите пожалуйста. Вот есть где то в интернетах файл abcd.js. Он большой, а мне нужен оттуда маленький кусочек. Я делаю:
fetch (http://abcd.js ) .then(resp => resp.text()) .then(scr => { let my_scr = scr.match(regexp)[0] // получаю нужный фрагмент из файла abcd.js, полностью он мне не нужен } )
Теперь есть у меня нужный фрагмент my_scr в виде строки. А как сделать, чтоб этот код начал выполняться в кнопке?
Отсутствует
hartumov пишетесть у меня нужный фрагмент my_scr в виде строки. А как сделать, чтоб этот код начал выполняться
eval? Не, никогда не слышал.
Пробовал. У меня этот eval блокируется. В консоли две ошибки:
eval() и eval-подобное использование других методов не разрешено в Родительском процессе или в Системных контекстах (Использование заблокировано в «chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button3@init»)
и
И если это важно, добавлю, что у меня отключен мультипроцессорный режим.
Отредактировано hartumov (20-03-2021 01:52:13)
Отсутствует
В консоли две ошибки
Ого! Не думал что такое (пока) встречается "в дикой природе".
Значит CB установлен на релиз или бету вылеченную не через config.js,
либо на билд изначально не нуждающийся в лечении (DE, Unbraindead, ...)
и без config.js как такового.
То есть, по своей природе eval-like расширение работает через Debugger.
Для indirect eval замен много, а вот direct eval практически незаменим.
Если MDN-страница eval недостаточно запугала, то можно переключить
настройку security.allow_eval_with_system_principal
Отсутствует