In Zeile 653 einmal entfernen, dann funktioniert es auch in Nightly wieder.
Erledigt..
Danke dir für den Hinweis und milupo für die Codeanpassung!
In Zeile 653 einmal entfernen, dann funktioniert es auch in Nightly wieder.
Erledigt..
Danke dir für den Hinweis und milupo für die Codeanpassung!
Skript, um die Tableiste unter die Lesezeichen-Symbolleiste zu schieben
Es geht übrigens auch ohne Skript: tabs_below_navigation_toolbar.css · Aris-t2/CustomCSSforFx.
Wozu aber 193 Zeilen, wenn es 6 Zeilen auch tun? Der CSS-Code macht viel mehr, als nur die Tableiste zu verschieben.
Übrigens: Ich habe gestern schon die nötige Änderung für das Skript an Aris gemeldet.
Meine Frage hat sich erledigt, glaube ich.
Habe mir Sörens Beitrag noch einmal ganz genau durchgelesen
und glaube, es geht darum, dass nach dem onclick der Code ähnlich dem CSS ausschaut.
Wenn danach aber eine Funktion "function(aDocument)" kommt oder ein "Name" einer Funktion,
dann trifft das von milupo angesprochene nicht zu.
Ich hoffe, es wird verstanden, was ich da schreibe, und dass ich richtig liege.
und glaube, es geht darum, dass nach dem onclick der Code ähnlich dem CSS ausschaut.
Wenn danach aber eine Funktion "function(aDocument)" kommt oder ein "Name" einer Funktion,
dann trifft das von milupo angesprochene nicht zu.
Ich weiß nicht, was du mit „ähnlich dem CSS ausschaut“ meinst. Aber grundsätzlich ist es genau das Gleiche, ob du den Funktionsnamen angibst und die Funktion an anderer Stelle definierst oder ob du die Funktion direkt an die Stelle schreibst:
CustomizableUI.createWidget({
/* … */
onCommand: onCommand
});
function onCommand (event) {
/* … */
}
… ist identisch zu:
Es ist nicht so, dass man alles umbauen müsste, wo irgendetwas steht, was mit on beginnt. Am Beispiel von deinem Beitrag #4059:
In deinem ersten Script steht:
In dem Fall ist onCommand Teil der CustomizableUI.createWidget-API. Es gibt keinen Grund, hier etwas zu ändern, solange Mozilla seine API nicht ändert. Gleiches gilt für onBuild im zweiten Script.
Was in deinem zweiten Script allerdings anders ist:
let toolbaritem = aDocument.createXULElement('toolbarbutton');
let props = {
/* … */
oncommand: 'Services.dirsvc.get("UChrm", Ci.nsIFile).launch();'
};
for (let p in props)
toolbaritem.setAttribute(p, props[p]);
Hier ist oncommand kein Teil einer Firefox-API, sondern du arbeitest mit dem DOM, also vereinfacht gesagt den HTML- / XUL-Elementen. Du erstellst ein Element (createXULElement), definierst dann in props eine Reihe von Attributen und gehst in der for-Schleife schließlich über alle Einträge von props, um diese via setAttribute() für eben jenes Element als Attribut zu setzen. Das könnte ohne dieses Objekt auch so aussehen, wenn du es direkt schreiben würdest:
let toolbaritem = aDocument.createXULElement('toolbarbutton');
/* … */
toolbaritem.setAttribute('oncommand', 'Services.dirsvc.get("UChrm", Ci.nsIFile).launch();');
Diese Schreibweise macht es vielleicht deutlicher. Es geht um genau diese Fälle, wo du ein on*-Attribut im HTML / XUL setzt, wo sich stattdessen addEventlistener nutzen lässt:
let toolbaritem = aDocument.createXULElement('toolbarbutton');
/* … */
toolbaritem.addEventListener('command', function () {
Services.dirsvc.get('UChrm', Ci.nsIFile).launch();
};
Oder eben in der moderneren Syntax, die mit ECMAScript 6 (ES6) eingeführt wurde:
Ich weiß nicht, was du mit „ähnlich dem CSS ausschaut“ meinst. Aber grundsätzlich ist es genau das Gleiche, ob du den Funktionsnamen angibst und die Funktion an anderer Stelle definierst oder ob du die Funktion direkt an die Stelle schreibst:
Du nanntest es, glaube ich, "String".
Zitat von SörenMan setzt dann eben nicht mehr das onclick-Attribut und dann den Code als String, sondern verwendet die addEventListener-Methode und schreibt den Code direkt
Aber ist ja nicht wirklich soo wichtig, finde ich.
Wichtig ist, dass ich Dich scheinbar richtig verstanden habe! Nicht alles, was mit "on" anfängt, muss geändert werden.
Ich blicke nur gerade nicht, welche Codezeilen Du da ausgelassen hast.
Was mache ich denn mit den anderen Attributen?
Wie bekomme ich diese denn hier noch unter?
let toolbaritem = aDocument.createXULElement('toolbarbutton');
/* … */
toolbaritem.addEventListener('command', () => {
Services.dirsvc.get('UChrm', Ci.nsIFile).launch();
});
AHHHH! Habe mir gerade Dein geändertes Skript angeschaut.
Ich belasse es dabei!
let props = {
id: 'Open-Chrome-Folder-ToolBarButton',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: 'Chrome-Ordner',
tooltiptext: 'Chrome-Ordner öffnen',
};
for (let p in props)
toolbaritem.setAttribute(p, props[p]);
toolbaritem.addEventListener('command', () => {
Services.dirsvc.get('UChrm', Ci.nsIFile).launch();
});
return toolbaritem;
Alles anzeigen
Du nanntest es, glaube ich, "String".
Ein „String“ meint im Kontext der Programmierung gewöhnlichen Text. Was ich damit meinte, war ganz einfach, dass wenn du das Script als großen Textblock hier im Forum einfügst, alles in der gleichen Farbe dargestellt wird und du nicht die Syntax-Hervorhebung bekommst, die du bekommst, wenn der Code als JavaScript erkannt wird. Und das macht für die Lesbarkeit schon sehr viel aus.
Ich blicke nur gerade nicht, welche Codezeilen Du da ausgelassen hast.
Ich habe alles ausgelassen, was für die Frage nicht relevant war. So wie in deinem Nachtrag passt das also. Nur eine Anmerkung zwecks Lesbarkeit:
for (let p in props)
toolbaritem.setAttribute(p, props[p]);
toolbaritem.addEventListener('command', () => {
Services.dirsvc.get('UChrm', Ci.nsIFile).launch();
});
Die Einrückung ist nicht gut. Und während das zwar für die Funktion keine Rolle spielt, zeigt sehr gut, wieso ich kein Freund davon bin, geschweifte Klammern wegzulassen, auch wenn diese optional sind. Konkret geht es darum:
Eigentlich würde man das so schreiben:
Die Klammern kannst du nur weglassen, weil es nur eine einzige Zeile dazwischen gibt. Aber so, wie der Code formatiert ist, könnte man fälschlicherweise auf die Idee gebracht werden, dass die folgende Zeile auch als Teil der Schleife ausgeführt wird, obwohl es gar nicht so ist:
Und das nur, weil beide Zeilen an der gleichen Position beginnen:
Also wie gesagt: Funktional alles in Ordnung. Aber die Lesbarkeit würde ich optimieren, um nicht irgendwann durcheinander zu kommen. Erstens immer Klammern setzen, zweitens Einrückung. So sieht der obige doch schon viel übersichtlicher aus und hilft beim Vermeiden von Fehlern:
let props = {
id: 'Open-Chrome-Folder-ToolBarButton',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: 'Chrome-Ordner',
tooltiptext: 'Chrome-Ordner öffnen'
};
for (let p in props) {
toolbaritem.setAttribute(p, props[p]);
}
toolbaritem.addEventListener('command', () => {
Services.dirsvc.get('UChrm', Ci.nsIFile).launch();
});
Alles anzeigen
Hier mal das ganze Skript.
(function() {
if (location != "chrome://browser/content/browser.xhtml") return;
try {
CustomizableUI.createWidget({
id: 'Open-Chrome-Folder-ToolBarButton',
type: 'custom',
onBuild: function(aDocument) {
let toolbaritem = aDocument.createXULElement('toolbarbutton');
let props = {
id: 'Open-Chrome-Folder-ToolBarButton',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: 'Chrome-Ordner',
tooltiptext: 'Chrome-Ordner öffnen',
// oncommand: 'Services.dirsvc.get("UChrm", Ci.nsIFile).launch();'
};
for (var p in props) {
toolbaritem.setAttribute(p, props[p]);
}
/* Neu */
toolbaritem.addEventListener('command', () => {
Services.dirsvc.get('UChrm', Ci.nsIFile).launch();
});
/* Bis hier */
return toolbaritem;
}
});
} catch(e){}
})();
Alles anzeigen
Das meinst Du doch so?
Schon besser. Dieser Block:
toolbaritem.addEventListener('command', () => {
Services.dirsvc.get('UChrm', Ci.nsIFile).launch();
});
… müsste eigentlich noch um ein Zeichen nach links gerückt werden, um auf der gleichen Ebene wie der Code darüber und darunter zu starten, und auch die Kommentare sind merkwürdig platziert. Aber das, was tatsächlich zu Irritationen führen könnte, ist gelöst.
Ich Danke Dir.
Wenn ich aber diesen Block um ein Zeichen nach links rücke,
stimmt das aber doch nicht mehr mit der "Schleife" onBuild: function(aDocument) { ..... } überein.
Zeile 8 - Zeile 28
Aber nochmals vielen Dank, habe nun alle meine Skripte überarbeitet und korrigiert.
Die Kommentare fliegen dann auch irgendwann raus, sowie die "toten" Codezeilen.
Ist ja erst einmal nur für mich, damit ich besser sehen kann, was ich gegenüber den "Backups" geändert habe.
Wenn ich aber diesen Block um ein Zeichen nach links rücke,
stimmt das aber doch nicht mehr mit der "Schleife" onBuild: function(aDocument) { ..... } überein.
Zeile 8 - Zeile 28
Nur um ein einziges Zeichen. Du rückst in deinem gesamten Script mit vier Zeichen ein, die drei genannten Zeilen sind mit fünf Zeichen eingerückt. Deswegen stehen diese drei Zeilen nicht direkt unter der for-Schleife und nicht direkt über dem return, sondern versetzt.
Das ist nur eine Kleinigkeit und tut für die Übersichtlichkeit nicht mehr viel. Mir sticht das nur sofort ins Auge. Und wenn du eh schon dabei bist, die Einrückung zu verbessern …
Adleraugen?
Ist aber interessanterweise nur hier so!
In den Skripten ist es richtig, deshalb habe ich Dich wohl auch falsch verstanden.
Aber dennoch Danke, so habe ich alle noch einmal kontrolliert.
Wozu aber 193 Zeilen, wenn es 6 Zeilen auch tun?
Ja, wenn man aber die gesamte Sammlung sowieso auf den Rechner hat oder wenn man keine Skripte nutzt, reicht der Stil.
Übrigens: Ich habe gestern schon die nötige Änderung für das Skript an Aris gemeldet.
Jepp, hab ich bemerkt.
Hallo Leute, benutze das Script "Tooltips.us.js".
Funktioniert soweit auch gut. Nur hat sich ja vor kurzem die Tabvorschau geändert, habe bei mir das Voschaubild abgeschaltet und sehe nur den Tooltip. Nur ist ber leider schwarz mit weisser Schrift. Nun frage ich mich, ob es nicht möglich wäre den Tooltip der Tabvorschau auch in das Script einzubinden, damit ich die Farben und auch die Schriftart ändern kann. Wäre toll, wenn jemand helfen könnte.
Ach ja, hier noch mein benutztes Script:
// Tooltips.us.js
"use strict";
/* Firefox userChrome.js tweaks - 'Custom Tooltips' for Firefox ************************************************************** */
/* Inspired by Mary-J. auf Camp-Firefox.de *********************************************************************************** */
/* https://www.camp-firefox.de/forum/thema/112673/?postID=1223252#post1223252
/* *************************************************************************************************************************** */
/* Customized by Mira********************************************************************************************************* */
/* https://www.camp-firefox.de/forum/thema/112673/?postID=1223348#post1223348 ************************************************ */
/* *************************************************************************************************************************** */
(function() {
if (location.href !== 'chrome://browser/content/browser.xhtml') return;
var css =`
tooltip[label="Add-ons aktualisieren"],
tooltip[label="Anwendungsmenü öffnen"],
tooltip[label="Erweiterungen"],
tooltip[label="Firefox-Startseite"],
tooltip[label="Geschlossenen Tab wiederherstellen"],
tooltip[label="Morning Coffee Quantum"],
tooltip[label="Morning Coffee"],
tooltip[label="MySessions"],
tooltip[label="Neustart (der userChrome.js-Cache wird geleert)"],
tooltip[label="Normalgröße (Strg+0)"],
tooltip[label="uBlock Origin (0)"],
tooltip[label="uBlock Origin (off)"],
tooltip[label="Browser-Werkzeuge"],
tooltip[label="Werkzeuge für Web-Entwickler"],
tooltip[label="Lesezeichenleiste ein-/ausblenden"],
tooltip[label="Verkleinern (Strg+-)"],
tooltip[label="Vergrößern (Strg++)"],
tooltip[label="Verifiziert von: Cloudflare, Inc."],
tooltip[label="Verifiziert von: Starfield Technologies, Inc."],
tooltip[label="Verifiziert von: Let's Encrypt"],
tooltip[label="Verifiziert von: DigiCert Inc"],
tooltip[label^="U"],
tooltip[label^="Q"],
#tabbrowser-tab-tooltip,
#dynamic-shortcut-tooltip,
#back-button-tooltip,
#forward-button-tooltip {
appearance: none !important;
background-color: none !important;
font-family: EurostileExtended.cursive;
font-size: 13px !important;
color: #1E90FF !important;
border: 2px solid #0000CD !important;
border-radius: 4px !important;
box-shadow: none !important;
padding: 5px 7px 5px 7px !important;
width: auto !important;
height: auto !important;
vertical-align: middle !important;
overflow: hidden !important;
}
tooltip[label^="S"] {
appearance: none !important;
background-color: none !important;
font-family: EurostileExtended.cursive;
font-size: 13px !important;
color: #1E90FF !important;
border: 2px solid #0000CD !important;
border-radius: 4px !important;
box-shadow: none !important;
padding: 5px 7px 5px 7px !important;
width: auto !important;
height: auto !important;
vertical-align: middle !important;
overflow: hidden !important;
}
tooltip,
.balloonTooltip {
appearance: none !important;
background-color: #333333CC !important;
font-family: EurostileExtended.cursive;
font-size: 13px !important;
color: #1E90FF !important;
border: 2px solid #0000CD !important;
border-radius: 4px !important;
box-shadow: none !important;
padding: 5px 7px 5px 7px !important;
width: auto !important;
height: auto !important;
vertical-align: middle !important;
overflow: hidden !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.AGENT_SHEET);
})();
Alles anzeigen
Gruß
Michael (mkpcxxl)
Hallo Leute, benutze das Script "Tooltips.us.js".
Funktioniert soweit auch gut. Nur hat sich ja vor kurzem die Tabvorschau geändert, habe bei mir das Voschaubild abgeschaltet und sehe nur den Tooltip. Nur ist ber leider schwarz mit weisser Schrift. Nun frage ich mich, ob es nicht möglich wäre den Tooltip der Tabvorschau auch in das Script einzubinden, damit ich die Farben und auch die Schriftart ändern kann. Wäre toll, wenn jemand helfen könnte.
...
Gruß
Michael (mkpcxxl)
Ergänze!
.tab-preview-title {
font-size: 13px !important;
font-weight: 400 !important;
font-family: Segoe UI !important;
color: red !important;
}
.tab-preview-uri {
font-size: 13px !important;
font-weight: 400 !important;
font-family: Segoe UI !important;
color: blueviolet !important;
}
.tab-preview-text-container {
background: lime !important;
}
Alles anzeigen
Nun ja, und passe die Farben und Schriftart, Größe usw. Deinen Wünschen an.
Mira_Belle : Ja super funktioniert, habe Schriftart und Farben angepasst und jetzt sieht das richtig gut aus.
Danke dafür, einen schönen Sonntag noch.
Gruß
Michael (mkpcxxl)
Es freut mich, wenn ich Dir helfen konnte.
Hallo zusammen.
Bitte testet mal dieses Script.
Es fügt dem Rechtsklick Kontextmenü der Lesezeichen
den Eintrag Lesezeichen Seitenleiste öffnen hinzu.
Öffnet sich bei Euch die Seitenleiste?
// ==UserScript==
// @name openSidebarContextMenu.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description Seitenleiste über das Kontextmenü von Lesezeichen öffnen (einschließlich Suchergebnissen)
// @description Nachahmung von goParentFolder (Seitenleistenversion von openLibraryContextMenu.uc.js)
// @include main
// @include chrome://browser/content/places/places.xhtml
// @include chrome://browser/content/places/bookmarksSidebar.xhtml
// @author Alice0775
// @compatibility 132
// @version 2024/09/02 Bug 1916098 - Remove appcontent box.
// @version 2024/05/05 Bug 1892965 - Rename Sidebar launcher and SidebarUI
// @version 2023/01/10 Bug 1382992 - Remove the synchronous getFolderIdForItem()
// @version 2021/12/24 remove menu in sidebar due to Bug 469441
// @version 2021/06/22 remove document.popupNode
// @version 2020/12/14 fix ucjs_expand_sidebar hack
// @version 2020/12/14 simplify & ucjs_expand_sidebar hack
// @version 2020/12/13 simplify
// @version 2020/12/13 save folder state
// @version 2020/12/12
// ==/UserScript==
var openSidebarContextMenu = {
init: function () {
this.db = this.openDB();
var placesContext = document.getElementById("placesContext");
if (!placesContext) return;
if (location.href == "chrome://browser/content/places/bookmarksSidebar.xhtml") return;
var menuitem = document.createXULElement("menuitem");
menuitem.id = "placesContext_manageFolder3";
menuitem.setAttribute("label", "Lesezeichen Seitenleiste öffnen");
menuitem.setAttribute("accesskey", "L");
menuitem.setAttribute("selectiontype", "single");
menuitem.setAttribute("selection", "bookmark|folder|query|livemark/feedURI");
menuitem.setAttribute("oncommand", "openSidebarContextMenu.showSidebar(this.parentNode.triggerNode);");
var afterNode = placesContext.firstChild;
placesContext.insertBefore(menuitem, afterNode);
},
showSidebar: function(atriggerNode) {
let view = PlacesUIUtils.getViewForNode(atriggerNode);
let node = view.selectedNode;
let win = Services.wm.getMostRecentWindow("navigator:browser");
win.SidebarController._show("viewBookmarksSidebar").then(() => {
let sidebarWin = win.SidebarController.browser.contentWindow;
sidebarWin.openSidebarContextMenu.show(node);
// xxx ucjs_expand_sidebar hack
if (typeof win.ucjs_expand_sidebar != "undefined" ) {
win.SidebarController._box.collapsed = false;
win.SidebarController._splitter.hidden = false;
win.ucjs_expand_sidebar._opend = true;
win.ucjs_expand_sidebar._loadKeepItSizes("viewBookmarksSidebar");
if (win.ucjs_expand_sidebar._FLOATING_SIDEBAR) {
let x = win.document.getElementById("tabbrowser-tabbox").getBoundingClientRect().x;
win.ucjs_expand_sidebar._sidebar_box.style.setProperty("left", x + "px", "");
}
}
/// xxx
});
},
show: function(node) {
let delay = 0;
let tree = document.getElementById("bookmarks-view");
if (document.getElementById("search-box").value) {
document.getElementById("search-box").value = "";
tree.place = tree.place;
delay = 250;
}
let guid = node.bookmarkGuid
setTimeout(() => {
let aFolderItemId = openSidebarContextMenu.getFolderIdForItem(node.itemId);
if (aFolderItemId) {
tree.selectItems([guid]);
} else {
return;
}
// xxx
this.xulStore(tree);
let index = tree.currentIndex;
if (tree.view.isContainer(index)) {
if (!tree.view.isContainerOpen(index)) {
tree.view.toggleOpenState(index);
}
let e = tree.view.selection.currentIndex
tree.scrollToRow(e)
} else {
tree.ensureRowIsVisible(index);
}
tree.focus();
}, delay);
},
xulStore: function(tree) {
let docURI = tree.ownerDocument.documentURI;
let view = tree.view;
let node = view.nodeForTreeIndex(tree.currentIndex);
var parent = node.parent;
if (parent) {
// Build a list of all of the nodes that are the parent of this one
// in the result.
var parents = [];
var root = tree.result.root;
while (parent && parent != root) {
parents.push(parent);
parent = parent.parent;
}
// Walk the list backwards (opening from the root of the hierarchy)
// opening each folder as we go.
for (var i = parents.length - 1; i >= 0; --i) {
let index = view.treeIndexForNode(parents[i]);
if (index != -1 && view.isContainer(index)) {
let node = view._rows[index];
let uri = node.uri;
if (node.containerOpen) {
Services.xulStore.setValue(docURI, uri, "open", "true");
} else {
Services.xulStore.removeValue(docURI, uri, "open");
}
}
}
}
},
getFolderIdForItem: function(aItemId) {
let sql = `SELECT b.id, h.url, b.title, b.position, b.fk, b.parent AS folderId, b.type,
b.dateAdded, b.lastModified, b.guid, t.guid, t.parent,
b.syncStatus
FROM moz_bookmarks b
LEFT JOIN moz_bookmarks t ON t.id = b.parent
LEFT JOIN moz_places h ON h.id = b.fk
WHERE b.id = :item_id`;
let stmt = this.db.createStatement(sql);
stmt.params['item_id'] = aItemId;
let FolderId = null;
try {
while (stmt.executeStep()) {
FolderId = stmt.row.folderId;
}
} finally {
stmt.finalize();
}
return FolderId;
},
openDB: function() {
/*
let targetPath = PathUtils.join(
PathUtils.profileDir,
"places.sqlite"
);
let file = new FileUtils.File(targetPath);
return Services.storage.openDatabase(file);
*/
return PlacesUtils.history.DBConnection;
}
}
openSidebarContextMenu.init();
Alles anzeigen
Wenn alles passt lade ich es dann bei mir hoch.
Mfg.
Endor
Öffnet sich bei Euch die Seitenleiste?
Ja.
Klasse.
Vielen Dank.
Mfg.
Endor