1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Mira_Belle

Beiträge von Mira_Belle

  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 18. Juni 2026 um 21:01

    FuchsFan Und hier die Lösung.

    JavaScript
    // addonUpdateNotifier.uc.js
    // Firefox 152+
    
    (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);
                });
            }
            if (foundUpdate) {
                let win = Services.wm.getMostRecentWindow("navigator:browser");
                let tab = win.gBrowser.addTrustedTab("about:addons");
    
                tab.linkedBrowser.addEventListener(
                    "DOMContentLoaded",
                    function listener() {
                        tab.linkedBrowser.removeEventListener(
                            "DOMContentLoaded",
                            listener
                        );
                        tab.linkedBrowser.loadURI(
                            Services.io.newURI(
                                "about:addons#updates"
                            )
                        );
                    },
                    { once: true }
                );
            }
        }
        setTimeout(checkForUpdates, 2000);
    })();
    Alles anzeigen
  • Menüpopup hat keinen Text wenn kein Focus vorher war

    • Mira_Belle
    • 18. Juni 2026 um 18:33

    Sorry 2002Andreas habe ich zum Glück nicht.
    Auch nicht in der derzeitigen Nightly.

    Nutzt Du wirklich noch 152.0?

  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 18. Juni 2026 um 17:54

    juzzlukin Du hast nun die Wahl.

    Suche Dir aus, was Dir besser zusagt.


    Falls ich Dir richtig verstanden hatte und die Seite "about:addons" manchmal hängen geblieben ist,
    habe ich das Skript dafür gefixt.

    JavaScript
    // Atomatk-Addons-UpDate-Check.uc.js
    // Das Script führt automatisch einen UpDate-Check aus und dies in einem neuen Tab anzeigt.
    // Auch wird ein Button erstellt, der einen UpDate-Check ausführt und dies in einem neuen Tab anzeigt.
    
    // Source file https://www.camp-firefox.de/forum/thema/140656/?postID=1290593#post1290593
    
    /* ----------------------------------------------------------------------------------- */
    /* Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen */
    /* %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons */
    /* ----------------------------------------------------------------------------------- */
    
    (function() {
    "use strict";
    
        // Nur in einem normalen Browserfenster weiterarbeiten.
        if (!window.gBrowser) return;
    
        const
        // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                 id = 'addons-update-button', // Id des Buttons
               link = 'about:addons', // Linkziel des Buttons
              label = 'Add-ons Update', // Bezeichnung des Buttons
        tooltiptext = 'Add-ons aktualisieren',
        // Icon-------------------------------------------------------
               icon = 'sync.svg', // [Name.Dateiendung] des Symbols
             colour = '#8bff0f', // Farbe für das SVG-Icon setzen
           iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
        // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
         curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
    
        // SVG-Icons können CSS-Farbangaben übernehmen; das schaltet Firefox dafür frei.
    	if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
    		Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
    	}
    
        const
        // ■■ START ScriptConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        STARTUP_DELAY_MS = 2500, // Verzögerung nach Firefox-Start, damit die Oberfläche fertig geladen ist.
             MAX_WAIT_MS = 12000, // Maximale Wartezeit darauf, dass about:addons vollständig geladen ist.
                 POLL_MS = 250; // Intervall für wiederholte Prüfungen.
        let
             startupDone = false, // Merkt sich, ob der Startvorgang schon einmal ausgeführt wurde.
                    busy = false; // Verhindert parallele Abläufe.
        // ■■ END ScriptConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
        //BUTTON
    	try {
          CustomizableUI.createWidget({
             id: id,
             defaultArea: CustomizableUI.AREA_NAVBAR,
             label: label,
             tooltiptext: tooltiptext,
    
             onCreated: (button) => {
                button.style.MozContextProperties = 'fill, stroke, fill-opacity';
                button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
                button.style.minWidth = 'fit-content';
              //  button.style.color = '#ffe10f'; // Farbe für das SVG-Icon setzen
                button.style.color = colour;
             }
          });
    	} catch(e) {};
        // Liefert das aktuellste Browserfenster.
        function getBrowserWindow() {
            return Services.wm.getMostRecentWindow("navigator:browser");
        }
        // Öffnet about:addons in einem neuen Tab.
        function openAddonsTab(win) {
            if (!win) return false;
            try {
                win.openTrustedLinkIn(link, "tab");
            return true;
            } catch (e) {
                return false;
            }
        }
    
        // Schließt den Tab, wenn keine Updates gefunden wurden (mit robusterer Prüfung).
        function checkAndCloseIfNoUpdates(doc, win) {
            const startTime = Date.now();
            const MAX_CHECK_TIME = 10000; // 10 Sekunden maximale Wartezeit
            const CHECK_INTERVAL = 500;   // Alle 500ms prüfen
    
            function check() {
                try {
                    // 1. Prüfe das klassische "no updates"-Element
                    const messageEl = doc.getElementById('updates-message');
                    if (messageEl && messageEl.getAttribute('state') === 'none-found') {
                        closeTabSafely(win);
                        return;
                    }
    
                    // 2. Prüfe, ob die "Available Updates"-Liste leer ist
                    const availableUpdates = doc.querySelector('addon-list[filter="updates-available"]');
                    if (availableUpdates && availableUpdates.items.length === 0) {
                        closeTabSafely(win);
                        return;
                    }
    
                    // 3. Prüfe auf Textindikatoren (z. B. "All add-ons are up to date")
                    const noUpdatesText = doc.querySelector('.no-updates, [data-l10n-id="addon-updates-none-found"]');
                    if (noUpdatesText) {
                        closeTabSafely(win);
                        return;
                    }
    
                    // 4. Wenn nichts gefunden wurde, aber die Zeit abgelaufen ist: Tab schließen
                    if (Date.now() - startTime > MAX_CHECK_TIME) {
                        closeTabSafely(win);
                        return;
                    }
    
                    // Weiter prüfen
                    win.setTimeout(check, CHECK_INTERVAL);
                } catch (e) {
                    // Falls ein Fehler auftritt (z. B. Tab bereits geschlossen), abbrechen
                    console.error('[AddonUpdateCheck] Fehler bei der Update-Prüfung:', e);
                }
            }
    
            // Hilfsfunktion: Tab sicher schließen (mit Fehlerbehandlung)
            function closeTabSafely(win) {
                try {
                    if (win && win.gBrowser && win.gBrowser.removeCurrentTab) {
                        win.gBrowser.removeCurrentTab();
                    }
                } catch (e) {
                    console.warn('[AddonUpdateCheck] Tab konnte nicht geschlossen werden:', e);
                }
            }
    
            // Erste Prüfung nach 1 Sekunde starten (damit Firefox Zeit hat, die UI zu aktualisieren)
            win.setTimeout(check, 1000);
        }
        // Prüft, ob die Update-Elemente in about:addons schon vorhanden sind.
        function runOriginalAddonActions(doc, win) {
            try {
                const
                options = doc.querySelector("addon-page-options"),
                checkItem = doc.querySelector('panel-item[action="check-for-updates"]');
                // Update-Prüfung auslösen.
                if (options && checkItem) {
                    checkItem.click();
                }
                // Kurz warten, damit Firefox die Ergebnisse sichtbar aufbauen kann.
                win.setTimeout(function() {
                    try {
                        const categories = doc.getElementById("categories");
                        if (categories) {
                            const availableBtn = categories.querySelector('button[viewid="addons://updates/available"]');
                            if (availableBtn) availableBtn.click();
                            // 500ms warten, dann einmal prüfen
                            win.setTimeout(() => checkAndCloseIfNoUpdates(doc, win), 500);
                        }
                    } catch (e) {}
                        busy = false;
                }, 500); // Timeout auf 500ms erhöht für zuverlässigen Wechsel // hier stand vorher 1500
            } catch (e) {
                busy = false;
            }
        }
    
        // Wartet, bis about:addons vollständig geladen ist.
        function waitForAboutAddons(win, fromStartup) {
            const started = Date.now();
    
            function tick() {
                let doc = null;
                try {
                doc = win.gBrowser.selectedBrowser.contentDocument;
                } catch (e) {}
                // Nur weitermachen, wenn about:addons wirklich geöffnet ist.
                if (doc && doc.URL === "about:addons") {
                    try {
                        const
                        // Prüfen, ob die erwarteten UI-Elemente schon vorhanden sind.
                        options = doc.querySelector("addon-page-options"),
                        checkItem = doc.querySelector('panel-item[action="check-for-updates"]'),
                        recentItem = doc.querySelector('panel-item[action="view-recent-updates"]');
    
                        // Wenn alles da ist, die eigentliche Update-Logik starten.
                        if (options && checkItem && recentItem) {
                            runOriginalAddonActions(doc, win);
                            return;
                        }
                    } catch (e) {}
                }
                // Weiter warten, solange das Zeitlimit nicht überschritten ist.
                if (Date.now() - started < MAX_WAIT_MS) {
                    win.setTimeout(tick, POLL_MS);
                } else {
                    // Wenn die Zeit abgelaufen ist, wieder freigeben.
                    busy = false;
    
                    // Beim Start nicht weiter forcieren.
                    if (!fromStartup) {
                        openAddonsTab(win);
                    }
                }
            }
            tick();
        }
        // Gemeinsame Hauptfunktion für Start und Button.
        function runCheck(fromStartup) {
            if (busy) return;
            busy = true;
            const win = getBrowserWindow();
            if (!win) { 
                busy = false;
                return;
            }
            // Erst Tab öffnen.
            if (!openAddonsTab(win)) { 
                busy = false;
                return;
            }
            // Danach auf fertige Seite warten.
            waitForAboutAddons(win, fromStartup);
        }
        // Startprüfung nur einmal ausführen.
        function runStartupCheck() {
            if (startupDone) return;
            startupDone = true;
            const win = getBrowserWindow();
            if (!win) return;
            // Kleine Verzögerung, damit Firefox vollständig bereit ist.
            win.setTimeout(function() { 
                runCheck(true);
            }, STARTUP_DELAY_MS);
        }
        // Observer für den Zeitpunkt, an dem Firefox die Fenster wiederhergestellt hat.
        function onWindowsRestored(subject, topic) {
            if (topic !== "sessionstore-windows-restored") return;
            try {
                Services.obs.removeObserver(onWindowsRestored, "sessionstore-windows-restored");
            } catch (e) {}
            runStartupCheck();
        }
        // Observer registrieren.
        try {
            Services.obs.addObserver(onWindowsRestored, "sessionstore-windows-restored");
        } catch (e) {
            // Falls der Observer nicht verfügbar ist, per Timer versuchen.
            window.setTimeout(runStartupCheck, STARTUP_DELAY_MS);
        }
        // Button-Klick-Handler einrichten.
        (function click_button() {
            const button = document.getElementById(id);
            if (button) {
                button.addEventListener("click", (event) => {
                    // Nur linker Mausklick.
                    if (event.button !== 0) return;
                    // Das richtige Browserfenster ermitteln.
                    const win = event.target.documentGlobal || event.target.ownerGlobal;
                    // Keine parallelen Läufe.
                    if (busy) return;
                    busy = true;
                    // Verhalten wie beim Start: Tab öffnen und dann prüfen.
                    if (!openAddonsTab(win)) { 
                        busy = false;
                        return;
                    }
                    waitForAboutAddons(win, false);
                });
            } else {
            // Wenn der Button noch nicht existiert, erneut probieren.
            setTimeout(click_button, 100);
            }
        })();
    
    })();
    Alles anzeigen
  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 18. Juni 2026 um 15:04
    Zitat von FuchsFan

    Ihr könnt ja mal dieses Script testen, es prüft gleich nach dem Start, ob Updates vorhanden sind, gibt es sie, so wird in einem neuen Tab der Addonmanager geöffnet. Gibt es keine Updates, dann passiert weiter nichts.

    Funktioniert so weit! Habe auch die Zeitschleife etwas kürzer gemacht!

    Updates werden aber nur für aktive Addons angezeigt.

  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 18. Juni 2026 um 10:40

    Aha.
    Aber das Verhalten ist doch so gewollt.

    Wenn kein Update vorliegt, schließt sich der Tab doch.
    Anders lässt sich das nicht umsetzen.
    Hatte ja schon erwähnt, warum das Skript aus #1 nicht mehr funktioniert.
    Sicherheit und Änderungen deshalb von Mozilla.

  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 18. Juni 2026 um 10:02
    Zitat von 2002Andreas

    Hallo Mira.

    Ist er hier nicht, trotzdem kann ich das bestätigen.

    Mist.
    Kannst Du mir das noch mal genau erklären? Oder ein "Filmchen" davon machen?
    In der Zwischenzeit werde ich mein Testprofil tausendmal öffnen und schließen.
    Ma sehn.

    PS. Wenn Updates anliegen, vorhanden sind, schließt sich der Tab auch nicht!
    Soll er ja nicht.

  • Scaling/display problems

    • Mira_Belle
    • 18. Juni 2026 um 08:47
    Zitat von juzzlukin

    Ich greife in beiden Installationen auf dieselben Profile zu.

    Warum?
    Meiner Meinung nach ist es besser, Du würdest das eine BS konsequent vom anderen BS trennen!

    Die Profile das Profil auf dem einen BS hättest Du doch klonen können.

    Aber sicher wird Dir da jemand antworten, der Dir das ganze viel besser erklären kann,
    und warum eine solche Konstellation m.M. keine gute Idee ist
    und eventuell genau für solche Probleme prädestiniert ist.
    Zumal eine Einstellung in dem BS natürlich auch Auswirkungen auf den Firefox hat.
    Sind diese auf den Systemen unterschiedlich, hast Du schon den Salat.

  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 18. Juni 2026 um 08:36
    Zitat von juzzlukin

    I discovered a slight abnormality I did not recognize this at first. Now, regardless of an available update or not, when i reboot, the browser opens to about:addons for several seconds, then to travels to the previous active tab. Do you see this as well?

    Wenn der Firefox so konfiguriert ist, dass er auch bei Systemstart gestartet wird, ja.

    Zitat von juzzlukin

    EDIT: After a few more tries, I find that sometimes it returns to the previous active tab, and others times it stays at about:config

    Mh, beobachte das mal weiter. Eventuell muss da noch etwas mit den Zeitschleifen nachgebessert werden.

  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 17. Juni 2026 um 20:58

    juzzlukin Ich habe ganz einfach geschimpft wie ein Rohspatz und der KI an den Kopf geworfen, wie blöd sie doch ist.
    Grast das ganze Internet ab, aber lässt die wichtigste Quelle aus!
    Sie hat sich entschuldigt und mir fest versprochen auch in Zukunft diese Quelle in bedacht zu ziehen.

    I just swore like a sailor and told the AI right to her face how stupid she is.
    She scours the entire internet but leaves out the most important source!
    She apologized and promised me she'd make sure to include that source in the future.

    Searchfox

  • SkipToTopAndBottom.uc.js

    • Mira_Belle
    • 17. Juni 2026 um 20:09

    Da das alte Skript unter dem Firefox 152.0 nicht mehr funktionierte, habe ich mich mal wieder drann getraut.

    JavaScript
    //SkipToTopAndBottom.uc.js
    // Das Script erstellt im Kontextmenü zwei "Pfeile", nach oben und nach unten.
    // Mit diesen kann man schnell zum Anfang oder Ende einer Seite scrollen.
    
    // Source file https://www.camp-firefox.de/forum/thema/140683/?postID=1290621#post1290621
    
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    //angepasst für Fx 152
    
    (function() {
    
        let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");  // Pfadangabe zum Profilordner
        let up = "arrow-up.svg";
    
        let menuitem = document.createXULElement('menuitem');
            menuitem.id = 'context-to-top';
            menuitem.classList.add('menuitem-iconic');
            menuitem.setAttribute('tooltiptext' , 'Zum Seitenanfang springen');
            menuitem.style.setProperty('--menuitem-icon', 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + up) + '")');
            menuitem.addEventListener('click', (event) => {
                if (event.button == 0) {
                    const
                            win = Services.wm.getMostRecentWindow("navigator:browser"),
                            browser = win.gBrowser.selectedBrowser,
                            scrollScript = `content.scrollTo ({ top: 0, left: 0, behavior: "smooth"});`;
                            browser.messageManager.loadFrameScript ( `data:,${encodeURIComponent(scrollScript)}`, false );
                }
            });
    
        let refItem = document.getElementById('context-reload');
        refItem.parentNode.insertBefore(menuitem, refItem);
         
        })();
    
        (function() {
    
        let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");  // Pfadangabe zum Profilordner
        let down = "arrow-down.svg";
        
        let menuitem = document.createXULElement('menuitem');
            menuitem.id = 'context-to-bottom';
            menuitem.classList.add('menuitem-iconic');
            menuitem.setAttribute('tooltiptext' , 'Zum Seitenende springen');
            menuitem.style.setProperty('--menuitem-icon', 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + down) + '")');
            menuitem.addEventListener('click', (event) => {
                if (event.button == 0) {
                    const
                            win = Services.wm.getMostRecentWindow("navigator:browser"),
                            browser = win.gBrowser.selectedBrowser,
                            scrollScript = `content.scrollTo ({ top: 100000, left: 0, behavior: "smooth"});`;
                            browser.messageManager.loadFrameScript ( `data:,${encodeURIComponent(scrollScript)}`, false );
                }
            });
    
        let refItem = document.getElementById('context-reload');
        refItem.parentNode.insertBefore(menuitem, refItem);
         
        })(); 
    Alles anzeigen
  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 17. Juni 2026 um 18:52

    2002Andreas Danke.
    Du glaubst gar nicht wie oft ich an dem Skript gebastelt habe!

    Hier mal einen Tipp an alle, die auch mithilfe von KI "arbeiten".
    Teilt den Dingern mit, dass sie auch auf Searchfox suchen sollen:!:
    Es nutzt nix, wenn die alles was mit JS zu tun hat abgrasen, wenn sie
    FFspezifisches nicht berücksichtigen. FuchsFan

  • extensionsUpdateChecker.uc.js no longer works

    • Mira_Belle
    • 17. Juni 2026 um 17:18

    Yes:!:

    Please test it.

    JavaScript
    // Atomatk-Addons-UpDate-Check.uc.js
    // Das Script führt automatisch einen UpDate-Check aus und dies in einem neuen Tab anzeigt.
    // Auch wird ein Button erstellt, der einen UpDate-Check ausführt und dies in einem neuen Tab anzeigt.
    
    // Source file https://www.camp-firefox.de/forum/thema/140656/?postID=1290593#post1290593
    
    /* ----------------------------------------------------------------------------------- */
    /* Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen */
    /* %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons */
    /* ----------------------------------------------------------------------------------- */
    
    (function() {
    "use strict";
    
        // Nur in einem normalen Browserfenster weiterarbeiten.
        if (!window.gBrowser) return;
    
        const
        // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                 id = 'addons-update-button', // Id des Buttons
               link = 'about:addons', // Linkziel des Buttons
              label = 'Add-ons Update', // Bezeichnung des Buttons
        tooltiptext = 'Add-ons aktualisieren',
        // Icon-------------------------------------------------------
               icon = 'sync.svg', // [Name.Dateiendung] des Symbols
             colour = '#8bff0f', // Farbe für das SVG-Icon setzen
           iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
        // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
         curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
    
        // SVG-Icons können CSS-Farbangaben übernehmen; das schaltet Firefox dafür frei.
    	if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
    		Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
    	}
    
        const
        // ■■ START ScriptConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        STARTUP_DELAY_MS = 2500, // Verzögerung nach Firefox-Start, damit die Oberfläche fertig geladen ist.
             MAX_WAIT_MS = 12000, // Maximale Wartezeit darauf, dass about:addons vollständig geladen ist.
                 POLL_MS = 250; // Intervall für wiederholte Prüfungen.
        let
             startupDone = false, // Merkt sich, ob der Startvorgang schon einmal ausgeführt wurde.
                    busy = false; // Verhindert parallele Abläufe.
        // ■■ END ScriptConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
        //BUTTON
    	try {
          CustomizableUI.createWidget({
             id: id,
             defaultArea: CustomizableUI.AREA_NAVBAR,
             label: label,
             tooltiptext: tooltiptext,
    
             onCreated: (button) => {
                button.style.MozContextProperties = 'fill, stroke, fill-opacity';
                button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
                button.style.minWidth = 'fit-content';
              //  button.style.color = '#ffe10f'; // Farbe für das SVG-Icon setzen
                button.style.color = colour;
             }
          });
    	} catch(e) {};
        // Liefert das aktuellste Browserfenster.
        function getBrowserWindow() {
            return Services.wm.getMostRecentWindow("navigator:browser");
        }
        // Öffnet about:addons in einem neuen Tab.
        function openAddonsTab(win) {
            if (!win) return false;
            try {
                win.openTrustedLinkIn(link, "tab");
            return true;
            } catch (e) {
                return false;
            }
        }
    
        // Schließt den Tab nach 30s, wenn keine Updates gefunden wurden.
        function checkAndCloseIfNoUpdates(doc, win) {
            const messageEl = doc.getElementById('updates-message');
            if (messageEl && messageEl.getAttribute('state') === 'none-found') {
                win.setTimeout(() => {
                    try {
                        win.gBrowser.removeCurrentTab();
                    } catch (e) {}
                }, 2000); // 30 Sekunden 30000
            }
        }
    
        // Prüft, ob die Update-Elemente in about:addons schon vorhanden sind.
        function runOriginalAddonActions(doc, win) {
            try {
                const
                    options = doc.querySelector("addon-page-options"),
                    checkItem = doc.querySelector('panel-item[action="check-for-updates"]');
                // Update-Prüfung auslösen.
                if (options && checkItem) {
                    checkItem.click();
                }
                // Kurz warten, damit Firefox die Ergebnisse sichtbar aufbauen kann.
    
                win.setTimeout(function() {
                    try {
                        const categories = doc.getElementById("categories");
                        if (categories) {
                            const availableBtn = categories.querySelector('button[viewid="addons://updates/available"]');
                            if (availableBtn) availableBtn.click();
                            // 500ms warten, dann einmal prüfen
                            win.setTimeout(() => checkAndCloseIfNoUpdates(doc, win), 500);
                        }
                    } catch (e) {}
                    busy = false;
                }, 500);
    
                /*
                win.setTimeout(function() {
                    try {
                        const categories = doc.getElementById("categories");
                        if (categories) {
                            const availableBtn = categories.querySelector('button[viewid="addons://updates/available"]');
                            if (availableBtn) availableBtn.click();
                        }
                    } catch (e) {}
                    busy = false;
                }, 500); // Timeout auf 500ms erhöht für zuverlässigen Wechsel
                */
                } catch (e) {
                busy = false;
            }
        }
        /*
        function runOriginalAddonActions(doc, win) {
            try {
                const
                    options = doc.querySelector("addon-page-options"), // Bereich für die Add-ons-Optionen.
                    checkItem = doc.querySelector('panel-item[action="check-for-updates"]'), // Menüpunkt "Check for Updates".
                    recentItem = doc.querySelector('panel-item[action="view-recent-updates"]'); // Menüpunkt "View Recent Updates".
    
                // Erst die Ansicht der letzten Updates öffnen.
                if (options && recentItem) {
                    recentItem.click();
                }
    
                // Danach die Update-Prüfung auslösen.
                if (options && checkItem) {
                    checkItem.click();
                }
    
                // Kurz warten, damit Firefox die Ergebnisse sichtbar aufbauen kann.
                win.setTimeout(function() {
                    try {
                        const categories = doc.getElementById("categories");
    
                        if (categories) {
                        const
                            // Kategorie "recent updates" anklicken.
                            recentBtn = categories.querySelector('button[viewid="addons://updates/recent"]'),
                            // Kategorie "available updates" anklicken.
                            availableBtn = categories.querySelector('button[viewid="addons://updates/available"]');
    
                            if (recentBtn) recentBtn.click();
                            if (availableBtn) availableBtn.click();
                        }
                    } catch (e) {}
    
                    // Freigabe für neue Aktionen.
                    busy = false;
                }, 50);   // hier stand vorher 1500
            } catch (e) {
            busy = false;
            }
        }
        */
        // Wartet, bis about:addons vollständig geladen ist.
        function waitForAboutAddons(win, fromStartup) {
            const started = Date.now();
    
            function tick() {
                let doc = null;
                try {
                doc = win.gBrowser.selectedBrowser.contentDocument;
                } catch (e) {}
                // Nur weitermachen, wenn about:addons wirklich geöffnet ist.
                if (doc && doc.URL === "about:addons") {
                    try {
                        const
                        // Prüfen, ob die erwarteten UI-Elemente schon vorhanden sind.
                        options = doc.querySelector("addon-page-options"),
                        checkItem = doc.querySelector('panel-item[action="check-for-updates"]'),
                        recentItem = doc.querySelector('panel-item[action="view-recent-updates"]');
    
                        // Wenn alles da ist, die eigentliche Update-Logik starten.
                        if (options && checkItem && recentItem) {
                            runOriginalAddonActions(doc, win);
                            return;
                        }
                    } catch (e) {}
                }
                // Weiter warten, solange das Zeitlimit nicht überschritten ist.
                if (Date.now() - started < MAX_WAIT_MS) {
                    win.setTimeout(tick, POLL_MS);
                } else {
                    // Wenn die Zeit abgelaufen ist, wieder freigeben.
                    busy = false;
    
                    // Beim Start nicht weiter forcieren.
                    if (!fromStartup) {
                        openAddonsTab(win);
                    }
                }
            }
            tick();
        }
        // Gemeinsame Hauptfunktion für Start und Button.
        function runCheck(fromStartup) {
            if (busy) return;
            busy = true;
            const win = getBrowserWindow();
            if (!win) { 
                busy = false;
                return;
            }
            // Erst Tab öffnen.
            if (!openAddonsTab(win)) { 
                busy = false;
                return;
            }
            // Danach auf fertige Seite warten.
            waitForAboutAddons(win, fromStartup);
        }
        // Startprüfung nur einmal ausführen.
        function runStartupCheck() {
            if (startupDone) return;
            startupDone = true;
            const win = getBrowserWindow();
            if (!win) return;
            // Kleine Verzögerung, damit Firefox vollständig bereit ist.
            win.setTimeout(function() { 
                runCheck(true);
            }, STARTUP_DELAY_MS);
        }
        // Observer für den Zeitpunkt, an dem Firefox die Fenster wiederhergestellt hat.
        function onWindowsRestored(subject, topic) {
            if (topic !== "sessionstore-windows-restored") return;
            try {
                Services.obs.removeObserver(onWindowsRestored, "sessionstore-windows-restored");
            } catch (e) {}
            runStartupCheck();
        }
        // Observer registrieren.
        try {
            Services.obs.addObserver(onWindowsRestored, "sessionstore-windows-restored");
        } catch (e) {
            // Falls der Observer nicht verfügbar ist, per Timer versuchen.
            window.setTimeout(runStartupCheck, STARTUP_DELAY_MS);
        }
        // Button-Klick-Handler einrichten.
        (function click_button() {
            const button = document.getElementById(id);
            if (button) {
                button.addEventListener("click", (event) => {
                    // Nur linker Mausklick.
                    if (event.button !== 0) return;
                    // Das richtige Browserfenster ermitteln.
                    const win = event.target.documentGlobal || event.target.ownerGlobal;
                    // Keine parallelen Läufe.
                    if (busy) return;
                    busy = true;
                    // Verhalten wie beim Start: Tab öffnen und dann prüfen.
                    if (!openAddonsTab(win)) { 
                        busy = false;
                        return;
                    }
                    waitForAboutAddons(win, false);
                });
            } else {
            // Wenn der Button noch nicht existiert, erneut probieren.
            setTimeout(click_button, 100);
            }
        })();
    
    })();
    Alles anzeigen

    Wenn Du Anpassungen wünschst,
    z.B, ein integriertes Symbol für den Button,
    oder was auch immer, lass es mich wissen.

    If you'd like any customizations,
    such as an integrated icon for the button,
    or anything else, just let me know.

  • Quicklink.uc.js funktioniert nicht mehr

    • Mira_Belle
    • 17. Juni 2026 um 15:29

    Das mit dem Skript hat mir dennoch keine Ruhe gelassen:!:

    Und da ich ja eigen bin, habe ich das ganze Skript umgebaut.
    Mir gefällt das mit einem Bereich für Anwenderkonfigurationen einfach besser.
    Auch weil da niemand mehr im eigentlichen Code "rumfummeln" muss.

    Ach, die ID musste ich ändern, da ich schon einen anderen Button mit dieser habe.

    JavaScript
    // QuickLinkButton.uc.js
    // Das Script erstellt einen Button, der bei Linksklick, mehrere Tabs 
    // und bei Rechtsklich ein neues Fenster öffnet mit verschiedenen Webseiten.
    
    // Source file https://www.camp-firefox.de/forum/thema/140675/?postID=1290591#post1290591
    
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    //angepasst für Fx 152
    
    (function() {
    
        if (!window.gBrowser){
            return;
        }
    
        let newWindow = null;
        const
        // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                 id = 'link-button_2', // Id des Buttons
           Sinistra = [
                      'https://www.ardmediathek.de/serie/morden-im-norden/staffel-12/Y3JpZDovL25kci5kZS80OTU1/12',
                      'https://www.ardmediathek.de/serie/mittendrin-flughafen-frankfurt/staffel-16/Y3JpZDovL2hyLW9ubGluZS8zODIyMDAzMw/16',
                      'https://www.zdf.de/serien/soko-koeln',
                      'https://www.daserste.de/unterhaltung/quiz-show/wer-weiss-denn-sowas/videos/index.html',
                    ],
             Dextra = [
                      'https://www.hr-fernsehen.de/tv-programm/index.html',
                      'https://www.swrfernsehen.de/tv-programm/index.html',
                      'https://www.wdr.de/programmvorschau/wdrfernsehen/uebersicht/index.html',
                    ],
              label = 'Quicklink', // Bezeichnung des Buttons
        tooltiptext = 'Quicklink',
        // Icon-------------------------------------------------------
               icon = 'pug.svg',  // [Name.Dateiendung] des Symbols
             colour = '#e0e0e0',  // Farbe für das SVG-Icon setzen
           iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
         curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); // Pfad zum Profil
        // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
        // Erlaubt korrekte .svg Icons Darstellung in allen UI Bereichen
    	if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
    		Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
    	}
       //BUTTON
    	try {
          CustomizableUI.createWidget({
             id: id,
             defaultArea: CustomizableUI.AREA_NAVBAR,
             label: label,
             tooltiptext: tooltiptext,
    
             onCreated: (button) => {
                button.style.MozContextProperties = 'fill, stroke, fill-opacity';
                button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
                button.style.minWidth = 'fit-content';
                button.style.color = colour;
             }
          });
    	} catch(e) {};
    
        (function click_button() {
            const button = document.getElementById(id);
            if (button) {
                button.addEventListener('click', function(event) {
                    if (event.button == 0) {
                        newWindow = null;
                        Sinistra.forEach(url => {
                            event.target.documentGlobal.openTrustedLinkIn(url, "tab");
                        });
                    }
                    else if (event.button == 2) {
                        event.preventDefault();
                        newWindow = OpenBrowserWindow();
                        setTimeout(() => {
                            Dextra.forEach((url, index) => {
                                newWindow.openTrustedLinkIn(url, index === 0 ? "current" : "tab");
                            });
                        }, 500);
                    }
                });
          } else {
             setTimeout(click_button, 100);
          }
        })();
    
    })();
    Alles anzeigen
  • Quicklink.uc.js funktioniert nicht mehr

    • Mira_Belle
    • 16. Juni 2026 um 22:37

    2002Andreas Entschuldige, dass ich Dir da nicht wirklich habe weiter helfen können.

    Um so mehr freut es mich, dass Du selbst eine Lösung gefunden hast.

  • Quicklink.uc.js funktioniert nicht mehr

    • Mira_Belle
    • 16. Juni 2026 um 17:47

    Muss noch mal nach haken!

    Die neuen Tabs sollen sich bei Rechts, so wie bei Linksklick in einem neuen Fenster öffnen?
    Oder nur die neuen Tabs bei Rechtsklick?
    Oder nur bei Linksklick?

  • Quicklink.uc.js funktioniert nicht mehr

    • Mira_Belle
    • 16. Juni 2026 um 17:35

    Funktioniert DER so, wie Du Dir das vorstellst?

    JavaScript
    (function() {
    
      if (!window.gBrowser)
    	return;
    
      const
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                id = 'link-button', // Id des Buttons
             label = 'Quicklink', // Bezeichnung des Buttons
       tooltiptext = '',
      // Icon-------------------------------------------------------
              icon = 'chronik7.png',  // [Name.Dateiendung] des Symbols
          iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
        curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); // Pfad zum Profil
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
      // Erlaubt korrekte .svg Icons Darstellung in allen UI Bereichen
    	if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
    		Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
    	}
      //BUTTON
      try {
        CustomizableUI.createWidget({
          id: id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: label,
          tooltiptext: tooltiptext,
    
          onCreated: (button) => {
            // Optik
            button.style.MozContextProperties = 'fill, stroke, fill-opacity';
            button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
            button.style.minWidth = 'fit-content';
            button.style.color = colour;
          }
        });
    	} catch(e) {};
    
      //click
      (function click_button() {
        const button = document.getElementById(id);
        if (button) {
          button.addEventListener('click', event => {
            if (event.button === 0) {
              openTrustedLinkIn('https://www.zdf.de/serien/soko-koeln',"tab");
              openTrustedLinkIn('https://www.daserste.de/unterhaltung/quiz-show/wer-weiss-denn-sowas/videos/index.html',"tab");
            }
            else if (event.button == 2) {
              openTrustedLinkIn('https://www.hr-fernsehen.de/tv-programm/index.html',"current");        
              openTrustedLinkIn('https://www.swrfernsehen.de/tv-programm/index.html',"tab");
              openTrustedLinkIn('https://www.zdf.de/reportagen/abenteuer-auswandern-104',"tab");
            }
          });
        } else {
          setTimeout(click_button, 100);
        }
      })();
    })();
    Alles anzeigen
  • Blaue Umrandung des Adressfeldes

    • Mira_Belle
    • 16. Juni 2026 um 17:16
    Zitat von 2002Andreas

    Teste bitte wieder:

    CSS
    #urlbar {
    	--toolbar-field-border-color-focus: red !important;
    }

    :thumbup:

    Das war es! Danke.

  • Blaue Umrandung des Adressfeldes

    • Mira_Belle
    • 16. Juni 2026 um 15:30

    Kann das mit diesem Eintrag etwas zu tun haben?

    CSS
    :focus-visible {
     outline: initial;
    }

    Da ist dann ein kleines Schloss davor.



  • Blaue Umrandung des Adressfeldes

    • Mira_Belle
    • 16. Juni 2026 um 15:19

    Danke Andreas, aber das ist es auch nicht!

    Über diesen Selektor bin ich auch schon gestolpert, aber keiner von denen ich dachte, dass es der sein könnte,
    hat eine Veränderung gebracht, wenn ich ihn z.B. in rot "eingestellt" habe.

    Was mich ja total irritiert, ist der Umstand, wie die Voraussetzungen sein müssen, dass dieser blaue Rand zu sehen ist.

    Firefox muss im Vordergrund sein und der Cursor muss im Adressfeld stehen.
    Öffne ich die Browserwerkzeuge, ist ja dessen Fenster im Vordergrund und der blaue Rand dann nicht mehr Vorhanden!
    Sobald ich aber den Fuchs wieder in den Vordergrund hole, ist dieser blöde Rand wieder da.

    Ach, und mit einem Theme hat das nicht zu tun, mehrere ausprobiert.

  • Blaue Umrandung des Adressfeldes

    • Mira_Belle
    • 16. Juni 2026 um 10:15

    Habe eine blaue Umrandung um das Adressfeld,
    aber nur, wenn der Cursor sich darinnen befindet.
    Weis nicht wie ich das beschreiben soll.

    Wenn ich nun mit den Browserwerkzeugen versuche, den Selektor dafür zu finden,
    ist die Umrandung leider nicht sichtbar!
    Das Fenster muss aktiv sein. Toll.

    Kann mir da jemand helfen? Ich will das weg haben.
    Entweder transparent oder ganz weg (none, hidden oder was auch immer)
    transparent, wäre natürlich besser, da ich damit ja mehr anstellen kann.

Unterstütze uns!

Jährlich (2026)

71,6 %

71,6% (554,79 von 775 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon