Es hat einen Schaltfläche, und er funktioniert.
Ja Sie haben völlig recht. War mir nicht aufgefallen.
Vielen Dank für den Hinweis.
Mfg.
Endor
Es hat einen Schaltfläche, und er funktioniert.
Ja Sie haben völlig recht. War mir nicht aufgefallen.
Vielen Dank für den Hinweis.
Mfg.
Endor
Du hast falsch verstanden.
Du sollst about:support in die Adressleiste eingeben und
mit Entertaste auf Tastatur bestätigen.
Es öffnet sich eine neue Seite mit Informationen.
Da machst Du einen klick auf Text in die Zwischenablage kopieren
dann hier in einem neuen Betrag einfügen.
Dazu im neuen Beitrag klick hier:
Dann im Beitrag im hellgrauen Bereich einfügen.
Mfg.
Endor
Hallo lenny2
Ich habe hier eine Alternatives Script:
// ==UserScript==
// @name URL Tooltip Toggle (149+)
// @description Shows link target URL near mouse cursor (multiline, no truncation)
// ==/UserScript==
(function () {
if (!window.gBrowser || !window.CustomizableUI) return;
const { Services } = globalThis;
const PREF = "urltooltip.enabled";
let originalSetOverLink;
let tooltip;
let lastMouseX = 0;
let lastMouseY = 0;
/* ================= MOUSE TRACKING ================= */
window.addEventListener("mousemove", e => {
lastMouseX = e.screenX;
lastMouseY = e.screenY;
}, true);
/* ================= TOOLTIP ================= */
function createTooltip() {
if (tooltip) return;
tooltip = document.createXULElement("tooltip");
tooltip.id = "ucjs-url-tooltip";
tooltip.setAttribute("noautohide", "true");
// Multiline + wrapping
tooltip.style.maxWidth = "600px";
tooltip.style.whiteSpace = "pre-wrap";
tooltip.style.wordBreak = "break-word";
document.documentElement.appendChild(tooltip);
}
function showTooltip(url) {
if (!tooltip) createTooltip();
url = cleanURL(url);
if (!url) return;
tooltip.label = url;
tooltip.openPopupAtScreen(
lastMouseX + 0,
lastMouseY + 2,
false
);
}
function hideTooltip() {
if (tooltip && tooltip.state !== "closed")
tooltip.hidePopup();
}
/* ================= PATCH ================= */
function patch() {
if (originalSetOverLink) return;
originalSetOverLink = XULBrowserWindow.setOverLink;
XULBrowserWindow.setOverLink = function (url, anchorElt) {
originalSetOverLink.apply(this, arguments);
if (!Services.prefs.getBoolPref(PREF, true))
return;
if (!url) {
hideTooltip();
return;
}
showTooltip(url);
};
}
function restore() {
if (!originalSetOverLink) return;
XULBrowserWindow.setOverLink = originalSetOverLink;
originalSetOverLink = null;
hideTooltip();
}
/* ================= URL CLEAN ================= */
function cleanURL(url) {
if (/^(javascript|data|mailto|about):/i.test(url))
return "";
try {
const { UrlbarUtils } =
ChromeUtils.importESModule(
"resource:///modules/UrlbarUtils.sys.mjs"
);
url = UrlbarUtils.stripPrefixAndTrim(url);
} catch {}
return url;
}
/* ================= BUTTON ================= */
CustomizableUI.createWidget({
id: "urltooltip-toggle",
type: "button",
defaultArea: CustomizableUI.AREA_NAVBAR,
label: "URL Tooltip",
tooltiptext: "Toggle link URL tooltips",
onCreated(button) {
updateButton(button);
button.addEventListener("command", () => {
let state = !Services.prefs.getBoolPref(PREF, true);
Services.prefs.setBoolPref(PREF, state);
updateButton(button);
state ? patch() : restore();
});
if (Services.prefs.getBoolPref(PREF, true))
patch();
}
});
function updateButton(btn) {
let state = Services.prefs.getBoolPref(PREF, true);
btn.style.opacity = state ? "1" : "0.5";
btn.tooltipText = "URL Tooltip: " + (state ? "ON" : "OFF");
}
/* ================= INIT ================= */
if (Services.prefs.getBoolPref(PREF, true))
patch();
})();
Alles anzeigen
Das funktioniert hier in Firefox 149 und 150. Ob es auch im aktuellen 148 funktioniert
müsste ich noch testen. Das hat aber keine Schaltfläche zum aktivieren oder deaktivieren.
Rest wie gewohnt.
Mfg.
Endor
aber es hat nichts genützt.
Kann und muss ich leider bestätigen.
In Firefox 149 beta2 funktioniert es nicht.
Mfg.
Endor
Habe Deine Version hier in 149beta2 getestet da funktioniert sie nicht.
Schaltfläche ist da aber es wird keine URL als Popup angezeigt.
2002Andreas.
Bei mir war beim ersten mal die Schaltfläche im Anpassenfenster.
Musste die erst auf die Symbolleiste ziehen.
Mfg.
Endor
Hallo milupo.
Und wie steht die Einstellung bei Dir:
security.browser_xhtml_csp.enabled
true oder false?
Standard ist true und so ist auch hier bei mir.
Mfg.
Endor
Schade. Aber ich vermute mal, da ich den Schalter in About:config:
security.allow_unsafe_dangerous_privileged_evil_eval
auf true habe, funktioniert es hier noch in Firefox 148.
Weil hier funktionieren die Schaltflächen und die Einblendung des Tototipps.
In Firefox 149 beta2 funktioniert es auch so nicht mehr. Schade.
Vielleicht kann da jemand anderes weiter helfen.
Mfg.
Endor
Hallo lenny2
Könntest Du bitte mal diese Version testen:
// ==UserScript==
//
// @description Displays target URL in tooltip, when hovering over a link
// Button has “tooltips on”/“tooltips off” positions
// ==/UserScript==
(function() {
if (!window.gBrowser){
return;
}
try {
CustomizableUI.createWidget(({
label: "Links in pop-up tooltips", localized: false,
id: "URLTooltip", pref: "URLTooltip.enabled",
get state() {
return Services.prefs.getBoolPref(this.pref, true); // Standardmäßig aktiviert
},
setIcon(btn, state = this.state) {
btn.setAttribute("image", "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' style='fill:context-fill rgb(142, 142, 152);'><path d='M9.618 6.721a2.483 2.483 0 0 0-.39-.317l-.735.734A1.486 1.486 0 0 1 8.91 9.55l-2.12 2.122a1.486 1.486 0 0 1-2.122 0 1.486 1.486 0 0 1 0-2.121l.605-.605a3.53 3.53 0 0 1-.206-1.209L3.961 8.843a2.506 2.506 0 0 0 0 3.535 2.506 2.506 0 0 0 3.535 0l2.122-2.121a2.506 2.506 0 0 0 0-3.536z'/><path d='M6.79 9.55c.12.121.25.226.389.317l.734-.734a1.486 1.486 0 0 1-.417-2.411L9.618 4.6a1.486 1.486 0 0 1 2.121 0 1.486 1.486 0 0 1 0 2.121l-.605.605c.137.391.211.798.206 1.209l1.106-1.107a2.506 2.506 0 0 0 0-3.535 2.506 2.506 0 0 0-3.535 0L6.789 6.014a2.506 2.506 0 0 0 0 3.536z'/><circle style='fill:none;stroke:context-fill rgb(142, 142, 152);stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round' cx='8' cy='8' r='7.4'/></svg>");
btn.style.setProperty("fill", `${state ? "color-mix(in srgb, currentColor 20%, #e31b5d)" : ""}`);
},
onCreated(btn) {
this.setIcon(btn), this.btn = btn, btn.owner = this;
//btn.setAttribute("oncommand", "owner.toggle()");
btn.addEventListener('command', () => {
this.toggle();
});
btn.addEventListener('mouseenter', () => {
this.mouseenter();
});
},
mouseenter() {
this.btn.tooltipText = this.label +' – '+ `${this.state ? "enabled" : "disabled"}`;
},
toggle() {
Services.prefs.setBoolPref(this.pref, !this.state);
},
observe(s, topic) {
if (topic.startsWith("q")) return this.destroy();
var {state} = this;
for(var {node} of CustomizableUI.getWidget(this.id).instances)
this.setIcon(node, state);
state ? this.initTooltip() : this.destroyTooltip();
},
init() {
Services.prefs.addObserver(this.pref, this);
Services.obs.addObserver(this, "quit-application-granted", false);
this.state && this.initTooltip();
delete this.init; return this;
},
destroy() {
Services.prefs.removeObserver(this.pref, this);
Services.obs.removeObserver(this, "quit-application-granted");
},
initTooltip() {
var url = this.initURL = this.createURL("psInit");
(this.initTooltip = () => Services.ppmm.loadProcessScript(url, true))();
},
destroyTooltip() {
var url = this.createURL("psDestroy");
(this.destroyTooltip = () => {
Services.ppmm.removeDelayedProcessScript(this.initURL);
Services.ppmm.loadProcessScript(url, false);
})();
delete this.createURL;
},
createURL: function createURL(meth) {
var subst = this.id + "-" + meth;
(createURL.rph || (createURL.rph = Services.io.getProtocolHandler("resource")
.QueryInterface(Ci.nsIResProtocolHandler)
)).setSubstitution(subst, Services.io.newURI("data:text/javascript;charset=utf-8," + encodeURIComponent(
`(${this[meth]})(ChromeUtils.importESModule("resource://gre/modules/TooltipTextProvider.sys.mjs").TooltipTextProvider.prototype)`
)));
delete this[meth]; return "resource://" + subst;
},
psInit: proto => {
if (proto.getTextPlus) return proto.getNodeText = proto.getTextPlus.newGetNodeText;
//================[ start content ]================
proto.getTextPlus = node => {
var href = getHref(node);
if (!href || href == "#" || skipRe.test(href)) return;
if (href.startsWith("data:")) return crop(href, 64);
return crop(decode(href));
}
var skipRe = /^(?:javascript|addons):/;
var getHref = node => {do {
if (HTMLAnchorElement.isInstance(node) && node.href) return node.href;
} while (node = node.flattenedTreeParentNode)}
var crop = (url, max = 128) => url.length <= max
? url : url.slice(0, --max) + "\u2026"; // ellipsis
var decode = url => {
var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var ldu = ChromeUtils.importESModule("moz-src:///browser/components/urlbar/UrlbarInput.sys.mjs", {}).losslessDecodeURI;
return (decode = url => {try {return ldu(ios.newURI(url));} catch {return url;}})(url);
}
//================[ end content ]==================
var func = proto.getTextPlus.getNodeText = proto.getNodeText;
proto.getTextPlus.newGetNodeText = proto.getNodeText = function(node, text) {
var res = func.apply(this, arguments);
if (!res && !(node?.localName != "browser" && node.ownerGlobal && node.ownerDocument))
return false;
var txt = this.getTextPlus(node), add = "";
return txt ? text.value = res ? text.value + "\n" + txt + add : txt + add : res;
}
},
psDestroy: proto => {
proto.getNodeText = proto.getTextPlus.getNodeText;
}
}).init())} catch(ex) {Cu.reportError(ex);}
})();
Alles anzeigen
Hoffe die funktioniert.
Mfg.
Endor
In Memoriam:
Neil Sedaka ist tot.
Oh! Carol einer seiner größten Hits.
R.I.P.
Mfg.
Endor
Nur zur Info, der Eintrag wird durch das Script UndoListInTabmenuToo.uc.js
von Alice eingefügt.
bzw.
Mfg.
Endor
Ja habe ich auch hier, aber erst im Firefox 149 wie im Script angegeben.
Trotzdem danke für den Hinweis.
Mfg.
Endor
ausgegraut (inaktiv)...
und mit Rechtsklick drauf wird hier auch ein Kontextmenü angezeigt.
statt [image] image
Macht keinen Unterschied.
Aber das passt hier jetzt ja.
Hatte oben ja nochmals geändert.
Vielen Dank für Deine Mühe.
Mfg.
Endor
Wenn ich es so mache:
#mainPopupSet menupopup[needsgutter] > menuitem:not([type="checkbox"], [class="menuitem-iconic"],
[type="radio"], [checked], [image]) > .menu-icon {display: none !important; }
dann funktioniert es auch bei der vor und zurück Schaltfläche.
[needsgutter] braucht es. Ohne tut sich nichts.
Mfg.
Endor
Nein leider nicht, auch ohne [needsgutter] nichts.
Du hast recht es liegt nicht an deinem, sondern an diesem:
@media (-moz-platform: windows) {
menupopup[needsgutter] > menuitem:not([type="checkbox"], [class="menuitem-iconic"] ,[type="radio"], [checked]) > .menu-icon {display: none !important;}
}
Dein letzter passt irgendwie besser.
Hast Du für obigen eine Idee?
Mfg.
Endor
Woll'n wir's hoffen.
Habe leider doch noch ein Problem entdeckt:
Kontextmenü bei Vor und Zurückpfeil in Navigationsleiste sind die Symbole weg.
Mfg.
Endor
Prima. Nun ist es aber wirklich perfekt.
Vielen Dank für Deine Mühe.
Mfg.
Endor