einen andere Fox getestet
Neuer Test.
Jetzt öffnet sich ein neuer Tab, sieht dann so aus:
Ich hatte mal diesen Wert verändert:
K.A. was genau der macht![]()
einen andere Fox getestet
Neuer Test.
Jetzt öffnet sich ein neuer Tab, sieht dann so aus:
Ich hatte mal diesen Wert verändert:
K.A. was genau der macht![]()
K.A. was genau der macht
Die Zeile verzögert die Ausführung der Methode checkForUpdates um zwei Sekunden (2.000 Millisekunden). In Beitrag #56 waren es zehn Sekunden.
verzögert die Ausführung der Methode
Danke für die Aufklärung![]()
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.
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.
// 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
Funktioniert so weit! Habe auch die Zeitschleife etwas kürzer gemacht!
Updates werden aber nur für aktive Addons angezeigt.
Danke für den Test! Das war erst einmal ein Versuch, werde aber weiter daran arbeiten. Nur bei aktiven Button, dass muss ich prüfen. Eine Erweiterung dieses Scriptes brachte nur die inaktiven Addon, da gibt es noch Nachholebedarf.
FuchsFan Und hier die Lösung.
// 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
Und hier die Lösung.
Danke, werde ich testen. Ja funktioniert, schön wäre natürlich, wenn der Tab im Vordergrund öffnet, das habe ich bei meiner Lösung realisiert.
Und hier meine Lösung:
// AddonSuche4.uc.js
// Firefox 152+
(async function () {
if (location.href !== "chrome://browser/content/browser.xhtml")
return;
var AddonManager = ChromeUtils.importESModule(
"resource://gre/modules/AddonManager.sys.mjs"
).AddonManager;
function findUpdatesForAddon(addon) {
return new Promise(function (resolve) {
var hasUpdate = false;
addon.findUpdates({
onUpdateAvailable: function (aAddon, install) {
hasUpdate = true;
},
onNoUpdateAvailable: function () {
},
onUpdateFinished: function () {
resolve(hasUpdate);
}
}, AddonManager.UPDATE_WHEN_USER_REQUESTED);
});
}
async function checkForUpdates() {
await AddonManager.readyPromise;
var updates = [];
var addons = await AddonManager.getAllAddons();
for (var i = 0; i < addons.length; i++) {
var addon = addons[i];
if (addon.type !== "extension")
continue;
if (!(addon.permissions & AddonManager.PERM_CAN_UPGRADE))
continue;
var hasUpdate = await findUpdatesForAddon(addon);
if (hasUpdate) {
updates.push({
id: addon.id,
name: addon.name,
disabled: !!(addon.userDisabled || addon.appDisabled)
});
}
}
if (!updates.length)
return;
console.log(
"Gefundene Add-on-Updates:",
updates.map(function (u) {
return u.name + (u.disabled ? " (deaktiviert)" : "");
})
);
var win = Services.wm.getMostRecentWindow("navigator:browser");
if (!win || !win.gBrowser)
return;
var tab = win.gBrowser.addTrustedTab("about:addons");
// Tab in den Vordergrund holen
win.gBrowser.selectedTab = tab;
win.focus();
// Erst den normalen about:addons-Zustand laden, dann auf Updates umschalten.
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
Verdammt, erstelle doch nicht immer komplett neuen Code.
Korrigiere doch den Alten. Der ist doch gut![]()
Da fehlte nur eine Zeile! => win.gBrowser.selectedTab = tab;
Hier Dein komplettes, altes Skript:
// 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");
win.gBrowser.selectedTab = tab;
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
Nimm mir meinen Kraftausdruck bitte nicht krumm,
aber ich finde, wenn bei jeder kleinsten Anpassung jedes Mal ein komplett anderer Code gepostet wird,
stiftet das nur durcheinander.
Auch die Änderung, dass alle Updates aller Addons angezeigt werden, war ja recht banal und einfach.
Dein (altes) Skript ist klasse und um einiges leichter zu warten, als mein Monstrum.
Choose whichever one suits you best.
If I understood you correctly and the "about:addons" page sometimes freezes,
I fixed the script for that.
Mira_Belle
Thanks for the test! That was just a first attempt, but I'll continue working on it. I need to check if it only works with active buttons. Extending this script only affected inactive add-ons; there's still room for improvement there.
I just tested your script. After the first try, It seemed to work as we had all hoped. After reboot, the about:addons tab opened to the main page (not the "Available Updates" page), but the update notification was there.
Ich habe dein Skript gerade getestet. Nach dem ersten Versuch schien es so zu funktionieren, wie wir es uns alle erhofft hatten. Nach dem Neustart öffnete sich die Registerkarte „about:addons“ auf der Hauptseite (nicht auf der Seite „Verfügbare Updates“), aber die Update-Benachrichtigung war vorhanden.
That result would certainly be just fine with me. However, after closing about:addons and repeating the test, the browser now opens to the active tab (this thread), with about:addons to the right
Dieses Ergebnis wäre für mich sicherlich völlig in Ordnung. Nachdem ich jedoch „about:addons“ geschlossen und den Test wiederholt habe, öffnet sich der Browser nun auf dem aktiven Tab (diesem Thread), wobei „about:addons“ rechts davon angezeigt wird.
On my system, the green indicates an active tab, even though it was closed before the reboot. When selecting that tab, it shows that the addon that requires updating has been detected.
However, in my case (I don't know i this happens to anybody else), when I tried it with two addons, after reboot, only one of the two tabs were indicated on that "Available Updates" badge. I had to "Check for Update" to have the second addon recognized.
Finally, since my original post, during this ongoing test process, if I recall correctly, Firefox has crashed three times, including today, during reboot. I'm not saying the script(s) caused it. I'm just reporting my observation. I copied the details of the crash report if anyone wants to see it.
Auf meinem System zeigt die grüne Markierung an, dass ein Tab aktiv ist, obwohl er vor dem Neustart geschlossen war. Wenn ich diesen Tab auswähle, wird angezeigt, dass das Add-on, das aktualisiert werden muss, erkannt wurde.
However, in my case (I don't know i this happens to anybody else), when I tried it with two addons, after reboot, only one of the two tabs were indicated on that "Available Updates" badge. I had to "Check for Update" to have the second addon recognized.
Seit meinem ursprünglichen Beitrag ist Firefox während dieses laufenden Testprozesses – wenn ich mich recht erinnere – dreimal abgestürzt, darunter auch heute beim Neustart. Ich behaupte nicht, dass das Skript bzw. die Skripte dafür verantwortlich waren. Ich gebe lediglich meine Beobachtung wieder. Ich habe die Details des Absturzberichts kopiert, falls jemand sie einsehen möchte.
Nimm mir meinen Kraftausdruck bitte nicht krumm,
Das wäre ja schlimm.![]()
aber ich finde, wenn bei jeder kleinsten Anpassung jedes Mal ein komplett anderer Code gepostet wird,
stiftet das nur durcheinander.
Da stimme ich dir zu, aber du kennst das ja auch, wenn man nach Lösungen sucht, und sie funktionieren letztendlich, dann ist man erst einmal "glücklich". Der erste Code war ja auch gut, bloß wenn KI dann alles wieder ummodelt damit es funkt, es ist nicht so einfach. Aber egal, dann einigen wir uns auf das Script aus #69. Einverstanden?
juzzlukin Du hast, wenn ich das alles richtig mitbekomme, eine recht eigenwillige Installation!
Ich würde Dir echt anraten
1. Strickt die Betriebssysteme voneinander zu trennen.
2. Den Firefox neu zu installieren, backup nicht vergessen, und dann erst das Profil neu aufzubauen.
Und weil hier schon etwas durcheinander herrscht, gib doch bitte z.B. den Link zum Beitrag an,
welches Skript Du gerade in Verwendung hattest.
Aber egal, dann einigen wir uns auf das Script aus #69. Einverstanden?
Wir müssen uns ja nicht einigen, aber man kann auch der doofen KI in den Arsch treten,
damit sie eben nicht ständig irgendetwas Neues aus dem Hut zaubert.
Und manchmal hilft Fluchen auch ![]()
Magst Du mal meinen Prompt sehen?
aber man kann auch der doofen KI in den Arsch treten
Ich traue mich immer nicht so heftig zu reagieren, sonst streikt sie womöglich noch. ![]()
Ich traue mich immer nicht so heftig zu reagieren, sonst streikt sie womöglich noch.
Hahaha. Du glaubst gar nicht, was ich Fluchen kann und wie ich manchmal das Teil beschimpfe.
Aber sie macht dann, was ich will.
juzzlukin If I understand correctly, you have a rather unique installation!
I would really advise you to do this
1. Keep the operating systems strictly separate from each other.
2. Reinstall Firefox, don't forget to back up your data, and then rebuild your profile.
Are you referring to my other post? They are separate. There is is no relationship.
Beziehst du dich auf meinen anderen Beitrag? Das sind zwei verschiedene Dinge. Es gibt da keinen Zusammenhang.
And here's my solution:
JavaScript // AddonSuche4.uc.js
Thus far, my latest test demonstrates, at least in my system, That AddonSuche4.uc.js a worthy successor to the xiaoxiaoflood script.
It only open about:addons when there is an available update. When multiple updates are available, it recognizes them.
Thanks for all the hard work!! 😄
Many thanks to you as well for the final product!
Bisher zeigen meine jüngsten Tests, zumindest auf meinem System, dass „AddonSuche4.uc.js“ ein würdiger Nachfolger des „xiaoxiaoflood“-Skripts ist.
„about:addons“ wird nur geöffnet, wenn ein Update verfügbar ist. Sind mehrere Updates verfügbar, werden diese erkannt.
Vielen Dank für die ganze harte Arbeit!! 😄
Auch dir vielen Dank für das Endergebnis!
juzzlukin Das Skript, AddonSuche4.uc.js, kannst Du nehmen, es ist & war aber nur ein Test,
das darauf folgende (#69) Skript, ist das bessere und finale Skript.
Einfacherer Code und somit besser wartbar.
Darauf hatten FuchsFan und ich uns geeinigt.
Probiere es doch bitte aus und teile uns mit, ob es das auch tut.
Here is your complete, old script:
JavaScript // addonUpdateNotifier.uc.js
The following script ( #69 ) is the better and final script.
Yes. I did not realize. It was one of those "got lost in translation" things when you said "old" script.
Works great. Thanks again.
Ja. Das war mir nicht klar. Das war so ein Fall von „Verloren in der Übersetzung“, als du von einem „alten“ Skript gesprochen hast.
Funktioniert super. Nochmals vielen Dank.
Nur zum Verständnis: das hier besprochene Skript in der aktuellsten Version von Mira_Belle hat eine ähnliche Funktion (prüfen ob Updates für Erweiterungen vorliegen) wie dieses Skript welches 2002Andreas in einem anderen Thread gepostet hat und was BrokenHeart stammt, richtig?
Zweiteres prüfe nur bei Klick auf das Icon, also manuell, während das hier besprochene aktiv nach Updates sucht?!