1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. FuchsFan

Beiträge von FuchsFan

  • Anzeige unter about:addons in Nightly verändert

    • FuchsFan
    • 5. Juni 2026 um 13:43
    Zitat von 2002Andreas

    Wenn ja, teste bitte mal:

    Danke, Andreas, das habe ich soweit auch schon. Der Code wirkt aber auf alle Button, auf der Hauptseite Themes, sowie auch unter "Verwalten". Mir kommt es darauf an, nur die Button unter Verwalten extra anzusprechen, wenn das überhaupt möglich ist.

    So verhält es sich auch dem more-options-button, der auf alle Menüs wirkt. Auch hier wollte ich ihn nur unter Verwalten ausklammern, und ihn extra ansprechen, wenn es auch hier überhaupt möglich ist.

  • Anzeige unter about:addons in Nightly verändert

    • FuchsFan
    • 5. Juni 2026 um 09:38

    Und es geht weiter unter about:addons, z.B. die Button Aktivieren/Deaktivieren bei Themes. Ich komme da nicht weiter, wenn ich unter Verwalten diese Button einzeln ansprechen möchte. Alles was ich bisher versucht habe wirkt immer übergreifend auf andere Button.

  • Entwicklung Firefox

    • FuchsFan
    • 2. Juni 2026 um 18:46
    Zitat von Sören Hentzschel

    Mit einem installierten Firefox habe ich das Problem jedenfalls nicht.

    Damit hier auch nicht, es sind nur die portablen Versionen.

  • Entwicklung Firefox

    • FuchsFan
    • 2. Juni 2026 um 17:29
    Zitat von 2002Andreas

    Klicke ich auf: Weiter wird ein neues Profil erstellt.

    Und das Schlimme daran ist, ich finde auch keine Möglichkeit das abzubrechen, also nur auf "Weiter" , oder gibt es da einen anderen Weg?

  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 1. Juni 2026 um 20:15
    Zitat von 2002Andreas

    Warum nicht in der userContent.css?

    Gute Frage, weil ich gelernt habe ::part imm er in Shadow.;):)

  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 1. Juni 2026 um 19:51

    Um hier reinen Tisch zu machen, es lag nicht an dem Script, sondern an css-Code in der userChromeShadow.css, und zwar an diesem.

    CSS
    panel-item::part(button) {
        background-image: none !important;
    }	

    Der war dafür gedacht die originalen Icon in dem Popup auszublenden (funktionierte bis Version 150).

    Damit wurden dann auch noch die Suchmaschinen-Icon angezeigt, aber nicht mehr in Version 151.

    Jetzt habe ich den css-Code so abgeändert, damit sind alle Probleme beseitigt.

    CSS
    panel-item[action="remove"]::part(button), 
    panel-item[action="report"]::part(button) {
    	background-image: none !important;
    }	

    Danke, Andreas, für deinen Einsatz.:thumbup::)

  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 1. Juni 2026 um 17:14
    Zitat von 2002Andreas

    Ich glaube, du verwechselst da etwas :/

    Dieses Skript lädt das, was in der userChromeShadow.css eingetragen ist.

    Kann sein, ich war mir jetzt nicht sicher, deswegen nochmals nachgebohrt.

    Und ich habe beide in meinem Script vereinigt, schau mal hier RE: Popup der Suchmaschinen ohne Icons, deswegen die Nachfrage.

  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 1. Juni 2026 um 16:34
    Zitat von 2002Andreas

    Ja, und das macht es hier auch.

    Gut, dann werde ich es auch mal testen, danke Andreas.:)

  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 1. Juni 2026 um 16:22
    Zitat von 2002Andreas

    Funktioniert hier einwandfrei in Fx 151

    Ja, glaube ich dir, aber noch einmal zu meinen Gedanken, muss das Script nicht auch den Code laden, der in userChromeShadow.css hinterlegt ist, damit er funktioniert?

  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 1. Juni 2026 um 16:12
    Zitat von Mira_Belle

    Und was war jetzt genau der "falsche" Code?

    Mira_Belle Dieser hier.

    JavaScript
    //  userChromeShadow.uc.js
    //  Button zum Aufruf der userChromeShadow.css im Ordner chrome
    
    (async function() {
    
       if (location != 'chrome://browser/content/browser.xhtml') return;
           
        try {
              let path = PathUtils.join(PathUtils.profileDir, 'chrome', 'userChromeShadow.css');
              let cssIn = await IOUtils.readUTF8(path);
    
              let sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
              let uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(cssIn));
              sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
        
           } catch(e) { 
            
             console.log("UserChromeShadow-Error: " + e.name + ': ' + e.message );
     
           };        
       
    })();
    
    (function() {
    
      if (!window.gBrowser)
    	return;
    
            let btn_id ='chromeshadow_button';
    
           	try {
              CustomizableUI.createWidget({
                id: btn_id,
                defaultArea: CustomizableUI.AREA_NAVBAR,
                label: "Datei userChromeShadow.css",
                tooltiptext: "Datei userChromeShadow.css öffnen",
                onCreated: (this_button) => {
                    this_button.style.MozContextProperties = 'fill, stroke, fill-opacity, stroke-opacity';
                    this_button.style.listStyleImage = 'url("file:///C:/FoxIcons2/css22.png")';
                    this_button.style.minWidth = 'fit-content';
                }
              });
        	} catch(e) {}
    		
    		function click_button() {
              document.getElementById(btn_id).addEventListener('click', event => {
                    if (event.button == 0) {
                        let dir = Services.dirsvc.get('UChrm', Ci.nsIFile);
                            dir.append('userChromeShadow.css');
                            dir.launch();	
                    }
    			});
            };
    
          if (window.readyState !== "loading") {
        		setTimeout(click_button, 500);
            }
          else {
        	  window.addEventListener( "DOMContentLoaded", click_button );
            };
              window.addEventListener('aftercustomization', () => {
        		setTimeout(() => click_button(), 100)
            });
    })();
    Alles anzeigen

    Zitat von 2002Andreas

    Ich nutze hier dieses Skript dafür:

    2002Andreas

    Ja, so rufe ich die Test-Shadow.css auf, aber das Script lädt ja nicht den Code in der userChromeShadow.css, damit er funktioniert. Liege ich mit meiner Denkweise daneben?:/

  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 31. Mai 2026 um 22:47
    Zitat von 2002Andreas

    viel Spaß dann ;)

    Danke, hatte ich.;)

    Du wirst es nicht glauben, es lag am Script userChromeShadow.uc.js. Mit dem folgenden Script funktioniert es nun wieder.

    JavaScript
     // userChromeShadow.uc.js
    // Button zum Aufruf der userChromeShadow.css im Ordner chrome
    
    (async function() {
        if (location !== 'chrome://browser/content/browser.xhtml') return;
    
        try {
            // Pfad zur CSS-Datei
            let file = PathUtils.join(PathUtils.profileDir, 'chrome', 'userChromeShadow.css');
    
            // Datei-URI erzeugen statt Data-URI
            let fileObj = new FileUtils.File(file);
            let uri = Services.io.newFileURI(fileObj);
    
            let sss = Cc['@mozilla.org/content/style-sheet-service;1']
                        .getService(Ci.nsIStyleSheetService);
    
            // Vorherige Registrierung entfernen, falls schon vorhanden
            if (sss.sheetRegistered(uri, sss.AUTHOR_SHEET)) {
                sss.unregisterSheet(uri, sss.AUTHOR_SHEET);
            }
    
            sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
        } catch (e) {
            console.log("UserChromeShadow-Error: " + e.name + ': ' + e.message);
        }
    })();
    
    (function() {
        if (!window.gBrowser) return;
    
        let btn_id = 'chromeshadow_button';
    
        try {
            CustomizableUI.createWidget({
                id: btn_id,
                defaultArea: CustomizableUI.AREA_NAVBAR,
                label: "Datei userChromeShadow.css",
                tooltiptext: "Datei userChromeShadow.css öffnen",
                onCreated: (this_button) => {
                    this_button.style.MozContextProperties = 'fill, stroke, fill-opacity, stroke-opacity';
                    this_button.style.listStyleImage = 'url("file:///C:/FoxIcons2/css22.png")';
                    this_button.style.minWidth = 'fit-content';
                }
            });
        } catch (e) {}
    
        function click_button() {
            document.getElementById(btn_id).addEventListener('click', event => {
                if (event.button == 0) {
                    let dir = Services.dirsvc.get('UChrm', Ci.nsIFile);
                    dir.append('userChromeShadow.css');
                    dir.launch();
                }
            });
        }
    
        if (window.readyState !== "loading") {
            setTimeout(click_button, 500);
        } else {
            window.addEventListener("DOMContentLoaded", click_button);
        }
    
        window.addEventListener('aftercustomization', () => {
            setTimeout(() => click_button(), 100);
        });
    })();
    Alles anzeigen
  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 31. Mai 2026 um 20:00
    Zitat von 2002Andreas

    Hier werden die Icons in allen Profilen angezeigt.

    Danke, Andreas, für den Text suche ich mir das Passende raus. :thumbup:

    Nun habe ich den Ordner Scripte entfernt, alle Icon da, also auf zur Jagd.;)

  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 31. Mai 2026 um 19:47
    Zitat von 2002Andreas

    Evtl. funkt dir ein anderer Code dazwischen

    Alle Codes deaktiviert, keine Änderung. Es ist je nichts weiter verändert worden, nur das Update von 150 auf 151.

    Für den Text habe ich das noch probiert, müsste funktionieren, wie es aussieht.

    CSS
    panel-item.searchmode-switcher-installed::part(label) {
      font-size: 1.2em !important;
      font-weight: 600 !important;
    }
  • Popup der Suchmaschinen ohne Icons

    • FuchsFan
    • 31. Mai 2026 um 19:08

    Bis Version 150.0.2 wurden die Icon angezeigt. Ab Version 151 sieht es dann so aus

    Es ist merkwürdig, in einigen Versionen Beta und Nightly werden sie angezeigt, in anderen wieder nicht. Woran kann das eventuell liegen?

    Ich versuche auch den Text (die Namen) anzupassen, was mir nur mit dem Code gelingt, der aber auch auf andere Teile zugreift (z.B. Sucheinstellungen). Gibt es noch eine weitere Möglichkeit, um das nur auf die Item (Namen) zu begrenzen?

    CSS
    ::part(label) {
      font-size: 1.2em !important;
      font-weight: 600 !important;
    }
  • Anzeige unter about:addons in Nightly verändert

    • FuchsFan
    • 24. Mai 2026 um 22:22

    Boersenfeger

    Ich habe nochmals versucht deine Button nach dem Original anzupassen, eventuell kannst du es gebrauchen.

    CSS
    @-moz-document url-prefix("about:addons") {
    
    /* =========================================
       Sidebar Buttons (alle)
    ========================================= */
    
    moz-page-nav-button {
        background: lightgrey !important;
        color: black !important;
        border: 2px solid grey !important;
    	border-radius: 50px !important;
    	box-shadow: inset 0 0 5px 5px #888 !important;
    }
    
    /* =========================================
       Hover (nur bei inaktiv sichtbar)
    ========================================= */
    
    moz-page-nav-button:hover {
        background: blue !important;
        color: white !important;
        border-color: brown !important;
    	box-shadow: inset 0 0 5px 5px #888 !important;
    }
    
    /* aktiver Button */
    button[selected] {
        color: white !important;
        background-color: red !important;
    	border-radius: 50px !important;
    	box-shadow: inset 0 0 5px 5px #888 !important;
    }
    
    /* optional hover für aktiven Button */
    /* button[selected]:hover {
        color: white !important;
        background-color: #8A2BE2 !important;
    } */
    }
    Alles anzeigen
  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • FuchsFan
    • 23. Mai 2026 um 21:46

    Das Script wurde überarbeitet, alle Vorkommen von ownerGlobal durch documentGlobal ersetzt, damit es ab Version 152 wieder funktioniert.

    JavaScript
    // 'MultiRowTabs@BuF.uc.js' – Logik-Version mit MultiRow + DnD + Emoji-Marker
    // Styling (Farben, Tabhöhe, Breite, max. Zeilen) in userChrome.css
    
    "use strict";
    
    MultiRowTabs();
    
    function MultiRowTabs() {
      if (!window.gBrowser) {
        return;
      }
    
      // ----------------------------
      // --- User-Settings: Start ---
      // ----------------------------
    
      // Position der Tab-Leiste:
      //
      // [1] Tab-Leiste ist oberhalb aller Symbolleisten
      // [2] Tab-Leiste ist unterhalb aller Symbolleisten, aber über dem Inhaltsbereich
      // [6] Tab-Leiste ist unterhalb des Inhaltsbereichs 
      var nTabbarPosition = 2;
    
      // MultiRow-Einstellungen (nur horizontale Positionen [1], [2], [6])
      // Die tatsächliche Zeilenanzahl wird ausschließlich über CSS (max-height) begrenzt.
      var nTabLines     = 3;      // Dokumentationswert; in userChrome.css via max-height nachziehen
      var bTabScrollbar = true;   // Scrollbar für Tab-Leiste anzeigen
      var bTabTooltips  = false;  // Tab-Tooltips (Tabvorschau) anzeigen?
    
      // Einstellungen für Maus-Bedienung
      var bTabWheel               = false; // Tab per Mausrad wechseln
      var bPageScroll             = true;  // seitenweises Scrollen (statt zeilenweise)
      var bDblclickOnTabbarNewTab = true;  // Doppelklick auf freie Tabbar -> neuer Tab
      var bDblclickOnTabReloadTab = true;  // Doppelklick auf Tab -> Reload
    
      // ----------------------------
      // --- User-Settings: Ende ---
      // ----------------------------    
    
      let strHomepageURL;
      try {
        strHomepageURL = Services.prefs.getCharPref("browser.startup.homepage");
      } catch (e) {
        console.log("Error Homepage-String loading...");
      }
    
      if (nTabbarPosition < 1 || (nTabbarPosition != 1 && nTabbarPosition != 2 && nTabbarPosition != 6)) {
        nTabbarPosition = 1;
      }
    
      // Tab-Leiste ganz unten 
      if (nTabbarPosition == 6) {
        let tabbarBoxBottom = document.createXULElement("vbox");
        tabbarBoxBottom.id = "tabbarboxbottom";
    
        document
          .getElementById("navigator-toolbox")
          .parentNode.insertBefore(tabbarBoxBottom, null);
    
        let tabbar = document.getElementById("TabsToolbar");
        tabbarBoxBottom.appendChild(tabbar);
      }
    
      // -------------------------------------------------------------
      // Grund-CSS für Slot-Layout & Scrollbar (keine Farben!)
      // -------------------------------------------------------------
      {
        let cssAgent = `
          /* Scrollbars in der Tabbar sollen nicht als Fenster-Drag-Bereich dienen */
          scrollbar,
          scrollcorner,
          scrollbar thumb,
          scrollbar scrollbarbutton {
            -moz-window-dragging: no-drag !important;
          }
    
          /* Slot-Inhalt (Tabs) direkt in den Flex-Container holen */
          scrollbox[smoothscroll="true"] > slot {
            display: contents !important;
          }
        `;
    
        let sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(
          Ci.nsIStyleSheetService
        );
        let uriAgent = makeURI(
          "data:text/css;charset=UTF=8," + encodeURIComponent(cssAgent)
        );
        if (!sss.sheetRegistered(uriAgent, sss.AGENT_SHEET)) {
          sss.loadAndRegisterSheet(uriAgent, sss.AGENT_SHEET);
        }
      }
    
      {
        // MultiRow-Layout: Wrap, keine Pfeile, „Alle Tabs“-Button entfernen
        let cssAuthor = `
          #tabbrowser-tabs {
            --tab-overflow-pinned-tabs-width: 0px !important;
          }
          
          #alltabs-button,
          hbox.titlebar-spacer,
          #tabbrowser-arrowscrollbox::part(scrollbutton-up), 
          #tabbrowser-arrowscrollbox::part(scrollbutton-down),
          #tabbrowser-arrowscrollbox::part(overflow-start-indicator), 
          #tabbrowser-arrowscrollbox::part(overflow-end-indicator) {
            display: none !important;
          }
          
          tabs > arrowscrollbox::part(scrollbox) {
            flex-wrap: wrap !important;
            overflow-x: hidden !important;
            overflow-y: ${bTabScrollbar ? "auto" : "hidden"} !important;
          }
        `;
    
        let sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(
          Ci.nsIStyleSheetService
        );
        let uriAuthor = makeURI(
          "data:text/css;charset=UTF=8," + encodeURIComponent(cssAuthor)
        );
        if (!sss.sheetRegistered(uriAuthor, sss.AUTHOR_SHEET)) {
          sss.loadAndRegisterSheet(uriAuthor, sss.AUTHOR_SHEET);
        }
      }
    
      // Tab-Leiste unterhalb der Symbolleisten (Position 2)
      if (nTabbarPosition == 2) {
        let tabbar = document.getElementById("TabsToolbar");
        tabbar.parentNode.appendChild(tabbar);
      }
    
      //------------------------------------------------------------------------------------------
    
      var tabsToolbar   = document.getElementById("TabsToolbar");
      var tabsscrollbox = document.getElementById("tabbrowser-arrowscrollbox");
      var ScrollBox     = tabsscrollbox.scrollbox;    
    
      // ----------------------------------
      // Load-Event: MultiRow aktivieren (keine Höhenberechnung mehr)
      // ----------------------------------
      function onReady() {
        console.log("MultiRowTabs OnReady");
        // Auswahl sichtbar halten
        gBrowser.selectedTab.scrollIntoView();
      }    
        
      if (document.readyState !== "loading") {
        setTimeout(onReady, 500); 
      } else {
        window.addEventListener("DOMContentLoaded", onReady);
      }
    
      // ----------------------------------
      // ToggleMenuObserver (Menüleiste ein/aus) – nur für Position 2/6
      // ----------------------------------
      if (nTabbarPosition == 2 || nTabbarPosition == 6) {
        let targetMenubar = document.getElementById("toolbar-menubar");
        let titlebar      = document.querySelector("#navigator-toolbox>vbox#titlebar");
    
        const callback = (mutationList, observer) => {
          for (const mutation of mutationList) {
            if (mutation.type === "attributes") {
              let bInactive = targetMenubar.getAttribute("inactive");
              if (bInactive == "true") {
                titlebar.style.display = "none";
              } else {
                titlebar.style.display = "initial";
              }
            }
          }
        };
        
        let observerToggleMenu = new MutationObserver(callback);
        let configObserver = {
          attributes: true,
          attributeFilter: ["autohide","inactive"]
        };
        observerToggleMenu.observe(targetMenubar, configObserver);    
      }
    
      // ----------------------------------
      // Middleclick auf Tab -> Close Tab
      // ----------------------------------
      gBrowser.tabContainer.addEventListener(
        "click",
        function(event) {
          if (event.button == 1) {
            let element = event.target.parentNode;
            while (element) {
              if (element.localName == "tab") {
                gBrowser.removeTab(element, { animate: false });
                event.preventDefault();
                event.stopPropagation();    
                return;
              }
              element = element.parentNode;
            }
          }
        },
        true
      );
    
      // ----------------------------------
      // Middleclick auf TabsToolbar -> New Tab
      // ----------------------------------
      tabsToolbar.addEventListener(
        "click",
        function(event) {
          if (event.button == 1) {
            if (event.target.parentNode.id == "TabsToolbar") { 
              if (strHomepageURL) {
                event.target.documentGlobal.openTrustedLinkIn(strHomepageURL,"tab");
              } else {
                BrowserOpenTab();
              }
              return;
            }
          }
        },
        true
      );
    
      // ----------------------------------
      // Doubleclick auf TabsToolbar -> New Tab
      // ----------------------------------
      tabsToolbar.addEventListener(
        "dblclick",
        function(event) {
          if (!bDblclickOnTabbarNewTab) return;
          if (event.button == 0) {
            if (event.target.parentNode.id == "TabsToolbar") {
              if (strHomepageURL) {
                event.target.documentGlobal.openTrustedLinkIn(strHomepageURL,"tab");
              } else {
                BrowserOpenTab();
              }
              event.preventDefault();
              event.stopPropagation();    
              return;
            }
          }
        },
        true
      );
            
      // ----------------------------------
      // Doubleclick auf leeren Bereich in TabContainer -> New Tab
      // ----------------------------------
      gBrowser.tabContainer.addEventListener(
        "dblclick",
        function(event) {
          if (!bDblclickOnTabbarNewTab) return;
          if (event.button == 0) {
            let element = event.target.parentNode;
            if (element == gBrowser.tabContainer) {
              if (strHomepageURL) {
                event.target.documentGlobal.openTrustedLinkIn(strHomepageURL,"tab");
              } else {
                BrowserOpenTab();
              }
              event.preventDefault();
              event.stopPropagation();    
              return;
            }
          }
        },
        true
      );
        
      // ----------------------------------
      // Doubleclick auf Tab -> Reload Tab
      // ----------------------------------
      gBrowser.tabContainer.addEventListener(
        "dblclick",
        function(event) {
          if (!bDblclickOnTabReloadTab) return;
          if (event.button == 0) {
            let element = event.target.parentNode;
            while (element) {
              if (element.localName == "tab") {
                element.linkedBrowser.reload();
                return;
              }
              element = element.parentNode;
            }
          }
        },
        true
      );
    
      // ----------------------------------
      // TabSelect -> Tab in Sicht bekommen
      // ----------------------------------
      gBrowser.tabContainer.addEventListener(
        "TabSelect",
        function(event) {
          let bScroll    = false;
          let bScrollTop = true;
                    
          let scrollBoxY1     = event.target.parentElement.scrollbox.screenY;
          let scrollBoxHeight = event.target.parentElement.scrollbox.clientHeight;
          let scrollBoxY2     = scrollBoxY1 + scrollBoxHeight;
            
          let TabSelY1     = event.target.screenY;
          let TabSelHeight = event.target.clientHeight;
          let TabSelY2     = TabSelY1 + TabSelHeight;
            
          if (TabSelY2 > scrollBoxY2) {
            bScroll    = true;
            bScrollTop = false;
          }
          if (TabSelY1 < scrollBoxY1) {
            bScroll    = true;
            bScrollTop = true;
          }
            
          if (bScroll) {
            setTimeout(function() {
              event.target.scrollIntoView(bScrollTop);
            }, 0);
          }
        },
        true
      );
          
      // ----------------------------------
      // Wheel-Event über Tab-Leiste  
      // ----------------------------------
      let tabsScrollbox2 = document.getElementById(
        "tabbrowser-arrowscrollbox"
      ).scrollbox;
    
      tabsScrollbox2.addEventListener(
        "wheel",
        function(event) {
          event.preventDefault();
          event.stopPropagation();
            
          let scrollUp    = true;
          let wrap        = false;
          let scrollBoxY1 =
            gBrowser.tabContainer._animateElement.scrollbox.scrollTop; 
          let scrollHeight;
            
          if (bPageScroll) {
            scrollHeight =
              gBrowser.tabContainer._animateElement.scrollbox.clientHeight;
          } else {            
            let firstTab = gBrowser.visibleTabs[0];
            let h = firstTab ? firstTab.getBoundingClientRect().height : 24;
            scrollHeight = h;
          }
            
          let dir = (scrollUp ? 1 : -1) * Math.sign(event.deltaY);
          let bLastScrollLine = false; 
            
          if (
            gBrowser.tabContainer._animateElement.scrollbox.scrollTopMax ==
            gBrowser.tabContainer._animateElement.scrollbox.scrollTop
          ) {
            bLastScrollLine = true;
          }        
    
          if (
            !bTabWheel ||
            event.ctrlKey ||
            event.originalTarget.localName == "thumb"  ||
            event.originalTarget.localName == "slider" ||
            event.originalTarget.localName == "scrollbarbutton"
          ) {
            setTimeout(function() {
              let scrollBoxMod = scrollBoxY1 % scrollHeight;
              if (scrollBoxMod > 0) {
                if (dir == -1) {
                  scrollBoxY1 -= scrollBoxMod;
                  if (scrollBoxMod < scrollHeight && !bLastScrollLine) {
                    scrollBoxY1 -= scrollHeight;
                  }
                } else {
                  scrollBoxY1 += scrollHeight - scrollBoxMod;
                  if (scrollHeight - scrollBoxMod < scrollHeight) {
                    scrollBoxY1 += scrollHeight;
                  }
                }
              } else {
                if (dir == -1) {
                  scrollBoxY1 -= scrollHeight;
                } else {
                  scrollBoxY1 += scrollHeight;
                }
              }
              gBrowser.tabContainer._animateElement.scrollbox.scrollTo({
                top: scrollBoxY1,
                left: 0,
                behavior: "auto"
              }); 
            }, 20);
          }
    
          if (bTabWheel && !event.ctrlKey) {
            setTimeout(function() {
              if (
                event.originalTarget.localName != "slider" &&
                event.originalTarget.localName != "thumb"  &&
                event.originalTarget.localName != "scrollbarbutton"
              ) {
                gBrowser.tabContainer.advanceSelectedTab(dir, wrap);
                if (
                  gBrowser.tabContainer._firstTab == gBrowser.selectedTab ||
                  gBrowser.tabContainer._lastTab  == gBrowser.selectedTab
                ) {
                  gBrowser.selectedTab.scrollIntoView(); 
                }
              }    
            }, 50);
          }
        },
        false
      );
    
      //-------------------------------------------------------------------------------------------
      // Drag & Drop – Multirow-fähig, mit Emoji-Einfüge-Marker
      //-------------------------------------------------------------------------------------------
    
      // Einfüge-Markierung vorbereiten: Attribut "dnd-marker" statt Border
      if (!gBrowser.tabContainer.clearDropIndicator) {
        gBrowser.tabContainer.clearDropIndicator = function() {
          for (let tab of this.allTabs) {
            tab.removeAttribute("dnd-marker");
          }
        };
    
        gBrowser.tabContainer.addEventListener(
          "dragleave",
          function () {
            this.clearDropIndicator();
          },
          true
        );
      }
    
      // _getDropIndex: ermittelt die Zielposition für den Drop
      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;
          }
          return tabPos + 1;
        }
    
        let rect = tabToDropAt.getBoundingClientRect();
        if (event.clientX > rect.x + rect.width / 2) {
          return tabPos;
        }
        return tabPos + 1;
      };
    
      let listenersActive = false;
    
      gBrowser.tabContainer.addEventListener("dragstart", () => {
        gBrowser.visibleTabs.forEach(t => (t.style.transform = ""));
    
        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);
    
          listenersActive = true;
        }
      });
    } // Ende MultiRowTabs()
    
    // -----------------------------------------------------------------------------
    // Globale Hilfsfunktionen für Drag&Drop (mit Emoji-Einfüge-Marker)
    // -----------------------------------------------------------------------------
    
    var lastKnownIndex = null;
    var lastGroupStart = null;
    var lastGroupEnd   = 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.25) &&
            gBrowser.tabContainer.verticalMode)
        ) {
          return selectedTab;
        }
      }
      return tab;
    }
    
    function performTabDragOver(event) {
      event.preventDefault();
      event.stopPropagation();
    
      let tc  = gBrowser.tabContainer;
      let ind = tc._tabDropIndicator;
    
      // Alte Marker entfernen
      if (tc.clearDropIndicator) {
        tc.clearDropIndicator();
      }
    
      let effects = orig_getDropEffectForTabDrag(event);
      let tab;
    
      // Link-Drop (Links auf Tabs ziehen) – nur Auswahl, kein Marker
      if (effects == "link") {
        tab = getTabFromEventTarget(event, true);
        if (tab) {
          if (!tc._dragTime) {
            tc._dragTime = Date.now();
          }
          if (
            !tab.hasAttribute("pendingicon") &&
            Date.now() >= tc._dragTime + tc._dragOverDelay
          ) {
            tc.selectedItem = tab;
          }
          if (ind) {
            ind.hidden = true;
          }
          return;
        }
      }
    
      if (!tab) {
        tab = getTabFromEventTarget(event, false);
      }
    
      let newIndex = tc._getDropIndex(event);
      if (newIndex == null) {
        return;
      }
    
      // eingebauten Indikator verstecken
      if (ind) {
        ind.hidden = true;
      }
    
      let tabs = gBrowser.tabs;
    
      // Am Ende der Tab-Leiste: Marker "right" am letzten Tab
      if (newIndex == tabs.length) {
        let lastTab = tabs[newIndex - 1];
        if (lastTab) {
          lastTab.setAttribute("dnd-marker", "right");
        }
      } else {
        // Sonst: Marker "left" am Tab an der Drop-Position
        let targetTab = tabs[newIndex];
        if (targetTab) {
          targetTab.setAttribute("dnd-marker", "left");
        }
      }
    }
    
    function performTabDropEvent(event) {
      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 (tabgroup && !tab.previousSibling) {
          newIndex = 0;
          selectedTabs.forEach(t => {
            gBrowser.moveTabTo(t, {
              tabIndex: newIndex++,
              forceUngrouped: true
            });
          });
        } else if (
          !tab ||
          (!tabgroup && !tabToMoveAt?.group) ||
          (tabgroup && tabToMoveAt?.group)
        ) {
          selectedTabs.forEach(t => {
            gBrowser.moveTabBefore(t, tabToMoveAt);
          });
        } else {
          tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex - 1);
          selectedTabs.forEach(t => {
            gBrowser.moveTabAfter(t, tabToMoveAt);
          });
        }
    
        lastKnownIndex = null;
        lastGroupStart = null;
        lastGroupEnd   = null;
      }
    
      // Marker nach dem Drop entfernen
      if (gBrowser.tabContainer.clearDropIndicator) {
        gBrowser.tabContainer.clearDropIndicator();
      }
    }
    
    function orig_getDropEffectForTabDrag(event) {
      let dt = event.dataTransfer;
    
      let isMovingTabs = dt.mozItemCount > 0;
      for (let i = 0; i < dt.mozItemCount; i++) {
        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.documentGlobal.isChromeWindow &&
          sourceNode.ownerDocument.documentElement.getAttribute("windowtype") ==
            "navigator:browser" &&
          sourceNode.documentGlobal.gBrowser.tabContainer == sourceNode.container
        ) {
          if (
            PrivateBrowsingUtils.isWindowPrivate(window) !=
            PrivateBrowsingUtils.isWindowPrivate(sourceNode.documentGlobal)
          ) {
            return "none";
          }
    
          if (
            window.gMultiProcessBrowser !=
            sourceNode.documentGlobal.gMultiProcessBrowser
          ) {
            return "none";
          }
    
          if (window.gFissionBrowser != sourceNode.documentGlobal.gFissionBrowser) {
            return "none";
          }
    
          return dt.dropEffect == "copy" ? "copy" : "move";
        }
      }
    
      if (Services.droppedLinkHandler.canDropLink(event, true)) {
        return "link";
      }
    
      return "none";
    }
    Alles anzeigen
  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • FuchsFan
    • 23. Mai 2026 um 17:12
    Zitat von lenny2

    Das Problem wurde gelöst, indem im Skript alle Vorkommen von ownerGlobal durch documentGlobal ersetzt wurden.

    Sehr schön, das werde ich auch gleich mal ändern. Im Moment ist das ab 152 die erste Anlaufstelle, in der Regel funktioniert es. Danke!:)

  • newtabfromhistory.uc.js = Fehlermeldung

    • FuchsFan
    • 23. Mai 2026 um 09:37
    Zitat von lenny2

    Alle Skripte newtabfromhistory.uc.js ist komplett inkompatibel mit v152, und Links aus den Favoriten lassen sich nicht mehr öffnen.

    Ich kann es nicht prüfen, weil ich nicht genau sagen kann, was das Script macht. Aber bitte mal testen, eventuell ist ja der Fehler hiermit behoben.

    JavaScript
    // ==UserScript==
    // @name           newTabFromHistory.uc.js
    // @namespace      https://www.camp-firefox.de/forum/viewtopic.php?p=1090093#p1090093
    // @description    Links aus Chronik in neuem Tab öffnen
    // @author         aborix
    // @Source         https://www.camp-firefox.de/forum/thema/138013/?postID=1251376#post1251376
    // @Source_new     https://www.camp-firefox.de/forum/thema/139502/?postID=1273989#post1273989       
    // @compatibility  139+
    // @version        0.0.5 date 2025.06.18
    // ==/UserScript==
    
    (function() {
      if (location.href !== 'chrome://browser/content/browser.xhtml')
        return;
    
      PlacesUIUtils.openNodeWithEvent = function PUIU_openNodeWithEvent(aNode, aEvent) {
        let window = aEvent.target.documentGlobal;
        let browserWindow = (window && window.document.documentElement.getAttribute('windowtype') == 'navigator:browser') ? window : BrowserWindowTracker.getTopWindow();
        let where = window.BrowserUtils.whereToOpenLink(aEvent, false, true);
        if (this.loadBookmarksInTabs) {
          if (where == 'current' && !aNode.uri.startsWith('javascript:')) {
            where = 'tab';
          }
          if (where == 'tab' && browserWindow.gBrowser.selectedTab.isEmpty) {
            where = 'current';
          }
        }
        this._openNodeIn(aNode, where, window);
      }
    
      let onPopupshowing = function () {
        let historyMenu = document.getElementById('history-menu');
        if (!historyMenu._placesView) {
          new HistoryMenu(event);
          historyMenu._placesView._onCommand = function HM__onCommand(aEvent) {
            let placesNode = aEvent.target._placesNode;
            if (placesNode) {
              PlacesUIUtils.openNodeWithEvent(placesNode, aEvent);
            }
          }
        }
      }
    
      let historyPopup = document.getElementById('historyMenuPopup');
      historyPopup?.addEventListener('popupshowing', onPopupshowing);
    
    })();
    Alles anzeigen
  • Anzeige unter about:addons in Nightly verändert

    • FuchsFan
    • 22. Mai 2026 um 19:21
    Zitat von Boersenfeger

    Oh, ich sehe gerade, das bei Themes die Nummerierung weg ist. Kann das geheilt werden?

    Der ganze rechte Bereich Themes muss in deinem Code angepasst werden.=O

  • Anzeige unter about:addons in Nightly verändert

    • FuchsFan
    • 22. Mai 2026 um 18:00
    Zitat von Boersenfeger

    Der Code in beiden Browsern ist identisch. Was ist nicht mehr kompatibel?

    Wie auch bei about:preferences sehr viel verändert, und nach meinem Empfinden immer komplizierter das anzupassen. Nur mit diesem Code sehen dann die Button hier so aus (erster Test). Eventuell kannst du es verwenden.

    CSS
    #sidebar categories-box moz-page-nav moz-page-nav-button:not([selected]) {
      --page-nav-button-text-color-hover: red !important;
      --page-nav-button-background-color-hover: yellow !important;
      --page-nav-button-border-color-hover: blue !important;
      --page-nav-button-background-color: beige !important;
      border-top: 2px solid grey !important;
      border-bottom: 2px solid grey !important;
      border-left: 2px solid grey !important;
    }
    
    #sidebar categories-box moz-page-nav moz-page-nav-button {
      --page-nav-button-background-color-selected: #7DB040 !important; 
      --color-accent-primary: white !important;
    }
    Alles anzeigen

Unterstütze uns!

Jährlich (2026)

59,3 %

59,3% (459,86 von 775 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon