Garalf у меня нет 55, а что в ошибках пишет? У меня на 69 такой:
/*Initialization Code*/ // ==UserScript== // @name UserCSSLoader // @description CSS Codes - Styles laden und verwalten // @namespace http://d.hatena.ne.jp/Griever/ // @author Griever // @charset UTF-8 // @version 0.0.4f // ==/UserScript== var idb=this.id; var button = document.getElementById(idb); const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; (function(){ var editor = "C:\\Program Files\\AkelPad\\AkelPad.exe"; let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; if (!window.Services) Cu.import("resource://gre/modules/Services.jsm"); let list = Services.wm.getEnumerator("navigator:browser"); while(list.hasMoreElements()){ if(list.getNext() != window) return; } if (window.UCL) { window.UCL.destroy(); delete window.UCL; } window.UCL = { USE_UC: "UC" in window, AGENT_SHEET: Ci.nsIStyleSheetService.AGENT_SHEET, USER_SHEET : Ci.nsIStyleSheetService.USER_SHEET, readCSS : {}, get disabled_list() { let obj = []; try { obj = this.prefs.getCharPref("disabled_list").split("|"); } catch(e) {} delete this.disabled_list; return this.disabled_list = obj; }, get prefs() { delete this.prefs; return this.prefs = Services.prefs.getBranch("UserCSSLoader.") }, get styleSheetServices(){ delete this.styleSheetServices; return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); }, get FOLDER() { let aFolder; try { let folderPath = this.prefs.getCharPref("FOLDER"); aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) aFolder.initWithPath(folderPath); } catch (e) { aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile); aFolder.appendRelativePath("CSS"); } if (!aFolder.exists() || !aFolder.isDirectory()) { aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0o664); } delete this.FOLDER; return this.FOLDER = aFolder; }, getFocusedWindow: function() { let win = document.commandDispatcher.focusedWindow; if (!win || win == window) win = content; return win; }, init: function() { const cbNS = "http://xsms.nm.ru/custombuttons/"; var menupopup = document.createElementNS(xulNS, "menupopup"); menupopup.onclick = function (event) { button.menuClick(event); } menupopup.addEventListener("popupshowing", function (event) { self.menuPopupShowing(event); }, false); button.appendChild(menupopup); button.type = "menu"; button.orient = "horizontal"; button.menuClick = function (event) { event.preventDefault(); event.stopPropagation(); button.open = false; } button.menuPopupShowing = function (event) { var nodeList = event.target.childNodes; for (var i = nodeList.length - 1; i >= 0; i--) if (nodeList[i].hasAttributeNS(cbNS, "flag")) nodeList[i].parentNode.removeChild(nodeList[i]); } let cssmenu = $C("menu", { id: "usercssloader-menu", label: "CSS", }); menupopup.appendChild(cssmenu); let menupop = $C("menupopup", { id: "usercssloader-menupopup" }); cssmenu.appendChild(menupop); let menu = $C("menu", { label: "Инструменты", }); menupopup.appendChild(menu); let mp = $C("menupopup", { id: "usercssloader-submenupopup" }); menu.appendChild(mp); mp.appendChild($C("menuitem", { label: "Обновить список файлов-стилей", accesskey: "R", acceltext: "Alt + R", oncommand: "UCL.rebuild();" })); mp.appendChild($C("menuseparator")); mp.appendChild($C("menuitem", { label: "Создать файл CSS", accesskey: "D", oncommand: "UCL.create();" })); mp.appendChild($C("menuitem", { label: "Открыть папку CSS", accesskey: "O", oncommand: "UCL.openFolder();" })); mp.appendChild($C("menuitem", { label: "Редактировать userChrome.css", hidden: false, oncommand: "UCL.editUserCSS(\'userChrome.css\');" })); mp.appendChild($C("menuitem", { label: "Редактировать userContent.css", hidden: false, oncommand: "UCL.editUserCSS(\'userContent.css\');" })); mp.appendChild($C("menuseparator")); mp.appendChild($C("menuitem", { label: "Тест стиля (Chrome)", id: "usercssloader-test-chrome", //hidden: true, accesskey: "C", oncommand: "UCL.styleTest(window);" })); mp.appendChild($C("menuitem", { label: "Тест стиля (Web)", id: "usercssloader-test-content", //hidden: true, accesskey: "W", oncommand: "UCL.styleTest();" })); mp.appendChild($C("menuitem", { label: "Поиск стиля на userstyles.org", accesskey: "S", oncommand: "UCL.searchStyle();" })); menu = $C("menu", { label: ".uc.css", accesskey: "U", hidden: !UCL.USE_UC }); mp = $C("menupopup", { id: "usercssloader-ucmenupopup" }); menu.appendChild(mp); mp.appendChild($C("menuitem", { label: "Importieren(.uc.js)", oncommand: "UCL.UCrebuild();" })); mp.appendChild($C("menuseparator", { id: "usercssloader-ucsepalator" })); $("mainKeyset").appendChild($C("key", { id: "usercssloader-rebuild-key", oncommand: "UCL.rebuild();", key: "R", modifiers: "alt", })); this.rebuild(); this.initialized = true; if (UCL.USE_UC) { setTimeout(function() { UCL.UCcreateMenuitem(); }, 1000); } window.addEventListener("unload", this, false); }, uninit: function() { const dis = []; for (let x of Object.keys(this.readCSS)) { if (!this.readCSS[x].enabled) dis.push(x); } this.prefs.setCharPref("disabled_list", dis.join("|")); window.removeEventListener("unload", this, false); }, destroy: function() { var i = document.getElementById("usercssloader-menu"); if (i) i.parentNode.removeChild(i); var i = document.getElementById("usercssloader-rebuild-key"); if (i) i.parentNode.removeChild(i); this.uninit(); }, handleEvent: function(event) { switch(event.type){ case "unload": this.uninit(); break; } }, rebuild: function() { let ext = /\.css$/i; let not = /\.uc\.css/i; let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator); while (files.hasMoreElements()) { let file = files.getNext().QueryInterface(Ci.nsIFile); if (!ext.test(file.leafName) || not.test(file.leafName)) continue; let CSS = this.loadCSS(file); CSS.flag = true; } for (let leafName of Object.keys(this.readCSS)) { const CSS = this.readCSS[leafName]; if (!CSS.flag) { CSS.enabled = false; delete this.readCSS[leafName]; } delete CSS.flag; this.rebuildMenu(leafName); } if (this.initialized) { if (typeof(StatusPanel) !== "undefined") StatusPanel._label = "Style importiert"; else XULBrowserWindow.statusTextField.label = "Styles importieren"; } }, loadCSS: function(aFile) { var CSS = this.readCSS[aFile.leafName]; if (!CSS) { CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile); if (this.disabled_list.indexOf(CSS.leafName) === -1) { CSS.enabled = true; } } else if (CSS.enabled) { CSS.enabled = true; } return CSS; }, rebuildMenu: function(aLeafName) { var CSS = this.readCSS[aLeafName]; var menuitem = document.getElementById("usercssloader-" + aLeafName); if (!CSS) { if (menuitem) menuitem.parentNode.removeChild(menuitem); return; } if (!menuitem) { menuitem = document.createElementNS(xulNS, "menuitem"); menuitem.setAttribute("label", aLeafName); menuitem.setAttribute("id", "usercssloader-" + aLeafName); menuitem.setAttribute("class", "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : "USER_SHEET")); menuitem.setAttribute("type", "checkbox"); menuitem.setAttribute("autocheck", "false"); menuitem.setAttribute("oncommand", "UCL.toggle('"+ aLeafName +"');"); menuitem.setAttribute("onclick", "UCL.itemClick(event);"); document.getElementById("usercssloader-menupopup").appendChild(menuitem); } menuitem.setAttribute("checked", CSS.enabled); }, toggle: function(aLeafName) { var CSS = this.readCSS[aLeafName]; if (!CSS) return; CSS.enabled = !CSS.enabled; this.rebuildMenu(aLeafName); }, itemClick: function(event) { if (event.button == 0) return; event.preventDefault(); event.stopPropagation(); let label = event.currentTarget.getAttribute("label"); if (event.button == 1) { this.toggle(label); } else if (event.button == 2) { closeMenus(event.target); this.edit(this.getFileFromLeafName(label)); } }, getFileFromLeafName: function(aLeafName) { let f = this.FOLDER.clone(); f.QueryInterface(Ci.nsIFile); // use appendRelativePath f.appendRelativePath(aLeafName); return f; }, styleTest: function(aWindow) { aWindow || (aWindow = this.getFocusedWindow()); new CSSTester(aWindow, function(tester){ if (tester.saved) UCL.rebuild(); }); }, searchStyle: function() { let word; try { word = gBrowser.currentURI.host; } catch { word = gBrowser.currentURI.spec; } var ctabpos = gBrowser.selectedTab._tPos +1; gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab("https://userstyles.org/styles/search/" + word), ctabpos); }, openFolder: function() { this.FOLDER.launch(); }, editUserCSS: function(aLeafName) { let file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.appendRelativePath(aLeafName); this.edit(file); }, edit: function(aFile) { try { var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8"; var path = UI.ConvertFromUnicode(aFile.path); var app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); app.initWithPath(editor); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(app); process.run(false, [path], 1); } catch (e) {} }, create: function(aLeafName) { if (!aLeafName) aLeafName = prompt("Имя файла", dateFormat(new Date(), "%Y_%m%d_%H%M%S")); if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, ""); if (!aLeafName || !/\S/.test(aLeafName)) return; if (!/\.css$/.test(aLeafName)) aLeafName += ".css"; let file = this.getFileFromLeafName(aLeafName); this.edit(file); }, UCrebuild: function() { let re = /^file:.*\.uc\.css(?:\?\d+)?$/i; let query = "?" + new Date().getTime(); Array.slice(document.styleSheets).forEach(function(css){ if (!re.test(css.href)) return; if (css.ownerNode) { css.ownerNode.parentNode.removeChild(css.ownerNode); } let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"'); document.insertBefore(pi, document.documentElement); }); UCL.UCcreateMenuitem(); }, UCcreateMenuitem: function() { let sep = $("usercssloader-ucsepalator"); let popup = sep.parentNode; if (sep.nextSibling) { let range = document.createRange(); range.setStartAfter(sep); range.setEndAfter(popup.lastChild); range.deleteContents(); range.detach(); } let re = /^file:.*\.uc\.css(?:\?\d+)?$/i; Array.slice(document.styleSheets).forEach(function(css) { if (!re.test(css.href)) return; let fileURL = decodeURIComponent(css.href).split("?")[0]; let aLeafName = fileURL.split("/").pop(); let m = document.createElementNS(xulNS, "menuitem"); m.setAttribute("label", aLeafName); m.setAttribute("tooltiptext", fileURL); m.setAttribute("id", "usercssloader-" + aLeafName); m.setAttribute("type", "checkbox"); m.setAttribute("autocheck", "false"); m.setAttribute("checked", "true"); m.setAttribute("oncommand", "this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));"); m.setAttribute("onclick", "UCL.UCItemClick(event);"); m.css = css; popup.appendChild(m); }); }, UCItemClick: function(event) { if (event.button == 0) return; event.preventDefault(); event.stopPropagation(); if (event.button == 1) { event.target.doCommand(); } else if (event.button == 2) { closeMenus(event.target); let fileURL = event.currentTarget.getAttribute("tooltiptext"); let file = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(fileURL); this.edit(file); } }, }; function CSSEntry(aFile) { this.path = aFile.path; this.leafName = aFile.leafName; this.lastModifiedTime = 1; this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? Ci.nsIStyleSheetService.AGENT_SHEET: Ci.nsIStyleSheetService.USER_SHEET; } CSSEntry.prototype = { sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), _enabled: false, get enabled() { return this._enabled; }, set enabled(isEnable) { var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) aFile.initWithPath(this.path); var isExists = aFile.exists(); // Wenn die Datei existiert true var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0; var isForced = this.lastModifiedTime != lastModifiedTime; var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromFile(aFile); var uri = Services.io.newURI(fileURL, null, null); if (this.sss.sheetRegistered(uri, this.SHEET)) { if (!isEnable || !isExists) { this.sss.unregisterSheet(uri, this.SHEET); } else if (isForced) { // Nach Stornierung erneut einlesen this.sss.unregisterSheet(uri, this.SHEET); this.sss.loadAndRegisterSheet(uri, this.SHEET); } } else { if (isEnable && isExists) { this.sss.loadAndRegisterSheet(uri, this.SHEET); } } if (this.lastModifiedTime !== 1 && isEnable && isForced) { log(this.leafName + " wurde aktualisiert"); } this.lastModifiedTime = lastModifiedTime; return this._enabled = isEnable; }, }; function CSSTester(aWindow, aCallback) { this.win = aWindow || window; this.doc = this.win.document; this.callback = aCallback; this.init(); } CSSTester.prototype = { sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), preview_code: "", saved: false, init: function() { var url = "data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="ja"><head><title>CSSTester</title></head><body></body></html>'); if (parseInt(Services.appinfo.platformVersion) >= 69 && Services.appinfo.browserTabsRemoteAutostart) { var chromeURL = `chrome://custombuttons/content/cbdialog${Date.now()}.xul`; Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup).registerChrome( Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)), [["override", chromeURL, url]] ); url = chromeURL; } this.dialog = openDialog(url, "", "width=550,height=400,dialog=no"); this.dialog.addEventListener("load", this, false); }, destroy: function() { this.preview_end(); this.dialog.removeEventListener("unload", this, false); this.previewButton.removeEventListener("click", this, false); this.saveButton.removeEventListener("click", this, false); this.closeButton.removeEventListener("click", this, false); }, handleEvent: function(event) { switch(event.type) { case "click": if (event.button != 0) return; if (this.previewButton == event.currentTarget) { this.preview(); } else if (this.saveButton == event.currentTarget) { this.save(); } else if (this.closeButton == event.currentTarget) { this.dialog.close(); } break; case "load": var doc = this.dialog.document; doc.body.innerHTML = '\ <style type="text/css">\ :not(input):not(select) { padding: 0px; margin: 0px; }\ table { border-spacing: 0px; }\ body, html, #main, #textarea { width: 100%; height: 100%; }\ #textarea { font-family: monospace; }\ </style>\ <table id="main">\ <tr height="100%">\ <td colspan="4"><textarea id="textarea"></textarea></td>\ </tr>\ <tr height="40">\ <td><input type="button" value="Vorschau" id="Vorschau"/></td>\ <td><input type="button" value="Speichern" id="Speichern"/></td>\ <td width="80%"><span class="log"></span></td>\ <td><input type="button" value="Schließen" id="Schliessen"/></td>\ </tr>\ </table>\ '; this.textbox = doc.querySelector("textarea"); this.previewButton = doc.querySelector('input[value="Vorschau"]'); this.saveButton = doc.querySelector('input[value="Speichern"]'); this.closeButton = doc.querySelector('input[value="Schließen"]'); this.logField = doc.querySelector('.log'); var code = "@namespace url(" + this.doc.documentElement.namespaceURI + ");\n"; code += this.win.location.protocol.indexOf("http") === 0? "@-moz-document domain(" + this.win.location.host + ") {\n\n\n\n}": "@-moz-document url(" + this.win.location.href + ") {\n\n\n\n}"; this.textbox.value = code; this.dialog.addEventListener("unload", this, false); this.previewButton.addEventListener("click", this, false); this.saveButton.addEventListener("click", this, false); this.closeButton.addEventListener("click", this, false); this.textbox.focus(); let p = this.textbox.value.length - 3; this.textbox.setSelectionRange(p, p); break; case "unload": this.destroy(); this.callback(this); break; } }, preview: function() { var code = this.textbox.value; if (!code || !/\:/.test(code)) return; code = "data:text/css;charset=utf-8," + encodeURIComponent(this.textbox.value); if (code == this.preview_code) return; this.preview_end(); var uri = Services.io.newURI(code, null, null); this.sss.loadAndRegisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET); this.preview_code = code; this.log("Preview"); }, preview_end: function() { if (this.preview_code) { let uri = Services.io.newURI(this.preview_code, null, null); this.sss.unregisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET); this.preview_code = ""; } }, save: function() { var data = this.textbox.value; if (!data) return; var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); fp.init(window, "", Ci.nsIFilePicker.modeSave); fp.appendFilter("CSS Files","*.css"); fp.defaultExtension = "css"; if (window.UCL) fp.displayDirectory = UCL.FOLDER; var res = fp.show(); if (res != fp.returnOK && res != fp.returnReplace) return; var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); suConverter.charset = "UTF-8"; data = suConverter.ConvertFromUnicode(data); var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); foStream.init(fp.file, 0x02 | 0x08 | 0x20, 0o664, 0); foStream.write(data, data.length); foStream.close(); this.saved = true; }, log: function() { this.logField.textContent = dateFormat(new Date(), "%H:%M:%S") + ": " + $A(arguments); } }; UCL.init(); function $(id) { return document.getElementById(id); } function $A(arr) { return Array.slice(arr); } function $C(name, attr) { var el = document.createElementNS(xulNS, name); if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) }); return el; } function dateFormat(date, format) { format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4)); format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2)); format = format.replace("%d", ("0" + date.getDay()).substr(-2)); format = format.replace("%H", ("0" + date.getHours()).substr(-2)); format = format.replace("%M", ("0" + date.getMinutes()).substr(-2)); format = format.replace("%S", ("0" + date.getSeconds()).substr(-2)); return format; } function log() { Application.console.log(Array.slice(arguments)); } })();
Отредактировано Andrey_Krropotkin (25-09-2019 11:53:02)
Отсутствует
Неподписанные расширения сдохли, а править omni.ja считаю некроманством 81лвл) я не настолько крут, просто каждый раз при обнове его править... итак хватает что надо после обнов править тут еще это, хотя наверно пару файлов подсунуть на автомате можно, с помощью "user_chrome.manifest" от Vitaliy V.
Отредактировано func4ptch4 (26-09-2019 13:03:20)
Отсутствует
Andrey_Krropotkin
Кнопка SAVE , совмещенная , Сохранить как HTML -там все нормально? Обратно в браузере и шняга какая-то...
Вопрос снят, Это 69.0.1 глючила, правда, выбранное Html - никак...
Отредактировано solombala (01-10-2019 11:14:35)
Отсутствует
solombala проверить пока не могу в командировке до 15
Отсутствует
Кто знает, что делает этот код? вроде "long left click"? (если) так то он не работает.
//Uncnown code (code=>{ var delay = 500; // время удержания в мс var inBackground = true; // открывать в фоновой вкладке var relatedToCurrent = true; // открывать рядом с related вкладкой var p = "CB" + _id.slice(20) + ":LongPressHandler:"; var msgDestroy = p + "Destroy", msgResponse = p + "Response"; code = code.replace(/%MD%/g, msgDestroy).replace("%MR%", msgResponse) .replace("%DL%", delay).replace("%BG%", inBackground); var url = "data:," + encodeURIComponent(code); var mm = window.getGroupMessageManager("browsers"); mm.loadFrameScript(url, true); function handleLongPress(msg) { var [link, ref, ctrl] = msg.data; var bg = inBackground != null ? inBackground : Services.prefs.getBoolPref("browser.tabs.loadInBackground"); gBrowser.loadOneTab(link, { relatedToCurrent, inBackground: ctrl != bg, //referrerURI: makeURI(ref) }); } mm.addMessageListener(msgResponse, handleLongPress); addDestructor(() => { mm.removeDelayedFrameScript(url); mm.broadcastAsyncMessage(msgDestroy); mm.removeMessageListener(msgResponse, handleLongPress); }); })(`({ init() { addEventListener("mousedown", this, false); addMessageListener("%MD%", this); }, receiveMessage() { removeEventListener("mousedown", this, false); removeMessageListener("%MD%", this); }, handleEvent(e) { if (e.type == "mousedown") { if (e.button || e.shiftKey || e.altKey || e.detail != 1) return; var a = e.originalTarget.closest("a[href]"); if (!a || a.href.startsWith("javascript:")) return; this.ctrl = e.ctrlKey; this.initLongPress(a); } else { if (e.type == "click" && !this.link) e.preventDefault(); this.destroyLongPress(); } }, get timer() { delete this.timer; return this.timer = Cc["@mozilla.org/timer;1"] .createInstance(Ci.nsITimer); }, notify() { sendSyncMessage("%MR%", [this.link.href, this.link.ownerDocument.URL, this.ctrl]); this.link = null; if (!%BG%) this.destroyLongPress(); }, initLongPress(a) { addEventListener("click", this, true); addEventListener("dragstart", this, false); this.timer.initWithCallback(this, %DL%, this.timer.TYPE_ONE_SHOT); this.link = a; }, destroyLongPress() { removeEventListener("click", this, true); removeEventListener("dragstart", this, false); this.link && this.timer.cancel(); this.link = null; } }).init();`);
Отредактировано func4ptch4 (02-10-2019 09:33:39)
Отсутствует
Кто знает в 69 загрузки не исчезают из библиотеки
DownloadsCommon.getData(content).removeFinished(); Cc["@mozilla.org/browser/download-history;1"] .getService(Ci.nsIDownloadHistory) .removeAllDownloads();
Отредактировано solombala (04-10-2019 18:15:11)
Отсутствует
Тоже заметил когда тестил твою сборку), вроде в однопроцессорном пашет точно не знаю, в многоп. не пашет.
Да и вообще сам не разберешься будешь ждать год, темболее скоро праздники я просто забил настроив ПКМ открытие самой библиотеки или ctrl+j.
(btn=>{addEventListener("contextmenu",e=>e.ctrlKey||e.preventDefault()||DownloadsPanel.showDownloadsHistory(),false,btn);})(document.getElementById("downloads-button"));
(возможно код с ошибками... но пашет) удобнее конечно если при выходе очищает, но... крутимся как можем.
Отредактировано func4ptch4 (05-10-2019 06:09:41)
Отсутствует
удобнее конечно если при выходе очищает
Может так
((g, id, {history}) => addDestructor(r => id in g && g[id].destroy(r)) || id in g || ({ clearOnRestart: false, su: Services.startup, init() { g.AsyncShutdown.quitApplicationGranted.addBlocker( id, this.condition = this.condition.bind(g[id] = this) ); }, destroy(reason) { if (reason[5] != "e") return; delete g[id]; g.AsyncShutdown.quitApplicationGranted.removeBlocker(this.condition); }, condition() { return this.su.restarting && !this.clearOnRestart || history.removeVisitsByFilter({ transition: history.TRANSITIONS.DOWNLOAD }); } }).init())( Cu.import("resource://gre/modules/AsyncShutdown.jsm", {}), "Custom Buttons button: Clear downloads history.", PlacesUtils );
Отредактировано Dumby (05-10-2019 21:38:20)
Отсутствует
Круть, спасибо) вопрос насчет кода https://forum.mozilla-russia.org/viewto … 42#p773842 что он точно делает? так то он не нужен, просто что он делает.
Upd: еще раз спасибо, даже не знаю что и сказать)
Отредактировано func4ptch4 (06-10-2019 13:50:39)
Отсутствует
вопрос насчет кода https://forum.mozilla-russia.org/viewto … 42#p773842 что он точно делает?
Ну, почти правильно сказал, только не long click, а long press.
Если добавить triggeringPrincipal, то даже будет работать, но криво:
при открытии в активной вкладке залипает курсор.
И, такое использование frame script'а, когда в каждом разворачивается
новый отдельный обработчик считается не по-перформансу.
Плюс, unload не учитывается, хотя, может и не надо.
Вобщем, код неудачный, лучше избавься от него.
P.S. У меня в предыдущем посте return потерялся. Добавил.
Отсутствует
Сори если не в тему!
Во-общем , у меня работают скрипты в цикле через прокси.
Но когда происходит какая-та ерунда у поставщика проксей , (обычно ддос) то авторизация слетает и появляется модальное окно
Можно ли это как то обойти?
Отсутствует
Решил костылем на vbs.
Set shell = WScript.CreateObject("WScript.Shell") title = "Authentication Required" If shell.AppActivate(title) Then shell.SendKeys "%{F4}" End If
Отсутствует
Подскажите, а почему не получаются простые команды JavaScript, типа вывести в консоль?
Отредактировано Parazit (11-10-2019 17:28:11)
Отсутствует
Здравствуйте, как можно сделать из этого меню чтобы автопопап был и открывался нормально, он снизу открывает и подкошенный какой-то.
this._handleClick=()=>popup.openPopup(this); var popup=addElement("menupopup",{position:"after_start",oncontextmenu:"return false", style:"-moz-appearance:none;border:1px solid rgb(220,220,220);"},self); var mainBox=addElement("hbox",{},popup); var leftBox=addElement("vbox",{style:"background-color:rgb(217,231,215);"},mainBox); // ======================================================== const _proxyieo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAEAklEQVR42pWTbUxTVxzGn9veyy20FYTJCpTXUah0CbpFYS6TgIZN4hTYIhi/KFuWZQmL2zJhYcxkiYbFDy4bDJxR58YcwgQWl+EUBqWAvBSQgKBApZDaUt6hQGl7e+9OXez0wxL3T07yP/c893fPec5zKfzf8oUSbgTACQOZ2R8/ph43+zL27RcD/o4Nu40GzYMHJXgEROH2CASB9DxcHC/QrM8mB+e8o23RDj8Fejs3J7fml6pS0gatAxsS8pron3UPi3wchAu4wFM2x7oQysqYwYGBzrz33yvWd3ZrvaBDOTkfVFZVlVXf78CibQmKgCBIxAxYhoWPmCYiARzPezYF8+IM1GEvYMVgGjuZ//Gn7V2dv3lBmZkHj16qq64obatnbesr7jhFuMiflUEulcGPZj3HElwc59kWZbCauJiQCGZ1Yrr/zCdFhe36rpv/grKyjl6trS0/2fyTZHppVtAooymFPBCBsk2QMX6PfHK6neBcLoxaTNyL4Sp6wzjb99XxE4Xanq5bXtDBrMy8utq6smP1X0vumscFtTKKCpUFwl8qhx8jAU2JwfNu8G4Oo1Yzl65Jpv1m7f0l+QWfNfd0/OkFZRPQNQJ662qJRG8cElQh4VQQgXg8YmkGYiJz8wLcnBtjM2bu2K4DdMSaT29J/onCpp7Wxqc8qq2rL0/9oUjSNtbrjgsOE22WyEHTNEUTsz1XZ3c54XA6YZqzuD7ae4TRcJv15cWnC27oGv/ygrKys/JqrtVWpF/+gtHe70ZE4BbIGSkYhgbjAfEiOBw2BIgckFICl5H4Ci1Zck021NSf+rWy5bwXlHPk8PGqyitnddYH5Hot8PeVQkx8EZHwkBNhbtEijE+2Q/2cnNKEJQg+rC81bhmErveWcWHO/k3F501nH4FS0/fsOV/2/aVVpz3Itrw873Y4F1gJK1UEh0T4sqzPvYdtwqhVh5fid1Hq8CSSdDGGjJ3ovPcHRk39U60Nd4u8v0j5uYoUGSuhNHFqa1OrNjU8Ourd6JjY7STo0A6fw9RKP5I0mUhLPASOJHPgQQffb2gUGcx9mJgwtnhBpEjy4Ijbqo6/eOHCmeSkpDd5kRjmWQMu3vwQQ5M6JMdnkpGBQH8FLAtGvnvkBjVi0lGrG9apJ0FSMtb2vJ6+/btvSw/HqVSxZL7SPtjI/NhY8OqCayxyW+QbiAxOQIwyAWtrq1z3cIPIMNMtmpufHngS9F8likpF4e4Dz5/aFpuGWMXLUIXuwOyyWWgevEwZHvbxA9r5smcBISQBO/bmRv6ctHOnandiNrYqUjBi7kC1tgR3hnr1v58W8p4J5KktkaKc/e9EFaelvBatDFVSt/XtzuvXW3pvX8GXZFn7N/UMs/PM0CK5AAAAAElFTkSuQmCC"; var leftItem1=addElement("menuitem",{label:"Open Connections",image:_proxyieo,oncommand:"openConnections()"},leftBox); //Функция открывает настройки прокси в окне ................... this.openConnections=function openConnections(){self.win&&self.win.close(); self.win=openDialog("chrome://browser/content/preferences/connection.xul","Proxy","centerscreen"); self.win.addEventListener("load",function f(e){this.removeEventListener("load",f,true);e.target.documentElement.setAttribute("type","prefwindow");},true); //добавить атрибут "prefwindow" gBrowser.addEventListener("click",function c(){this.removeEventListener("click",c);try{self.win.close()}catch(e){};},true);}; //закрыть настройки прокси по клику на странице /**/ // ======================================================== function addElement(elementName,attributes,parent){ var element=document.createXULElement(elementName); element.id=_id+"-"+elementName+"-"+Date.now(); for(var attribute in attributes)element.setAttribute(attribute,attributes[attribute]); if(["menu","menuitem"].indexOf(elementName)!=-1)element.classList.add(elementName+"-iconic"); return parent.appendChild(element);};addDestructor(()=>popup.remove());
Отсутствует
В 70-й отвалилась кнопка "Очистить панель адреса прокруткой колёсиком мыши"
// Очистить панель адреса прокруткой колёсиком мыши ..................................... (function () { var urlbar = document.getElementById("urlbar"); if ( !urlbar ) return; addEventListener('DOMMouseScroll', function(){ urlbar.value = ''; }, false, urlbar ); })();
// Очистить панель поиска прокруткой колёсиком мыши на панели поиска, от 19.09.2014. .............. (function () { var searchbar = document.getElementById("searchbar"); if ( !searchbar ) return; addEventListener('DOMMouseScroll', function(){ searchbar.textbox.value = ''; }, false, searchbar ); })();
Отсутствует
xrun1
Может так.
// Очистить панель адреса прокруткой колёсиком мыши, на панели адреса от 24.10.2019. .............. (()=>{ var urlbar = document.getElementById("urlbar"); if ( !urlbar ) return; addEventListener('wheel', ()=> urlbar.value = '', false, urlbar); })(); // Очистить панель поиска прокруткой колёсиком мыши на панели поиска, от 24.10.2019. .............. (()=>{ var searchbar = document.getElementById("searchbar"); if ( !searchbar ) return; addEventListener('wheel', ()=> searchbar.value = '', false, searchbar); })();
Отсутствует