Klasse. 
Vielen Dank.
Mfg.
Endor
Beiträge von Endor
- 
					
- 
					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?Code
 Alles anzeigen// ==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();Wenn alles passt lade ich es dann bei mir hoch. 
 Mfg.
 Endor
- 
					Danke, interner Fehler Ok.  
 Danke für die Info.
 Mfg.
 Endor
- 
					Hallo Boersenfeger 
 Tut hier auch was es soll.
 Stell mal deine Version rein.
 Mfg.
 Endor
- 
					Hallo zusammen. War einige Tage beruflich weg. Daher erst heute die deutsche Version 
 des aktuellen Scripts. Der Autor hat übrigens den CSS Teil zum Ausblenden der Alle Tabsschaltfläche
 aus der Tableiste entfernt weil man die jetzt ja mit Rechtsklick usw. entfernen kann.Script siehe hier: userChrome.js/Multirowtabs/Firefox 133/MultiRowTabLiteforFx.uc.js at master · Endor8/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.github.comMfg. 
 Endor
- 
					Hallo FuchsFan an . 
 Danke für die Info.
 Diese Version scheint aber nur für Firefox 128esr zu sein.
 Optionen für Firefox 132 fehlen hier.Siehe Beschreibung auf Deiner verlinkten Seite: CodeMultiRowTabLiteforFx.uc.js: Enthält Firefox128esr-Multi-Tab-Skript. _____Öffnen Sie „MultiRowTabLiteforFx.uc.js“ mit Notepad usw. und stellen Sie es nach Ihren Wünschen ein. _____2024/10/07___Als die Position der Tab-Leiste geändert wurde, funktionierte „Uploader [bbs2chreader] Refuge SearchWP (esr115)“ nicht mehr. Nachdem ich einen Bericht wie diesen gesehen hatte, stellte ich fest, dass das Problem an der Art und Weise lag, wie die Symbolleisten neu angeordnet wurden, und wechselte daher zu einer anderen Methode. Ich habe bei „esr, Developer, Nightly“ nachgefragt und es hat funktioniert, also denke ich, dass es in Ordnung ist. _____Sie waren eine Zeit lang bis zur Version vom 24.09.30 zusammen, aber mit der Änderung in 133 wurden „#toolbar-menubar“ und „#TabsToolbar“ zu untergeordneten Elementen von „#navigator-toolbox“, also habe ich beschlossen, sie zu trennen . Die Teile im Zusammenhang mit vertikalen Tabs, die in 128esr noch nicht vorhanden sind, wurden gelöscht.Übersetzung von Goggle. 
 Mfg.
 Endor
- 
					Wenn Du den Unterstrich meinst den habe ich eingefügt. 
 Den hat der Autor anscheinend vergessen.Mfg. 
 Endor
- 
					Externer Inhalt www.youtube.comInhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
- 
					Hallo Horstmann! Auch von mir alles alles Gute zum Geburtstag. 
 Vor allem viel Gesundheit, aber auch viel Glück und
 Wohlergehen wünsche ich Dir von ganzen Herzen.
 Mfg.
 Endor
- 
					Hallo Herzmann . 
 Der Autor hat wieder aktualisiert.
 Hier wieder die Deutsche Version: userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.github.com userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.github.comMfg. 
 Endor
- 
					Kris Kristofferson ist tot.  US-Star Kris Kristofferson ist totEr gilt als einer der bedeutendsten Songwriter aller Zeiten, schrieb Hits für Janis Joplin und Elvis. Außerdem war er in Hollywood erfolgreich: Am Samstag ist…www.tagesschau.de US-Star Kris Kristofferson ist totEr gilt als einer der bedeutendsten Songwriter aller Zeiten, schrieb Hits für Janis Joplin und Elvis. Außerdem war er in Hollywood erfolgreich: Am Samstag ist…www.tagesschau.deR.I.P. 
 Mfg.
 Endor
