Nö, ich auch (dann wären wir schon zu dritt).
Oh, doch 50% mehr Nutzer, als vermutet...
Eine Lsg. bei diesem doch komplizierten Script wäre schön...
Funktioniert das angepasste Script aus #91 bei dir nicht?
Nö, ich auch (dann wären wir schon zu dritt).
Oh, doch 50% mehr Nutzer, als vermutet...
Eine Lsg. bei diesem doch komplizierten Script wäre schön...
Funktioniert das angepasste Script aus #91 bei dir nicht?
Wegen der Funktion an den Anfang oder das Ende einer Page zu scrollen,
nutze ich dieses Skript:
//SkipToTopAndBottom.uc.js
(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.listStyleImage='url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiElEQVR42mNkoBAw4pFjAuIWIP4NxA1A/J8UA0Ca5wFxPJQ/C4gzsBnCSIRmBnyGMBKpGachjCRoxmoII4maMQyBGVAOxB1EaoaBEiDuxRaI4kD8AocmCSB+iS8QRw2AAHYgfgXEfGjin4BYDIh/EjIABNyBuAyIuaD8b0DcBcQ70RXiy41EAQBJ/SQRxtinwAAAAABJRU5ErkJggg==")';
menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + up) + '")';
// menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo(0,0) ' , false);");
menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo({ top: 0, left: 0, behavior: \"smooth\" }) ' , 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.listStyleImage='url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhUlEQVR42mNkoBAw4hB3B+IyIOaC8r8BcRcQ7yTGAHYgfgXEfGjin4BYDIh/EjJAHIhf4HCZBBC/HDUAuwHFQNzDQBqoAOJORiSDZgBxGpGaFwJxEhD/Q/YCsYbANWMLA0KGoGjGFYi4DMHQjMsAbIZg1YzPAJhcAxCzAnENNs2EDCAKAADTlCMRQhQlFQAAAABJRU5ErkJggg==")';
menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + down) + '")';
// menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo(0,100000) ' , false);");
menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo({ top: 100000, left: 0, behavior: \"smooth\" }) ' , false);");
let refItem = document.getElementById('context-reload');
refItem.parentNode.insertBefore(menuitem, refItem);
})();
Alles anzeigen
Wie immer Symbole und eventuell den Pfad ändern!
Ach, Mensch, grisu2099. Zu spät. Aber Firefox brauchte bei mir gerade eine Ewigkeit, um die Forumsseite nach einem Neustart wieder zu laden.
Funktioniert das angepasste Script aus #91 bei dir nicht?
Habe leider kein Nightly zum testen...
Mal bitte diese Version testen...
Funktioniert hier...
Wegen der Funktion an den Anfang oder das Ende einer Page zu scrollen,
nutze ich dieses Skript:
Funktioniert nicht, da in dem Skript menuitem.setAttribute('oncommand', [...] genutzt wird.
Habe leider kein Nightly zum testen...
Brauchst du auch gar nicht. Wenn du das angepasste Skript in der Release-Version testest und es genau das macht, was das Skript vorher gemacht hat, dann wird es auch in der Nightly funktionieren.
Funktioniert hier...
Wenn ich, wie hier in diesem Script, abschreiben kann, kann ich auch Java-Script....
Wieder eins weniger in der Liste...
Ich hab hier noch eins, wo du schon mal dran warst. Kriegst du das jetzt auch wieder hin?
// ==UserScript==
// @name newTabButtonUndoTabList.uc.js
// @description Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü
// @description der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt.
// @description Von BrokenHeart - camp-firefox.de wieder lauffähig gemacht
// @adresse https://www.camp-firefox.de/forum/thema/112673-userchrome-js-scripte-f%C3%BCr-den-fuchs-diskussion/?postID=1223749#post1223749
// @include main
// ==/UserScript==
(function () {
if (!window.gBrowser){
return;
}
gBrowser.tabContainer.addEventListener('click', function (e) {
if (e.originalTarget.id != 'tabs-newtab-button') return;
switch (e.button) {
case 1:
undoCloseTab(0);
break;
case 2:
UCT.makePopup(e);
event.preventDefault();
break;
}
}, false);
})();
var UCT = {
init: function () {
var mp = document.createXULElement("menupopup");
mp.id = "undo-close-tab-list";
mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
mp.setAttribute("placespopup", true);
mp.setAttribute("tooltip", "bhTooltip");
mp.setAttribute("popupsinherittooltip", true);
document?.getElementById("mainPopupSet")?.appendChild(mp);
},
makePopup: function (e) {
if (SessionStore.getClosedTabCountForWindow(window) != 0) {
document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
}
else
{
console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
}
},
onpopupshowing: function (e) {
var popup = e.target;
while (popup.hasChildNodes())
popup.removeChild(popup.firstChild);
let undoItems = SessionStore.getClosedTabDataForWindow(window);
undoItems.map(function (item, id) {
var m = document.createXULElement('menuitem');
m.setAttribute('label', item.title);
m.setAttribute('image', item.image );
m.setAttribute('class', 'menuitem-iconic bookmark-item');
m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
popup.appendChild(m);
});
popup.appendChild(document.createXULElement("menuseparator"));
m = document.createXULElement("menuitem");
m.setAttribute("label", "Chronik in der Sidebar öffnen");
m.setAttribute("image", "chrome://browser/skin/history.svg");
m.setAttribute("class", "menuitem-iconic");
m.setAttribute("oncommand", "SidebarUI.toggle('viewHistorySidebar');");
popup.appendChild(m);
},
};
setTimeout(function() {
UCT.init();
},250);
Alles anzeigen
BrokenHeart Im Skript aus Beitrag #91 ist in Zeile 55 noch ein schwerer Fall von ondblclick. Ansonsten funktioniert das Skript wohl offenbar. Das Symbol sehe ich nicht, ist wohl bei mir nicht vorhanden.
Brauchst du auch gar nicht. Wenn du das angepasste Skript in der Release-Version testest und es genau das macht, was das Skript vorher gemacht hat, dann wird es auch in der Nightly funktionieren.
Getestet in Release und funzt!
Danke!!
Im Skript aus Beitrag #91 ist in Zeile 55 noch ein schwerer Fall von ondblclick.
Stimmt, danke für den Hinweis. Schau ich mir morgen an. Auf die Schnelle funktioniert hier der Doppelklick auf das Icon nicht. Öffnet 'about:config' schon bei einem einfachen Klick mit der rechten Maustaste. Daher eigentlich auch überflüssig, oder?
Ich hab hier noch eins, wo du schon mal dran warst. Kriegst du das jetzt auch wieder hin?
Das müsste eigentlich funktionieren, tut es aber (bei mir) nicht . Keine Ahnung, was da im Argen liegt . Schau ich mir morgen nochmal an.
// ==UserScript==
// @name newTabButtonUndoTabList.uc.js
// @description Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü
// @description der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt.
// @description Von BrokenHeart - camp-firefox.de wieder lauffähig gemacht
// @adresse https://www.camp-firefox.de/forum/thema/112673-userchrome-js-scripte-f%C3%BCr-den-fuchs-diskussion/?postID=1223749#post1223749
// @include main
// ==/UserScript==
(function () {
if (!window.gBrowser){
return;
}
gBrowser.tabContainer.addEventListener('click', function (e) {
if (e.originalTarget.id != 'tabs-newtab-button') return;
switch (e.button) {
case 1:
undoCloseTab(0);
break;
case 2:
UCT.makePopup(e);
event.preventDefault();
break;
}
}, false);
})();
var UCT = {
init: function () {
var mp = document.createXULElement("menupopup");
mp.id = "undo-close-tab-list";
//mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
mp.addEventListener('popupshowing', function(event) {
UCT.onpopupshowing(event);
}, true);
mp.setAttribute("placespopup", true);
mp.setAttribute("tooltip", "bhTooltip");
mp.setAttribute("popupsinherittooltip", true);
document?.getElementById("mainPopupSet")?.appendChild(mp);
},
makePopup: function (e) {
if (SessionStore.getClosedTabCountForWindow(window) != 0) {
document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
}
else
{
console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
}
},
onpopupshowing: function (e) {
var popup = e.target;
while (popup.hasChildNodes())
popup.removeChild(popup.firstChild);
let undoItems = SessionStore.getClosedTabDataForWindow(window);
undoItems.map(function (item, id) {
var m = document.createXULElement('menuitem');
m.setAttribute('label', item.title);
m.setAttribute('image', item.image );
m.setAttribute('class', 'menuitem-iconic bookmark-item');
//m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
m.addEventListener('command', function(event) {
undoCloseTab(' + id + ');
}, true);
popup.appendChild(m);
});
popup.appendChild(document.createXULElement("menuseparator"));
m = document.createXULElement("menuitem");
m.setAttribute("label", "Chronik in der Sidebar öffnen");
m.setAttribute("image", "chrome://browser/skin/history.svg");
m.setAttribute("class", "menuitem-iconic");
//m.setAttribute("oncommand", "SidebarUI.toggle('viewHistorySidebar');");
m.addEventListener('command', function(event) {
SidebarUI.toggle('viewHistorySidebar');
}, true);
popup.appendChild(m);
},
};
setTimeout(function() {
UCT.init();
},250);
Alles anzeigen
Mitleser Die Inline-Eventhandler sind ja schon lange nur eine Altlast nebenher, die Variante mit addEventListener und seinem Gegenstück removeEventListener gibt es ja schon seit einer Ewigkeit.
Keine Ahnung, was da im Argen liegt
In Zeile 55 ist noch der Inline-Eventhandler onpopupshowing, auf den in Zeile 36 wohl Bezug genommen wird.
Das müsste eigentlich funktionieren, tut es aber (bei mir) nicht
Hier läuft es... Danke dafür!
In Zeile 55 ist noch der Inline-Eventhandler onpopupshowing, auf den in Zeile 36 wohl Bezug genommen wird.
Nein. onpopupshowing ist kein Inline-Eventhandler sondern ein vom Autor des Skripts gewählter Name für eine Funktion, wie bei OnCommand und OnCreated . Er hat sich halt nicht an eine etwaige Mozilla-Namenskonvention gehalten, falls es die überhaupt für Objekt-Eigenschaftsnamen gibt .
Hier läuft es... Danke dafür!
Gerne .
Ja, jetzt läuft es hier auch. Ich hatte sehr viele Tabs offen und dann wird der '+'-Button außerhalb des Scrollbereichs für die Tabs dargestellt und dann funktioniert es nicht mehr. Sollte man natürlich auch mal anpassen...
Mitleser Die Inline-Eventhandler sind ja schon lange nur eine Altlast nebenher, die Variante mit addEventListener und seinem Gegenstück removeEventListener gibt es ja schon seit einer Ewigkeit.
Ach so , Danke!,
BrokenHeart Jep!
Habe mir die 136.0a1 parallel installiert und meine Skripts alle durch getestet!
Es sind acht an der Zahl, die nicht mehr funktionieren.
/* Restart item script for Firefox 89+ by Aris
- left-click on restart item: normal restart
- middle-click on restart item: restart + clear caches
- right-click on restart item: no special function
- option: display restart icon in menubars 'File' menu
- option: display restart icon in main menus popup
- based on 'addRestartButton.uc.js' script by Alice0775
- restart code from Classic Theme Restorer add-on
- invalidate caches from Session Saver add-on
https://github.com/Aris-t2/CustomJSforFx/blob/master/scripts/restart_item_in_menu.uc.js
*/
var appversion = parseInt(Services.appinfo.version);
var menuicon = false;
var appmenuicon = false;
var RestartMenuFileAppItems = {
init: function() {
var button_label = "Neustart";
try {
restartitem_appmenu = document.createXULElement("toolbarbutton");
restartitem_appmenu.setAttribute("label", button_label);
restartitem_appmenu.setAttribute("id","appMenu-restart-button");
restartitem_appmenu.setAttribute("class","subviewbutton");
restartitem_appmenu.setAttribute("insertbefore", "appMenu-quit-button2");
restartitem_appmenu.setAttribute("onclick", "if (event.button == 0) {RestartMenuFileAppItems.restartApp(false);} else if (event.button == 1) {RestartMenuFileAppItems.restartApp(true)};");
restartitem_appmenu.setAttribute("oncommand", "RestartMenuFileAppItems.restartApp(false);");
var AMObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if(document.querySelector("#appMenu-restart-button") == null ) document.querySelector("#appMenu-quit-button2").parentNode.insertBefore(restartitem_appmenu,document.getElementById("appMenu-quit-button2"));
});
});
AMObserver.observe(document.querySelector("#PanelUI-menu-button"), { attributes: true, attributeFilter: ['open'] });
} catch(e) {}
let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons')); // Pfad zum Profilordner und gleich in den entsprechenden Unterordner
let ButtonIcon = "restart.svg"; // Name & Dateiendung des anzuzeigenden Symbols!
let sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
let uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
#appMenu-restart-button { list-style-image: url("${ProfilePath}/${ButtonIcon}") }
#appMenu-restart-button > .toolbarbutton-icon {
margin-inline-end: 6px !important;
width: 19px !important;
height: 19px !important;
}
#appMenu-restart-button > image:nth-child(1) {
margin-left: -2px !important;
}
`), null, null);
sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
},
restartApp: function(clearcaches) {
var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"].createInstance(Components.interfaces.nsISupportsPRBool);
var observerSvc = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
if(clearcaches) {
Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).invalidateCachesOnRestart();
}
observerSvc.notifyObservers(cancelQuit, "quit-application-requested", "restart");
if(cancelQuit.data) return false;
Services.startup.quit(Services.startup.eRestart | Services.startup.eAttemptQuit);
}
}
RestartMenuFileAppItems.init();
Alles anzeigen
// ==UserScript==
// @name
// @description Tab schließen + Kontextmenü auch in dem Einstellungsfenster
// @charset UTF-8
// @author @aborix
// @version v2024.09.10
// @note Vorlage Script von @aborix (+ Änderungen von @milupo aus dem Fuchsforum 1.10.24)
// @note Zeile 32 Anpassung von @milupo ( 08.10.2024 ab Fx 132 > tabbrowser-tabbox statt appcontent)
// Zeile 29 https://www.camp-firefox.de/forum/thema/112673/?postID=1247653#post1247653
// Zeile 32 https://www.camp-firefox.de/forum/thema/138429/?postID=1257843#post1257843
// Source https://www.camp-firefox.de/forum/thema/131567/?postID=1158359#post1158359
// Weitere Url https://www.camp-firefox.de/forum/thema/138429/?postID=1257796#post1257796
// Weitere Url https://www.camp-firefox.de/forum/thema/138429/?postID=1257854#post1257854
// Weitere Url https://www.camp-firefox.de/forum/thema/112673/?postID=1247653#post1247653
(function() {
if (!window.gBrowser)
return;
var contextMenu = document.getElementById('contentAreaContextMenu');
var menuseparator = document.createXULElement('menuseparator');
menuseparator.id = 'context-sep-closetab';
contextMenu.append(menuseparator);
var menuitem = document.createXULElement('menuitem');
menuitem.id = 'context-closetab';
menuitem.setAttribute('label', 'Tab schließen');
menuitem.setAttribute('oncommand', 'BrowserCommands.closeTabOrWindow();');
contextMenu.append(menuitem);
var appcontent = document.getElementById('tabbrowser-tabbox');
appcontent.addEventListener('contextmenu', event => {
setTimeout(() => {
if (gContextMenu && !gContextMenu.shouldDisplay) {
for (let string of 'back forward reload bookmarkpage'.split(' ')) {
document.getElementById('context-' + string).removeAttribute('hidden');
}
document.getElementById('context-stop').setAttribute('hidden', 'true');
const A = 'navigation sep-navigation savepage sep-paste selectall sep-viewsource viewsource viewinfo sep-bidi inspect-a11y inspect sep-closetab closetab'.split(' ');
for (let node of contextMenu.childNodes) {
if (A.includes(node.id.substring(8)))
node.removeAttribute('hidden');
else
node.setAttribute('hidden', 'true');
}
contextMenu.openPopupAtScreen(event.screenX, event.screenY, true, event);
}
}, 50);
});
})();
Alles anzeigen
// Translate_DeepL.uc.js
// https://github.com/ardiman/userChrome.js/tree/master/contexttranslate
// ex ContextTranslate.uc.js///
// modifiziert by universum 123, Umlaute geändert by 2002Andreas
// https://www.camp-firefox.de/forum/thema/126100/?postID=1107070#post1107070
(function () {
if (location.href !== 'chrome://browser/content/browser.xhtml') return;
let translate = function () {
let browserMM = gBrowser.selectedBrowser.messageManager;
browserMM.addMessageListener('getSelection', function listener(message) {
let t = (message.data !== '');
let e = (document.charset || document.characterSet);
if (t) {
openWebLinkIn('https://www.deepl.com/translator#en/de/' + encodeURIComponent(message.data), 'tab');
} else {
openWebLinkIn('https://www.deepl.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab');
};
browserMM.removeMessageListener('getSelection', listener, true);
});
browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true);
}
let menuitem = document.createXULElement('menuitem');
menuitem.id = 'context-DeepLtranslate';
menuitem.setAttribute('label', '\u00dcbersetzen (DeepL)');
menuitem.setAttribute('oncommand', '(' + translate.toString() + ')()');
menuitem.classList.add('menuitem-iconic');
let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
let ButtonIcon = "DeepL_2.png";
menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + ButtonIcon) + '")';
let refItem = document.getElementById('context-inspect');
refItem.parentNode.insertBefore(menuitem, refItem);
})();
Alles anzeigen
Das hier ist dem Vorherigen sehr ähnlich, nur dass per Google übersetzt wird!
// ContextTranslate_Google.uc.js
// https://github.com/ardiman/userChrome.js/tree/master/contexttranslate
// ex ContextTranslate.uc.js///
// modifiziert by universum 123, Umlaute geändert by 2002Andreas
// https://www.camp-firefox.de/forum/thema/126100/?postID=1107070#post1107070
(function () {
if (location != 'chrome://browser/content/browser.xhtml')
return;
let translate = function () {
let browserMM = gBrowser.selectedBrowser.messageManager;
browserMM.addMessageListener('getSelection', function listener(message) {
let t = (message.data !== '');
let e = (document.charset || document.characterSet);
if (t) {
openWebLinkIn('https://translate.google.com/?sl=en&tl=de&text=' + encodeURIComponent(message.data), 'tab');
} else {
openWebLinkIn('https://translate.google.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab');
};
browserMM.removeMessageListener('getSelection', listener, true);
});
browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true);
}
let menuitem = document.createXULElement('menuitem');
menuitem.id = 'context-googletranslate';
menuitem.setAttribute('label', '\u00dcbersetzen (Google)');
menuitem.setAttribute('oncommand', '(' + translate.toString() + ')()');
menuitem.classList.add('menuitem-iconic');
let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
let ButtonIcon = "Google.svg";
menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + ButtonIcon) + '")';
let refItem = document.getElementById('context-inspect');
refItem.parentNode.insertBefore(menuitem, refItem);
})();
Alles anzeigen
// newTabButtonUndoTabList.uc.js
"use strict";
/* ******************************************************************************************************** */
/* Beschreibung */
/* Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü, */
/* der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt. */
/* Customized by BrokenHeart */
/* */
/* https://www.camp-firefox.de/forum/thema/112673/?postID=1223733#post1223733 */
/* https://www.camp-firefox.de/forum/thema/112673/?postID=1228286#post1228286 */
/* */
/* ******************************************************************************************************** */
(function () {
if (!window.gBrowser){
return;
}
gBrowser.tabContainer.addEventListener('click', function (e) {
if (e.originalTarget.id != 'tabs-newtab-button') return;
switch (e.button) {
case 1:
undoCloseTab(0);
break;
case 2:
UCT.makePopup(e);
event.preventDefault();
break;
}
}, false);
})();
var UCT = {
init: function () {
var mp = document.createXULElement("menupopup");
mp.id = "undo-close-tab-list";
mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
mp.setAttribute("placespopup", true);
mp.setAttribute("tooltip", "bhTooltip");
mp.setAttribute("popupsinherittooltip", true);
document?.getElementById("mainPopupSet")?.appendChild(mp);
},
makePopup: function (e) {
if (SessionStore.getClosedTabCountForWindow(window) != 0) {
document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
}
else
{
console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
}
},
onpopupshowing: function (e) {
var popup = e.target;
while (popup.hasChildNodes())
popup.removeChild(popup.firstChild);
let undoItems = SessionStore.getClosedTabDataForWindow(window);
undoItems.map(function (item, id) {
var m = document.createXULElement('menuitem');
m.setAttribute('label', item.title);
m.setAttribute('image', item.image );
m.setAttribute('class', 'menuitem-iconic bookmark-item');
m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
popup.appendChild(m);
});
},
};
setTimeout(function() {
UCT.init();
},250);
Alles anzeigen
Das hatte ich schon mal gepostet, funktioniert aber nicht!
//SkipToTopAndBottom.uc.js
(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.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + up) + '")';
menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo({ top: 0, left: 0, behavior: \"smooth\" }) ' , 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.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + down) + '")';
menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo({ top: 100000, left: 0, behavior: \"smooth\" }) ' , false);");
let refItem = document.getElementById('context-reload');
refItem.parentNode.insertBefore(menuitem, refItem);
})();
Alles anzeigen
// ==UserScript==
// @name UndoListInTabmenuToo.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description Kürzlich geschlossene Tabsliste in Tab-Kontext und Hauptkontextmenü einfügen.
// @include main
// @compatibility Firefox 117
// @author Alice0775
// @version 2023/07/02 Einträge für Fenster entfernt
// @version 2023/06/16 08:00 Bug 1819675 - Expand recently closed tabs to include all Windows
// @version 2022/05/10 fix ref to context-media-eme-separator
// @version 2021/12/09 remove JSON.parse (Bug 1733425)
// @version 2021/04/25 fix 1689378
// @version 2019/11/14 remove eval
// @version 2019/06/30 10:00 Bug 1555060 Convert <tabs> to a custom element
// @version 2019/06/24 23:00 wait for gBrowser initialized
// @version 2019/05/21 08:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement
// @version 2018/05/10 60
// @version 2017/11/18 nsIPrefBranch to nsIPrefBranch
// @version 2010/09/18 00:00 4.0b7pre
// @version 2009/02/03 13:00 Tab-Verlauf im Tooltip anzeigen
// @Note Fügt die UndoClose-Tab-Liste zu Tabs und Kontextmenüs hinzu
// @OriginalCode Orginalcode aus browser.js für populateUndoSubmenu verwenden
// @version 2018/05/09 15:00 61
// ==/UserScript==
// @version 2010/03/26 13:00 Minefield/3.7a4pre Bug 554991 - allow tab context menu to be modified by normal XUL overlays
// @version 2010/03/15 00:00 Minefield/3.7a4pre Bug 347930 - Tab strip should be a toolbar instead
// @version 2009/09/09 15:00 Mittelklick-Handhabung
// @version 2009/09/03 22:00 Firefox3.7a1pre Funktion wurde wieder hergestellt. (Bug 489925. getElementById should not return anonymous nodes)
// @version 2009/08/22 00:00 Firefox3.6 Ändern des stringbandle
// @version 2009/04/24 00:00 #394759 [Firefox:Session Restore]-Add undo close window feature
// @version 2008/10/12 18:00 Fx3.0.4pre Mittelklick-Popupmenü wurde nicht geschlossen und andere Korrekturen
// @version 2007/10/05 10:00
var UndoListInTabmenu = {
// -- config --
TABCONTEXTMENU : false , //Im Tabkontextmenü: anzeigen: true, nicht anzeigen: false
CONTEXTMENU : false, //Im Hauptkontextmenü: anzeigen: true , nicht anzeigen: false
// -- config end--
ss: null,
get tabContext() {
return document.getElementById("tabContextMenu");
},
get navigatorBundle() {
return Services.strings.createBundle(
"chrome://browser/locale/browser.properties"
);
},
init: function(){
var css =`
#tabContextUndoList :is(menu,menuitem),
#ContextUndoList :is(menu,menuitem) {
min-height: 20px !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
}
`;
var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
if (this.TABCONTEXTMENU){
//Tabkontextmenü
var tabContext = this.tabContext;
this.makePopup(tabContext, null, "tabContextUndoList");
}
if (this.CONTEXTMENU){
//Hauptkontextmenü
var contextMenu = document.getElementById("contentAreaContextMenu");
var refItem = document.getElementById("context-media-eme-separator");
this.makePopup(contextMenu, refItem, "ContextUndoList");
}
// Geschlossene Tabs dem NS-Sitzungsspeicher entnehmen
this._ss = SessionStore;
},
makePopup: function(popup, refItem, id){
var menu;
//label
const locale = "de";
//Liste kürzlich geschlossener Tabs
const LABELTEXT = "Kürzlich geschlossene Tabs"; //create menu
menu = document.createXULElement("menu");
menu.setAttribute("label", LABELTEXT);
menu.setAttribute("accesskey", "T");
if (id)
menu.setAttribute("id", id);
var menupopup = document.createXULElement("menupopup");
menupopup.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoSubmenu(this);");
menu.appendChild(menupopup);
popup.insertBefore(menu, refItem);
//Eventlistener hinzufügen
popup.addEventListener('popupshowing',function(event) {
UndoListInTabmenu.toggleRecentlyClosedWindows();
if (UndoListInTabmenu._ss.getClosedTabCount(window) == 0) {
menu.setAttribute("disabled", true);
return;
}
menu.removeAttribute("disabled");
},false);
},
/* Befüllen, wenn das Chronik-Menü geöffnet ist (Fx3.6) */
populateUndoSubmenu: function(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
var utils = RecentlyClosedTabsAndWindowsMenuUtils;
var tabsFragment = utils.getTabsFragment(
window,
"menuitem",
aPrefixRestoreAll = true,
"menu-history-reopen-all-tabs"
);
undoPopup.appendChild(tabsFragment);
undoPopup.firstChild.setAttribute("accesskey", "R");
var m = undoPopup.insertBefore(document.createXULElement("menuitem"), undoPopup.childNodes[0]);
m.setAttribute("label", "Letzten geschlossenen Tab wieder öffnen (s)");
m.setAttribute("oncommand", "undoCloseTab()");
m.setAttribute("accesskey", "o");
undoPopup.insertBefore(document.createXULElement(""), undoPopup.childNodes[2]);
// populate tab historis for tooltip
var undoItems = UndoListInTabmenu._ss.getClosedTabDataForWindow(window);
for (var i = 0; i < undoItems.length; i++) {
var entries = undoItems[i].state.entries;
var tooltiptext = "";
for (var j = entries.length - 1; j > -1; j--){
if (j != entries.length - 1)
tooltiptext += "\n";
tooltiptext += parseInt(j + 1, 10) + ". " + entries[j].title;
}
undoPopup.childNodes[i + 2/*restore all, sep*/].setAttribute("tooltiptext", tooltiptext);
}
// "Append Clear undo close tb list"
undoPopup.appendChild(document.createXULElement(""));
m = undoPopup.appendChild(document.createXULElement("menuitem"));
m.setAttribute("label", "Liste der letzten Tabs l\u00F6schen");
m.setAttribute("accesskey", "h");
m.addEventListener("command", function() {
let prefs = Services.prefs;
let max_undo = prefs.getIntPref("browser.sessionstore.max_tabs_undo");
prefs.setIntPref("browser.sessionstore.max_tabs_undo", 0);
prefs.setIntPref("browser.sessionstore.max_tabs_undo", max_undo);
}, false);
},
toggleRecentlyClosedWindows: function PHM_toggleRecentlyClosedWindows() {
// enable/disable the Recently Closed Windows sub menu
let undoPopup = this.historyUndoWindowPopup3;
// no restorable windows, so disable menu
if (this._ss.getClosedWindowCount() == 0)
this.historyUndoWindowPopup3.parentNode.setAttribute("disabled", true);
else
this.historyUndoWindowPopup3.parentNode.removeAttribute("disabled");
},
/**
* Populate when the history menu is opened
*/
populateUndoWindowSubmenu: function PHM_populateUndoWindowSubmenu(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
let utils = RecentlyClosedTabsAndWindowsMenuUtils;
let windowsFragment = utils.getWindowsFragment(
window,
"menuitem",
aPrefixRestoreAll = true,
"menu-history-reopen-all-windows"
);
undoPopup.appendChild(windowsFragment);
undoPopup.firstChild.setAttribute("accesskey", "R");
undoPopup.insertBefore(document.createXULElement(""), undoPopup.childNodes[1]);
}
};
// Wir sollten die Weiterleitung nur starten, wenn das Browserfenster den Startprozess abgeschlossen hat
// Ansonsten sollten wir warten, bis der Start abgeschlossen ist.
if (gBrowserInit.delayedStartupFinished) {
UndoListInTabmenu.init();
}
else {
let delayedStartupFinished = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" &&
subject == window) {
Services.obs.removeObserver(delayedStartupFinished, topic);
UndoListInTabmenu.init();
}
};
Services.obs.addObserver(delayedStartupFinished,
"browser-delayed-startup-finished");
}
Alles anzeigen
Und das Letzte ist zu groß (lang), als dass ich es hier posten könnte.
Deshalb als ZIP
Ich hätte dies:
Translate_DeepL.uc.js
16_deepl_logo_moz.svg
// JavaScript Document
// M_Translate_DeepL.uc.js
// Das Script erstellt einen neuen Menüeintrag. Beim Klick auf den Eintrag öffnet die Seite https://www.deepl.com/...in einem neuen Tab und der vorher markierte Text wird übernommen.
// Bug: Sprache erkennen funktioniert nicht.
// Das .svg-Icon kann - je nach Hover-Zustand - mit zwei unterschiedlichen Farben gefüllt werden [fill]. Beim Überfahren des Menuitems vergrößert sich das Icon [scale: 1.1].
// Das Menü für den Menüeintrag kann selektiert werden (Seitenkontextmenü oder Tabkontextmenü).
// Die Position des Menüeintrags innerhalb des Menüs kann bestimmt werden.
// Darstellung des Menüeintrags mit/ohne Icon kann gewählt werden.
// Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script - bei gewählter Iconanzeige [const isIcon = 1;] - die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'.
(function() {
if (!window.gBrowser)
return;
// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const id = 'contextDeepletranslate'; // ID des neuen menuitems
const label = 'Deepl Translate'; // Bezeichnung des neuen menuitems
const tooltiptext = 'Mit DeeplTranslate übersetzen';
// Icon-------------------------------------------------------
const isIcon = 1;
// const isIcon = 1; mit Icon
// const isIcon = 0; ohne Icon; die Konstanten icon, iconPath, iconColOu und iconColOv haben dann keine Funktion und sollten unberührt bleiben
const icon = '16_deepl_logo_moz.svg'; // [Name.Dateiendung] des anzuzeigenden Symbols
const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet
const iconColOu = 'steelblue'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOu keine Funktion)
const iconColOv = 'currentColor'; // Farbe des Icons beim Überfahren des Items (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOv keine Funktion)
// Menü-------------------------------------------------------
const isMenu = 1;
// const isMenu = 1; für Seitenkontextmenü;
// const isMenu = 2; für Tabkontextmenü';
const isPos = 'context-translate-selection';
// Option A:
// const isPos = 12; [Zahlen von -5 bis 20]
// Menuitem an einer bestimmten Position im Menü einfügen
// wie in CSS: [order:12!important;]
// Option B:
// const isPos = 'context-translate-selection'; [String]
// Menuitem auf diesen Menüpunkt folgend einfügen
// wie in CSS: [#context-translate-selection]
// ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
const cl = 'image';
const menu1 = document.getElementById('contentAreaContextMenu');
const menu2 = document.getElementById('tabContextMenu');
const menuitem = document.createXULElement('menuitem');
menuitem.id = id;
menuitem.setAttribute('label', label);
menuitem.setAttribute('tooltiptext', tooltiptext);
//mit Icon
if (isIcon === 1) {
//----
if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
}
//----
menuitem.classList.add('menuitem-iconic');
menuitem.style.MozContextProperties = 'fill';
menuitem.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
//Icon start
switch (isMenu) {
case 1:
menu1.addEventListener('popupshowing', () => {
menuitem.querySelector(cl).style.fill = iconColOu;
});
break;
case 2:
menu2.addEventListener('popupshowing', () => {
menuitem.querySelector(cl).style.fill = iconColOu;
});
break;
}
//Icon over
menuitem.addEventListener('mouseover', () => {
menuitem.querySelector(cl).setAttribute('style','fill:'+iconColOv+';scale: 1.1;transition: scale 0.2s ease-in-out 0.0s;');
});
//Icon out
menuitem.addEventListener('mouseout', () => {
menuitem.querySelector(cl).setAttribute('style','fill:'+iconColOu+';scale: 1.0;transition: scale 0.2s ease-in-out 0.0s;');
});
}
//Icon end
//click
menuitem.addEventListener('click', () => {
if (event.button == 0) {
translate();
}
});
//Position order
if (isPos > -6 && isPos < 21) {
if (isMenu === 1) {
menu1.append(menuitem);
}
else
if (isMenu === 2) {
menu2.append(menuitem);
}
menuitem.style.order = isPos;
}
//Position reference
else {
const refItem = document.getElementById(isPos);
refItem.parentNode.insertBefore(menuitem, refItem.nextSibling);
}
//----
function translate() {
const browserMM = gBrowser.selectedBrowser.messageManager;
browserMM.addMessageListener('getSelection', function listener(message) {
const t = (message.data !== '');
const e = (document.charset || document.characterSet);
if (t) {
openTrustedLinkIn('https://www.deepl.com/translator#en/de/' + encodeURIComponent(message.data), 'tab');
}
else {
openTrustedLinkIn('https://www.deepl.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab');
};
browserMM.removeMessageListener('getSelection', listener, true);
});
browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true);
};
//----
})();
Alles anzeigen
/* Restart item script for Firefox 89+ by Aris
Du hattest doch schon ein anderes Restart-Script hier gepostet...
// newTabButtonUndoTabList.uc.js
Siehe #109
//SkipToTopAndBottom.uc.js
Siehe #100
zu1.
Oh, ehrlich? Dann muss ich noch mal schauen.
zu2.
Habe ich übersehen! Sorry.
zu3.
Danke, habe ich nach diesem "Muster" korrigiert.
Nachtrag!
zu2.
let undoItems = SessionStore.getClosedTabDataForWindow(window);
undoItems.map(function (item, id) {
var m = document.createXULElement('menuitem');
m.setAttribute('label', item.title);
m.setAttribute('image', item.image );
m.setAttribute('class', 'menuitem-iconic bookmark-item');
// m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
m.addEventListener('command', function(event) {
undoCloseTab(' + id + ');
}, true);
popup.appendChild(m);
});
Alles anzeigen
will einfach nicht! Why?
Nachtrag II
Ich Hirni ! Zeile 40 vergessen. Jetzt funktioniert es.
Letzter Nachtrag!
zu1.
Ja, aber es funktioniert wohl ganz anders und ich habe jenes gar nicht in Benutzung,
sondern habe nur jenes von FuchsFan angepasst!
"Mein" Skript generiert einen verschiebbaren Button.
Kann man für einzelne Skripts nicht ein Unterforum aufmachen
Oder eine Liste, in denen die Skripte verlinkt werden. Das kann aber immer nur einer bearbeiten (plus Admin und Moderator).
Das stört mich quasi schon von Anfang an. Ich hatte mal ein ergänzendes Wiki vorgeschlagen. Der Vorteil wäre, dass dort mehr als eine Person editieren könnten.
Hallo,
funktioniert bei mir auch nicht.
(function() {
// Add "Restart" to menu > file
var menuitem = document.createXULElement('menuitem');
menuitem.id = 'uc_menu_Restart';
menuitem.setAttribute('label' , 'Neustarten');
menuitem.setAttribute('oncommand' , "Services.appinfo.invalidateCachesOnRestart() || Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);");
var refItem = document.getElementById('menu_FileQuitItem');
refItem.parentNode.insertBefore(menuitem, refItem);
})();
Alles anzeigen
Mal bitte diese Version testen...
grisu2099 Funktioniert perfekt, danke: