userChrome.js Scripte für den Fuchs (Diskussion)
-
Endor -
12. Mai 2015 um 14:19 -
Erledigt
-
-
-
geldhuegel ..
das ist im Hamburger-Menü, nicht im Menü "Datei" aus der Menübar

-
Aber es geht doch um das Hamburger Menü. Siehe deine eigenen Antworten. Oder blick ich jetzt gar nix mehr?
-
Aber es geht doch um das Hamburger Menü
Auch, und:
DeinSkript aus #4704 funktioniert jetzt wie es soll. Auch aus dem Hamburgermenu und dem Dateimenu.
Fett nachträglich von mir.
In deinem Skript fehlt es (das Icon) im Dateimenü.
-
In dem Script Appmenu.uc.js (https://github.com/Endor8/userChr…5/Appmenu.uc.js ) lassen sich schon ab Firefox 153 einige Funktionen nicht mehr aufrufen. Mein Script konnte ich noch mit KI neu einrichten, dieses mit den vielen Base64-Codes will nicht gelingen. Wenn gewünscht, dann stelle ich auch mein Script zur Verfügung.
Das ist der Ansatz, der zum Erfolg führte: Appmenü ab Fox 153.txt
Edit:
Nun habe ich den Base64-Code entfernt, müsste dann wieder hier image: 'den Base64-Code hier einfügen ' eingefügt werden. Das Script funktioniert dann wieder, hier dann zum Test.
Code
Alles anzeigen// ==UserScript== // @name Appmenu.uc.js // @namespace Appmenu@gmail.com // @description Firefox-Menübutton für Firefox 155+ // @include main // @version 2025.01.01 // @author bege // @charset UTF-8 // ==/UserScript== var Appmenu = { // ============================== // Konfiguration // ============================== editor: Services.prefs.getCharPref( 'view_source.editor.path', '' ), fileManager: '', FMParameter: '/T', autohideEmptySubDirs: true, moveSubDirstoBottom: false, // 0 = TabsToolbar // 1 = Navigationsleiste // 2 = Menüleiste isUrlbar: 1, // 0 = kleines Symbol // 1 = großes Firefox-Symbol isButton: 1, hotkey: 'x', hotkeyModifier: 'alt', subdirPopupHash: Object.create(null), subdirMenuHash: Object.create(null), toolbar: { subdirs: [ { name: 'Firefox Verzeichnisse', image: ' ' }, { name: 'Firefox Profil-Dateien', image: ' ' }, { name: 'Firefox Funktionen', image: ' ' }, { name: 'about:', image: ' ' } ], apps: [ { name: 'userChrome.css', root: 'ProfD', path: '\\chrome\\userChrome.css', subdir: 'Firefox Profil-Dateien', image: ' ' }, { name: 'userContent.css', root: 'ProfD', path: '\\chrome\\userContent.css', subdir: 'Firefox Profil-Dateien', image: ' ' }, { name: 'userChrome.js', root: 'ProfD', path: '\\chrome\\userChrome.js', subdir: 'Firefox Profil-Dateien', image: ' ' }, { name: 'prefs.js', root: 'ProfD', path: '\\prefs.js', subdir: 'Firefox Profil-Dateien', image: ' ' }, { name: 'user.js', root: 'ProfD', path: '\\user.js', subdir: 'Firefox Profil-Dateien', image: ' ' }, { name: 'Profil', root: 'ProfD', path: '\\', subdir: 'Firefox Verzeichnisse', image: ' ' }, { name: 'chrome', root: 'ProfD', path: '\\chrome', subdir: 'Firefox Verzeichnisse', image: ' ' }, { name: 'CSS', root: 'ProfD', path: '\\chrome\\CSS', subdir: 'Firefox Verzeichnisse', image: ' ' }, { name: 'JS', root: 'ProfD', path: '\\chrome\\JS', subdir: 'Firefox Verzeichnisse', image: ' ' }, { name: 'Addons', root: 'ProfD', path: '\\extensions', subdir: 'Firefox Verzeichnisse', image: ' ' }, { name: 'Programm', root: 'CurProcD', path: '\\', subdir: 'Firefox Verzeichnisse', image: ' ' }, { name: 'Startup-Cache', root: 'ProfLD', path: '\\startupCache', subdir: 'Firefox Verzeichnisse', image: ' ' } ], configs: [ { name: 'Anpassen', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'Neustart im abgesicherten Modus', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'Browser-Konsole', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'Entwickler-Werkzeuge', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'Browser-Werkzeuge', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'Firefox synchronisieren', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'Zugangsdaten und Passwörter', tooltiptext: 'about:logins', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'Task Manager', tooltiptext: 'about:processes', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'Offline arbeiten', subdir: 'Firefox Funktionen', image: ' ' }, { name: 'about:about', subdir: 'about:', image: ' ' }, { name: 'about:cache', subdir: 'about:', image: ' ' }, { name: 'about:certificate', subdir: 'about:', image: ' ' }, { name: 'about:checkerboard', subdir: 'about:', image: ' ' }, { name: 'about:compat', subdir: 'about:', image: ' ' }, { name: 'about:config', subdir: 'about:', image: ' ' }, { name: 'about:crashes', subdir: 'about:', image: ' ' }, { name: 'about:debugging', subdir: 'about:', image: ' ' }, { name: 'about:downloads', subdir: 'about:', image: ' ' }, { name: 'about:logging', subdir: 'about:', image: ' ' }, { name: 'about:logins', subdir: 'about:', image: ' ' }, { name: 'about:memory', subdir: 'about:', image: ' ' }, { name: 'about:networking', subdir: 'about:', image: ' ' }, { name: 'about:processes', tooltiptext: 'Task Manager', subdir: 'about:', image: ' ' }, { name: 'about:policies', subdir: 'about:', image: ' ' }, { name: 'about:profiles', subdir: 'about:', image: ' ' }, { name: 'about:profiling', subdir: 'about:', image: ' ' }, { name: 'about:protections', subdir: 'about:', image: ' ' }, { name: 'about:rights', subdir: 'about:', image: ' ' }, { name: 'about:serviceworkers', subdir: 'about:', image: ' ' }, { name: 'about:studies', subdir: 'about:', image: ' ' }, { name: 'about:support', subdir: 'about:', image: ' ' }, { name: 'about:sync-log', subdir: 'about:', image: ' ' }, { name: 'about:telemetry', subdir: 'about:', image: ' ' }, { name: 'about:third-party', subdir: 'about:', image: ' ' }, { name: 'about:unloads', tooltiptext: 'Tabs entladen', subdir: 'about:', image: ' ' }, { name: 'about:url-classifier', subdir: 'about:', image: ' ' }, { name: 'about:webrtc', subdir: 'about:', image: ' ' }, { name: 'about:windows-messages', subdir: 'about:', image: ' ' }, { name: 'Neues privates Fenster', id: 'AMprivate', image: ' ' }, { name: 'separator' }, { name: 'Einstellungen', id: 'AMsettings', image: ' ' }, { name: 'Add-ons', id: 'AMaddons', image: ' ' }, { name: 'separator' }, { name: 'Lesezeichen-Verwaltung', id: 'AMbookmarks', image: ' ' }, { name: 'Chronik', id: 'AMhistory', image: ' ' }, { name: 'Downloads', id: 'AMdownloads', image: ' ' }, { name: 'Seite speichern unter...', id: 'AMsave', image: ' ' }, { name: 'Chronik löschen', id: 'AMsanitize', image: ' ' }, { name: 'separator' }, { name: 'Neustart', id: 'AMreboot', tooltiptext: 'userChrome.js-Cache wird geleert', image: ' ' }, { name: 'Beenden', id: 'AMquit', image: ' ' } ] }, _externalAppPopup: null, _isready: false, // ============================== // Initialisierung // ============================== init: function() { this.handleRelativePath(this.toolbar.apps); const XULNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'; const ExternalAppBtn = document.createElementNS( XULNS, 'toolbarbutton' ); ExternalAppBtn.id = 'AppMenuButton'; ExternalAppBtn.setAttribute('label', 'AppButton'); ExternalAppBtn.setAttribute('tooltiptext', 'Firefox Menü'); ExternalAppBtn.setAttribute('type', 'menu'); ExternalAppBtn.setAttribute('removable', 'true'); // Firefox-internes Symbol statt Base64 //ExternalAppBtn.style.listStyleImage = // 'url("chrome://browser/skin/menu.svg")'; if (Appmenu.isButton) { ExternalAppBtn.style.listStyleImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAAUCAYAAAAwaEt4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAF3SURBVFhH7ZUxS8RAEIX9M1fb29vb+wP8AdaCYCVY2FmInY1YWmlrp7WtNp6ihyKKCDYrb7kPxsuMJiG5CO6DR5LZmd2Zl9ndhduNUSqssggTsAgTsAgTsAgTsLEw71enyYPGHvZW8vvHzUUlrinvd5e/reX59Mk/K8zn5DrPBTyfPtlamOeTTXe8K4LHg1V3vG92KgwdI2ADT8fr+UmcfNVZ4OVspzIH0Joau9teSq/n+1Nryl1l8yA3/LUdgWLxq8NOthKJ/CQMUCE2YQuJEwkz3lqsbC+AOCoeaB5y1U8hn7qcmzB0hArkr79dHuVvhFLhs3GaU9+Tw7WpJWV/2SQIIA4bIpJbU85tK1Gg6IkLojgKtoV664kWbc+oQYRRpwh0DHZLQJztGM6LOh3T9oYcRBjrZ2F9ADYJGIFcZg9bxPFy/Y2DCCOqxe2tpHd7cwAbp3G6TVDh9mBlPp1h+va6rC4bC/NfWIQJWIQJWIQJWIRxOUpfQ+jqXwPuQ7IAAAAASUVORK5CYII=)"; } else { ExternalAppBtn.style.listStyleImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA6SURBVDhPYxgcIDg+6z8IQ7lwPiEMVT4YDBh4gO4kZGfiw1Dlg8GAgQfoTkJ2Jj4MVT4YDCAfMDAAAFSm42US1bMnAAAAAElFTkSuQmCC)"; } let toolbar; if (this.isUrlbar === 1) { toolbar = document.getElementById( 'nav-bar-customization-target' ); } else if (this.isUrlbar === 2) { toolbar = document.getElementById( 'toolbar-menubar' ); } else { toolbar = document.getElementById( 'TabsToolbar' ); } if (toolbar) { toolbar.insertBefore( ExternalAppBtn, toolbar.firstChild ); } ExternalAppBtn.addEventListener('click', event => { event.preventDefault(); event.stopPropagation(); }); const ExternalAppPopup = document.createElementNS( XULNS, 'menupopup' ); ExternalAppPopup.id = 'AMpopup'; ExternalAppPopup.addEventListener('click', event => { event.stopPropagation(); }); this._externalAppPopup = ExternalAppPopup; ExternalAppBtn.appendChild(ExternalAppPopup); this.onpopupshowing(); if (this.hotkey) { const key = document.createXULElement('key'); key.id = 'key_AppMenuPopup'; key.setAttribute('key', this.hotkey); if (this.hotkeyModifier) { key.setAttribute( 'modifiers', this.hotkeyModifier ); } key.addEventListener('command', () => { document .getElementById('AMpopup') .openPopup(); }); document .getElementById('mainKeyset') .appendChild(key); } }, // ============================== // Menü aufbauen // ============================== onpopupshowing: function() { if (this._isready || !this._externalAppPopup) { return; } const popup = this._externalAppPopup; for (const subdir of this.toolbar.subdirs) { if (subdir.name === 'separator') { popup.appendChild( document.createXULElement('menuseparator') ); continue; } const menu = document.createXULElement('menu'); const subpopup = document.createXULElement( 'menupopup' ); menu.setAttribute('class', 'menu-iconic'); menu.setAttribute('label', subdir.name); menu.setAttribute('image', subdir.image); menu.appendChild(subpopup); popup.appendChild(menu); this.subdirPopupHash[subdir.name] = subpopup; this.subdirMenuHash[subdir.name] = menu; } for (const app of this.toolbar.apps) { let item; if (app.name === 'separator') { item = document.createXULElement( 'menuseparator' ); } else { item = document.createXULElement('menuitem'); item.setAttribute( 'class', 'menuitem-iconic' ); item.setAttribute('label', app.name); item.setAttribute('image', app.image); item.setAttribute( 'tooltiptext', app.name ); item.path = app.path; item.args = app.args; item.addEventListener('command', function() { Appmenu.exec( this.path, this.args ); }); } if ( app.subdir && this.subdirPopupHash[app.subdir] ) { this.subdirPopupHash[app.subdir] .appendChild(item); } else { popup.appendChild(item); } } for (const config of this.toolbar.configs) { let item; if (config.name === 'separator') { item = document.createXULElement( 'menuseparator' ); } else { item = document.createXULElement( 'menuitem' ); item.setAttribute( 'class', 'menuitem-iconic' ); item.setAttribute( 'label', config.name ); item.setAttribute( 'image', config.image ); item.setAttribute( 'tooltiptext', config.tooltiptext || config.name ); if (config.id) { item.setAttribute( 'id', config.id ); } item.addEventListener( 'command', event => { Appmenu.executeCommand( config.name, event ); } ); } if ( config.subdir && this.subdirPopupHash[config.subdir] ) { this.subdirPopupHash[config.subdir] .appendChild(item); } else { popup.appendChild(item); } } if (this.autohideEmptySubDirs) { for (const name in this.subdirPopupHash) { const subpopup = this.subdirPopupHash[name]; const menu = this.subdirMenuHash[name]; if ( !subpopup.hasChildNodes() && menu ) { menu.setAttribute( 'hidden', 'true' ); } } } if (this.moveSubDirstoBottom) { let count = popup.childNodes.length; while ( popup.firstChild && popup.firstChild.getAttribute( 'class' ) !== 'menuitem-iconic' && count-- > 0 ) { popup.appendChild( popup.firstChild ); } } this._isready = true; }, // ============================== // Neue Befehlsausführung // ============================== executeCommand: function(name, event) { if (name.startsWith('about:')) { openTrustedLinkIn( name, gBrowser.selectedTab.isEmpty ? 'current' : 'tab' ); return; } switch (name) { case 'Anpassen': gCustomizeMode.enter(); break; case 'Neustart im abgesicherten Modus': safeModeRestart(); break; case 'Browser-Konsole': { const { require } = ChromeUtils.importESModule( 'resource://devtools/shared/loader/Loader.sys.mjs', {} ); const { BrowserConsoleManager } = require( 'resource://devtools/client/webconsole/browser-console-manager' ); BrowserConsoleManager .openBrowserConsoleOrFocus(); break; } case 'Entwickler-Werkzeuge': { const { require } = ChromeUtils.importESModule( 'resource://devtools/shared/loader/Loader.sys.mjs', {} ); const { gDevToolsBrowser } = require( 'devtools/client/framework/devtools-browser' ); gDevToolsBrowser .toggleToolboxCommand( window.gBrowser, Cu.now() ); break; } case 'Browser-Werkzeuge': { const { require } = ChromeUtils.importESModule( 'resource://devtools/shared/loader/Loader.sys.mjs', {} ); const { BrowserToolboxLauncher } = require( 'resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs' ); BrowserToolboxLauncher.init(); break; } case 'Firefox synchronisieren': gSync.openPrefs('menubar'); break; case 'Zugangsdaten und Passwörter': LoginHelper.openPasswordManager( window, { entryPoint: 'mainmenu' } ); break; case 'Task Manager': switchToTabHavingURI( 'about:processes', true ); break; case 'Offline arbeiten': BrowserOffline.toggleOfflineStatus(); break; case 'Neues privates Fenster': OpenBrowserWindow({ private: true }); break; case 'Einstellungen': openPreferences(); break; case 'Add-ons': BrowserAddonUI.openAddonsMgr(); break; case 'Lesezeichen-Verwaltung': PlacesCommandHook .showPlacesOrganizer( 'AllBookmarks' ); break; case 'Chronik': PlacesCommandHook .showPlacesOrganizer( 'History' ); break; case 'Downloads': BrowserCommands.downloadsUI(); break; case 'Seite speichern unter...': saveBrowser( gBrowser.selectedBrowser ); break; case 'Chronik löschen': Sanitizer.showUI(window); break; case 'Neustart': Services.appinfo .invalidateCachesOnRestart(); Services.startup.quit( Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit ); break; case 'Beenden': goQuitApplication(event); break; default: console.error( 'Appmenu: Unbekannter Befehl: ' + name ); } }, // ============================== // Pfade verarbeiten // ============================== handleRelativePath: function(apps) { for (const app of apps) { if (!app.path) { continue; } app.path = app.path.replace( /\//g, '\\' ); const ffdir = Cc[ '@mozilla.org/file/directory_service;1' ] .getService(Ci.nsIProperties) .get(app.root, Ci.nsIFile) .path; if (/^\\/.test(app.path)) { app.path = ffdir + app.path; } } }, // ============================== // Dateien und Ordner öffnen // ============================== exec: function(path, args) { args = args || []; const args_t = args.slice(0); for (let i = 0; i < args_t.length; i++) { args_t[i] = args_t[i].replace( /%u/g, gBrowser.currentURI.spec ); } const file = Cc[ '@mozilla.org/file/local;1' ].createInstance(Ci.nsIFile); file.initWithPath(path); if (!file.exists()) { alert( 'Datei nicht gefunden: ' + path ); return; } if ( file.isExecutable() && !path.endsWith('.js') ) { const process = Cc[ '@mozilla.org/process/util;1' ].createInstance(Ci.nsIProcess); process.init(file); process.run( false, args_t, args_t.length ); return; } if (file.isFile()) { if (this.editor) { const converter = Cc[ '@mozilla.org/intl/scriptableunicodeconverter' ].createInstance( Ci.nsIScriptableUnicodeConverter ); converter.charset = window.navigator.platform .toLowerCase() .includes('win') ? 'Shift_JIS' : 'UTF-8'; const convertedPath = converter.ConvertFromUnicode( file.path ); const editor = Cc[ '@mozilla.org/file/local;1' ].createInstance(Ci.nsIFile); editor.initWithPath( this.editor ); const process = Cc[ '@mozilla.org/process/util;1' ].createInstance(Ci.nsIProcess); process.init(editor); process.run( false, [convertedPath], 1 ); } else { file.launch(); } return; } if (file.isDirectory()) { if (this.fileManager) { const fmArgs = [ this.FMParameter, path ]; const manager = Cc[ '@mozilla.org/file/local;1' ].createInstance(Ci.nsIFile); manager.initWithPath( this.fileManager ); const process = Cc[ '@mozilla.org/process/util;1' ].createInstance(Ci.nsIProcess); process.init(manager); process.run( false, fmArgs, fmArgs.length ); } else { file.launch(); } } } }; if (window.gBrowser) { Appmenu.init(); } -
vielen Base64-Codes will nicht gelingen.
Ich habe vor langer Zeit base64-Symbole durch Icons aus Browserressourcen ersetzt.
image: "chrome://global/skin/icons/folder.svg"........ -
Ich habe vor langer Zeit base64-Symbole durch Icons aus Browserressourcen ersetzt.
Ich habe sie ganz aus dem Script entfernt, dafür die Icon mit einer css-Datei erstellt.
-
Hallo zusammen.
Habe mit diesem Script ein kleines Problem.
Linksklick funktioniert bestens. Definierte Adressen werden in neuen Tabs geöffnet.
Rechtsklick wird neues Fenster geöffnet, wie es soll, aber keine
neuen Tabs mit definierten Seiten geöffnet. Könnt ihr euch das mal anschauen.JavaScript
Alles anzeigen(function() { if (!window.gBrowser){ return; } // key: 0 = linke Maustatste // key: 2 = rechte Maustatste const quickLinks = [ {"wLink": 'https://www.camp-firefox.de/forum', "key": 0}, {"wLink": 'https://www.thunderbird-mail.de/forum/board/71-manuelle-anpassungen-per-css-oder-script/', "key": 0}, {"wLink": 'https://github.com/Endor8/userChrome.js', "key": 0}, {"wLink": 'https://github.com/alice0775/userChrome.js', "key": 0}, {"wLink": 'https://www.camp-firefox.de/forum', "key": 2 }, {"wLink": 'https://www.thunderbird-mail.de/forum/board/71-manuelle-anpassungen-per-css-oder-script/', "key": 2}, {"wLink": 'https://github.com/Endor8/userChrome.js', "key": 2}, {"wLink": 'https://github.com/alice0775/userChrome.js', "key": 2}, ]; try { CustomizableUI.createWidget({ id: 'link-button', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { var currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/"); var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton'); var props = { id: 'link-button', class: 'toolbarbutton-1 chromeclass-toolbar-additional', removable: 'true', label: 'Quicklink', accesskey: '', tooltiptext: 'Quicklinks:\nWetterbericht', style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/Links.png") + '");', }; for (var p in props) toolbaritem.setAttribute(p, props[p]); return toolbaritem; } }); } catch(e) { }; document.getElementById('link-button').addEventListener( 'click', function(event) { let linkCaller=null; let timeout=0; if (event.button == 0) { linkCaller = event.target; } else if (event.button == 2) { event.preventDefault(); linkCaller = OpenBrowserWindow(); timeout=1000; } else return; setTimeout(function() { let bFirstTabNewWindow=true; quickLinks.forEach((weblink,nIndex) => { if( event.button == 2 ) { if( weblink["key"] == 2 ) { if(bFirstTabNewWindow) { bFirstTabNewWindow = false; linkCaller.documentGlobal.openWebLinkIn(weblink["wLink"],"current"); } else { linkCaller.documentGlobal.openWebLinkIn(weblink["wLink"],"tab"); } } } else if( event.button == 0 && weblink["key"] == 0 ) { linkCaller.documentGlobal.openWebLinkIn(weblink["wLink"],"tab"); } }); }, timeout); }, true); }) ();Konsole sagt:
CodeUncaught TypeError: can't access property "openWebLinkIn", linkCaller.documentGlobal is undefined <anonymous> file:///C:/Users/xxxx/AppData/Roaming/Mozilla/Firefox/Profiles/u8c46bd1.Firefox144/chrome/wetterbericht.uc.js:74 <anonymous> file:///C:/Users/xxxx/AppData/Roaming/Mozilla/Firefox/Profiles/u8c46bd1.Firefox144/chrome/wetterbericht.uc.js:66 wetterbericht.uc.js:74:29 <anonym> file:///C:/Users/xxxx/AppData/Roaming/Mozilla/Firefox/Profiles/u8c46bd1.Firefox144/chrome/wetterbericht.uc.js:74 forEach self-hosted:145 <anonym> file:///C:/Users/xxxx/AppData/Roaming/Mozilla/Firefox/Profiles/u8c46bd1.Firefox144/chrome/wetterbericht.uc.js:66Mfg.
Endor -
Könnt ihr euch das mal anschauen.
Hallo Endor...anpassen kann ich es leider nicht.

Dieses Skript nutze ich dafür:
JavaScript
Alles anzeigen//Autor @BrokenHeart //angepasst für Fx 152 = https://www.camp-firefox.de/forum/thema/140675-quicklink-uc-js-funktioniert-nicht-mehr/?postID=1290552#post1290552 (function() { if (!window.gBrowser){ return; } let newWindow = null; try { CustomizableUI.createWidget({ id: 'link-button', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { var currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/"); var buttonicon = "Links.png" var toolbaritem = aDocument.createXULElement('toolbarbutton'); var props = { id: 'link-button', class: 'toolbarbutton-1 chromeclass-toolbar-additional', removable: 'true', label: 'Quicklink', accesskey: '', tooltiptext: '', style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");' }; for (var p in props) toolbaritem.setAttribute(p, props[p]); return toolbaritem; } }); } catch(e) { }; document.getElementById('link-button').addEventListener( 'click', function(event) { if (event.button == 0) { newWindow = null; event.target.documentGlobal.openTrustedLinkIn('https://www.camp-firefox.de/forum',"tab"); event.target.documentGlobal.openTrustedLinkIn ('https://www.thunderbird-mail.de/forum/board/71-manuelle-anpassungen-per-css-oder-script/',"tab"); event.target.documentGlobal.openTrustedLinkIn('https://github.com/alice0775/userChrome.js',"tab"); } else if (event.button == 2) { event.preventDefault(); newWindow = OpenBrowserWindow(); setTimeout(function() { newWindow.openTrustedLinkIn('https://www.camp-firefox.de/forum',"current"); newWindow.openTrustedLinkIn('https://github.com/alice0775/userChrome.js',"tab"); }, 1500); } }, true); }) ();Kannst es ja mal testen wenn du magst.
-
-
Prima funktioniert bestens.
Freut mich, sehr schön


-
Hallo zusammen.
Habe mit diesem Script ein kleines Problem.
Linksklick funktioniert bestens. Definierte Adressen werden in neuen Tabs geöffnet.
Rechtsklick wird neues Fenster geöffnet, wie es soll, aber keine
neuen Tabs mit definierten Seiten geöffnet. Könnt ihr euch das mal anschauen.Getestet in Nightly, funktioniert auch wieder.
JavaScript
Alles anzeigen(function() { "use strict"; if (!window.gBrowser) { return; } const quickLinks = [ {wLink: "https://www.camp-firefox.de/forum", key: 0}, {wLink: "https://www.thunderbird-mail.de/forum/board/71-manuelle-anpassungen-per-css-oder-script/", key: 0}, {wLink: "https://github.com/Endor8/userChrome.js", key: 0}, {wLink: "https://github.com/alice0775/userChrome.js", key: 0}, {wLink: "https://www.camp-firefox.de/forum", key: 2}, {wLink: "https://www.thunderbird-mail.de/forum/board/71-manuelle-anpassungen-per-css-oder-script/", key: 2}, {wLink: "https://github.com/Endor8/userChrome.js", key: 2}, {wLink: "https://github.com/alice0775/userChrome.js", key: 2} ]; /* * ============================================================ * Vorhandenes Widget entfernen * ============================================================ */ try { if (CustomizableUI.getWidget("link-button")) { CustomizableUI.destroyWidget("link-button"); } } catch (e) { console.error("Quicklink: destroyWidget:", e); } /* * ============================================================ * Links im aktuellen Fenster öffnen * * loadTabs() öffnet alle URLs in einem einzigen Aufruf. * ============================================================ */ function openCurrentWindow() { const urls = quickLinks .filter(function(item) { return item.key === 0; }) .map(function(item) { return item.wLink; }); if (!urls.length || !window.gBrowser) { return; } try { window.gBrowser.loadTabs( urls, { inBackground: false, replace: false, triggeringPrincipal: Services.scriptSecurityManager .getSystemPrincipal() } ); } catch (e) { console.error( "Quicklink: loadTabs:", e ); } } /* * ============================================================ * Neues Fenster * * Wir verwenden OpenBrowserWindow() wie im ursprünglichen * Script und warten auf die vollständige Initialisierung. * ============================================================ */ function openNewWindow() { let newWin; try { newWin = OpenBrowserWindow(); } catch (e) { console.error( "Quicklink: OpenBrowserWindow:", e ); return; } const urls = quickLinks .filter(function(item) { return item.key === 2; }) .map(function(item) { return item.wLink; }); if (!urls.length) { return; } /* * Firefox-Signal für ein vollständig gestartetes * Browserfenster. */ const observer = { observe(subject, topic) { if ( topic !== "browser-delayed-startup-finished" || subject !== newWin ) { return; } Services.obs.removeObserver( observer, "browser-delayed-startup-finished" ); loadIntoNewWindow(); } }; function loadIntoNewWindow() { if ( !newWin || newWin.closed || !newWin.gBrowser ) { return; } try { /* * Der erste URL ersetzt den vorhandenen Tab, * die restlichen werden als neue Tabs angehängt. */ newWin.gBrowser.loadTabs( urls, { inBackground: false, replace: true, triggeringPrincipal: Services.scriptSecurityManager .getSystemPrincipal() } ); } catch (e) { console.error( "Quicklink: loadTabs neues Fenster:", e ); } } Services.obs.addObserver( observer, "browser-delayed-startup-finished" ); /* * Falls das Fenster bereits vollständig gestartet war, * bevor der Observer registriert wurde. */ setTimeout(function() { try { if ( newWin && !newWin.closed && newWin.gBrowser ) { Services.obs.removeObserver( observer, "browser-delayed-startup-finished" ); loadIntoNewWindow(); } } catch (e) { console.error( "Quicklink: Fensterprüfung:", e ); } }, 500); } /* * ============================================================ * WIDGET * ============================================================ */ try { CustomizableUI.createWidget({ id: "link-button", type: "custom", defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { const profileDirectory = Services.dirsvc .get("ProfD", Ci.nsIFile) .path .replace(/\\/g, "/"); const toolbaritem = aDocument.createXULElement( "toolbarbutton" ); toolbaritem.id = "link-button"; toolbaritem.className = "toolbarbutton-1 " + "chromeclass-toolbar-additional"; toolbaritem.setAttribute( "removable", "true" ); toolbaritem.setAttribute( "label", "Quicklink" ); toolbaritem.setAttribute( "tooltiptext", "Quicklinks:\n" + "Linksklick: aktuelles Fenster\n" + "Rechtsklick: neues Fenster" ); toolbaritem.setAttribute( "style", 'list-style-image: url("file:' + profileDirectory + '/chrome/icons/Links.png");' ); /* * ================================================= * DER ENTSCHEIDENDE TEIL * * Wir hängen den Listener direkt an den * tatsächlich erzeugten toolbarbutton. * * Nicht onCommand. * Nicht CustomizableUI.onClick. * ================================================= */ toolbaritem.addEventListener( "click", function(event) { console.log( "Quicklink click:", event.button ); /* * Linksklick */ if (event.button === 0) { event.preventDefault(); event.stopPropagation(); openCurrentWindow(); return; } /* * Rechtsklick */ if (event.button === 2) { event.preventDefault(); event.stopPropagation(); openNewWindow(); return; } }, true ); return toolbaritem; } }); console.log( "Quicklink: Widget erstellt" ); } catch (e) { console.error( "Quicklink: createWidget:", e ); } })(); -
Und auch hier habe ich schon eine ganze Weile ein funktionierendes Skript!
Poste es nur auf Wunsch, -
Das Script für Addon-Suche funktionierte auch nicht mehr richtig. Das ist jetzt die Abfolge, in 155 bis 157 getestet:
Das ist jetzt der Ablauf:
Firefox startet (kein Restart).
Die installierten Erweiterungen werden im Hintergrund geprüft.
Es wird nichts automatisch installiert (automatische Updates deaktiviert).
Gibt es keine Updates, passiert gar nichts.
Gibt es Updates, wird genau ein about:addons-Tab geöffnet.
Firefox landet direkt bei „Verfügbare Updates“.
Rechts werden die tatsächlich verfügbaren Updates angezeigt.
Über die Installation wird selbst entschieden.JavaScript
Alles anzeigen// addonUpdateNotifier.uc.js // Firefox 154+ // Version 03.09.2026 // Sucht beim Firefox-Start nach Updates für installierte // Erweiterungen. Es wird NICHT automatisch installiert. // Automatisches Update muss deaktiviert sein // Bei Updates wird direkt "Verfügbare Updates" geöffnet. (async function() { if (location.href !== "chrome://browser/content/browser.xhtml") return; const { AddonManager } = ChromeUtils.importESModule( "resource://gre/modules/AddonManager.sys.mjs" ); async function checkForUpdates() { let foundUpdate = false; let addons = await AddonManager.getAddonsByTypes([ "extension" ]); for (let addon of addons) { if ( !(addon.permissions & AddonManager.PERM_CAN_UPGRADE) ) { continue; } await new Promise(resolve => { addon.findUpdates({ onUpdateAvailable( aAddon, install ) { foundUpdate = true; }, onNoUpdateAvailable() { }, onUpdateFinished() { resolve(); } }, AddonManager.UPDATE_WHEN_USER_REQUESTED); }); } /* * Keine Updates: * nichts machen. */ if (!foundUpdate) return; /* * ======================================================== * UPDATE GEFUNDEN * ======================================================== */ let win = Services.wm.getMostRecentWindow( "navigator:browser" ); if (!win) return; /* * Einen neuen about:addons-Tab öffnen. */ let tab = win.gBrowser.addTrustedTab( "about:addons" ); win.gBrowser.selectedTab = tab; win.focus(); /* * ======================================================== * ABOUT:ADDONS WARTEN * ======================================================== */ let browser = tab.linkedBrowser; browser.addEventListener( "DOMContentLoaded", function listener() { browser.removeEventListener( "DOMContentLoaded", listener ); /* * Jetzt NICHT about:addons#updates laden! * * Stattdessen den internen ViewController * von about:addons benutzen. */ selectUpdatesView( browser ); }, { once: true } ); } /* * ============================================================ * UPDATE-VIEW AUSWÄHLEN * ============================================================ */ function selectUpdatesView(browser) { let tries = 0; let timer = setInterval(() => { tries++; try { let win = browser.contentWindow; let doc = browser.contentDocument; if (!win || !doc) { if (tries > 200) clearInterval(timer); return; } /* * ------------------------------------------------ * Firefox about:addons ViewController * ------------------------------------------------ */ let controller = win.gViewController; if (!controller) { if (tries > 200) { clearInterval(timer); console.error( "[AddonUpdateNotifier] " + "gViewController nicht gefunden." ); } return; } /* * ------------------------------------------------ * Direkt die Firefox-View aufrufen. * ------------------------------------------------ * * Die gewünschte View lautet: * * addons://updates/available * * Das ist die View-ID der Kategorie * "Verfügbare Updates". */ clearInterval(timer); /* * Je nach Firefox-Version ist die Methode * loadView() bzw. loadViewInternal() verfügbar. */ if ( typeof controller.loadView === "function" ) { controller.loadView( "addons://updates/available" ); return; } if ( typeof controller.loadViewInternal === "function" ) { controller.loadViewInternal( "addons://updates/available" ); return; } /* * ------------------------------------------------ * Fallback: * * Kategorie-Button über seine View-ID anklicken. * ------------------------------------------------ */ let button = doc.querySelector( '[viewid="addons://updates/available"]' ); if (!button) { button = doc.querySelector( '[name="available-updates"]' ); } if (button) { button.click(); return; } console.error( "[AddonUpdateNotifier] " + "Keine Möglichkeit gefunden, " + "'Verfügbare Updates' zu öffnen." ); } catch (e) { console.error( "[AddonUpdateNotifier]", e ); if (tries > 200) clearInterval(timer); } }, 100); } /* * ============================================================ * START * ============================================================ */ setTimeout( checkForUpdates, 2000 ); })(); -
Seit dem Update auf die 155 funktioniert die "mousehoover.uc.js" nicht mehr. Nachstehend der bei mir in der chrome gespeicherte Code. Gibt es dafür eine Lösung? Danke
JavaScript
Alles anzeigenvar tab_hover = { event:null, tid:null, getTab: function(element) { while (element && element.localName != 'tab') { element = element.parentNode; }; return element; }, onLoad: function() { gBrowser.tabContainer.addEventListener("mouseout", tab_hover.onMouseOut, false); gBrowser.tabContainer.addEventListener("mouseover", tab_hover.onMouseOver, false); }, onUnload: function() { gBrowser.tabContainer.removeEventListener("mouseover", tab_hover.onMouseOver, false); gBrowser.tabContainer.removeEventListener("mouseout", tab_hover.onMouseOut, false); }, onMouseOver: function(event) { tab_hover.event = event.target; tab_hover.tid = setTimeout(function() { gBrowser.selectedTab = tab_hover.getTab(tab_hover.event); }, 250); }, onMouseOut: function() { clearTimeout(tab_hover.tid); } }; tab_hover.onLoad(); -
funktioniert die "mousehoover.uc.js" nicht mehr.
Funktioniert hier einwandfrei.
Du hast die neuen Anpassungen gemacht?
BeitragFirefox 155 notwendige Änderung bei Skriptverwendung!
Hinweis:
Ab der Firefox Version 155 müssen Dateien im Installationsorder von Firefox ausgetauscht werden.
Die neuen Dateien gibt es hier zum Download:
https://github.com/Endor8/userChr…rChrome/Dateien
Oder hier der direkte Download der .zip Datei:
https://raw.githubusercontent.com/Endor8/userChr…anpassungen.zip
Und hier eine Erklärung, wohin die Dateien müssen:
https://github.com/Endor8/userChr…ster/userChrome
Oder auch hier mal lesen:
RE: JavaScript in der Nightly 155.0a1 (2026-07-28)
2002Andreas2. September 2026 um 11:41 -
Sorry Andreas. Den Thread mit den Änderungen habe ich überlesen. Nach dem Überschreiben der Dateien funktioniert es wieder wie gewohnt. Danke nochmal.
-
Sorry Andreas. Den Thread mit den Änderungen habe ich überlesen.
Alles ist gut

Danke nochmal.
Gern geschehen.
-