userChrome.js Scripte für den Fuchs (Diskussion)

Schrauberecke: Hier geht es um optische und funktionelle Veränderungen (ohne Themes oder Personas) von Firefox oder von Webseiten per CSS-Codes oder JavaScript.
Benutzeravatar
2002Andreas
Moderator
Beiträge: 39032
Registriert: Fr, 04. Jul 2008 19:25
Wohnort: Niedersachsen

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1981

Beitrag von 2002Andreas » So, 18. Nov 2018 17:17

Ich habe jetzt einfach mal in den Einstellungen vom Fx die Reihenfolge der Startseiten verändert, jetzt passt es wieder :wink:
Mit freundlichem Gruß
Andreas
Mein System    Meine Add-ons

Benutzeravatar
2002Andreas
Moderator
Beiträge: 39032
Registriert: Fr, 04. Jul 2008 19:25
Wohnort: Niedersachsen

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1982

Beitrag von 2002Andreas » So, 18. Nov 2018 17:26

Wenn ich allerdings mit dem Restart Script einen Neustart mache, ist die Reihenfolge wieder falsch. :-??
Mit freundlichem Gruß
Andreas
Mein System    Meine Add-ons

Benutzeravatar
aborix
Senior-Mitglied
Beiträge: 4162
Registriert: So, 06. Sep 2009 0:57

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1983

Beitrag von aborix » So, 18. Nov 2018 17:37

Lass in den Einstellungen die Startseiten-Reihenfolge mal unverändert.
Wenn browser.tabs.insertRelatedAfterCurrent auf false steht, setze es testweise auf true.
Oder teste diesen Code:

Code: Alles auswählen

  setTimeout(function() {
    let tab = gBrowser.selectedTab;
    let tab2 = gBrowser.duplicateTab(tab);
    gBrowser.moveTabTo(tab2, tab._tPos + 1);
    gBrowser.removeTab(tab);
  }, 1500);

Benutzeravatar
2002Andreas
Moderator
Beiträge: 39032
Registriert: Fr, 04. Jul 2008 19:25
Wohnort: Niedersachsen

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1984

Beitrag von 2002Andreas » So, 18. Nov 2018 17:42

aborix hat geschrieben:
So, 18. Nov 2018 17:37
Oder teste diesen Code:
Ich habe beides gemacht...nun ist es wieder perfekt :klasse:

Ganz herzlichen Dank wie immer dafür :D
Mit freundlichem Gruß
Andreas
Mein System    Meine Add-ons

Benutzeravatar
2002Andreas
Moderator
Beiträge: 39032
Registriert: Fr, 04. Jul 2008 19:25
Wohnort: Niedersachsen

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1985

Beitrag von 2002Andreas » So, 18. Nov 2018 17:44

Auch der neue Zusatz zum Script reicht schon, ohne die config Änderung.
Mit freundlichem Gruß
Andreas
Mein System    Meine Add-ons

Benutzeravatar
milupo
Senior-Mitglied
Beiträge: 4987
Registriert: Fr, 27. Okt 2006 22:25

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1986

Beitrag von milupo » So, 18. Nov 2018 19:58

Ja, das Skript funktioniert jetzt hier auch und außerdem funktioniert das Seiteninfo-Medien-Skript wieder auch aus der Symbolleiste heraus.
Übersetzer für Obersorbisch und Niedersorbisch auf pontoon.mozilla.org, u.a. für Firefox, Firefox für Android, Firefox für iOS, Firefox Klar/Focus für iOS und Android, Thunderbird, Pootle, Django und LibreOffice

Benutzeravatar
bege
Mitglied
Beiträge: 199
Registriert: Sa, 19. Apr 2008 22:50

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1987

Beitrag von bege » Sa, 24. Nov 2018 17:49

Beim Skript UserCSSLoader von hier https://github.com/Endor8/userChrome.js ... ader.uc.js müsste bei einem Rechtsklick auf einen Skript-Eintrag das Skript im Texteditor geöffnet werden. Bei mir geht aber nur das Symbolleisten-Kontextmenü auf. Woran liegt das?
Firefox 63.0.3, Windows 7 Professional 64 bit SP1