- 
					Hallo juras Alternativ gebe es vom selben Autor dieses Script:  userChrome.js/130/SidebarModoki.uc.js at master · alice0775/userChrome.jsContribute to alice0775/userChrome.js development by creating an account on GitHub.github.com userChrome.js/130/SidebarModoki.uc.js at master · alice0775/userChrome.jsContribute to alice0775/userChrome.js development by creating an account on GitHub.github.com
 Mfg.
 Endor
- 
					Hallo Mira_Belle . 
 Prima das freut mich, dass er dir weiter geholfen hat.
 Dass es etwas länger dauern würde wusste ich schon.
 Er ist auch Berufstätig und das geht halt vor.
 Bin schon gespannt auf dein Ergebnis.
 Mfg.
 Endor
- 
					Hallo Mira_Belle! Wirklich schade. 
 jizz hat da auch ein eigenes Script usw.
 Vielleicht schaust Du Dir das mal an: FirefoxCustomize/userChromeJS/addMenuPlus at master · benzBrake/FirefoxCustomizeRyan 收集的 Firefox 个性化相关资源. Contribute to benzBrake/FirefoxCustomize development by creating an account on GitHub.github.com FirefoxCustomize/userChromeJS/addMenuPlus at master · benzBrake/FirefoxCustomizeRyan 收集的 Firefox 个性化相关资源. Contribute to benzBrake/FirefoxCustomize development by creating an account on GitHub.github.comMfg. 
 Endor
- 
					Hallo FuchsFan. 
 Ja hatte ich schon gesehen. Deutsche Version ist auch fertig. userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.github.com userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.github.comMfg. 
 Endor
- 
					Wäre es nicht schlauer, die Dateien auf Dein GitHub-Konto hochzuladen Ja das werde ich auch so machen.
 Gemacht! Siehe oben.
 Mfg.
 Endor
- 
					Hallo Herzmann 
 Der Autor hat wieder aktualisiert siehe hier: userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.github.com userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.github.comIch habe im Kopfbereich mal Versions Info eingefügt. 
 // @version 2024/09/11 12:00 Firefox 131+
 So lassen sich dann die neuen Versionen leichter unterscheiden.
 Mfg.
 Endor
- 
					R.I.P. Mfg. 
 Endor
- 
					Schade, dass er sich nicht mal "persönlich" meldet. Ja das finde ich auch. 
 Mfg.
 Endor
