probier das evtl. mal aus
Habe ich auch mal gemacht, vielleicht hilft Dir das weiter: funzt auch nicht!
probier das evtl. mal aus
Habe ich auch mal gemacht, vielleicht hilft Dir das weiter: funzt auch nicht!
Habe gerade mal mit Deinem (doch sehr unwahrscheinlichem) Szenario getestet. Hier funzt damit kein Button (Release +Linux)!
wenn das zuerst (bei Programmstart) geöffnete Fx Fenster geschlossen wurde - falls man mit mehreren Fenstern arbeitet - funktioniert dieser Scriptaufbau nicht mehr, jedenfalls hier.
Was hier klappt:
Hier funzt Dein gerade gepostetes Script unter den von Dir geschilderten Bedingungen auch nicht (Linux).
ich war mal so frei, und habe das für ihn gemacht
Aus kosmetischen Gründen (beeinflußt die Funktion nicht) könnte man in Zeile 33 noch ein ';' anhängen. Der Code ist dann einfach bessser lesbar (
).
onCommand();
Und um Verwirrungen mit 'Inline Event Handlers' aus dem Weg zu gehen könnte die Funktion auch einen anderen Namen erhalten.
Und hier meins:
Icon: 16synchronization_moz.svg
// JavaScript Document
// B_RestartFirefox.uc.js
// Das Script erstellt einen Button, der Firefox neu startet. Linksklick: Neustart MIT löschen Js-Cache \ Mittelklick: Neustart OHNE löschen Js-Cache \ Rechtsklick: Neustart OHNE löschen Js-Cache. Das .svg-Icon kann - je nach Hover-Zustand - mit zwei unterschiedlichen Farben gefüllt werden [fill].
// Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'.
(function() {
if (!window.gBrowser)
return;
// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const id = 'restart-button'; // Id des neuen Buttons
const label = 'Restart - Quicklink'; // Bezeichnung des neuen Buttons
const tooltiptext = 'Restart - Quicklink\n\nLinksklick: Neustart MIT löschen Js-Cache\nMittelklick: Neustart OHNE löschen Js-Cache\nRechtsklick: Neustart OHNE löschen Js-Cache';
// Icon-------------------------------------------------------
const icon = '16synchronization_moz.svg'; // [Name.Dateiendung] des anzuzeigenden Symbols
const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet
const iconColOu = 'red'; // 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 Buttons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOv keine Funktion)
// ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
const cl = '.toolbarbutton-icon';
//----
if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
}
//----
CustomizableUI.createWidget({
id: id,
type: 'button',
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.fill = iconColOu;
//over
button.addEventListener('mouseover', () => {
button.style.fill = iconColOv;
button.querySelector(cl).style.rotate = '90deg';
});
//out
button.addEventListener('mouseout', () => {
button.style.fill = iconColOu;
button.querySelector(cl).style.rotate = '0deg';
});
//click
button.addEventListener('click', () => {
if (event.button == 0) {
Services.appinfo.invalidateCachesOnRestart();
Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
}
else
if (event.button == 1 || event.button == 2) {
Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
}
});
}
});
//----
})();
Alles anzeigen
Ich habe in einigen Beiträgen (UserPref betreffende Button-) Scripte angeboten. Post
und Folgende
Bug: Die Buttons wurden in einem neuen Fenster nicht angezeigt. Dieser Fehler ist jetzt behoben. Download mit Icons als gepackte Datei: UserPrefScripte.zip
Vielleicht bringt dich das weiter:
Aber bei deinem Vorhaben einzelne Ordner oder Lesezeichen in der Sidebar anzusprechen, sehe ich keine Möglichkeit.
Bei mir ist die Schaltfläche "Alle Tabs wieder öffnen" oberhalb der Liste, auch in einem neuen Profil...
Quelle:
Es geht jedoch so etwas
In der Tat wäre dies etwas kürzer, aber auch wieder etwas schlechter lesbar.
Schrägstrich im Pfad sind wichtig für die Funktionalität, so dass man darauf hinweisen könnte, sie nicht zu entfernen
Kann man machen aber 'copy and paste' aus einem Dateimanager sollte man dann schon voraussetzen können.
Und ich habe noch eine weitere Variante:
Das funzt?
Zeile 18 = 25 ?
Ich nutze dieses Skript, funktionierte nicht mehr in Nightly
Ich hätte nur ein Alternativ-Script:
Icon: 16_library-big_moz.svg
// JavaScript Document
// B_Bookmarks-manager.uc.js
// Das Script erstellt einen Button, der die Bibliothek öffnet. Das .svg-Icon kann - je nach Hover-Zustand - mit zwei unterschiedlichen Farben gefüllt werden [fill].
// Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'.
(function() {
if (!window.gBrowser)
return;
// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const id = 'bookmarks-manager-button'; // Id des neuen Buttons
const label = 'Bibliothek'; // Bezeichnung des neuen Buttons
const tooltiptext = 'Bibliothek';
// Icon-------------------------------------------------------
const icon = '16_library-big_moz.svg' // [Name.Dateiendung] des anzuzeigenden Symbols
const iconPath = '/chrome/icons/' // Pfad zum Ordner der das Icon beinhaltet
const iconColOu = 'teal'; // 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 Buttons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOv keine Funktion)
// ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
//----
if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
}
//----
CustomizableUI.createWidget({
id: id,
defaultArea: CustomizableUI.AREA_NAVBAR,
label: label,
tooltiptext: tooltiptext,
onCreated: (button) => {
button.style.MozContextProperties = 'fill';
button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
}
});
const el = document.getElementById(id);
const cl = '.toolbarbutton-icon';
//start
el.querySelector(cl).style.fill = iconColOu;
//over
el.addEventListener('mouseover', () => {
el.querySelector(cl).style.fill = iconColOv;
});
//out
el.addEventListener('mouseout', () => {
el.querySelector(cl).style.fill = iconColOu;
});
//click
el.addEventListener('click', () => {
if (event.button == 0) {
// PlacesCommandHook.showPlacesOrganizer('History');
openTrustedLinkIn('chrome://browser/content/places/places.xhtml', 'tab');
}
});
//----
})();
Alles anzeigen
(hätte ich auch vor ewigen Zeiten schon mal nachfragen können)
Oder ich hätte das (vor äonen von Jahren) mal korrigieren sollen![]()
Ich nutze u.a. dieses Skript:
Genau dieses Script geändert und ungetestet im Nightly!
(function() {
if (location != 'chrome://browser/content/browser.xhtml')
return;
let menuitem = document.createXULElement('menuitem');
menuitem.id = 'context_closeLeftTabs';
menuitem.setAttribute('label', 'Linke Tabs schließen');
let tabContextMenu = document.getElementById('tabContextMenu');
let refItem = document.getElementById('context_undoCloseTab');
tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheEnd'), refItem);
tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheStart'), refItem);
tabContextMenu.insertBefore(document.getElementById('context_closeOtherTabs'), refItem);
//tabContextMenu.removeChild(document.getElementById('context_closeTabOptions'));
//click
menuitem.addEventListener('click', () => {
if (event.button == 0) {
for (let i = TabContextMenu.contextTab._tPos - 1; i >= 0; i--)gBrowser.removeTab(gBrowser.tabs[i], {animate: true});
}
});
})();
Alles anzeigen
Tab schließen + Kontextmenü auch in dem Einstellungsfenster
Vielleicht reicht das schon aus; ungetestet! Zeile 19 ersetzen mit:
?
Eins hab ich noch..
Auch nur wieder ein Alternativ-Script aus meiner Sammlung (Icons aus #23):
// JavaScript Document
// B_UserPrefToolbarTip.uc.js
// Das Script erstellt einen Button, der in about:config boolsche Werte ändert. In der UserConfiguration unter 'const boolPref' kann die zu ändernde Einstellung festgelegt werden. Das icon/label/tooltiptext kann in der UserConfiguration dem jeweiligen Zustand angepasst werden (true/false).
// Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'.
(function() {
if (!window.gBrowser)
return;
// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const id = 'UserPref-t_t-button'; // Id des neuen Buttons
const boolPref = 'browser.chrome.toolbar_tips'; // Einstellung in about:config deren boolesche Variable geschaltet werden soll
const labelT = 'Tooltips aktiviert'; // Bezeichnung des neuen Buttons bei boolPref=true
const labelF = 'Tooltips deaktiviert'; // Bezeichnung des neuen Buttons bei boolPref=false
const tooltiptextT = 'Tooltips aktiviert';
const tooltiptextF = 'Tooltips deaktiviert';
// Icon-------------------------------------------------------
const iconT = '16-control-panel-20_moz.svg'; // [Name.Dateiendung] des anzuzeigenden Symbols für boolPref=true
const iconF = '16-control-panel-18_moz.svg'; // [Name.Dateiendung] des anzuzeigenden Symbols für boolPref=false
const bgImage = 'greenyellow'; // Farbe des Indikators (zur Unterscheidung mehrerer UserPref-buttons;)
const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet
const iconColorT = 'forestgreen'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties] für boolPref=true, bei anderen Icons hat const iconColorT keine Funktion)
const iconColorF = 'firebrick'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties] für boolPref=false, bei anderen Icons hat const iconColorF keine Funktion)
// ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
//----
if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
}
//----
CustomizableUI.createWidget({
id: id,
defaultArea: CustomizableUI.AREA_NAVBAR,
onCreated: function(button) {
button.style.MozContextProperties = 'fill';
//bgImage
button.style = 'background-image:linear-gradient('+bgImage+','+bgImage+'); background-repeat: no-repeat; background-size: 4px 4px; background-position: left 2px top calc(50% - 8px);';
}
});
const el = document.getElementById(id);
const cl = '.toolbarbutton-icon';
//start
if (Services.prefs.getBoolPref(boolPref) == false ) {
el.querySelector(cl).style.fill = iconColorF;
el.style.listStyleImage = 'url("' + curProfDir + iconPath + iconF + '")';
el.setAttribute('label', labelF);
el.setAttribute('tooltiptext', tooltiptextF);
}
else
if (Services.prefs.getBoolPref(boolPref) == true ) {
el.querySelector(cl).style.fill = iconColorT;
el.style.listStyleImage = 'url("' + curProfDir + iconPath + iconT + '")';
el.setAttribute('label', labelT);
el.setAttribute('tooltiptext', tooltiptextT);
}
//click
el.addEventListener('click', () => {
if (event.button == 0) {
if (Services.prefs.getBoolPref(boolPref) == false ) {
el.querySelector(cl).style.fill = iconColorT;
Services.prefs.setBoolPref(boolPref, true);
el.style.listStyleImage = 'url("' + curProfDir + iconPath + iconT + '")';
el.setAttribute('label', labelT);
el.setAttribute('tooltiptext', tooltiptextT);
}
else
if (Services.prefs.getBoolPref(boolPref) == true ) {
el.querySelector(cl).style.fill = iconColorF;
Services.prefs.setBoolPref(boolPref, false);
el.style.listStyleImage = 'url("' + curProfDir + iconPath + iconF + '")';
el.setAttribute('label', labelF);
el.setAttribute('tooltiptext', tooltiptextF);
}
}
});
//----
})();
Alles anzeigen
Wie Du vielleicht bemerkt hast, ist mir die 'ConfigArea' in meinen Scripten sehr wichtig. Es gibt Menschen, die kaum Ahnung von JavaScript haben die Möglichkeit einfach ein Script zu konfigurieren. Deshalb gibt es z.B. die Möglichkeit den Pfad einzustellen (const iconPath = '/chrome/icons/';). Außerdem nutze ich meist mehrere Icons in den Pfaden zu den ListStylImages. Wenn ein 'switch' besser als ein 'if' sein sollte, benutze ich diesen auch. Aber trotzdem: Danke für Deine Anmerkungen!
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
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!,
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!!
Funktioniert das angepasste Script aus #91 bei dir nicht?
Habe leider kein Nightly zum testen...