Benutzeravatar
2002Andreas
Moderator
Beiträge: 39032
Registriert: Fr, 04. Jul 2008 19:25
Wohnort: Niedersachsen

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1988

Beitrag von 2002Andreas » Sa, 24. Nov 2018 17:55

bege hat geschrieben:
Sa, 24. Nov 2018 17:49
das Skript im Texteditor geöffnet werden.
Funktioniert hier einwandfrei.
Animation.gif
Dieses Script verwende ich hier:

Code: Alles auswählen

// ==UserScript==
// @name           UserCSSLoader
// @description    CSS Codes - Styles laden und verwalten
// @namespace      http://d.hatena.ne.jp/Griever/
// @author         Griever
// @include        main
// @license        MIT License
// @compatibility  Firefox 4
// @charset        UTF-8
// @version        0.0.4f
// @note           0.0.4 Remove E4X
// @note           CSSEntry-Klasse erstellt
// @note           Style-Test-Funktion überarbeitet
// @note           Wenn die Datei gelöscht wurde, CSS beim Neu erstellen und Löschen des Menüs abbrechen
// @note           uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen
// ==/UserScript==

/****** Bedienungsanleitung ******

Da der CSS-Ordner im Chrome-Ordner erstellt wurde, CSS-Dateien dort ablegen - speichern.
Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET, 
andere außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
darauf achten, @ Namespace Angabe nicht zu vergessen!

CSS-Menü wird zur Menüleiste hinzugefügt
Linksklick auf Stil, zum aktivieren/deaktivieren
Mittelklick auf Stil zum aktivieren/deaktivieren, ohne Menü zu schließen
Rechtsklick auf Stil zum Öffnen im Editor

Verwenden des in "view_source.editor.path" angegebenen Editors
Ordner kann geändert werden, indem ein Pfad in "UserCSSLoader.FOLDER" eingefügt wird

 **** Anleitung Ende ****/

(function(){

let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
if (!window.Services)
	Cu.import("resource://gre/modules/Services.jsm");
// Wenn beim Start ein anderes Fenster angezeigt wird (das zweite Fenster), wird es beendet
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 {
			// UserCSSLoader.FOLDER verwenden
			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, 0664);
		}
		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 cssmenu = $C("menu", {
			id: "usercssloader-menu",
			label: "CSS",
			accesskey: "C"
		});
		const menupopup = $C("menupopup", {
			id: "usercssloader-menupopup"
		});
		cssmenu.appendChild(menupopup);

		let menu = $C("menu", {
			label: "Style Loader Menü",
			accesskey: "M"
		});
		menupopup.appendChild(menu);
		let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
		menu.appendChild(mp);
		mp.appendChild($C("menuitem", {
			label: "Styles importieren",
			accesskey: "R",
			acceltext: "Alt + R",
			oncommand: "UCL.rebuild();"
		}));
		mp.appendChild($C("menuseparator"));
		mp.appendChild($C("menuitem", {
			label: "CSS Datei erstellen",
			accesskey: "D",
			oncommand: "UCL.create();"
		}));
		mp.appendChild($C("menuitem", {
			label: "CSS Ordner öffnen",
			accesskey: "O",
			oncommand: "UCL.openFolder();"
		}));
		mp.appendChild($C("menuitem", {
			label: "userChrome.css bearbeiten",
			hidden: false,
			oncommand: "UCL.editUserCSS(\'userChrome.css\');"
		}));
		mp.appendChild($C("menuitem", {
			label: "userContent.css bearbeiten",
			hidden: false,
			oncommand: "UCL.editUserCSS(\'userContent.css\');"
		}));
		mp.appendChild($C("menuseparator"));
		mp.appendChild($C("menuitem", {
			label: "Style Test (Chrome)",
			id: "usercssloader-test-chrome",
			hidden: true,
			accesskey: "C",
			oncommand: "UCL.styleTest(window);"
		}));
		mp.appendChild($C("menuitem", {
			label: "Style Test (Web)",
			id: "usercssloader-test-content",
			hidden: true,
			accesskey: "W",
			oncommand: "UCL.styleTest();"
		}));
		mp.appendChild($C("menuitem", {
			label: "Styles dieser Seite auf userstyles.org finden",
			accesskey: "S",
			oncommand: "UCL.searchStyle();"
		}));

		menu = $C("menu", {
			label: ".uc.css",
			accesskey: "U",
			hidden: !UCL.USE_UC
		});
		menupopup.appendChild(menu);
		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" }));

		$('main-menubar').appendChild(cssmenu);

		$("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.createElement("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;
		}
		openLinkIn("https://userstyles.org/styles/search/" + word, "tab", {});
	},
	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) {
		var editor = Services.prefs.getCharPref("view_source.editor.path");
		if (!editor) return alert("Unter about:config den vorhandenen Schalter:\n view_source.editor.path mit dem Editorpfad ergänzen");
		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("Name des Styles", 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.createElement("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; // Wenn es eine Änderung in der Datei gibt true

		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)) {
			// Wenn diese Datei bereits gelesen wurde
			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 {
			// Datei wurde nicht gelesen
			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() {
		this.dialog = openDialog(
			"data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="ja"><head><title>CSSTester</title></head><body></body></html>'),
			"",
			"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, 0664, 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.createElement(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)); }

})();
Mit freundlichem Gruß
Andreas
Mein System    Meine Add-ons

Benutzeravatar
Boersenfeger
Senior-Mitglied
Beiträge: 52385
Registriert: So, 21. Mär 2004 13:21
Wohnort: Brunswiek anne Oker dranne

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1989

Beitrag von Boersenfeger » Sa, 24. Nov 2018 18:19

Hast du denn einen Editor definiert?

Code: Alles auswählen

Verwenden des in "view_source.editor.path" angegebenen Editors
Stand 16.12.2018
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:64.0) 20100101 Firefox/64.0
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:65.0) 20181212 Firefox/65.0b4
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:66.0) 20181216 Firefox/66.0a1

