Mira_Belle Vielen Dank für den Hinweis. Das hört sich echt super an, was ich bisher gelesen habe. Wenn ich wieder etwas mehr Kraft für diese Umstellung habe, dann möchte ich das unbedingt auch umsetzen/probieren.
Beiträge von GermanFreme82
-
-
2002Andreas
Ich verstehe, aber gibt es eine neue Version davon, die ich nutzen könnte, die fast das gleiche macht ?
Ich meine damit das Aussehen der TABs, das verschieben, die Reihen, die Position und keine Ahnung, was ich davon noch benötige. Ich wette, das ich nicht einmal die Hälfte davon brauch, was da noch alles drinsteckt in dem Script.
Die Funktionen sind mir nicht einmal alle bekannt darin.
Aus dem Stehgreif würde ich sagen ich brauch:
TAB
----------
Design
Position (unter Lesezeichen Symbolleiste)
6 Reihen untereinander danach Scrolleiste (oben unten Pfeile)
8 pro Reihe
verschieben
...
mehr fällt mir aktuell nicht ein. -
2002Andreas
ich muss gerade tierisch lachen 😉. Ich zeig dir mal das Ergebnis, denn Firefox macht wieder "Firefox Dinge" 🤣
Lass es mich mal so ausdrücken. Es sieht interessant aus. 😅
Das Problem siehst du dann aber auf dem nächsten Foto, was ich dir jetzt zeige. Wenn ich nämlich dann drei Leisten mit geöffneten Tabs habe und dann einen zweiten Tab anpinne, dann wird er ebenfalls an die linke Seite gerückt.
Hast du vielleicht noch eine andere Idee im Kopf, die man umsetzen könnte? Weil es gestaltet sich dann bei mehreren Tab-Leisten ziemlich schwierig dann den Überblick zu behalten. 😇 -
Hallo liebe Fuchsfreunde !
Ich habe folgendes Problem in meinem Firefox. Ich weiß nicht, wann das Problem aufgetreten ist, aber es ist jetzt einfach da und ich möchte es nicht.
Wenn ich so viele Tabs geöffnet habe, dass davon eine Zeile gefüllt ist, das Bild habe ich in diesen Beitrag reingemacht und ich pinne dann einen dieser Tabs an, ist das Verhalten völlig normal. Das sieht man auf dem Foto ganz deutlich.
Wenn ich jedoch so viele Tabs aufmache bei mir, dass man eine zweite Zeile braucht im Firefox und ich pinne dann einen dieser Tabs an, völlig egal welcher das ist, dann dreht dieses Skript völlig am Rad und läuft Amok und ich habe eine riesengroße Blase. Das brauche ich nicht.
Könnte bitte jemand in diesem Skript die Zeile reparieren, die das kaputt macht?CSS
Alles anzeigen// ==UserScript== // @name MultiRowTabLiteforFx.uc.js // @namespace Based on Alice0775's zzzz-MultiRowTab_LiteforFx48.uc.js // @description Mehrzeilige Tableiste - Experimentelle CSS Version // @include main // @compatibility Firefox141+ // @version 2025/06/30 16:58 // ==/UserScript== "use strict"; MultiRowTabLiteforFx(); function MultiRowTabLiteforFx() { if (!window.gBrowser) { return; } // -- Config -- // Vergleichbarer CSS Code in userChrome.css Datei wird vorrangig behandelt! const // Mehrzeilige Tableiste Ein/Aus Anzahl der Tabzeilen MultiRowTab_OnOff_and_TabBar_Rows = -1 ,// [-1] = Mehrzeilige Tableiste aktiv unbegrenzte Anzahl von Zeilen. // 0 = Mehrzeilige Tableiste aus. // 1 = Mehrzeilige Tableiste aktiv. Standard = 1 Zeile. Bei Berührung // der Tableiste mit der der Maus, werden die zweite und die folgenden // Zeilen bis zur angegebenen Anzahl von Zeilen angezeigt. // 2 = Mehrzeilige Tableiste aktiv. Anzahl der Tabzeilen angeben. TabBar_Rows_on_MouseOver = 3 ,// Standard = 1 Zeile. Anzahl der Zeilen angeben, die angezeigt werden sollen, // wenn der Mauszeiger über die Tableiste bewegt wird. Voraussetzung: // „MultiRowTab_OnOff_and_TabBar_Rows“ auf „1“ setzen. TabBar_DisplayTime_on_MouseOver = 1 ,// Sie können die Anzeigezeit (Sekunden) festlegen, wann die zweite und die // folgenden Zeilen beim Mouseover angezeigt werden. Das Display zeigt den // eingestellten Wert(Sekunden) an und kehrt dann zur ersten Zeile zurück. // Position der Tab-Leiste. TabBar_Position = 1 ,// [0] = Standard // 1 = unter der Symbolleiste // 2 = unter dem Fenster // Positionen der Tab-Leiste und der Lesezeichen-Symbolleiste tauschen. // sofern die Position der Tab-Leiste unterhalb der Symbolleiste festgelegt ist. // Voraussetzung: "TabBar_Position" auf "1". Bookmark_Toolbar_Position = true ,// [true] = Menüleiste, Navigationsleiste, Lesezeichenleiste, Tableiste // false = Menüleiste, Navigationsleiste, Tableiste, Lesezeichensymbolleiste // Tab-Höhe „UI-Dichte“ UI_Density_Compact = 32 ,// Standard = 29 Pixelbei Kompakt UI_Density_Normal = 32 ,// Standard = 36 Pixel bei Normal UI_Density_Touch = 41 ,// Standard = 41 Pixel bei Touch // Tab-Breite Tab_Min_Width = 165 ,// Standard - Mindestwert = 76px Tab_Max_Width = 165 ,// Standard - Maxwert = 225px // Bei gleichen Werten bei Min und Max, wird die Tabbreite fixiert! // „Tab schließen“ Schaltfläche Tab_Close_Button = 2 ,// [0] = Standard // 1 = Ausgeblendet // 2 = Auf allen Tabs anzeigen // 3 = Nur bei Mausberührung anzeigen // 4 = Aktive Tabs werden immer angezeigt, inaktive Tabs // werden beim Mouseover angezeigt. *Standard für vertikalen Tab-Modus. // ProtonUI Erscheinungsbild der Tabs ändern Proton_Margins = true ,// [true] = Darstellung ProtonUI // Die Höhe der Tab-Leiste entspricht der Höhe der UI-Dichte plus dem Leerraum darüber // und darunter. // false = Darstellung wie bei browser.proton.enabled auf false, was man vor Firefox 90 // noch einstellen konnte. // Wenn der Leerraum um die Tabs auf 0 und die Höhe auf die UI-Dichte eingestellt // ist, ist sie 4 Pixel breiter und 8 Pixel niedriger als die Standardeinstellung. // Ränder auf der linken und rechten Seite der Tabs Tab_Separators = false ,// [false] = Nicht anzeigen // true = Anzeigen // Rahmen CSS wurde extrahiert und angepasst, an Aussehen wie bei browser.proton.enabled // auf false, was man vor Firefox 90 noch einstellen konnte. // Voraussetzung: „TabBar_Position“ auf „0“ setzen. TitleBar_Button_Autohide = false ,// [false] = Aktiviert // true = Deaktiviert // Äußeren Rahmen der Titelleistenschaltfläche [-□×] reduzieren und transparent machen. TitleBar_Button_DisplayTime = 0.6 ,// Dauer der Anzeige in Sekunden, nach der Rückkehr zur Originalgröße und dem Aufheben // der Transparenz per Mouseover angeben. // Tab-Leiste von Anfang an auf die angegebene Höhe einstellen. // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf „2“ oder höher setzen. Set_the_TabBar_to_the_Specified_Height = false ,// [false] = Die Tab-Leiste wird höher, wenn der nächsten Zeile weitere Tabs hinzugefügt werden. // true = Verwendung: Die Tab-Leiste wird von Anfang an auf die angegebene Höhe eingestellt // „.tabDropIndicator“, der beim Ziehen und Ablegen eines Tabs angezeigt wird, ersetzen. // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf einen anderen Wert als „0“ setzen. Tab_Drop_Indicator = false ,// [false] = Stecknadel Symbol 📍 // true = Rote Linie (2px × 29px) als Symbol // Position der angepinnten Tabs // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf einen Wert ungleich „0“ setzen. Separate_Tabs_and_PinnedTabs = false ,// [false] = Standard // true = Angeheftete Tabs von der Tab-Leiste lösen und in die darüber liegende // Zeile verschieben. Breite der angehefteten Tabs für die Position der // angehefteten Tabs „true“ anpassen. PinnedTab_Width = false ,// [false] = Kein Standard // true = Breite angehefteter Tabs anpassen, z. B. „Tab-Breite“. PinnedTab_Min_Width = 76 ,// Standard Mindestbreite = 76 Pixel PinnedTab_Max_Width = 225 ,// Standard Maximalbreite = 225 Pixel // Bei gleichen Werten ist die Breite fixiert. // Angeheftete Tab, Schließen Schaltfläche // Voraussetzung: „Separate_Tabs_and_PinnedTabs“ auf „true“ setzen. PinnedTab_Close_Button = 0 ,// [0] = Standard // 1 = auf allen Tabs sichtbar // 2 = auf Tab bei Mouseover anzeigen // 3 = Aktiver Tab immer sichtbar, inaktiver Tab bei Mouseover sichtbar // *Standard für vertikalen Tab-Modus. // Tab-Leisten-Ziehbereich Left_Drag_Area = 0 ,// Linker Ziehbereich Breite: Standard 40 Pixel Right_Drag_Area = 0 ,// Rechter Ziehbereich Breite: Standard 40 Pixel Maximize_Left_Drag_Area = false ,// true = Linken Ziehbereich bei maximiertem Fenster anzeigen. Standard ausgeblendet. Fullscreen_Drag_Area = false ,// true = Linken und rechten Ziehbereich bei Vollbild anzeigen. Standard ausgeblendet. // Wenn die Titelleiste angezeigt wird, funktioniert sie nicht als Drag-Bereich, selbst // wenn „.titlebar-spacer“ angezeigt wird. Daher habe ich dafür gesorgt, dass sie nichts bewirkt. // -- Config Ende -- css = ` #TabsToolbar:not([collapsed="true"]) { :root[uidensity="compact"] & { --tab-min-height: ${UI_Density_Compact}px; } :root:not([uidensity]) & { --tab-min-height: ${UI_Density_Normal}px; } :root[uidensity="touch"] & { --tab-min-height: ${UI_Density_Touch}px; } &[dragtarget] { z-index: unset !important; position: unset !important; pointer-events: unset !important; /* avoid blocking dragover events on scroll buttons */ } #tabbrowser-tabs[movingtab] & { position: unset !important; } #tabbrowser-tabs[movingtab] &:is(:active, [multiselected]) { position: relative; z-index: 2; pointer-events: none; /* avoid blocking dragover events on scroll buttons */ } #tabbrowser-tabs { min-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px); ${MultiRowTab_OnOff_and_TabBar_Rows != 0 ? ` &[overflow] { padding-inline: 0 !important; & > #tabbrowser-arrowscrollbox { & > .tabbrowser-tab[pinned] { display: flex; margin-inline-start: 0 !important; position: static !important; } &::part(scrollbox) { padding-inline: 0; } } & + #new-tab-button { display: none; } } ${Tab_Drop_Indicator ? ` & > .tab-drop-indicator { background: url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAdCAIAAAAPVCo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3growJEQ5+SUQEAOb1EM8kwskcAAAAASUVORK5CYII= ) no-repeat center; } ` : ``} #tabbrowser-arrowscrollbox { &::part(scrollbox) { & > slot { flex-wrap: wrap; } ${MultiRowTab_OnOff_and_TabBar_Rows != -1 ? ` ${MultiRowTab_OnOff_and_TabBar_Rows == 1 ? ` ${TabBar_Rows_on_MouseOver == 0 || TabBar_Rows_on_MouseOver == 1 ? ` max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * 2); ` : ` max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${TabBar_Rows_on_MouseOver}); `} &:not(:hover) { max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) !important; ${Proton_Margins ? `scrollbar-width: none;` : ``} transition: all 0s ease-in-out ${TabBar_DisplayTime_on_MouseOver}s; } ` : ` ${Set_the_TabBar_to_the_Specified_Height ? ` min-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows}); & > slot { max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px); } ` : ` max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows}); `} `} overflow: hidden auto; & scrollbar { -moz-window-dragging: no-drag; } ` : ``} } &::part(overflow-start-indicator), &::part(overflow-end-indicator), &::part(scrollbutton-up), &::part(scrollbutton-down) { display: none; } ${Separate_Tabs_and_PinnedTabs ? ` &:has(> .tabbrowser-tab[fadein][pinned]) { &::part(scrollbox) { & > slot::after { display: flow-root list-item; content: ""; flex-basis: -moz-available; height: 0; overflow: hidden; } } } .tabbrowser-tab[fadein] { &:not([pinned]) { #tabbrowser-tabs[haspinnedtabs] & { &, & + :not(#tabs-newtab-button) { order: 1; } } } &[pinned] { .tab-background:after { content: "📌"; font-size: 11px; right: -2px; position: absolute; top: -2px; } ${PinnedTab_Width ? ` flex: 100 100; max-width: ${PinnedTab_Max_Width}px; min-width: ${PinnedTab_Min_Width}px; .tab-throbber, .tab-icon-pending, .tab-icon-image, .tab-sharing-icon-overlay, .tab-icon-overlay { margin-inline-end: 5.5px !important; } ${PinnedTab_Close_Button == 1 ? ` .tab-close-button { display: flex; } ` : PinnedTab_Close_Button == 2 ? ` .tab-close-button { display: none; } &:hover .tab-close-button { display: flex; } ` : PinnedTab_Close_Button == 3 ? ` &:not([selected]):hover, &[selected] { .tab-close-button { display: flex; } } ` : ``} ` : ``} } } ` : ``} #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & { & > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) { margin-inline-start: 0 !important; } } } ` : ``} } .tabbrowser-tab[fadein]:not([pinned]) { max-width: ${Tab_Max_Width}px; min-width: ${Tab_Min_Width}px; ${Tab_Close_Button == 1 ? ` .tab-close-button { display: none; } ` : Tab_Close_Button == 2 ? ` .tab-close-button { display: flex; } ` : Tab_Close_Button == 3 ? ` .tab-close-button { display: none; } &:hover .tab-close-button { display: flex; } ` : Tab_Close_Button == 4 ? ` &:not([selected]):hover { .tab-close-button { display: flex; } } ` : ``} } ${Tab_Separators ? ` .titlebar-spacer[type="pre-tabs"] { border-inline-end: 1px solid color-mix(in srgb, currentColor 20%, transparent); } .tabbrowser-tab { &::after, &::before { border-left: 1px solid color-mix(in srgb, currentColor 50%, transparent); height: calc(var(--tab-min-height) - 15%); margin-block: auto; } &:hover::after, &[multiselected]::after, #tabbrowser-tabs:not([movingtab]) &:has(+ .tabbrowser-tab:hover)::after, #tabbrowser-tabs:not([movingtab]) &:has(+ [multiselected])::after { height: 100%; } &::after, #tabbrowser-tabs[movingtab] &[visuallyselected]::before { display: flex; content: ""; } } ` : ``} ${Proton_Margins ? `` : ` .tabbrowser-tab, .toolbarbutton-1 { padding: 0; } .tabbrowser-tab, #tabs-newtab-button { height: var(--tab-min-height); } .tabbrowser-tab { .tab-background { box-shadow: none; margin-block: 0; } .tab-label-container { height: var(--tab-min-height); max-height: 24px; } .tab-close-button { height: 20px !important; padding-block: 3px !important; } &[usercontextid] > .tab-stack > .tab-background > .tab-context-line { margin-block-start: 1px !important; } } `} ${TabBar_Position == 0 ? ` .titlebar-buttonbox-container { height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px); } ${TitleBar_Button_Autohide ? ` & > .titlebar-buttonbox-container { background-color: color-mix(in srgb, currentColor 20%, transparent); position: fixed; right: 0; &:not(:hover) { height: 6px; .titlebar-button { padding: 0; } &,& .titlebar-button { opacity: 0; transition: all 0s ease-in-out ${TitleBar_Button_DisplayTime}s; } } } ` : ``} }` : ` ${TabBar_Position == 1 || TabBar_Position == 2 ? ` & > .titlebar-buttonbox-container { display: none; }} #nav-bar { &:not(.browser-titlebar) { :root[customtitlebar] #toolbar-menubar[autohide="true"] ~ &, :root[inFullscreen] #toolbar-menubar ~ & { & > .titlebar-buttonbox-container { display: flex; } } } .titlebar-button { padding-block: 0; } } ` : ``} body:has(> #navigator-toolbox:not([tabs-hidden])) { ${TabBar_Position == 1 ? ` script, toolbar:not(#TabsToolbar ${Bookmark_Toolbar_Position ? `` : `, #PersonalToolbar`}) { order: -1; } ` : TabBar_Position == 2 ? ` & > #fullscr-toggler[hidden] + tabbox, :root[inFullscreen] & > tabbox:hover { border-top: 0.01px solid var(--chrome-content-separator-color); } & > tabbox > #navigator-toolbox { border-block: none !important; } :root[inFullscreen] & { & > #navigator-toolbox { transition: none; &:has(~ tabbox:hover) { margin-top: 0 !important; } &:hover ~ tabbox > #navigator-toolbox { display: flex; } } & > tabbox:not(:hover) { border-top: 0.01px solid transparent; & > #navigator-toolbox { display: none; } } } ` : ``} } `} toolbar[id$="bar"].browser-titlebar { .titlebar-spacer { &[type="pre-tabs"] { width: ${Left_Drag_Area}px; } &[type="post-tabs"] { width: ${Right_Drag_Area}px; } ${Maximize_Left_Drag_Area ? ` :root[customtitlebar]:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] { display: flex; } ` : ``} ${Fullscreen_Drag_Area ? ` :root[customtitlebar][inFullscreen] & { display: flex; } ` : ``} } #navigator-toolbox[tabs-hidden] & { #new-tab-button { display: none; } } } `, sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css)); ["0", "2", "dragend", "SSTabRestored", "TabAttrModified"].find(eventType => { if(!sss.sheetRegistered(uri, eventType)) sss.loadAndRegisterSheet(uri, eventType); if (MultiRowTab_OnOff_and_TabBar_Rows > 0) { gBrowser.tabContainer.addEventListener(eventType, (e) => { e.target.scrollIntoView({ behavior: "instant", block: "nearest" }) }) } }) if (TabBar_Position == 2) { document.body.appendChild( document.createXULElement("tabbox") ).appendChild( document.importNode(document.getElementById("navigator-toolbox")) ).appendChild( document.adoptNode(document.getElementById("TabsToolbar")) ) } gBrowser.tabContainer._getDropIndex = function(event) { let tabToDropAt = getTabFromEventTarget(event, false); if (tabToDropAt?.localName == "tab-group") { tabToDropAt = tabToDropAt.previousSibling; if (!tabToDropAt) { tabToDropAt = gBrowser.visibleTabs[0]; } } if (!tabToDropAt) { tabToDropAt = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1]; } const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt); if (window.getComputedStyle(this).direction == "ltr") { let rect = tabToDropAt.getBoundingClientRect(); if (event.clientX < rect.x + rect.width / 2) return tabPos; else return tabPos + 1; } else { let rect = tabToDropAt.getBoundingClientRect(); if (event.clientX > rect.x + rect.width / 2) return tabPos; else return tabPos + 1; } }; // We set this to check if the listeners were added before let listenersActive = false; gBrowser.tabContainer.startTabDrag = function startTabDrag(event, tab, { fromTabList = false } = {}) { const isTab = element => gBrowser.isTab(element); const isTabGroup = element => gBrowser.isTabGroup(element); const isTabGroupLabel = element => gBrowser.isTabGroupLabel(element); if (tab.multiselected) { for (let multiselectedTab of gBrowser.selectedTabs.filter( t => t.pinned != tab.pinned )) { gBrowser.removeFromMultiSelectedTabs(multiselectedTab); } } let dataTransferOrderedTabs; if (fromTabList || isTabGroupLabel(tab)) { // Dragging a group label or an item in the all tabs menu doesn't // change the currently selected tabs, and it's not possible to select // multiple tabs from the list, thus handle only the dragged tab in // this case. dataTransferOrderedTabs = [tab]; } else { this.selectedItem = tab; let selectedTabs = gBrowser.selectedTabs; let otherSelectedTabs = selectedTabs.filter( selectedTab => selectedTab != tab ); dataTransferOrderedTabs = [tab].concat(otherSelectedTabs); } let dt = event.dataTransfer; for (let i = 0; i < dataTransferOrderedTabs.length; i++) { let dtTab = dataTransferOrderedTabs[i]; dt.mozSetDataAt(TAB_DROP_TYPE, dtTab, i); if (isTab(dtTab)) { let dtBrowser = dtTab.linkedBrowser; // We must not set text/x-moz-url or text/plain data here, // otherwise trying to detach the tab by dropping it on the desktop // may result in an "internet shortcut" dt.mozSetDataAt( "text/x-moz-text-internal", dtBrowser.currentURI.spec, i ); } } // Set the cursor to an arrow during tab drags. dt.mozCursor = "default"; // Set the tab as the source of the drag, which ensures we have a stable // node to deliver the `dragend` event. See bug 1345473. dt.addElement(tab); // Create a canvas to which we capture the current tab. // Until canvas is HiDPI-aware (bug 780362), we need to scale the desired // canvas size (in CSS pixels) to the window's backing resolution in order // to get a full-resolution drag image for use on HiDPI displays. let scale = window.devicePixelRatio; let canvas = this._dndCanvas; if (!canvas) { this._dndCanvas = canvas = document.createElementNS( "http://www.w3.org/1999/xhtml", "canvas" ); canvas.style.width = "100%"; canvas.style.height = "100%"; canvas.mozOpaque = true; } canvas.width = 160 * scale; canvas.height = 90 * scale; let toDrag = canvas; let dragImageOffset = -16; let browser = isTab(tab) && tab.linkedBrowser; if (isTabGroupLabel(tab)) { toDrag = tab; } else if (gMultiProcessBrowser) { var context = canvas.getContext("2d"); context.fillStyle = "white"; context.fillRect(0, 0, canvas.width, canvas.height); let captureListener; let platform = AppConstants.platform; // On Windows and Mac we can update the drag image during a drag // using updateDragImage. On Linux, we can use a panel. if (platform == "win" || platform == "macosx") { captureListener = function () { dt.updateDragImage(canvas, dragImageOffset, dragImageOffset); }; } else { // Create a panel to use it in setDragImage // which will tell xul to render a panel that follows // the pointer while a dnd session is on. if (!this._dndPanel) { this._dndCanvas = canvas; this._dndPanel = document.createXULElement("panel"); this._dndPanel.className = "dragfeedback-tab"; this._dndPanel.setAttribute("type", "drag"); let wrapper = document.createElementNS( "http://www.w3.org/1999/xhtml", "div" ); wrapper.style.width = "160px"; wrapper.style.height = "90px"; wrapper.appendChild(canvas); this._dndPanel.appendChild(wrapper); document.documentElement.appendChild(this._dndPanel); } toDrag = this._dndPanel; } // PageThumb is async with e10s but that's fine // since we can update the image during the dnd. PageThumbs.captureToCanvas(browser, canvas) .then(captureListener) .catch(e => console.error(e)); } else { // For the non e10s case we can just use PageThumbs // sync, so let's use the canvas for setDragImage. PageThumbs.captureToCanvas(browser, canvas).catch(e => console.error(e) ); dragImageOffset = dragImageOffset * scale; } dt.setDragImage(toDrag, dragImageOffset, dragImageOffset); // _dragData.offsetX/Y give the coordinates that the mouse should be // positioned relative to the corner of the new window created upon // dragend such that the mouse appears to have the same position // relative to the corner of the dragged tab. let clientPos = ele => { const rect = ele.getBoundingClientRect(); return this.verticalMode ? rect.top : rect.left; }; let tabOffset = clientPos(tab) - clientPos(this); let movingTabs = tab.multiselected ? gBrowser.selectedTabs : [tab]; let movingTabsSet = new Set(movingTabs); tab._dragData = { offsetX: this.verticalMode ? event.screenX - window.screenX : event.screenX - window.screenX - tabOffset, offsetY: this.verticalMode ? event.screenY - window.screenY - tabOffset : event.screenY - window.screenY, scrollPos: this.verticalMode && tab.pinned ? this.verticalPinnedTabsContainer.scrollPosition : this.arrowScrollbox.scrollPosition, screenX: event.screenX, screenY: event.screenY, movingTabs, movingTabsSet, fromTabList, tabGroupCreationColor: gBrowser.tabGroupMenu.nextUnusedColor, expandGroupOnDrop: false, }; event.stopPropagation(); } // This sets when to apply the fix (by default a new row starts after the 23th open tab, unless you changed the min-size of tabs) gBrowser.tabContainer.addEventListener("dragstart", () => { // Multiple tab select fix gBrowser.visibleTabs.forEach(t => t.style.transform = ""); // Event handling if (!listenersActive) { gBrowser.tabContainer.getDropEffectForTabDrag = function(){}; gBrowser.tabContainer._getDropEffectForTabDrag = function(){}; gBrowser.tabContainer.on_dragover = (dragoverEvent) => performTabDragOver(dragoverEvent); gBrowser.tabContainer._onDragOver = (dragoverEvent) => performTabDragOver(dragoverEvent); gBrowser.tabContainer.ondrop = (dropEvent) => performTabDropEvent(dropEvent); gBrowser.tabContainer.ondragleave = (ondragleave) => {gBrowser.tabContainer._dragTime = 0}; gBrowser.tabContainer.ondragend = (ondragend) => clearTimeout(dragovertimer); listenersActive = true; } }); } var lastKnownIndex = null; var lastGroupStart = null; var lastGroupEnd = null; let dragovertimer = null; let lasttabgroup = null; /** * Gets the tab from the event target. * @param {*} event The event. * @returns The tab if it was part of the target or its parents, otherwise null */ function getTabFromEventTarget(event, { ignoreTabSides = false } = {}) { let { target } = event; if (target.nodeType != Node.ELEMENT_NODE) { target = target.parentElement; } let tab = target?.closest("tab") || target?.closest("tab-group"); const selectedTab = gBrowser.selectedTab; if (tab && ignoreTabSides) { let { width, height } = tab.getBoundingClientRect(); if ( event.screenX < tab.screenX + width * 0.25 || event.screenX > tab.screenX + width * 0.75 || ((event.screenY < tab.screenY + height * 0.25 || event.screenY > tab.screenY + height * 0.75) && gBrowser.tabContainer.verticalMode) ) { return selectedTab; } } return tab; } /** * Performs the tab drag over event. * @param {*} event The drag over event. */ function performTabDragOver(event) { event.preventDefault(); event.stopPropagation(); let ind = gBrowser.tabContainer._tabDropIndicator; let effects = orig_getDropEffectForTabDrag(event); let tab; if (effects == "link") { tab = getTabFromEventTarget(event, true); if (tab) { if (!gBrowser.tabContainer._dragTime) gBrowser.tabContainer._dragTime = Date.now(); if (!tab.hasAttribute("pendingicon") && // annoying fix Date.now() >= gBrowser.tabContainer._dragTime + Services.prefs.getIntPref("browser.tabs.dragDrop.selectTab.delayMS")) { gBrowser.selectedTab = tab; ind.hidden = true; return; } } } if (!tab) { tab = getTabFromEventTarget(event, false); } if (tab?.nodeName == "tab-group") { if(lasttabgroup !== tab) { lasttabgroup = tab clearTimeout(dragovertimer); dragovertimer = setTimeout((tabgroup) => { tabgroup.collapsed = !tabgroup.collapsed }, Services.prefs.getIntPref("browser.tabs.dragDrop.expandGroup.delayMS"), tab); } } else { clearTimeout(dragovertimer); lasttabgroup = null; } let newIndex = gBrowser.tabContainer._getDropIndex(event); if (newIndex == null) return; // Update the last known index and group position lastKnownIndex = newIndex; if (tab?.nodeName == "tab-group" && !lastGroupStart) { lastGroupStart = tab.querySelector("tab:first-of-type")._tPos; lastGroupEnd = tab.querySelector("tab:last-of-type")._tPos; } let tabs = gBrowser.tabs; let ltr = (window.getComputedStyle(gBrowser.tabContainer).direction == "ltr"); let rect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect(); let newMarginX, newMarginY; if (newIndex == tabs.length) { let tabRect = tabs[newIndex - 1].getBoundingClientRect(); if (ltr) newMarginX = tabRect.right - rect.left; else newMarginX = rect.right - tabRect.left; newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+ newMarginY += rect.height / 2 - tabRect.height / 2; } else if (newIndex != null || newIndex != 0) { let tabRect = tabs[newIndex].getBoundingClientRect(); if (ltr) newMarginX = tabRect.left - rect.left; else newMarginX = rect.right - tabRect.right; newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+ newMarginY += rect.height / 2 - tabRect.height / 2; } newMarginX += ind.clientWidth / 2; if (!ltr) newMarginX *= -1; ind.hidden = false; ind.style.transform = "translate(" + Math.round(newMarginX) + "px," + Math.round(newMarginY) + "px)"; // multirow fix ind.style.marginInlineStart = (-ind.clientWidth) + "px"; } /** * Performs the tab drop event. * @param {*} event The drop event. */ function performTabDropEvent(event) { clearTimeout(dragovertimer); let newIndex; let dt = event.dataTransfer; let dropEffect = dt.dropEffect; let draggedTab; if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) { draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0); if (!draggedTab) { return; } } if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) { newIndex = gBrowser.tabContainer._getDropIndex(event); let selectedTabs = gBrowser.selectedTabs.length > 1 ? gBrowser.selectedTabs : [draggedTab]; let tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex); let tab = getTabFromEventTarget(event, false); let tabgroup = tab?.closest("tab-group"); if (!tab) { newIndex = gBrowser.tabs.length; tabToMoveAt = null; } if (tab?.pinned && !selectedTabs[0].pinned) { selectedTabs.forEach(t => gBrowser.pinTab(t)); if (tabToMoveAt == tab) { selectedTabs.forEach(t => {gBrowser.moveTabBefore(t, tab)}); } else { selectedTabs.forEach(t => {gBrowser.moveTabBefore(t, tabToMoveAt)}); } return; } else if(!tab?.pinned && selectedTabs[0].pinned) { selectedTabs.forEach(t => gBrowser.unpinTab(t)); } if (tabgroup && !tabgroup.previousSibling) { newIndex = 0; selectedTabs.forEach(t => {gBrowser.moveTabTo(t, { tabIndex: newIndex++,forceUngrouped:true});}); } else if (!tab || !tabgroup && !tabToMoveAt?.group || tabgroup && tabToMoveAt?.group) { if (tab !== tabToMoveAt) { tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex -1); selectedTabs.forEach(t => {gBrowser.moveTabAfter(t, tabToMoveAt); tabToMoveAt = t}); } else { selectedTabs.forEach(t => {gBrowser.moveTabBefore(t, tabToMoveAt)}); } } else { tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex -1); selectedTabs.forEach(t => {gBrowser.moveTabAfter(t, tabToMoveAt); tabToMoveAt = t}); } // Restart global vars lastKnownIndex = null; lastGroupStart = null; lastGroupEnd = null; } } // copy of the original and overrided _getDropEffectForTabDrag method function orig_getDropEffectForTabDrag(event) { let dt = event.dataTransfer; let isMovingTabs = dt.mozItemCount > 0; for (let i = 0; i < dt.mozItemCount; i++) { // tabs are always added as the first type let types = dt.mozTypesAt(0); if (types[0] != TAB_DROP_TYPE) { isMovingTabs = false; break; } } if (isMovingTabs) { let sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0); if (XULElement.isInstance(sourceNode) && sourceNode.localName == "tab" && sourceNode.ownerGlobal.isChromeWindow && sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser" && sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container) { // Do not allow transfering a private tab to a non-private window // and vice versa. if (PrivateBrowsingUtils.isWindowPrivate(window) != PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal)) return "none"; if (window.gMultiProcessBrowser != sourceNode.ownerGlobal.gMultiProcessBrowser) return "none"; if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser) return "none"; return dt.dropEffect == "copy" ? "copy" : "move"; } } if (Services.droppedLinkHandler.canDropLink(event, true)) return "link"; return "none"; }Ich habe versucht mit einer KI Google Gemini das ganze zu reparieren. Nach 45 Minuten habe ich dann aufgegeben, weil die KI das nicht konnte.
-
Mira_Belle
Ja, das ist natürlich aus vielerlei Aspekten nicht gut. Das ist mir bewusst, das weiß ich ganz genau.
Ich kann das Update aber nicht machen. Sobald ich das Update auf die Version 3.0.0 mache, geht das Programm ja gar nicht mehr zu öffnen.
Vielleicht hast du es ja aus Versehen überlesen. Ich habe ja auch gesagt, dass es selbst in der Windows Sandbox mit einem komplett neu installierten Firefox. Mit der aktuellsten Version dieser Erweiterung frisch aus dem Webstore installiert, auch nicht mehr zu öffnen geht. Die Schaltfläche ist dann tot, die geht nicht mehr.
Wenn ich das also rein logisch betrachte, kann man ausgrenzen, dass es an meinem Firefox liegt, weil in der Windows Sandbox ist der Firefox ja komplett neu, frisch installiert und dort geht es auch nicht. Diese Erweiterung.
Also habe ich faktisch keine Möglichkeit, diese Erweiterung nutzen zu können nach dem Update, egal wo
....
Ich könnte auch ein Video davon drehen, wie ich die Windows Sandbox öffne, Firefox über die offizielle Webseite frisch neu installiere, dann in den Webstore gehe, die Erweiterung dort hinzufüge und dann mit der Maus tausendmal auf den Knopf drücke, um die Anwendung zu öffnen und dann wirst du sehen, es geht nicht. Nichts ist leerer und frischer als die Windows Sandbox und ich achte sehr penibel darauf, dass in dieser Windows Sandbox nur das Betriebssystem Windows 10 auf dem aktuellsten technischen Stand ist und alles andere ist dort logischerweise komplett nackt. Das ist ja der Sinn der Windows Sandbox.
Ich weiß nicht, ob du dich mit der Windows Sandbox auskennst, aber die simuliert eine frische neue Windows Installation und hat keine Verbindung zu meinem echten Computer. Das bedeutet, jedes Mal wenn ich die Windows Sandbox öffne, wird sie frisch neu mit einem leeren Windows auf mich warten und wenn ich die Windows Sandbox schließe, werden alle Daten gelöscht, die sich darin befinden.
Deswegen ist die Windows Sandbox für technische Spielereien, wie zum Beispiel so was gut geeignet, um einen frischen neuen Installationsstart zu simulieren unter kontrollierter Umgebung. Abgekoppelt vom richtigen Computer, aus Sicherheitsgründen.
Wenn also in dieser Windows Sandbox das aktuellste normale Firefox nicht kompatibel ist mit dieser Erweiterung, dann geht sie definitiv nicht. Das wäre so, wie als wenn ich mir einen frisch neuen Computer oder Laptop kaufe und dort Windows 10 installiere, alle Sicherheitsupdates mache und dann das allererste Mal Firefox nackt dort aufspiele, dann hast du genau das Prinzip, was die Windows Sandbox macht. Grob gesehen.
Es gibt Dinge, mit denen ich mich auskenne und Dinge, mit denen ich mich überhaupt nicht auskenne. Aber ich kann dir versichern, dass die Windows Sandbox eine sichere Umgebung ist, um so etwas zu testen. Und da funktioniert es nachweislich nicht. -
Mira_Belle
Ja, das weiß ich. Das Ding ist mehrere Jahre alt. Ich habe jetzt erstmal alle Sicherheitskopien, die ich brauche, falls irgendwas schief geht.
Ich warte einfach auf eine neue Version. Aktuell lebe ich erstmal mit der Version. Das ist für mich am streßfreiesten. Vielleicht antwortet der Erfinder ja auf meine e-mail. Dann kann ich dem ja auch jetzt erklären, was ich gemacht habe. Dass ich das auch mit der Windows Sandbox probiert habe, dass die Probleme dort auch auftauchen.
milupo Hat ja auch geschrieben, dass es in der Versionshistorie drin steht, irgendwo, dass der Erfinder die Erweiterung von Grund auf neu gemacht hat. Wahrscheinlich ist da ein Fehler passiert dabei. Das weiß nur der Erfinder.
Mira_Belle
Jetzt muss ich erst mal durchatmen und vielleicht habe ich dann in den nächsten Tagen wieder genug Kraft, um bei dem Thema noch mal neu anzusetzen. Aber ich lasse es erst mal so, wie es ist. -
Mira_Belle
Ja, danke für dein Mitgefühl.
Vielen Dank, es ging wirklich zu schnell. Ich muss mit Sprachassistent arbeiten und der erkennt meine Sprache nicht immer richtig. Und dann muss ich die Wörter einzeln korrigieren und das kostet mich Zeit. Und dann muss ich da wieder darauf antworten und das geht alles zu schnell. Jetzt funktioniert es wieder.
Ich wiederhole, es funktioniert wieder !!! DANKE
Vielen Dank für die Unterstützung und Hilfe. 👍👍👍💖💖💖
Ich habe jetzt auch den Schalter auf aus gestellt Für die automatischen Updates.
Die Erweiterung wird nicht mehr automatisch aktualisiert.
Ich habe mir die XPI-Datei auf dem Desktop gespeichert und den Link.
Backup Einstellung erstellt.
Foto von allen Kacheln / Favoriten erstellt.
Vielen herzlichen dank es funktioniert wieder !! 💖💖💖💖 -
https://addons.mozilla.org/firefox/downloads/file/3775587/yay_another_speed_dial-1.5.2.1.xpi
Erweiterung Verison 1.5.2.1 + Firefox 147.0.3 = Alles geht !
Erweiterung Version 3.0.0 + Firefox 147.0.3 = Erweiterung defekt !
Windows Sandbox:
-------------------------
Erweiterung Verison 1.5.2.1 + Firefox 147.0.3 (neu installiert) = Alles geht !
Erweiterung Version 3.0.0 + Firefox 147.0.3 (neu installiert) = Erweiterung defekt ! -
Mira_Belle
So, ich habe jetzt sicherheitshalber eine Kopie gemacht von meinem Firefox, wo die Erweiterung bei mir defekt ist.
Danach bin ich auf deinen Link gegangen, habe das installiert und jetzt funktioniert es wieder.
Jetzt habe ich die alte Version wieder die auch funktioniert !!!
Ich wiederhole, mit deinem Link und der Installation funktioniert die Erweiterung jetzt wieder im Firefox !!
Zusatz:
------------
Windows Sandbox neue Version der Erweiterung
frischer Firefox
Erweiterung geht nicht
Deinen Link klicken
Alter Version installieren
Erweiterung geht wieder ! -
Mira_Belle
Moment, ich mach das jetzt in der virtuellen Sandbox mit der alten Version. Ich habe jetzt auf dein Link draufgeklickt, da ging gleich ein Fenster auf. Moment, ich mach das. Moment. -
Mira_Belle
Bitte nicht so schnell. Ich muss mit Sprachassistent und manueller Korrektur die Texte hier machen. Es fällt mir schwer, das alles so schnell hinzukriegen.
Ich habe gestern die Version 1.5.2.1 dieser Erweiterung noch in meinem aktuellen Firefox 147.0.3 Benutzt.
Was passiert dann mit den Einstellungen?
Ich kann das jetzt hier nicht löschen in meinem richtigen Firefox. Ich komme ja nicht mehr an die Einstellungen ran. Die sind ja dann alle weg, wenn ich das Ding jetzt lösche, drüber installiere. Ich habe das noch nie gemacht. Keine Ahnung, was da jetzt passiert.Sören Hentzschel
Ich habe so was noch nie gemacht, du machst es vielleicht täglich und bist Profi. Dann größter Respekt, aber ich habe so was noch nie gemacht. Eine alte Version drüber installieren, ich weiß noch nicht mal. Das ist gerade alles zu viel.
Ich brauche das langsam und nicht so schnell. Das einzige was ich jetzt machen kann ist eine Kopie erstellen von meinem Firefox, wo die Erweiterung kaputt ist. Dann gehe ich in mein virtuelles Windows, kopiere dort die kaputte Version rein und spiele ich so lange an dem Firefox mit irgendwelchen Dingen umher, bis es wieder geht. Ich bin überfordert. -
milupo
Das klingt interessant, ich weiß jetzt nicht, woher du die Information hast, aber ich vertraue dir jetzt einfach mal. Das würde vielleicht einiges erklären, warum es nicht mehr richtig funktioniert.
Ich habe eben die Windows Sandbox geöffnet.
Dort ist ein frisches neues Windows drin, aktuellster Stand mit allen Treibern.
Kein einziger Webbrowser installiert.
Ich habe eben frisch neu dort Firefox installiert und nur diese Erweiterung heruntergeladen. Und sie lässt sich nicht öffnen.
Sie ist oben in der Symbolleiste, aber sie geht nicht zu öffnen. 😢 -
Boersenfeger
Hör auf mich Kleinkind zu nennen. DANKE -
Sören Hentzschel
Das ist ein Missverständnis. Ich erkläre es nochmal kurz.
Ich nutze diese Erweiterung schon seit Jahren und sie funktionierte in jeder Firefox Version, die seitdem existiert.
Die Version 1.5.2.1 funktioniert mit dem aktuellsten Mozilla Firefox perfekt.
Die Version 3.0 funktioniert mit dem aktuellen Firefox nicht. Das habe ich in einer Windows Sandbox getestet. -
Mira_Belle
Ich verstehe nicht welchen Test du meinst. Ich habe Microsoft Edge, Brave, Firefox und SWR Iron. Und dort ist die Erweiterung in der Version 1.5.2.1 überall drin. Und die Browser sind alle aktuell.
In all diesen Programmen sind fast identische Daten drin. Das heißt die Einstellungen, die Favoriten, wie das aussieht, die Anordnung, die ganzen Einstellungen sind alle dort drin. Fast nahezu identisch. Nur die Favoriten haben eine andere Anordnung, sind etwas älter. Weil ich noch nicht alle diese Browser auf das neue gebracht habe.
Was ich jetzt mache ist, ich nehme die Windows Sandbox und werde dort Firefox nackt installieren, die Erweiterung drauf machen und dann mache ich ein Update für den Beitrag hier.
UPDATE:
Windows Sandbox,
Firefox neue Installation.
Nur diese Erweiterung installiert und sie funktioniert NICHT -
Sören Hentzschel
Ich habe doch heute das Update von der Erweiterung bekommen. Gestern lief noch alles. Heute kam das Update und dann ging nichts mehr. Firefox hat etwas erzählt von Berechtigungen und Zugriffen. Dem habe ich zugestimmt. Dann hat er das Update gemacht auf die Version 3.0 und dann ging es plötzlich nicht mehr. In den anderen Webbrausern ist überall noch die alte Version drin. Der Vorgänger vor der Version 3.0.
Auf dem Foto hier kannst du sehen, so sieht es aus in meinen anderen Browsern. Diese Version hat einwandfrei funktioniert. Und die Version 3.0 funktioniert nicht mehr. -
Mira_Belle
Mein letztes Backup ist vom 6. Februar. Aber ich habe einige Änderungen am Firefox durchgeführt bei den Passwörtern. Das wäre ein absolutes Chaos, das wieder zusammenzubringen.
Was ich nur weiß ist, dass vor dem Update dieser Erweiterung die Erweiterung einwandfrei funktioniert hat.
Jetzt klicke ich auf den Knopf drauf und die Erweiterung reagiert nicht. Das ist wie ein toter Schalter, das funktioniert überhaupt nicht. -
Sören Hentzschel
Ich habe verschiedene Internet-Browser, ich habe noch den Brave-Browser , den Microsoft-Edge-Browserund ich habe ein virtuelles Windows mit einer älteren Version von Firefox.
Bei all diesen Web-Browsern ist noch die alte Version installiert von der Erweiterung und da funktioniert es auch. In meinen virtuellen Windows habe ich noch eine ältere Version vom Firefox drinnen, die ist ungefähr fünf Monate alt. Da ist auch noch die alte Version drinnen, das hat tadellos funktioniert. Erst jetzt nach dem Update, was bei mir heute angekommen ist, offiziell. Erst dann ist der Fehler aufgetreten.
Ich habe gerade echt richtig Panik. Ich hoffe wirklich, dass das so schnell wie möglich dieser tolle Mensch das wieder repariert. -
Boersenfeger
Dein Spruch mit dem Kleinkind kannst du sein lassen, das ist respektlos. So schreibe ich auch nicht mit dir und lass das bitte. Danke.grisu2099
Ja, ich habe den Beitrag gelöscht, weil ich da so viel reingeschrieben habe und jetzt habe ich es noch mal gekürzt. Trotzdem habe ich Panik. Danke für deinen Tipp. Ich muss jetzt erstmal sehen, dass ich die nächsten Tage irgendwie schaffe, ohne diese Erweiterung. Es wird schwer, sehr schwer.
2002Andreas
Ich war jetzt in der Lage eine E-Mail dahin zu schicken, zu dem Erfinder. Ich hoffe, dass er die liest, aber vielleicht weiß ja trotzdem jemand schon. Außer mir bescheid darüber, dass die Erweiterung nicht mehr geht Vielleicht schreibt derjenige dann auch noch eine E-Mail. Je mehr Leute sich daran beteiligen, desto besser, desto schneller kann geholfen werden. -
Panik !!!!!!!!!!!
Ich weiß nicht, wo du das mit der E-Mail gesehen hast. Ich finde das nicht. Ich weiß auch nicht, was ich dem schreiben soll. Ich weiß nicht mal, ob ich dieselbe Sprache spreche. Keine Ahnung. Ich bin völlig überfordert gerade. Ich brauche das Ding unbedingt, das weiß ich. Bitte !!!