Ich schreibe jetzt im Fehlerbehebungsmodus.
Evtl. funkt dir ein Skript/Erweiterung oder CSS-Code dazwischen
Kann man im Fehlerbehebungsmodus die Erweiterungen einzeln wieder aktivieren? Ich weiß jedenfalls nicht, wie. Oder mit einem anderen Trick?
Ich schreibe jetzt im Fehlerbehebungsmodus.
Evtl. funkt dir ein Skript/Erweiterung oder CSS-Code dazwischen
Kann man im Fehlerbehebungsmodus die Erweiterungen einzeln wieder aktivieren? Ich weiß jedenfalls nicht, wie. Oder mit einem anderen Trick?
Hallo,
bitte teile die Links der letzten Absturzberichte, die du über about:crashes erreichst. Ich nehme mal an, dass du gerade wieder einen Firefox 140 am Laufen hast. Ansonsten siehe folgenden Artikel, um an die IDs zu kommen, wenn du Firefox nicht starten kannst:
Der 140 startet normal, stürzt nach einem Neustart aber auch ab. Ich schreibe jetzt im Fehlerbehebungsmodus.
Hier zwei IDs der diversen Abstürze:
Nachdem Firefox automatisch auf v141 upgedatet hat, stürzt er nach dem Neustart ab.
Um dem nächsten automatischen Update vorzubeugen, habe ich die entsprechende Einstellung geändert. Währenddessen lief schon wieder der Download der neuen Version. Ich bestätige die Frage, ob der Download abgebrochen werden soll. Nach dem nächsten Neustart stürzt Firefox wieder ab, obwohl ja noch nichts geändert sein sollte. Wieder hilft nur die obige Prozedur.
Weiß jemand Rat?
Habe da in der Beschreibung aber nichts zum Ausrufezeichen-Badges finden können.
Wird hier auch mal angezeigt, dann wieder nicht usw.Ich habe mal nachgefragt, bisher noch keine endgültige Antwort.
Die übersetzte Antwort des Entwicklers:
ZitatDerzeit wird update_badge() nur dann aufgerufen, wenn wir auf das Symbol klicken oder die Voreinstellung über unser Menü ändern. Der Status des Badges entspricht also nicht immer dem tatsächlichen Wert der prefs.
Das muss verbessert werden (in Zukunft, nicht sicher, wann ... 🤦♂️).
Habe da in der Beschreibung aber nichts zum Ausrufezeichen-Badges finden können.
Wird hier auch mal angezeigt, dann wieder nicht usw.
Ich habe mal nachgefragt, bisher noch keine endgültige Antwort.
die Bedeutung des Ausrufezeichen-Badges
Reine optische Sache als Warnung bei Änderungen.
Kannst du so deaktivieren:
Was meinst du mit "als Warnung bei Änderungen"? Wenn ich alles auf Standard setze, bleibt das Ausrufezeichen.
Manchmal aber verschwindet es, ohne dass ich den Zusammenhang erkennen kann. Im obigen Beitrag dachte ich, es liege an dem eingefügten Code, das scheint aber nicht der Fall zu sein.
Dass ich das auskommentieren kann, ist mir schon klar. Es gibt im Skript aber die Funktionen add_warnbadge und rm_warnbadge, die steuern, ob der rote Hintergrund angezeigt wird. Ich vermute, dass das Ausrufezeichen im Symbol versteckt ist und dadurch sichtbar wird oder nicht. Das kann ich gerade nicht weiter testen. Ich verstehe aber nicht, wann diese Funktionen angesteuert werden.
Hallo zusammen.
Hallo bege
Danke für Deine Änderung.
Habe ich alles so übernommen und hoch geladen.https://github.com/Endor8/userChr…nfig_menu.uc.js
Hier die Übersicht der Änderungen:
https://github.com/Endor8/userChr…b6d7c9f0ec05640
Mfg.
Endor
Danke!
Wäre schön, wenn noch jemand die Bedeutung des Ausrufezeichen-Badges auf dem Button herausfindet.
Hallo zusammen.
Es gibt mal wieder ein neues Script.
aboutconfig_menu.uc.js...
Das Script ist wie immer auf Github bei mir zu finden:
https://github.com/Endor8/userChr…nfig_menu.uc.js
Mfg.
Endor
Genial, Dankeschön! Funktioniert, ich bekomme aber diese Fehlermeldung in der Konsole
Zitat13:58:45.307 Uncaught ReferenceError: CustomizableUI is not defined
<anonymous> file:///C:/Users/bege/AppData/Roaming/Mozilla/Firefox/Profiles/487kit50.Quantum/chrome/JS/aboutconfig_menu_orig.uc.js:250
<anonymous> file:///C:/Users/bege/AppData/Roaming/Mozilla/Firefox/Profiles/487kit50.Quantum/chrome/JS/aboutconfig_menu_orig.uc.js:537
loadScript file:///C:/Program Files/Mozilla Firefox/userChromeJS/utilities.js:114
aboutconfig_menu_orig.uc.js:250:5
Edit: damit (wurde schon an anderer Stelle diskutiert) vor CustomizableUI.createWidget erscheint der Fehler nicht mehr. Dann verschwindet aber auch das rote Ausrufezeichen auf dem Button. Das ist nicht Teil des Symbols list-style-image. Die Bedeutung konnte ich bisher nicht herausfinden.
Ich habe unter CSP noch das hinzugefügt
{
name: "🔏 eval erlauben - verbieten",
type: prefs.PREF_BOOL,
pref: "security.allow_unsafe_dangerous_privileged_evil_eval",
possibleVals: [
{ val: false },
{ name: "true ⚠️", val: true , sign: '‼️' },
]
},
und die Einrückungen bei den prefs vereinheitlicht. Sieht dann so aus:
/* Firefox userChrome script
* Shortcut menu to modify about:config entries
* Tested on Firefox 139+
* Author: garywill (https://garywill.github.io)
*
*/
// ==UserScript==
// @include main
// @onlyonce
// ==/UserScript==
console.log("aboutconfig_menu.uc.js");
(() => {
const prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs")
const sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
// ---------------------------------------------------------------------------------------
const button_label = "about:config shortcut menu";
const cssuri_icon = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
toolbarbutton#aboutconfig-button .toolbarbutton-icon {
list-style-image: url("data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiPjxwYXRoIGZpbGw9ImNvbnRleHQtZmlsbCIgZD0iTTEzLjkgOS44MWExLjIzIDEuMjMgMCAwIDAgMC0uMTd2LS4wOGE1LjY3IDUuNjcgMCAwIDAtMi40LTMuMzYgMS4xNyAxLjE3IDAgMCAxLS41Ni0uOTVWM2ExIDEgMCAwIDAtMS0xSDYuMDZhMSAxIDAgMCAwLTEgMXYyLjI1YTEuMTcgMS4xNyAwIDAgMS0uNTYgMSA1LjY2IDUuNjYgMCAwIDAtMi4zNSAzLjMzdi4xMmEuNTMuNTMgMCAwIDAgMCAuMTEgNS4zNSA1LjM1IDAgMCAwLS4xMSAxIDUuNjUgNS42NSAwIDAgMCAzLjI0IDUuMDkgMSAxIDAgMCAwIC40NC4xaDQuNTdhMSAxIDAgMCAwIC40NC0uMUE1LjY1IDUuNjUgMCAwIDAgMTQgMTAuODNhNS4zIDUuMyAwIDAgMC0uMS0xLjAyem0tOC4yNy0yYTMuMTggMy4xOCAwIDAgMCAxLjQzLTIuNlY0aDEuODh2MS4yNWEzLjE4IDMuMTggMCAwIDAgMS40MyAyLjYgMy42OCAzLjY4IDAgMCAxIDEuNTQgMi4yNHYuMjJhMi44MiAyLjgyIDAgMCAxLTMuNjgtLjU5QTMuNDggMy40OCAwIDAgMCA0LjU2IDlhMy43NiAzLjc2IDAgMCAxIDEuMDctMS4xNXoiPjwvcGF0aD48L3N2Zz4=");
}
toolbarbutton#aboutconfig-button .toolbarbutton-badge {
background-color: #009f00;
visibility: hidden;
}
`), null, null);
const cssuri_warnbadge = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
toolbarbutton#aboutconfig-button .toolbarbutton-badge {
background-color: red ;
visibility: unset;
}
`), null, null);
sss.loadAndRegisterSheet(cssuri_icon, sss.USER_SHEET);
var prefItems = [
{
name: "📼 Kein automatisches Popup beim Download",
type: prefs.PREF_BOOL,
pref: "browser.download.alwaysOpenPanel",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "🎞️ Beim Schließen vom letzten Tab den Browser nicht schließen",
type: prefs.PREF_BOOL,
pref: "browser.tabs.closeWindowWithLastTab",
possibleVals: [
{ val: false },
{ val: true },
]
},
"seperator",
{
name: "🔎 Suche aus Suchleiste im neuen Tab öffnen",
type: prefs.PREF_BOOL,
pref: "browser.search.openintab",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "📖 Lesezeichen im neuen Tab öffnen",
type: prefs.PREF_BOOL,
pref: "browser.tabs.loadBookmarksInTabs",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "📖 Link aus Adressleiste im neuen Tab öffnen",
type: prefs.PREF_BOOL,
pref: "browser.urlbar.openintab",
possibleVals: [
{ val: false },
{ val: true },
]
},
"seperator",
{
name: "🎊 Animations Modus",
type: prefs.PREF_STRING,
pref: "image.animation_mode",
possibleVals: [
{ name: "Einmal", val: "once" },
{ name: "Keine", val: "none" },
{ name: "Dauerhaft", val: "normal" },
]
},
"seperator",
{
name: "🔏 CSP aktivieren - deaktivieren",
type: prefs.PREF_BOOL,
pref: "security.browser_xhtml_csp.enabled",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "🔏 eval erlauben - verbieten",
type: prefs.PREF_BOOL,
pref: "security.allow_unsafe_dangerous_privileged_evil_eval",
possibleVals: [
{ val: false },
{ name: "true ⚠️", val: true , sign: '‼️' },
]
},
{
name: "🌐 IPv6 ausschalten",
type: prefs.PREF_BOOL,
pref: "network.dns.disableIPv6",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "🔐 DNS Modus",
type: prefs.PREF_INT,
pref: "network.trr.mode",
possibleVals: [
{ name: "0 - Default" , val: 0 },
{ name: "2 - DoH, fallback Plain DNS" , val: 2 },
{ name: "3 - DoH only" , val: 3 },
{ name: "5 - Plain DNS" , val: 5 }
]
},
{
name: "🔐 DoH server",
type: prefs.PREF_STRING,
pref: "network.trr.uri",
possibleVals: [
{ name: "Cloudflare" , val: "https://mozilla.cloudflare-dns.com/dns-query" },
{ name: "NextDNS" , val: "https://firefox.dns.nextdns.io/" }
] // See buildin DoH at 'network.trr.resolvers'
},
{
name: "🔏 Veraltete TLS Version aktivieren",
type: prefs.PREF_BOOL,
pref: "security.tls.version.enable-deprecated",
possibleVals: [
{ val: false },
{ name: "true ⚠️", val: true , sign: '‼️'},
]
},
"seperator",
{
name: "🖱️ Mausrad-Y-Multiplikator",
type: prefs.PREF_INT,
pref: "mousewheel.default.delta_multiplier_y",
possibleVals: [
{ val: 150 },
]
},
{
name: "🖱️ Vertikaler Faktor des Systembildlaufes",
type: prefs.PREF_INT,
pref: "mousewheel.system_scroll_override.vertical.factor",
possibleVals: [
{ val: 250 },
]
},
"seperator",
{
name: "▶️ Autoplay Medien Standard",
type: prefs.PREF_INT,
pref: "media.autoplay.default",
possibleVals: [
{ val: 0, name: "0 - allow" },
{ val: 1, name: "1 - blockAudible 👍" },
{ val: 5, name: "5 - blockAll" },
]
},
{
name: "📺 Videos gesperrt - Videos frei",
type: prefs.PREF_BOOL,
pref: "media.mediasource.enabled",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "▶️ Media Autoplay ext bg",
type: prefs.PREF_BOOL,
pref: "media.autoplay.allow-extension-background-pages",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "▶️ Richtlinien zur Sperrung von Autoplay-Medien",
type: prefs.PREF_INT,
pref: "media.autoplay.blocking_policy",
possibleVals: [
{ val: 0, name: "0 - no block" },
{ val: 1, name: "1 - block 👍" },
{ val: 2, name: "2 - block more" },
// 0=sticky (default), 1=transient, 2=user
]
},
{
name: "▶️ InternetAudio",
type: prefs.PREF_BOOL,
pref: "dom.webaudio.enabled",
possibleVals: [
{ val: false },
{ val: true , sign: '‼️' , warnbadge: true},
]
},
"seperator",
{
name: "🔤 Benutzerdefinierte Web-Schriften zulassen",
type: prefs.PREF_INT,
pref: "browser.display.use_document_fonts",
possibleVals: [
{ name: "1 - Allow", val: 1 },
{ name: "0 - Disallow", val: 0 },
]
},
{
name: "💻 Keine Popup Anmeldung für Browser-Werkzeuge",
type: prefs.PREF_BOOL,
pref: "devtools.debugger.prompt-connection",
possibleVals: [
{ val: true },
{ name: "false ⚠️", val: false , sign: '‼️' },
]
},
{
name: "🔏 Tooltips aktivieren - deaktivieren",
type: prefs.PREF_BOOL,
pref: "browser.chrome.toolbar_tips",
possibleVals: [
{ val: false },
{ val: true },
]
},
];
if (!window.gBrowser){
return;
}
CustomizableUI.createWidget({
id: 'aboutconfig-button', // button id
type: "custom",
defaultArea: CustomizableUI.AREA_NAVBAR,
removable: true,
onBuild: function (doc) {
let btn = doc.createXULElement('toolbarbutton');
btn.id = 'aboutconfig-button';
btn.label = button_label;
btn.tooltipText = button_label;
btn.type = 'menu';
btn.className = 'toolbarbutton-1 chromeclass-toolbar-additional';
btn.setAttribute("badged", "true");
btn.setAttribute("badge", "!");
let mp = doc.createXULElement("menupopup");
mp.id = 'aboutconfig-popup';
mp.onclick = function(event) { event.preventDefault() ;} ;
prefItems.forEach( function (item, items_i) { // loop every user defined pref
if (item === "seperator")
{
mp.appendChild(doc.createXULElement('menuseparator'));
return;
}
//var current_val = getItemCurrentVal(item) ;
var menu = doc.createXULElement("menu");
menu.label = item.name ? item.name : item.pref ;
menu.id = "aboutconfig_menu_" + items_i ;
menu.className = 'menuitem-iconic' ;
var menupopup = doc.createXULElement("menupopup");
menupopup.id = "aboutconfig_menupopup_" + items_i ;
menupopup.className = 'menuitem-iconic' ;
item.possibleVals.forEach( function (pv, i) { // loop every possible value
var display_val = prefPossibleValToDisplay(item, pv.val) ;
// Submenu item. One is one possible value
var menuitem = doc.createXULElement("menuitem");
menuitem.label = pv.name ? pv.name : display_val ;
menuitem.id = "aboutconfig_menu_" + items_i + "__" + i ;
menuitem.setAttribute('type', 'radio') ;
menuitem.className = 'menuitem-iconic' ;
menuitem.tooltipText = display_val ;
if (pv ['sign'])
menuitem.label += ' ' + pv['sign'];
menuitem.addEventListener('click', function(event) {
//console.log(this.id);
setItemPrefVal(item , pv.val);
} ) ;
menupopup.appendChild(menuitem);
});
var default_val = getItemDefaultVal(item);
var default_val_display = null;
var reset_label = "Zurücksetzen: ";
if (item.signWhenDefaultVal)
reset_label += item.signWhenDefaultVal + ' ' ;
if (default_val !== undefined && default_val !== null)
{
default_val_display = prefPossibleValToDisplay(item, default_val);
reset_label += default_val_display ;
}
else
reset_label += ' (delete in about:config)'
menupopup.appendChild(
doc.createXULElement('menuseparator')
);
// Submenu entry to reset a pref to default
var default_item = doc.createXULElement("menuitem");
default_item.id = "aboutconfig_menu_" + items_i + "__default" ;
default_item.className = 'menuitem-iconic';
default_item.label = reset_label;
default_item.tooltipText = default_val_display;
default_item.addEventListener('click', function(event) {
//console.log(this.id);
//setItemPrefVal(item , getItemDefaultVal(item) );
prefs.clearUserPref(item.pref);
} ) ;
menupopup.appendChild(default_item);
//------------
menu.appendChild(menupopup);
mp.appendChild(menu);
});
btn.appendChild(mp);
mp.addEventListener('popupshowing', function() {
//console.log(this);
evalPopulateMenu(this);
update_badge();
});
btn.onclick = function(event) {
if (event.button == 1) {
const win = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator)
.getMostRecentWindow("navigator:browser");
win.gBrowser.selectedTab = win.gBrowser.addTrustedTab('about:config');
}
update_badge();
};
return btn;
}
});
function getItemDefaultVal (item) {
var default_val = undefined;
try{
if ( item.type == prefs.PREF_BOOL )
default_val = prefs.getDefaultBranch(item.pref).getBoolPref('');
else if ( item.type == prefs.PREF_INT )
default_val = prefs.getDefaultBranch(item.pref).getIntPref('');
else if ( item.type == prefs.PREF_STRING )
default_val = prefs.getDefaultBranch(item.pref).getStringPref('');
}catch(err) { default_val = null }
return default_val;
}
function getItemCurrentVal (item) {
var current_val = null;
try{
if ( item.type == prefs.PREF_BOOL )
current_val = prefs.getBoolPref(item.pref);
else if ( item.type == prefs.PREF_INT )
current_val = prefs.getIntPref(item.pref);
else if ( item.type == prefs.PREF_STRING )
current_val = prefs.getStringPref(item.pref);
}catch(err){ }
return current_val ;
}
function if_pref_current_val_is (item, pv_index) {
var current_val = getItemCurrentVal(item) ;
if (current_val === null)
return false;
if ( current_val === item.possibleVals[pv_index].val )
return true;
else
return false;
}
function setItemPrefVal(item, newVal)
{
if ( item.type == prefs.PREF_BOOL )
prefs.setBoolPref(item.pref, newVal);
else if ( item.type == prefs.PREF_INT )
prefs.setIntPref(item.pref, newVal);
else if ( item.type == prefs.PREF_STRING )
prefs.setStringPref(item.pref, newVal);
update_badge();
}
function prefPossibleValToDisplay(item, possible_val ) {
if (possible_val === null)
return "null";
var display_val = possible_val.toString();
if (item.type == prefs.PREF_STRING)
display_val = `'${display_val}'`;
return display_val;
}
function evalPopulateMenu(popupmenu)
{
prefItems.forEach( function (item, items_i) {
if (item === "seperator")
return;
const menu = popupmenu.querySelector("#aboutconfig_menu_" + items_i);
menu.label = item.name ? item.name : item.pref ;
menu.style.fontWeight = "";
const default_val = getItemDefaultVal(item);
var current_val = getItemCurrentVal(item) ;
var current_val_display = prefPossibleValToDisplay(item, current_val);
menu.tooltipText = `Pref: ${item.pref}\nValue: ${current_val_display}`;
if (current_val !== null)
{
if (item.type == prefs.PREF_BOOL)
menu.label += ' [' + ( current_val?'T':'F' ) + ']';
else if (item.type == prefs.PREF_INT)
menu.label += ' [' + current_val + ']';
else if (item.type == prefs.PREF_STRING) {
var current_val_display_short;
if (current_val.length > 8)
current_val_display_short = current_val.substring(0, 6) + '..';
else
current_val_display_short = current_val;
menu.label += ' [' + current_val_display_short + ']';
}
}
if (current_val !== default_val)
menu.style.fontWeight = "bold";
if (current_val === default_val && item.signWhenDefaultVal)
menu.label += ' ' + item.signWhenDefaultVal;
item.possibleVals.forEach( function (pv, i) {
menuitem = popupmenu.querySelector("#aboutconfig_menu_" + items_i + "__" + i);
if ( if_pref_current_val_is(item, i) )
{
menuitem.setAttribute("checked",true);
if (pv ['sign'])
menu.label += ' ' + pv['sign'];
}
else
menuitem.setAttribute("checked",false);
});
});
}
function add_warnbadge()
{
if ( ! sss.sheetRegistered(cssuri_warnbadge, sss.USER_SHEET) )
sss.loadAndRegisterSheet(cssuri_warnbadge, sss.USER_SHEET);
}
function rm_warnbadge()
{
if ( sss.sheetRegistered(cssuri_warnbadge, sss.USER_SHEET) )
sss.unregisterSheet(cssuri_warnbadge, sss.USER_SHEET);
}
update_badge();
async function update_badge()
{
var show_warnbadge = false;
for (item of prefItems)
{
if (typeof(item) === "string")
continue;
const current_val = getItemCurrentVal(item) ;
if (
item.possibleVals.some ( function(ele) {
return ( ele ['val'] === current_val && ele ['warnbadge'] && ele ['warnbadge'] === true );
} )
)
{
show_warnbadge = true;
break;
}
}
if (show_warnbadge)
add_warnbadge();
else
rm_warnbadge();
}
})();
Alles anzeigen
Ja! Jedes Skript wird über die von uns verwendete UserChrome-Logik zweimal aufgerufen. Warum das im Detail so ist, kann ich jetzt auch nicht sagen
Ist doch ganz einfach: Doppelt hält besser! 🤣
Danke dir, Sören Hentzschel und 2002Andreas für die Antworten. War mal wieder ein lehrreicher Abend. 🙏
So sefinitiv ist das wohl nicht, Fehlermeldungen lügen nicht.
Es wäre vermutlich hilfreich, wenn du den Code teilen würdest, um den es geht.
Die Fehlermeldung
Zitat21:09:08.499 Uncaught TypeError: document.getElementById(...) is null
init file:///C:/Users/bege/AppData/Roaming/Mozilla/Firefox/Profiles/487kit50.Quantum/chrome/JS/VersionInAddonBar.uc.js:34
<anonymous> file:///C:/Users/bege/AppData/Roaming/Mozilla/Firefox/Profiles/487kit50.Quantum/chrome/JS/VersionInAddonBar.uc.js:37
VersionInAddonBar.uc.js:34:18
Die Add-on Bar (ID wird in Zeile 120 definiert)
// Add-on Bar script for Firefox 126+ by Aris
//
// no 'close' button
// 'toggle' toolbar with 'Ctr + /' on Windows/Linux or 'Cmd + /' on macOS
// no 'Add-on Bar' entry in toolbar context menu
//
// option: smaller buttons / reduced toolbar button height
//
// flexible spaces on add-on bar behave like on old Firefox versions
// [!] Fix for WebExtensions with own windows by 黒仪大螃蟹 (for 1-N scripts)
var appversion = parseInt(Services.appinfo.version);
var compact_buttons = false; // reduced toolbar height and smaller buttons
var AddAddonbar = {
init: function() {
if (location != 'chrome://browser/content/browser.xhtml')
return;
/* blank tab workaround */
try {
if(gBrowser.selectedBrowser.getAttribute('blank')) gBrowser.selectedBrowser.removeAttribute('blank');
} catch(e) {}
try {
Services.prefs.getDefaultBranch('browser.addonbar.').setBoolPref('enabled',true);
} catch(e) {}
var addonbar_label = 'Add-on Bar';
var compact_buttons_code = '';
if(compact_buttons)
compact_buttons_code = `
#addonbar toolbarbutton .toolbarbutton-icon {
padding: 0 !important;
width: 16px !important;
height: 16px !important;
}
#addonbar .toolbarbutton-badge-stack {
padding: 0 !important;
margin: 0 !important;
width: 16px !important;
min-width: 16px !important;
height: 16px !important;
min-height: 16px !important;
}
#addonbar toolbarbutton .toolbarbutton-badge {
margin-top: 0px !important;
font-size: 5pt !important;
min-width: unset !important;
min-height: unset !important;
margin-inline-start: 0px !important;
margin-inline-end: 0px !important;
}
#addonbar .toolbaritem-combined-buttons {
margin-inline: 0px !important;
}
#addonbar toolbarbutton {
padding: 0 !important;
}
`;
// style sheet
Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService).loadAndRegisterSheet(
Services.io.newURI('data:text/css;charset=utf-8,' + encodeURIComponent(`
#addonbar toolbarpaletteitem[place=toolbar][id^=wrapper-customizableui-special-spring],
#addonbar toolbarspring {
-moz-box-flex: 1 !important;
min-width: unset !important;
width: unset !important;
max-width: unset !important;
}
#main-window[customizing] #addonbar {
outline: 1px dashed !important;
outline-offset: -2px !important;
}
#addonbar {
border-top: 1px solid var(--sidebar-border-color,rgba(0,0,0,0.1)) !important;
background-color: var(--toolbar-bgcolor);
background-image: var(--toolbar-bgimage);
-moz-window-dragging: no-drag !important;
}
:root[lwtheme] #addonbar {
background: var(--lwt-accent-color) !important;
}
:root[lwtheme][lwtheme-image='true'] #addonbar {
background: var(--lwt-header-image) !important;
background-position: 0vw 50vh !important;
}
/* autohide add-on bar in fullscreen mode */
/*#main-window[sizemode='fullscreen']:not([inDOMFullscreen='true']) #addonbar {
visibility: visible !important;
display: block !important;
min-height: 1px !important;
height: 1px !important;
max-height: 1px !important;
}
#main-window[sizemode='fullscreen']:not([inDOMFullscreen='true']) #addonbar:hover {
min-height: 24px !important;
height: 24px !important;
max-height: 24px !important;
}*/
#unified-extensions-button[hidden]{
visibility: visible !important;
display: flex !important;
}
`+compact_buttons_code+`
`), null, null),
Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService).AGENT_SHEET
);
// toolbar
try {
if(document.getElementById('addonbar') == null) {
var tb_addonbar = document.createXULElement('toolbar');
tb_addonbar.setAttribute('id','addonbar');
tb_addonbar.setAttribute('collapsed', 'false');
tb_addonbar.setAttribute('toolbarname', addonbar_label);
tb_addonbar.setAttribute('defaultset','spring,spring');
tb_addonbar.setAttribute('customizable','true');
tb_addonbar.setAttribute('mode','icons');
tb_addonbar.setAttribute('iconsize','small');
tb_addonbar.setAttribute('context','toolbar-context-menu');
tb_addonbar.setAttribute('lockiconsize','true');
tb_addonbar.setAttribute('class','toolbar-primary chromeclass-toolbar browser-toolbar customization-target');
document.getElementById('browser').parentNode.appendChild(tb_addonbar);
//tb_addonbar.insertBefore(document.querySelector('#statuspanel'),tb_addonbar.firstChild);
CustomizableUI.registerArea('addonbar', {legacy: true});
setTimeout(function(){
CustomizableUI.registerArea('addonbar', {legacy: true});
},2000);
CustomizableUI.registerToolbarNode(tb_addonbar);
// 'Ctr + /' on Windows/Linux or 'Cmd + /' on macOS to toggle add-on bar
var key = document.createXULElement('key');
key.id = 'key_toggleAddonBar';
key.setAttribute('key', '/');
key.setAttribute('modifiers', 'accel');
/*key.setAttribute('oncommand',`
var newAddonBar = document.getElementById('addonbar');
setToolbarVisibility(newAddonBar, newAddonBar.collapsed);
Services.prefs.getBranch('browser.addonbar.').setBoolPref('enabled',!newAddonBar.collapsed);
`);*/
key.addEventListener("command", () => {var newAddonBar = document.getElementById('addonbar');
setToolbarVisibility(newAddonBar, newAddonBar.collapsed);
Services.prefs.getBranch('browser.addonbar.').setBoolPref('enabled',!newAddonBar.collapsed);} );
document.getElementById('mainKeyset').appendChild(key);
try {
setToolbarVisibility(document.getElementById('addonbar'), Services.prefs.getBranch('browser.addonbar.').getBoolPref('enabled'));
} catch(e) {}
}
} catch(e) {}
}
}
/* initialization delay workaround */
document.addEventListener('DOMContentLoaded', AddAddonbar.init(), false);
/* Use the below code instead of the one above this line, if issues occur */
/*
setTimeout(function(){
AddAddonbar.init();
},2000);
*/
/* fix for downloads button on add-on bar - thanks to dimdamin */
/* https://github.com/Aris-t2/CustomJSforFx/issues/125#issuecomment-2506613776 */
(async url => !location.href.startsWith(url) || await delayedStartupPromise ||
(async (scrNT, nTjs) => {
if (scrNT.length >= 1) {
nTjs.uri = "data:application/x-javascript;charset=UTF-8,";
nTjs.res = await fetch(scrNT[0].src);
nTjs.src = (await nTjs.res.text())
.replace(/navigator-toolbox/, "addonbar_v")
.replace(/widget-overflow/, "addonbar");
(await ChromeUtils.compileScript(nTjs.uri + encodeURIComponent(nTjs.src))).executeInGlobal(this);
};
})(document.getElementById("navigator-toolbox").querySelectorAll(":scope > script"), {})
)("chrome://browser/content/browser.x");
Alles anzeigen
Das Skript, das einen Button in der Add-on Bar platziert und die Fehlermeldung erzeugt (die beanstandete ID wird in Zeile 18 definiert)
// ==UserScript==
// @name VersionInAddonBar.uc.js
// @description Versionsnummer in der Addon-Bar anzeigen
// @include main
// @charset UTF-8
// @note Basiert auf dem Script MemoryMonitorMod.uc.js und der Erweiterung "Version in Statusbar"
// @note Bit-Version aus https://www.camp-firefox.de/forum/thema/135247-anwendungsname-und-version-in-der-men%C3%BCleiste/
// @note In Zeilen 18 u. 19 die Toolbar und die Position (hinter welchem Element) auf der Toolbar anpassen.
// @note Ein Klick auf den Button öffnet das Fenster "Über Firefox".
// ==/UserScript==
setTimeout(function() {
var ucjsVN = {
init : function () {
let profile = Cc["@mozilla.org/toolkit/profile-service;1"].getService(Ci.nsIToolkitProfileService).currentProfile.name;
var Toolbar = 'addonbar';
var Position = 'customizableui-special-separator177';
// var Position = 'formhistory_yahoo_com-browser-action';
// var Position = 'textarea-cache-lite_wildsky_cc-browser-action';
var info = Components.classes['@mozilla.org/xre/app-info;1'].getService(Components.interfaces.nsIXULAppInfo);
var bit = (Services.appinfo.is64Bit ? 64 : 32);
var versionPanel = document.createXULElement('toolbaritem');
versionPanel.id = 'VersionDisplay';
versionPanel.setAttribute('tooltiptext', 'Versions-Nummer. Klick öffnet "Über ' + info.vendor + ' ' + info.name + '"');
versionPanel.addEventListener('click', function () {
openAboutDialog();
});
versionPanel.style.paddingTop = '4px';
var label = document.createXULElement('label');
label.setAttribute('value', "v" + info.version + " (" + bit + "bit)" + " [" + profile + "]");
versionPanel.appendChild(label);
document.getElementById(Toolbar).insertBefore(versionPanel, document.getElementById(Position).nextSibling);
},
}
ucjsVN.init();
}, 3000);
Alles anzeigen
Woran liegt das?
Konkret kann man das natürlich nicht bei jedem Skript sagen, aber wenn du verhinderst, dass das Skript zweimal aufgerufen wird, dann sollten sich solche Fehler in aller Regel vermeiden lassen. Daher bei jedem Skript z.B. diesen Code am Anfang einfügen:
Tatsächlich verschwindet die Fehlermeldung dadurch bei diesem Skript. Ich verstehe aber noch nicht, warum. Was meinst du mit "zweimal aufgerufen"? Passiert das bei dem Skript? Und trotz einer auch sehr langen timeout-Zeit?
Edit: Mit einem anderen Skript habe ich es auch probiert. Ist für einen Nur-Bastler wie mich nicht einfach, die richtige Stelle dafür zu finden. Ganz am Anfang funktioniert es nicht immer, das legt mitunter das ganze Skript lahm. Aber mit probieren habe ich es herausgefunden.
Auch, wenn Scripts ansonsten zu funktionieren scheinen, empfehle ich, solche Fehler zu beheben. Denn man kann nicht grundsätzlich ausschließen, dass nach Auftreten eines Fehlers nicht irgendwelche Dinge nicht mehr korrekt ausgeführt werden. Und selbst, wenn es keine Probleme gibt, wird ja nur das Entdecken tatsächlicher Fehler erschwert, wenn in der Konsole unnötige Fehlermeldungen erscheinen.
Ich habe versucht, das auf andere Skripte mit diesem Fehler zu übertragen. Bei Skripten, die sich auf Elemente aus einem anderen Skript beziehen, bekomme ich den Fehler, obwohl das Element des ersten Skripts definitiv bei der Ausführung des zweiten Skript vorhanden ist. (setTimeout so lang, dass ich sehen kann, wie das zweite Skript ausgeführt wird während das Element des ersten Skripts bereits vorhanden ist: Beispiel platzieren eines Buttons in der vom ersten Skript erzeugten Addonbar. Dennoch kommt für das zweite Skript der Fehler, dass die ID der Addonbar null ist, während der Button genau dort platziert wird.)
Woran liegt das?
Das Skript müsste angepasst werden. In dem aus Beitrag Nr. 23 gibt es nämlich keine.
Mit diesem Code aus dem verlinkten Skript - eingefügt unter der Konfiguration - verschwindet die Fehlermeldung.
An der Funktion ändert sich dadurch nichts, es gibt eben eine Fehlermeldung weniger. Wie gesagt gibt es diese Fehlermeldung bei einer ganzen Reihe von Skripten bei mir, die alle funktionieren, u.a. welche von alice0775.
Sören Hentzschel Kannst du zu diesen Fehlermeldungen etwas sagen?
Die Fehlermeldung document.getElementById(...) is null habe ich bei vielen Skripten, die wie dies hier trotzdem funktionieren. Für mich nur eines von vielen Javascript-Rätseln. 😉
Die Fehlermeldung erscheint hier allerdings auch.
Die Fehlermeldung document.getElementById(...) is null habe ich bei vielen Skripten, die wie dies hier trotzdem funktionieren. Für mich nur eines von vielen Javascript-Rätseln. 😉
Halle bege
Kann ich gerne machen.
Würde vorschlagen mein vorhandenes mit obigem ersetzen.
Was meinst Du - Ihr?Mfg.
Endor
Von mir aus gerne, ich hatte es ja per CSS so geändert und habe jetzt die neue Version übernommen. Ich weiß nicht, ob das bei jemand anderem Probleme bereitet.
JavaScript Alles anzeigen// ==UserScript== // @include chrome://mozapps/content/downloads/unknownContentType.xhtml // @charset UTF-8 // @sandbox true // @version Fx139+ // ==/UserScript== (function () { const { FileUtils } = ChromeUtils.importESModule('resource://gre/modules/FileUtils.sys.mjs'); const { setTimeout } = ChromeUtils.importESModule('resource://gre/modules/Timer.sys.mjs'); setTimeout(function () { saveTo() }, 200); function saveTo () { // config const dirArray = [ ['C:\\', 'System'], ['D:\\', 'DATA'], ['D:\\Software', 'Software'], ['D:\\Downloads', 'herunterladen'], ['D:\\Video', 'Video'], ['' + FileUtils.getDir('UChrm', []).path + '', 'chrome'], //['' + FileUtils.getDir('UChrm', ['SubScript']).path + '', 'SubScript'], ['F:\\', 'F:'], ['G:\\', 'G:'], ['H:\\', 'H:'], ]; const button = document.getElementById('unknownContentType').getButton('cancel'); const saveTo = button.parentNode.insertBefore(createEl('button', { label: 'Speichern nach', class: 'dialog-button', type: 'menu' }), button); const saveToMenu = saveTo.appendChild(createEl('menupopup')); saveToMenu.appendChild(createEl("html:link", { rel: "stylesheet", href: "chrome://global/skin/global.css" })); saveToMenu.appendChild(createEl("html:link", { rel: "stylesheet", href: "chrome://global/content/elements/menupopup.css" })); dirArray.forEach(function (a) { const [dir, name] = [a[0], a[1]]; saveToMenu.appendChild(createEl('menuitem', { label: (name || (dir.match(/[^\\/]+$/) || [dir])[0]), image: 'moz-icon:file:///' + dir + '\\', class: 'menuitem-iconic', dir: dir, onclick: function () { const locationtext = document.getElementById('locationtext'); const file = new FileUtils.File(this.getAttribute('dir') + '\\' + (locationtext ? locationtext.value : document.getElementById('location').value)); dialog.mLauncher.saveDestinationAvailable(file); dialog.onCancel = function () { }; close(); } })); }); } function createEl (type, attrs = {}, doc = document) { let el = type.startsWith('html:') ? doc.createElementNS('http://www.w3.org/1999/xhtml', type) : doc.createXULElement(type); for (let key of Object.keys(attrs)) { key.startsWith('on') ? el.addEventListener(key.slice(2).toLocaleLowerCase(), attrs[key]) : el.setAttribute(key, attrs[key]); } return el; } }());
Perfekt! Macht genau, was grisu2099 und ich mit CSS gebastelt haben.
Endor , nimmt du das ins Github repo auf?
Frag mich aber bitte nicht, wo/wie ich das gefunden habe...
![]()
Na gut. 😉
Für das Script saveto.uc.js gibt es eine neue Version für Firefox 139
Es gibt noch einen Fehler im Skript. Im letzten CSS-Befehl muss es ganz am Ende des Selektors menu-text heißen statt menu-iconic-text. Sonst greifen die padding-Werte nicht.
Ich nutze eine Windows-App, die abends das Windows-Theme von hell auf dunkel stellt. Dann funktionieren die Farben des Popups nicht mehr richtig, weil der Hintergrund im Skript hell fixiert ist, die Schrift aber auf weiß geändert wird. Um den Hintergrund flexibel je nach Windows-Theme zu halten, habe ich im zweiten CSS-Befehl den background: -Wert von #F0F0F0 auf var(--background-color-box) geändert.
Edit: Im dritten Befehl den background: -Wert von #91C9F7 auf var(--button-background-color-hover) ändern lässt den Hintergrund beim Hovern flexibel je nach Windows-Theme.
Mit diesen Änderungen funktioniert es wieder prima. Danke Endor und alle Mitdenker.
padding-left und padding-right überschreiben hier padding für links/rechts, soweit ich weiss.
Das ginge auch in einer Zeile: padding: 3px 12px 3px 5px;. Aber für so Bastler wie mich ist es wie geschrieben übersichtlicher. Deshalb kann es von mir aus so bleiben.
👍Super, danke.
Hast du eine Idee, warum auch das alte Skript plötzlich dieses Verhalten zeigt?
Ja, bei mir auch und vor allem mit meiner älteren Version hier ebenfalls.
Ich habe etwas herumexperimentiert, aber keine Lösung gefunden.
Das ist ja verrückt. Bei meiner alten Version war die Anzeige korrekt, aber beim Klick auf einen Ordner passierte nichts mehr. Nach deinem Beitrag habe ich die alte Version nochmal aktiviert und jetzt sind auch hier die Labels zwei mal zu sehen. Kein weiteres Firefox-Update dazwischen (aktuell 139.0.1). 🤔
Ich denke mal, an den Zeilen 26-28.
Daran habe ich auch gedacht. Aber das verändert ja nur die Position der Labels . Aber warum sind sie mit der neuen Skriptversion zwei Mal da?