Meine Füchse|Fehlersuche|Anleitung für Fragen im Forum|Sicherheitskonzept für Windowsnutzer

Benutzeravatar
bege
Mitglied
Beiträge: 199
Registriert: Sa, 19. Apr 2008 22:50

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1990

Beitrag von bege » Mo, 26. Nov 2018 19:39

Boersenfeger hat geschrieben:
Sa, 24. Nov 2018 18:19
Hast du denn einen Editor definiert?

Code: Alles auswählen

Verwenden des in "view_source.editor.path" angegebenen Editors
Ja, hatte ich, aber offensichtlich wollte ich es zu gut machen. Wegen der Leerzeichen im Pfad habe ich Anführungsstriche gesetzt, das war für about:config offensichtlich zu viel. Ohne klappts wieder. Vielen Dank für die Hinweise.

Mit dem richtigen Pfad gehen beide Versionen, die von mir verlinkte 4g und die von @2002Andreas gepostete 4f. In der neueren ist das Menü verschiebbar und es kann ein Dateimanager definiert werden.

Benutzeravatar
Boersenfeger
Senior-Mitglied
Beiträge: 52385
Registriert: So, 21. Mär 2004 13:21
Wohnort: Brunswiek anne Oker dranne

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1991

Beitrag von Boersenfeger » Di, 27. Nov 2018 14:25

Freut mich... :D
Stand 16.12.2018
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:64.0) 20100101 Firefox/64.0
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:65.0) 20181212 Firefox/65.0b4
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:66.0) 20181216 Firefox/66.0a1

Meine Füchse|Fehlersuche|Anleitung für Fragen im Forum|Sicherheitskonzept für Windowsnutzer

Benutzeravatar
bege
Mitglied
Beiträge: 199
Registriert: Sa, 19. Apr 2008 22:50

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1992

Beitrag von bege » Mo, 03. Dez 2018 5:49

Hallo,
ist es möglich, den Code der Erweiterung "Close All Tabs" statt mit einem Button durch ein Skript mit einem Shortcut zu starten? Im alten Firefox hatte ich mit keyconfig die F1-Taste damit belegt. Fand ich sehr praktisch. Die Erweiterungen Saka Key und Shortkeys, die Shortcuts konfigurieren können, bieten die Funktion "alle Tabs schließen" nicht an.
Oder gibt's so ein Skript schon, das ich noch nicht gefunden habe?