- 
					Herzmann Der Autor hat wieder aktualisiert. 
 Hier die aktuelle Version:CSS
 Alles anzeigen// ==UserScript== // @name zzzz-MultiRowTab_LiteforFx48.uc.js // @namespace http://space.geocities.yahoo.co.jp/gl/alice0775 // @description Mehrzeilige Tableiste - Experimentelle CSS Version // @include main // @compatibility Firefox 128esr Firefox 131+ // @author Alice0775 // @version 2016/08/05 00:00 Firefox 48 // @version 2016/05/01 00:01 hide favicon if busy // @version 2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+ // @version 2016/02/09 00:01 workaround css for lwt // @version 2016/02/09 00:00 // ==/UserScript== "use strict"; MultiRowTabLiteforFx(); function MultiRowTabLiteforFx() { if (!window.gBrowser) { return; } // -- Config -- const // Anzahl der Tab-Leistenzeilen angeben, oder unbegrenzte Anzahl von Zeilen wählen. TabBar_Rows = false ,// [false] = unbegrenzt // true = Begrenzte Tabzeilen - Anzahl der Zeilen angeben Max_Rows = 3 ,// Tabzeilen angeben (Standard: 3 Zeilen) // ProtonUI Erscheinungsbild der Tabs ändern ProtonUI = 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. // Leerraum um die Tabs auf 0 anpassen, um der Höhe der UI-Dichte zu entsprechen. // Position der Tab-Leiste. TabBar_Position = 0 ,// [0] = Standard // 1 = unter der Symbolleiste // 2 = unter dem Fenster // Standardposition der Tableiste Blenden Sie die Titelleistenschaltfläche [-□×] // aus und verwenden Sie die Breite der Tableiste entsprechend TitleBar_Button_Autohide = false ,// [false] = Aktiviert // true = Deaktiviert // Äußeren Rahmen der Titelleistenschaltfläche [-□×] reduzieren und transparent machen. // Obere rechte Ecke der Tab-Leiste auf ihre ursprüngliche Größe zurücksetzen und Transparenz aufheben. // Tab-Höhe „UI-Dichte“ UI_Density_Compact = 29 ,// Standard = 29 Pixel bei Kompakt UI_Density_Normal = 36 ,// Standard = 36 Pixel bei Normal UI_Density_Touch = 41 ,// Standard = 41 Pixel bei Touch // Entsprechender CSS Code in UserChrome.css wird vorrangig behandelt! // Tab-Breite // Bei gleichen Werten bei Min und Max, wird Tabbreite fixiert! Tab_Min_Width = 76 ,// Standard - Mindestwert = 76px Tab_Max_Width = 225 ,// Standard - Maxwert = 225px // Entsprechender CSS Code in UserChrome.css wird vorrangig behandelt! // .Tab-Drop-Indikator-Icon-Ersetzung. Tab_Drop_Indicator = false ,// [false] = Stecknadel Symbol 📍 // true = Rote Linie (2px × 29px) als Symbol // 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. // Tab-Leisten-Ziehbereich Left_Drag_Area = 0 ,// Linker Ziehbereich Breite: Standard 40 Pixel Right_Drag_Area = 0 ,// Rechter Ziehbereich Breite: Standard 40 Pixel Window_Maximize_Left_Drag_Area = false ,// true = Linken Ziehbereich bei maximiertem Fenster anzeigen. Standardmäßig ausgeblendet. Fullscreen_Drag_Area = false ,// true = Linken und rechten Ziehbereich bei Vollbild anzeigen. Standardmäßig ausgeblendet. // Angeheftete Tabs neu positionieren Separate_Tabs_and_PinnedTabs = false ,// [false] = Standard // true = Angeheftete Tabs von der Tab-Leiste lösen und in die darüber liegende Zeile verschieben. // „Tab schließen“ Schaltfläche . Tab_Close_Button = 0 ,// [0] = Standard // 1 = Ausgeblendet // 2 = Auf allen Tabs anzeigen // 3 = Nur bei Mausberührung anzeigen // Alle Tabs Schaltfläche All_Tabs_Button = false ,// [false] = ausblenden // true = anzeigen // -- Config End -- css = ` #TabsToolbar { :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; } ${Tab_Drop_Indicator ? ` #tabbrowser-tabs > .tab-drop-indicator { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAdCAIAAAAPVCo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3growJEQ5+SUQEAOb1EM8kwskcAAAAASUVORK5CYII=) no-repeat center !important; } ` : ``} .titlebar-spacer[type="pre-tabs"] { width: ${Left_Drag_Area}px !important; } .titlebar-spacer[type="post-tabs"] { width: ${Right_Drag_Area}px !important; } ${Window_Maximize_Left_Drag_Area ? ` .titlebar-spacer { :root:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] { display: block !important; } } ` : ``} ${Fullscreen_Drag_Area ? ` .titlebar-spacer { :root[inFullscreen] &, :root:not([tabsintitlebar]) & { display: block !important; } } ` : ``} #tabbrowser-arrowscrollbox { &::part(scrollbox) { &:has(+ spacer) > slot, .scrollbox-clip > & { flex-wrap: wrap; } ${TabBar_Rows ? ` max-height: calc((var(--tab-min-height) + ${ProtonUI ? 8 : 0}px) * ${Max_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 ? ` &::part(scrollbox) { &:has(+ spacer) > slot::after, .scrollbox-clip > &::after { display: flow-root list-item; content: ""; flex-basis: -moz-available; height: 0; overflow: hidden; } } .tabbrowser-tab:not([pinned]) { #tabbrowser-tabs[haspinnedtabs] & { &, & + :not(#tabs-newtab-button) { order: 1; } } } ` : ``} .tabbrowser-tab[fadein]:not([pinned]) { --tab-min-width: ${Tab_Min_Width}px; --tab-max-width: ${Tab_Max_Width}px; max-width: var(--tab-max-width); ${Tab_Close_Button !== 0 ? ` ${Tab_Close_Button === 1 ? ` .tab-close-button { display: none !important; } ` : Tab_Close_Button === 2 ? ` .tab-close-button { display: block !important; } ` : Tab_Close_Button === 3 ? ` .tab-close-button { opacity: 0; } &:hover .tab-close-button { opacity: 1; display: block !important; } ` : ``} ` : ``} } #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) { margin-inline-start: 0 !important; } } ${ProtonUI ? `` : ` .toolbarbutton-1 { margin: 0 !important; padding: 0 !important; } .tabbrowser-tab, #tabs-newtab-button { height: var(--tab-min-height); padding: 0 !important; } .tab-background { box-shadow: none !important; margin-block: 0 !important; } .tabbrowser-tab[usercontextid] > .tab-stack > .tab-background > .tab-context-line { margin: 1px 2px 0 !important; } `} ${Tab_Separators ? ` .titlebar-spacer[type="pre-tabs"] { border-inline-end: 1px solid color-mix(in srgb, currentColor 20%, transparent); } .tabbrowser-tab::after, .tabbrowser-tab::before { border-left: 1px solid color-mix(in srgb, currentColor 50%, transparent); height: calc(var(--tab-min-height) - 15%); margin-block: auto; } .tabbrowser-tab:hover::after, .tabbrowser-tab[multiselected]::after, #tabbrowser-tabs:not([movingtab]) .tabbrowser-tab:has(+ .tabbrowser-tab:hover)::after, #tabbrowser-tabs:not([movingtab]) .tabbrowser-tab:has(+ [multiselected])::after { height: 100%; } .tabbrowser-tab::after, #tabbrowser-tabs[movingtab] .tabbrowser-tab[visuallyselected]::before { content: ""; display: block; } ` : ``} ${All_Tabs_Button ? `` : ` #alltabs-button { display: none; } `} } ${TabBar_Position === 0 ? ` #TabsToolbar { .titlebar-buttonbox-container { height: calc(var(--tab-min-height) + ${ProtonUI ? 8 : 0}px); margin-bottom: 0 !important; ${TitleBar_Button_Autohide ? ` background-color: color-mix(in srgb, currentColor 20%, transparent); height: 6px; opacity: 0; position: fixed; right: 0; z-index: 2147483647; .titlebar-button { opacity: 0; padding: 0; } &:hover { height: calc(var(--tab-min-height) + ${ProtonUI ? 8 : 0}px); opacity: 1; .titlebar-button { opacity: 1; padding: 8px 17px; } } ` : ``} } } ` : ` #nav-bar { :root:not([inFullscreen]) #toolbar-menubar:not([inactive]) + & > .titlebar-buttonbox-container { display: none; } .titlebar-button { padding-block: 0 !important; } } `} ${TabBar_Position !== 2 ? `` : ` body { & > #fullscr-toggler[hidden] + tabbox, :root[inFullscreen] & > tabbox:hover { border-top: 0.5px solid var(--toolbar-bgcolor); } & > tabbox > #navigator-toolbox { border-block: none !important; } :root[inFullscreen] & { & > #navigator-toolbox { transition: none; &:has(~ tabbox:hover) { margin-top: 0 !important; } &:hover ~ tabbox > #navigator-toolbox { max-height: 100%; }} & > tabbox:not(:hover) { border-top: .5px solid transparent; & > #navigator-toolbox { max-height: 0; } } } } `} `, sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css)); if (TabBar_Rows == false) { ["0", "2"].find(type => { if(sss.sheetRegistered(uri, type)) sss.unregisterSheet(uri, type); sss.loadAndRegisterSheet(uri, type); }); } else { ["0", "2", "SSTabRestored", "TabMove", "TabOpen", "TabSelect"].find(type => { if(sss.sheetRegistered(uri, type)) sss.unregisterSheet(uri, type); sss.loadAndRegisterSheet(uri, type); gBrowser.tabContainer.addEventListener(type, (e) => { e.target.scrollIntoView({ block: "nearest" }); }); }); } if (TabBar_Position !== 0) { if (TabBar_Position === 1) { document.getElementById("navigator-toolbox").prepend( document.getElementById("toolbar-menubar"), document.getElementById("nav-bar"), document.getElementById("PersonalToolbar"), document.getElementById("titlebar"), ); } else { document.getElementById("navigator-toolbox").prepend( document.getElementById("toolbar-menubar"), document.getElementById("nav-bar"), document.getElementById("PersonalToolbar"), ); } document.getElementById("nav-bar").appendChild( document.querySelector("#TabsToolbar > .titlebar-buttonbox-container") ); } if (TabBar_Position === 2) { document.body.appendChild( document.createXULElement("tabbox") ).appendChild( document.importNode(document.getElementById("navigator-toolbox")) ).appendChild( document.getElementById("titlebar") ); } gBrowser.tabContainer.addEventListener("dragover", function(event) { this._on_dragover(event); }, false) gBrowser.tabContainer.addEventListener("drop", function(event) { this._on_drop(event); }, false) gBrowser.tabContainer.on_dragover = function(event) { return false; } gBrowser.tabContainer.on_drop = function(event) { return false; } gBrowser.tabContainer._on_dragover = function(event) { var effects = this.getDropEffectForTabDrag(event); var ind = this._tabDropIndicator; if (effects == "" || effects == "none") { ind.hidden = true; return; } event.preventDefault(); event.stopPropagation(); if (effects == "link") { let tab = this._getDragTargetTab(event, { ignoreTabSides: true }); if (tab) { if (!this._dragTime) { this._dragTime = Date.now(); } if (Date.now() >= this._dragTime + this._dragOverDelay) { this.selectedItem = tab; } ind.hidden = true; return; } } let tabRect, rect = this.arrowScrollbox.getBoundingClientRect(), newIndex = this._getDropIndex(event), newMarginX = ind.clientWidth / 2 - rect.left + ((newIndex === this.allTabs.length) ? (tabRect = this._getVisibleTabs().at(-1).getBoundingClientRect()).right : (tabRect = this.allTabs[newIndex].getBoundingClientRect()).left), newMarginY = tabRect.top - rect.top + tabRect.height / 2 - rect.height / 2; ind.hidden = false; ind.style.transform = "translate(" + Math.round(newMarginX) + "px," + Math.round(newMarginY) + "px)"; } gBrowser.tabContainer._on_drop = function(event) { var dt = event.dataTransfer; var dropEffect = dt.dropEffect; var draggedTab; let movingTabs; if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) { // tab copy or move draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0); // not our drop then if (!draggedTab) { return; } movingTabs = draggedTab._dragData.movingTabs; draggedTab.container._finishGroupSelectedTabs(draggedTab); } this._tabDropIndicator.hidden = true; event.stopPropagation(); if (draggedTab && dropEffect == "copy") { // copy the dropped tab (wherever it's from) let newIndex = this._getDropIndex(event); let draggedTabCopy; for (let tab of movingTabs) { let newTab = gBrowser.duplicateTab(tab); gBrowser.moveTabTo(newTab, newIndex++); if (tab == draggedTab) { draggedTabCopy = newTab; } } if (draggedTab.container != this || event.shiftKey) { this.selectedItem = draggedTabCopy; } } else if (draggedTab && draggedTab.container == this) { let oldTranslate = Math.round(draggedTab._dragData.translatePos); let tabSize = Math.round(draggedTab._dragData.tabSize); let translateOffset = oldTranslate % tabSize; let newTranslate = oldTranslate - translateOffset; if (oldTranslate > 0 && translateOffset > tabSize / 2) { newTranslate += tabSize; } else if (oldTranslate < 0 && -translateOffset > tabSize / 2) { newTranslate -= tabSize; } let dropIndex; if (draggedTab._dragData.fromTabList) { dropIndex = this._getDropIndex(event); } else { dropIndex = this._getDropIndex(event); // "animDropIndex" in draggedTab._dragData && // draggedTab._dragData.animDropIndex; } let incrementDropIndex = true; if (dropIndex && dropIndex > movingTabs[0]._tPos) { dropIndex--; incrementDropIndex = false; } if (oldTranslate && oldTranslate != newTranslate && !gReduceMotion) { for (let tab of movingTabs) { tab.toggleAttribute("tabdrop-samewindow", true); tab.style.transform = this.verticalMode ? "translateY(" + newTranslate + "px)" : "translateX(" + newTranslate + "px)"; let postTransitionCleanup = () => { tab.removeAttribute("tabdrop-samewindow"); this._finishAnimateTabMove(); if (dropIndex !== false) { gBrowser.moveTabTo(tab, dropIndex); if (incrementDropIndex) { dropIndex++; } } gBrowser.syncThrobberAnimations(tab); }; if (gReduceMotion) { postTransitionCleanup(); } else { let onTransitionEnd = transitionendEvent => { if ( transitionendEvent.propertyName != "transform" || transitionendEvent.originalTarget != tab ) { return; } tab.removeEventListener("transitionend", onTransitionEnd); postTransitionCleanup(); }; tab.addEventListener("transitionend", onTransitionEnd); } } } else { this._finishAnimateTabMove(); if (dropIndex !== false) { for (let tab of movingTabs) { gBrowser.moveTabTo(tab, dropIndex); if (incrementDropIndex) { dropIndex++; } } } } } else if (draggedTab) { // Move the tabs. To avoid multiple tab-switches in the original window, // the selected tab should be adopted last. const dropIndex = this._getDropIndex(event); let newIndex = dropIndex; let selectedTab; let indexForSelectedTab; for (let i = 0; i < movingTabs.length; ++i) { const tab = movingTabs[i]; if (tab.selected) { selectedTab = tab; indexForSelectedTab = newIndex; } else { const newTab = gBrowser.adoptTab(tab, newIndex, tab == draggedTab); if (newTab) { ++newIndex; } } } if (selectedTab) { const newTab = gBrowser.adoptTab( selectedTab, indexForSelectedTab, selectedTab == draggedTab ); if (newTab) { ++newIndex; } } // Restore tab selection gBrowser.addRangeToMultiSelectedTabs( gBrowser.tabs[dropIndex], gBrowser.tabs[newIndex - 1] ); } else { // Pass true to disallow dropping javascript: or data: urls let links; try { links = browserDragAndDrop.dropLinks(event, true); } catch (ex) {} if (!links || links.length === 0) { return; } let inBackground = Services.prefs.getBoolPref( "browser.tabs.loadInBackground" ); if (event.shiftKey) { inBackground = !inBackground; } let targetTab = this._getDragTargetTab(event, { ignoreTabSides: true }); let userContextId = this.selectedItem.getAttribute("usercontextid"); let replace = !!targetTab; let newIndex = this._getDropIndex(event); let urls = links.map(link => link.url); let csp = browserDragAndDrop.getCsp(event); let triggeringPrincipal = browserDragAndDrop.getTriggeringPrincipal(event); (async () => { if ( urls.length >= Services.prefs.getIntPref("browser.tabs.maxOpenBeforeWarn") ) { // Sync dialog cannot be used inside drop event handler. let answer = await OpenInTabsUtils.promiseConfirmOpenInTabs( urls.length, window ); if (!answer) { return; } } gBrowser.loadTabs(urls, { inBackground, replace, allowThirdPartyFixup: true, targetTab, newIndex, userContextId, triggeringPrincipal, csp, }); })(); } if (draggedTab) { delete draggedTab._dragData; } } };Mfg. 
 Endor
 
		
		
	