Das habe ich als Code in der Erweiterung gefunden:

Code: Alles auswählen

async function closeAllTabs() {
    try {
        let settings = await browser.storage.local.get({
            not_current: false,
            not_pinned: true,
        });
        let query = {
            currentWindow: true
        };
        if (settings.not_pinned) {
            query.pinned = false;
        }
        if (settings.not_current) {
            query.active = false;
        }
        let tabs = await browser.tabs.query(query);
        if (!settings.not_current) {
            let pinned = await browser.tabs.query({
                currentWindow: true,
                pinned: true
            });
            if(pinned.length === 0 || settings.not_pinned === false) {
                browser.tabs.create({});
            }
        }
        for (let tab of tabs) {
            browser.tabs.remove(tab.id);
        }
    } catch (error) {
        console.log(`Error: ${error}`);
    }
}

browser.browserAction.onClicked.addListener(closeAllTabs);

Benutzeravatar
aborix
Senior-Mitglied
Beiträge: 4162
Registriert: So, 06. Sep 2009 0:57

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1993

Beitrag von aborix » Di, 04. Dez 2018 1:19

Meinst du diese Erweiterung: Close All Tabs ?
Laut Beschreibung hat die bereits die Tastenkombination Alt+W. Oder willst du eine andere?

Es gibt außerdem diese beiden Skripte mit einem Eintrag im Tab-Kontextmenü:
viewtopic.php?p=1076283#p1076283 und viewtopic.php?p=1096041#p1096041
Eine Tastenkombination lässt sich einbauen.

Benutzeravatar
Speravir
Senior-Mitglied
Beiträge: 879
Registriert: Do, 15. Dez 2005 1:33
Wohnort: Potsdam

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1994

Beitrag von Speravir » Di, 04. Dez 2018 18:58

Es lohnt sich, immer mal wieder bei CustomJSforFx von Aris vorbeizuschauen. 3 relativ neue Skripte für Aktionen in der Tabstoolbar:
Steffen "Speravir"
---
Spiro, ergo sum.
Avatar: Vorlage Fox Head and Tail Tribal by Majykal-Melodi on DeviantArt, bearbeitet (Lizenz: CC by-sa 3.0)

Benutzeravatar
bege
Mitglied
Beiträge: 199
Registriert: Sa, 19. Apr 2008 22:50

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1995

Beitrag von bege » Mi, 05. Dez 2018 20:33

aborix hat geschrieben:
Di, 04. Dez 2018 1:19
Meinst du diese Erweiterung: Close All Tabs ?
Laut Beschreibung hat die bereits die Tastenkombination Alt+W. Oder willst du eine andere?

Es gibt außerdem diese beiden Skripte mit einem Eintrag im Tab-Kontextmenü:
viewtopic.php?p=1076283#p1076283 und viewtopic.php?p=1096041#p1096041
Eine Tastenkombination lässt sich einbauen.
Hallo aborix,
ich habe die Erweiterung Close All Tabs Button. Die von dir verlinkte löscht nicht alle Tabs, sondern nur alle außer dem aktiven. Die Skripte funktionieren bei mir nicht, das liegt daran, dass TreeStyleTabs seit der WebExtension-Version ein eigenes Kontextmenü für die Tabs aufbaut. Ich habe eben noch Multi-Tab Close gefunden. Das wäre ideal, wenn es Shortcuts hätte. Allerdings wird auch diese Erweiterung vom TST-Kontextmenü verschluckt.
Die Erweiterung Shortkeys ermöglicht Shortcuts anzupassen und hat auch eine Funktion Run Javascript. Damit habe ich aber noch gar nichts zum Laufen gebracht. Hast du eine Idee, wie der Code aussehen müsste, um damit einen Shortcut für Close All Tabs zu erstellen? Oder würde dein Skript mit Shortcut auch funktionieren, wenn der Kontextmenüeintrag nicht angezeigt wird? Wie würde dein Skript mit Shortcut aussehen?

Edit:
Wenn ich das auf der Hilfeseite von TST richtig verstehe, gibts da im FFv64 eine Änderung. Mal seh'n.

Antworten

Wer ist online?

Mitglieder in diesem Forum: robotest und 5 Gäste