- Firefox-Version
- 130.0.1
- Betriebssystem
- W11
Hallo
Ich nutze nachstehendes Script für eine automatisch einblendende (und ausblendede) Sidebar.
Dieses funktioniert seit einigen Versionen nicht mehr.
Gibt es bessere Alternativen? Was müsste angepasst werden damit das Skript wieder funktioniert?
Vielen Dank im Voraus
CSS
		
					
				// ==UserScript==
// @name           expandsidebar_fx58.uc.js
// @description    Seitenleiste automatisches Öffnen und Schließen
// @namespace      http://forums.mozillazine.org/viewtopic.php?p=2592073#2592073
// @include        main
// @compatibility  Firefox 107
// @author         Alice0775
// @Note           Seitenleistenposition bei _SIDEBARPOSITION wählbar (links oder rechts)
// @Note           Keyconfig und Mousegesten usw. SidebarUI.toggle (entsprechender Code);
// @Note
// @version        2022/10/14 20:00 sidebar width:100%
// @version        2022/09/30 20:00 Bug 1792748
// @version        2022/09/14 11:00 box width:auto
// @version        2022/08/26 Bug 1695435 - Remove @@hasInstance for IDL interfaces in chrome context
// @version        2021/11/14 21:00 css
// @version        2021/11/14 13:00 no longer close when print preview
// @version        2021/09/30 22:00 change splitter color
// @version        2020/12/14 00:00 vtb
// @version        2020/07/14 00:00 style
// @version        2019/12/09 18:00 fix 72 Bug 1582530
// @version        2019/12/05 18:00 fix 72 Bug 1492582 - browser.xhtml: Migrate root xul:window element to an html:html element
// @version        2019/12/05 17:00 fix 71 Bug 1582530 - Turn on `layout.css.xul-box-display-values.survive-blockification.enabled` by default
// @version        2019/12/05 10:00 fix 70 Bug 1558914 - Disable Array generics in Nightly
// @version        2019/09/04 Fx69
// @version        2018/07/03 Fx61 fix regression from remove loadoverlay
// @version        2018/07/03 Fx61 remove loadoverlay
// @version        2018/06/25 Fx61 wip
// @version        2018/01/25 Fx58 wip
// @version        2017/11/18 Fx57
// @version        2017/11/18 nsIPrefBranch2 to nsIPrefBranch
// @version        2017/02/01 00:00 enable floating(overlay) sidebar
// @version        2017/01/19 00:00 change event phase,target
// @version        2015/08/29 00:00 fix lastused command
// @version        2015/05/13 19:00 fix lastused command
// @version        2015/02/20 22:00 fix due to Bug 1123517
// @version        2014/10/31 22:00 fix due to Bug 714675
// @version        2014/05/22 12:00 fix var
// @version        2013/03/03 00:00 fix It close too soon when it opened from a button or menu
// @version        2013/02/26 00:00 fix close delay 
// @version        2012/12/08 22:30 Bug 788290 Bug 788293 Remove E4X 
// ==/UserScript==
// @version        2012/08/04 09:00 private browsingを考慮
// @version        2012/08/04 09:00 hiddenではなくcollapsedを使うように
// @version        2012/02/08 14:00 splitter width in full screen
// @version        2011/05/26 12:00 5.0a2でマウスが要素上通過する時, 移動速度が速すぎるとmouseoverイベントが発火しない? 感度が落ちた?
// @version        2011/03/24 12:00 ドラッグオーバー遅延を別設定とした
// @version        2010/10/30 18:00 http://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=84baf90b040c&tochange=16eac4b8b8e0
// @version        2010/10/09 18:00 Windows7 Aero
// @version        2009/06/06 20:00 ドラッグオーバーで閉じてしまうので
// @version        2009/05/24 18:00 chromeのチェック変更
// @version        2009/04/30 18:00 サイドバーを開閉したときは必ずタイマーをクリアするようにした。
// @version        2009/04/28 00:00 負荷軽減
// @version        2009/04/23 00:00 _KEEP_SIZESが動かなくなっていたので
// @version        2009/04/22 12:00 ドラッグオーバーで開かなくなっていたので
// @version        2009/04/15 21:00 マウスが通過したときは開かないが動かなくなっていたので
// @version        2009/04/15 19:00 細々bug修正
// @version        2009/04/15 02:00 _CLOSEWHENGOOUTが動かなくなっていたので
// @version        2009/04/14 22:00 fx2削除
var ucjs_expand_sidebar = {
// --- config ---
  //Anfang Konfiguration
  _OPEN_DELAY: 300,             //Zeitverzögerung zum Öffnen bei Mouseover
  _OPEN_DELAY_DRAGOVER: 400,    //Zeitverzögerung zum Öffnen per Dragover
  _CLOSE_DELAY: 800,            //Zeitverzögerung beim Schließen
  _SCROLLBAR_DELAY: 1000, //Zeitverzögerung der Bildlaufleiste beim Öffnen / Schließen
  _DEFAULTCOMMAND: "viewBookmarksSidebar", //  Standardseitenleiste
  _TOLERANCE: 5,          // Bereich, der als linke Kante des Fensters erkannt wird (0 kann bei Verwendung von TreeStyleTab usw. verwendet werden)
  _DONOTCLOSE_XULELEMENT: true, //Wenn sich die Maus auf einem XUL-Element befindet, nicht schließen 
                                //(Wird nicht geschlossen, selbst wenn XUL im Inhalt angezeigt wird)
  _CLOSEWHENGOOUT:  false, //Wenn sich die Maus aus dem Fenster bewegt: true: schließen, [false]: nicht schließen
  _FLOATING_SIDEBAR: true, //Schwebende Seitenleiste (Überlagerung des Seiteninhalts) aktivieren,
                           //(bekanntes Problem: Seitenleiste kann nicht skaliert werden = mit Maus breiter oder schmaler ziehen)  
  _SIDEBARPOSITION: "L",   //Seitenleistenposition Linke Seite: L Rechte Seite: R
                           //VerticalToolbar.uc.js von Gomita - vertikale Symbolleiste 0.1 
                           //(http://www.xuldev.org/blog/?p=113) muss zuerst ausgeführt werden!
  _KEEP_SIZES:true,        //Breite für jeden Seitenleisten-Typ speichern
  _defaultWidth: 234,      //Standardbreite der Seitenleiste
  _inFullscreen: true,     //Bei Vollbild, Verhalten von Firefox 31 verwenden
  //Ende Konfiguration
// --- config ---
  _MOUSEMOVEINTERVAL: 10,    //Intervall zum Überprüfen der Mausposition
  _CHECKBOX_AT_STARUP:false, //Kontrollkästchen beim Start anzeigen
  _CLOSE_AT_STARTUP:true,    //Seitenleiste beim Start geschlossen
  _lastcommand: null,
  _backup_lastcommand:null,
  _open_Timeout: null,
  _close_Timeout: null,
  _sidebar_box:null,
  _sidebar:null,
  _sidebar_splitter:null,
  _checkbox:null,
  _content:null,
  _opend:false,
  _mousedown:false,
  _mouse_Timeout: null,
  _resizeTimer: null,
  _mtimer: false,
  _startup:true,
  sizes:[],
  prefKeepItSizes: "userChrome.expandSidebar.keepItSizes",
  jsonToDOM: function(jsonTemplate, doc, nodes) {
    jsonToDOM.namespaces = {
    html: "http://www.w3.org/1999/xhtml",
    xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    };
    jsonToDOM.defaultNamespace = jsonToDOM.namespaces.xul;
    function jsonToDOM(jsonTemplate, doc, nodes) {
      function namespace(name) {
          var reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
          return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
      }
      // Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation
      function tag(elemNameOrArray, elemAttr) {
        // Array of elements?  Parse each one...
        if (Array.isArray(elemNameOrArray)) {
          var frag = doc.createDocumentFragment();
          Array.prototype.forEach.call(arguments, function(thisElem) {
            frag.appendChild(tag.apply(null, thisElem));
          });
          return frag;
        }
        // Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element
        var elemNs = namespace(elemNameOrArray);
        var elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
        // Set element's attributes and/or callback functions (eg. onclick)
        for (var key in elemAttr) {
          var val = elemAttr[key];
          if (nodes && key == "keyvalue") {
              nodes[val] = elem;
              continue;
          }
          var attrNs = namespace(key);
          if (typeof val == "function") {
            // Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener
            elem.addEventListener(key.replace(/^on/, ""), val, false);
          } else {
            // Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace)
            elem.setAttributeNS(attrNs.namespace || "", attrNs.shortName, val);
          }
        }
        // Create and append this element's children
        var childElems = Array.prototype.slice.call(arguments, 2);
        childElems.forEach(function(childElem) {
          if (childElem != null) {
            elem.appendChild(
                doc.defaultView.Node.isInstance(childElem)
                /*childElem instanceof doc.defaultView.Node*/ ? childElem :
                    Array.isArray(childElem) ? tag.apply(null, childElem) :
                        doc.createTextNode(childElem));
          }
        });
        return elem;
      }
      return tag.apply(null, jsonTemplate);
    }
    return jsonToDOM(jsonTemplate, doc, nodes);
  },
  init: function(){
    if ("EzSidebarService" in window)
      return;
    this._sidebar_box = document.getElementById('sidebar-box');
    var style = ` 
    @namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);     
    #sidebar-checkbox {
      border: 1px solid currentColor !important;
      width: 16px !important;
      height: 16px !important;
      overflow-x: hidden !important;
    }
    
    #sidebar-splitter 
    { 
      -moz-box-align: center; 
      -moz-box-pack: center; 
      cursor: ew-resize; 
      border-width: 0;
      border-style: solid; 
      width: 2px; 
      max-width: 2px; 
      min-width: 0px; 
      background-color: transparent;
      border-inline-start-color: var(--toolbar-bgcolor);
      border-inline-end-color: var(--toolbar-bgcolor);
      margin-left: 0px; 
      margin-inline-start: 0px; 
    } 
    #navigator-toolbox[inFullscreen="true"] #sidebar-box[hidden="true"] + #sidebar-splitter, 
    :root[inFullscreen="true"] #sidebar-box[hidden="true"] + #sidebar-splitter 
    { 
      width: 0px; 
      max-width: 1px; 
      min-width: 0px; 
      border-left-width: 0px; 
      border-right-width: 1px; 
      background-color: ThreeDFace; 
    }  
    `;
    var sspi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"'
    );
    document.insertBefore(sspi, document.documentElement);
    sspi.getAttribute = function(name) {
    return document.documentElement.getAttribute(name);
    };
    if (this._FLOATING_SIDEBAR) {
      // floating css
      var floatingStyle = `
        @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); 
 
        #sidebar-box { 
        position: fixed ; 
        display: block; 
        z-index: 55555; 
        left: 4px; 
        min-width: unset;
        max-width: unset;
        }
        :root:not([lwtheme-image]) #sidebar-box { 
        background-color: var(--toolbar-bgcolor); 
        } 
        :root[lwtheme-image] #sidebar-box { 
        background-color: var(--tabpanel-background-color); 
        } 
        #sidebar-box #sidebar-header 
        { 
        width :100%; 
        } 
        #sidebar-box #sidebar 
        { 
        height: calc(100vh - 230px); 
        border-left:3px solid var(--toolbar-bgcolor); 
        border-right:3px solid var(--toolbar-bgcolor); 
        border-bottom:3px solid var(--toolbar-bgcolor); 
        } 
        #sidebar-box #sidebar:-moz-lwtheme
        { 
        border-left:3px solid var(--sidebar-background-color);
        border-right:3px solid var(--sidebar-background-color);
        border-bottom:3px solid var(--sidebar-background-color);
        } 
 
        #sidebar-box { 
          border-right: 1px solid var(--sidebar-border-color);
          border-bottom: 1px solid var(--sidebar-border-color); 
          
        } 
        #sidebar-box:-moz-locale-dir(rtl) { 
          border-left: 1px solid var(--sidebar-border-color); 
        } 
        #sidebar-box:-moz-lwtheme { 
          background-color: var(--sidebar-background-color);
        } 
        #sidebar-box sidebarheader:-moz-lwtheme { 
          color: -moz-dialogtext; 
          text-shadow: none; 
          background-color: var(--sidebar-background-color);
          -moz-appearance: toolbox; 
          border-bottom: 1px solid var(--sidebar-border-color); 
          border-top: 1px solid var(--sidebar-border-color); 
        } 
        #sidebar-box #sidebarpopuppanel-bottom { 
        background-color: var(--toolbar-bgcolor); 
        width:100%; 
        }
        #sidebar-box #sidebarpopuppanel-bottom:-moz-lwtheme { 
        background-color: var(--sidebar-background-color);
        }`;
      if (this._SIDEBARPOSITION="L") {
        floatingStyle += ' #sidebar-box .PopupResizerGripper { \
        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABG0lEQVQ4jZXT2ytEURTH8U8UIjNESh5kQq4zGIpci+LBg8vkMhgkl+RhMo0Uf7yHWWo8jDlzXvbZv32+a63fr31o7WnHEDaxj6VW4TTW8YgHbLUC92E2wDKKWEgCtyEVcAEfsc6gJwmcxgpKqGIPExhAd7OxUwFf4QknmMYadrD8H/zruRTwEbLI4za0g0Zj13uuRud5ZGKaL7xiNYnnXUyqJV7EN05D+5NBI8+ToZ2jEnAeI+ht5nk+Op/jDfexX8NGvDf1XIzOd1jEXIRYxgX0J/D8W3Aaz/iM72cFfBljH2MMufBaCTgbWgHvOIschmE7Dg6jcypGLeAa4xiMIjdROBd6Xl1QGXSho+5wCp2hj6ndvlG1XzqPlx+JJSwSgQwohgAAAABJRU5ErkJggg=="); \
        cursor: se-resize; \
        }';
      } else {
        floatingStyle += ' #sidebar-box:-moz-locale-dir(rtl) .PopupResizerGripper { \
        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABIUlEQVQ4jZXRwUsUYRzG8Q8Jthi6SiKEB1lZJdvWXUtBKW3BIA8dajfSUjdlMSU6RFII9cd7mGdBPM3MYYaZ9/0983y/L7TxBluYwwMVry4+4UtCZjBRJWAZ7/EdQ7QwWyWkhlV8xJ+0aaVJKZzJbG5gPyFDBU69TEgTG+ikST84x0o6eZnaA4XQNj6o4OQpTnCNrwqp7TQp5eRhMPr4n5BucEo5qWEe6wm5xmEGSjlpZLiT6mf4mZBSTno4Deua4kTO7zkZt7vrpD4OWVKcwG9c4nn+PIiTY8VJreEt/mKEV1iQWwefcYNv2MnQAP/ufFtJg1+4wK5sbOY5zOJrLEbij/D38BjPgjbCO7jK8JOwHQVhGlPYxgE28/4o63t4cQuE/SwSa1JPlgAAAABJRU5ErkJggg=="); \
        cursor: sw-resize; \
        }';
      }
       sspi = document.createProcessingInstruction(
        'xml-stylesheet',
        'type="text/css" href="data:text/css,' + encodeURIComponent(floatingStyle) + '"'
      );
      document.insertBefore(sspi, document.documentElement);
      sspi.getAttribute = function(name) {
      return document.documentElement.getAttribute(name);
      };
      let template = 
        ["hbox", {id: "sidebarpopuppanel-bottom"},
          ["spacer", {flex: "1"}],
          ["image", {class: "PopupResizerGripper",
             onmousedown: "if (event.target == this) sidebarpopuppanelResize.start(event);"}]
        ];
      document.getElementById('sidebar-box')
              .appendChild(this.jsonToDOM(template, document, {}));
    }
    if (this._sidebar_box.hasAttribute('hidden') ||
        this._CLOSE_AT_STARTUP) {
      this._sidebar_box.collapsed = true;
    }
    this._sidebar_box.hidden = false;
    this._sidebar = document.getElementById('sidebar');
    this._sidebar_splitter = document.getElementById('sidebar-splitter');
    if (this._sidebar_splitter.hasAttribute('hidden')) {
      this._sidebar_splitter.removeAttribute('hidden');
    }
    this._sidebar_splitter.removeAttribute('state');
    this._sidebar_splitter.removeAttribute('collapsed');
    var checkbox = document.createXULElement('checkbox');
    var item = document.getElementById('sidebar-throbber');
    this._checkbox = item.parentNode.insertBefore(checkbox, item);
    checkbox.setAttribute("id", "sidebar-checkbox");
    checkbox.setAttribute("type", "checkbox");
    checkbox.setAttribute("label", "");
    checkbox.setAttribute('persist','checked');
    
    checkbox.checked = this._CHECKBOX_AT_STARUP;
    
    if(this._SIDEBARPOSITION == "R"){
      (function(self){ //this code from http://pc11.2ch.net/test/read.cgi/software/1185343069/128
        self._sidebar_splitter = self._sidebar_box.parentNode.appendChild(self._sidebar_splitter);
        self._sidebar_box = self._sidebar_box.parentNode.appendChild(self._sidebar_box);
      })(this);
    }
    window.PrintUtils.printPreview_org = PrintUtils.printPreview;
    PrintUtils.printPreview = function(arg) {
      if(document.getElementById("sidebar-box") && 
         !!document.getElementById("sidebar-box").getAttribute("sidebarcommand")) { 
        if (window.ucjs_expand_sidebar._FLOATING_SIDEBAR)
          SidebarUI.hide();
      }
      window.PrintUtils.printPreview_org(arg);
    };
    /**
     * helper functions
     */
		function accessorDescriptor(field, fun) {
		  var desc = { enumerable: true, configurable: true };
		  desc[field] = fun;
		  return desc;
		}
		function defineGetter(obj, prop, get) {
		  if (Object.defineProperty)
		    return Object.defineProperty(obj, prop, accessorDescriptor("get", get));
		  if (Object.prototype.__defineGetter__)
		    return obj.__defineGetter__(prop, get);
		  throw new Error("browser does not support getters");
		}
		function defineSetter(obj, prop, set) {
		  if (Object.defineProperty)
		    return Object.defineProperty(obj, prop, accessorDescriptor("set", set));
		  if (Object.prototype.__defineSetter__)
		    return obj.__defineSetter__(prop, set);
		  throw new Error("browser does not support setters");
		}
    /**
     * hack
     */
		defineGetter(SidebarUI, "isOpen", function isOpen(){return this._box && !this._box.collapsed;})
		SidebarUI.show_org = SidebarUI.show;
		SidebarUI.show = function show(commandID, triggerNode) {
	      //this._box.hidden = false;
	      this._box.collapsed = false;
	      this._splitter.hidden = false;
        ucjs_expand_sidebar._loadKeepItSizes(commandID);
        ucjs_expand_sidebar._lastcommand = commandID;
        ucjs_expand_sidebar._opend = true;
        if (ucjs_expand_sidebar._FLOATING_SIDEBAR) {
          let x = document.getElementById("appcontent").getBoundingClientRect().x;
          ucjs_expand_sidebar._sidebar_box.style.setProperty("left", x + "px", "");
        }
      SidebarUI.show_org(commandID, triggerNode);
	  }
		SidebarUI.hide_org = SidebarUI.hide;
		SidebarUI.hide =
		function hide(triggerNode) {
	    if (!this.isOpen) {
	      return;
	    }
      ucjs_expand_sidebar._saveKeepItSizes(ucjs_expand_sidebar._lastcommand);
	    this._box.collapsed = true;
        if ("treeStyleTab" in gBrowser)
          gBrowser.treeStyleTab.updateFloatingTabbar(gBrowser.treeStyleTab.kTABBAR_UPDATE_BY_WINDOW_RESIZE);
	    gBrowser.selectedBrowser.focus();
	    //SidebarUI.hide(triggerNode);
	  }
    //Fokussierte Aktion der Seitenleisten ausführen
    //
    if (typeof fireSidebarFocusedEvent == "function") {
      window.fireSidebarFocusedEvent_org = fireSidebarFocusedEvent;
      fireSidebarFocusedEvent = function () {
        fireSidebarFocusedEvent_org();
        ucjs_expand_sidebar._focused();
      }
    }
    if (typeof SidebarUI._fireFocusedEvent == "function") {
      SidebarUI._fireFocusedEvent_org = SidebarUI._fireFocusedEvent;
      SidebarUI._fireFocusedEvent = function () {
        SidebarUI._fireFocusedEvent_org();
        ucjs_expand_sidebar._focused();
      }
    }
    //Beim Start Seitenleiste geschlossen halten?
    setTimeout(function(self) {
      var command = self._sidebar_box.getAttribute("sidebarcommand");
      if (command)
        self._lastcommand = command;
      var broadcasters = document.getElementsByAttribute("group", "sidebar");
      if (self._CLOSE_AT_STARTUP) {
        SidebarUI.hide();
        //self._sidebar_box.setAttribute('collapsed',true);
        for (var i = 0; i < broadcasters.length; ++i) {
          if (broadcasters[i].localName != "broadcaster") {
              continue;
          }
          broadcasters[i].removeAttribute("checked");
        }
      } else {
        for (var i = 0; i < broadcasters.length; ++i) {
          if (broadcasters[i].localName != "broadcaster") {
            continue;
          }
          if (broadcasters[i].hasAttribute("checked")) {
            self._loadKeepItSizes();
            break;;
          }
        }
      }
    }, 500, this);
    this._sidebar.style.removeProperty('max-width');
    this._sidebar.style.removeProperty('min-width');
    this._sidebar.style.setProperty('width', '100%', '');
    this._content = document.getElementById("content");
    if (this._CLOSEWHENGOOUT)
      window.addEventListener("mouseout", ucjs_expand_sidebar._mouseout, true);
    else
      this._sidebar_splitter.addEventListener("mouseout", ucjs_expand_sidebar._mouseout, true);
    if (this._KEEP_SIZES)
      window.addEventListener("resize", this, false);
    if (this._SIDEBARPOSITION == "R"){
      gBrowser.tabpanels.addEventListener("mouseup", this, true);
      gBrowser.tabpanels.addEventListener("mousedown", this, true);
    }
    //this._content.addEventListener("mouseover", ucjs_expand_sidebar._mousemove, true);
    document.getElementById("browser").addEventListener("mousemove", ucjs_expand_sidebar._mousemove, true);
    this._sidebar_box.addEventListener("mouseover", ucjs_expand_sidebar._mouseover, true);
    window.addEventListener("dblclick", this, true);
    //window.addEventListener("click", this, true);
    this._sidebar_splitter.addEventListener("dragover", this, true);
    Services.obs.addObserver(this, "private-browsing", false);
  },
  uninit: function(){
    if (this._CLOSEWHENGOOUT)
      window.removeEventListener("mouseout", ucjs_expand_sidebar._mouseout, true);
    else
      this._sidebar_splitter.removeEventListener("mouseout", ucjs_expand_sidebar._mouseout, true);
    if (this._KEEP_SIZES)
      window.removeEventListener("resize", this, false);
    if (this._SIDEBARPOSITION == "R"){
      gBrowser.tabpanels.removeEventListener("mouseup", this, true);
      gBrowser.tabpanels.removeEventListener("mousedown", this, true);
    }
    //this._content.removeEventListener("mouseover", ucjs_expand_sidebar._mousemove, true);
    document.getElementById("browser").removeEventListener("mousemove", ucjs_expand_sidebar._mousemove, true);
    this._sidebar_box.removeEventListener("mouseover", ucjs_expand_sidebar._mouseover, true);
    window.removeEventListener("dblclick", this, true);
    //window.removeEventListener("click", this, true);
    this._sidebar_splitter.removeEventListener("dragover", this, true);
     Services.obs.removeObserver(this, "private-browsing");
  },
  _back_url: null,
  _back_cachedurl: null,
  observe: function(aSubject, aTopic, aData) {
    var self = ucjs_expand_sidebar;
    if (aData == "enter") {
      self._back_url = self._sidebar_box.getAttribute("src");
      if (self._back_url == "chrome://browser/content/web-panels.xul") {
        var b = self._sidebar.contentDocument.getElementById("web-panels-browser");
        self._back_cachedurl = b.getAttribute("cachedurl");
      }
      self._sidebar_box.setAttribute("src", "about:blank");
      self._sidebar.setAttribute("src", "about:blank");
      self._backup_lastcommand = self._lastcommand;
    } else if (aData == "exit") {
      self._lastcommand = self._backup_lastcommand;
      self._backup_lastcommand = null;
      self._sidebar.setAttribute("src", "about:blank");
      if (self._back_url == "chrome://browser/content/web-panels.xul") {
        if (!!self._back_cachedurl) {
          b = self._sidebar.contentDocument.getElementById("web-panels-browser");
          b.setAttribute("cachedurl", self._back_cachedurl);
          document.persist("web-panels-browser", "cachedurl");
          self._back_cachedurl = null;
        }
      }
      self._sidebar_box.setAttribute("src", self._back_url);
      self._back_url = null;
    }
  },
  handleEvent: function(event){
    event = new XPCNativeWrapper(event);
    switch (event.type){
      case "mouseup":
          if (this._mouse_Timeout)
            clearTimeout(this._mouse_Timeout);
          this._mouse_Timeout = setTimeout(function(self) {
            self._mousedown = false;
            self._checkWindowSideOrNot(event);
          },this._SCROLLBAR_DELAY,this);
          break;
      case "mousedown":
          if (event.screenX < this._sidebar_splitter.screenX - this._TOLERANCE)
            break;
          this._mousedown = true;
          if (this._mouse_Timeout)
            clearTimeout(this._mouse_Timeout);
          this._mouse_Timeout = null;
          this._clearOpenCloseTimer();
          break;
      case "click":
        if (event.button != 2) {
          //return;
        }
        event.preventDefault();
      case "dblclick":
          if(event.originalTarget != this._sidebar_splitter)
            return;
          event.preventDefault();
          event.stopPropagation();
          if (this._mouse_Timeout)
            clearTimeout(this._mouse_Timeout);
          this._mouse_Timeout = null;
          SidebarUI.toggle(this._getDefaultCommandID());
          this._openSidebar(this._getDefaultCommandID());
          this._mousedown = false;
          break;
      case "dragover":
          if (this._mouse_Timeout)
            clearTimeout(this._mouse_Timeout);
          this._mouse_Timeout = null;
          this._mousedown = false;
            if (this._close_Timeout)
              clearTimeout(this._close_Timeout);
            this._close_Timeout = null;
            if(!this._open_Timeout){
              this._open_Timeout = setTimeout(function(self){
                 var hidden = (self._sidebar_box.hasAttribute('hidden')?true:false) ||
                               self._sidebar_box.getAttribute('collapsed') == "true";
                 if (hidden) {
                   SidebarUI.toggle(self._getDefaultCommandID(), true);
                   self._openSidebar(self._getDefaultCommandID(), true);
                 }
              }, this._OPEN_DELAY_DRAGOVER, this);
            }
          break;
      case "resize":
        if (this._FLOATING_SIDEBAR) {
/*          this._loadKeepItSizes();
          if (this._resizeTimer)
            clearTimeout(this._resizeTimer);
          this._resizeTimer = setTimeout(() => {this._loadKeepItSizes();},250)
*/
          return;
        }
        if (this._resizeTimer)
          clearTimeout(this._resizeTimer);
        if (this._startup) {
          this._startup = false;
          return;
        }
        this._resizeTimer = setTimeout(function(self) {
          //Wenn die Seitenleiste geöffnet ist, Größe speichern
          var hidden = self._sidebar_box.hasAttribute('hidden') ? true : false;
          if (!hidden && self._sidebar_box.getAttribute('collapsed') != "true" ) {
            var size = self._sidebar_box.getBoundingClientRect().width;
            //Aktuellen Befehl ermitteln.(get)
            var _command =  self.getCommandId();
            if (!!_command){
              self._saveKeepItSizes(_command, size);
            }
          }
        }, 500, this);
        break;
    }
  },
  //Getrennt, um die Last zu reduzieren
  _mouseover: function(event){
    ucjs_expand_sidebar._checkWindowSideOrNot(event);
  },
  _mousemove: function(event){ 
    var self = ucjs_expand_sidebar;
//self.debug(event);
    if (self._mtimer)
      return;
    self._mtimer = true;
    setTimeout(function(self){
      self._mtimer = false;
    }, self._MOUSEMOVEINTERVAL, self);
    
    //self..debug("_mousemove " +event.originalTarget);
    if (event.originalTarget == self._sidebar_splitter) {
      self._checkWindowSideOrNot(event);
      return;
    }
    //self.debug("_mousemove self._mousedown=" +self._mousedown);
    if (self._mousedown) {
      return;
    }
    self._checkWindowSideOrNot(event);
  },
  _mouseout: function(event){
    var self = ucjs_expand_sidebar;
    if (self._mouse_Timeout)
      clearTimeout(self._mouse_Timeout);
    self._mouse_Timeout = null;
    //keine Aktion direkt nach dem öffnen
    if (self._opend) return;
    //Beim Überfahren des Fensterrandes Seitenleiste nicht öffnen
    if(!self._CLOSEWHENGOOUT){
      if (self._sidebar_splitter == event.originalTarget){
        if (self._open_Timeout)
          clearTimeout(self._open_Timeout);
        self._open_Timeout = null;
      }
      return;
    }
    //Wenn diese Option aktiviert ist, Seitenleiste nicht schließen
    if (self._checkbox.checked) return;
    if (/^menu|browser|tooltip/.test(event.originalTarget.localName)) return;
    if (self._sidebar.contentWindow.location.href == "chrome://browser/content/web-panels.xul") return;
    if (!self._close_Timeout) {
      //self.debug(event.type + "  " + event.originalTarget.localName + "  " + event.target.localName );
      if (self._open_Timeout)
        clearTimeout(self._open_Timeout);
      self._open_Timeout = null;
      self._close_Timeout = setTimeout(function(self){
        self._mousedown = false;
        self.toggleSidebar();
      }, self._CLOSE_DELAY, self);
    }
  },
  //Aktuellen Befehl ermitteln.(get)
  getCommandId: function(){
    return SidebarUI._box.getAttribute("sidebarcommand");
  },
	toggleSidebar: function expandsidebartoggleSidebar(commandID, forceOpen = false) {
    if (this._FLOATING_SIDEBAR) {
      let x = document.getElementById("appcontent").getBoundingClientRect().x;
      this._sidebar_box.style.setProperty("left", x + "px", "");
      this._sidebar.style.setProperty("left", x - 1  + "px", "");
    }
    if (forceOpen) {
      SidebarUI.show(commandID);
    } else {
      SidebarUI.toggle(commandID);
    }
  },
  _loadKeepItSizes: function(_command){
      if (this._KEEP_SIZES) {
        if (!_command)
          _command = this.getCommandId();
        if(!!_command) {
          this.sizes = this.getPref(this.prefKeepItSizes, 'str', 'viewBookmarksSidebar|178|viewHistorySidebar|286|viewGrepSidebar|157|viewUpdateScanSidebar|230|viewWebPanelsSidebar|371|viewWebPageSidebar|371|viewScrapBookSidebar|182|viewAdd-onsSidebar|371|viewStylishSidebar|379|viewMozgestSidebar|234|viewConsole2Sidebar|234|viewGoogleTransitSidebar|371|viewGoogleDocSidebar|371|viewIGoogleSidebar|371|viewPasswordManagerSidebar|371').split('|');
          var index = this.sizes.indexOf(_command);
          if (index < 0 ){
            this.sizes.push(_command);
            index = this.sizes.length - 1;
            this.sizes.push(this._defaultWidth);
          }
          if (this.sizes[index + 1] <= 0)
            this.sizes[index + 1] = this._defaultWidth
          if (this._FLOATING_SIDEBAR) {
            this._sidebar_box.style.setProperty('width', this.sizes[index + 1] + "px", "");
            //this._sidebar.style.setProperty('width', this.sizes[index + 1] - 1  + "px", "");
          } else
            this._sidebar_box.style.setProperty('width', this.sizes[index + 1] + "px", "");
          return;
        }
      }
      if (this._sidebar_box.getBoundingClientRect().width == 0) {
        if (this._FLOATING_SIDEBAR) {
          this._sidebar_box.style.setProperty('width', this._defaultWidth + "px", "");
          //this._sidebar.style.setProperty('width', this._defaultWidth - 1  + "px", "");
        } else {
          this._sidebar_box.style.setProperty('width', this._defaultWidth + "px", "");
        }
      }
  },
  _saveKeepItSizes: function(_command, size){
    if (!this._KEEP_SIZES)
      return;
    if (!!_command && size) {
      //this.debug(_command + "  "+ size);
      var index = this.sizes.indexOf(_command);
      if (index < 0 ){
        this.sizes.push(_command);
        this.sizes.push(size);
      } else {
        this.sizes[index + 1] = size;
      }
      var str = this.sizes.join('|');
      this.setPref(this.prefKeepItSizes, 'str', str);
    }
  },
  _openSidebar: function(_command, _forceOpen){
    this._clearOpenCloseTimer();
    //this.toggleSidebar(_command, _forceOpen);
    //Flag, ob mouseout sofort nach dem Öffnen als true verarbeitet werden soll oder nicht
    this._opend = true;
    if(this._mouseoutTimer)
      clearTimeout(this._mouseoutTimer);
    //Auf „false“ setzen, damit mouseout nach 200 ms nach dem Öffnen verarbeitet werden kann
    this._mouseoutTimer = setTimeout(function(that){that._opend = false;},300,this);
  },
  _focused: function(){
    //Suchfeld fokussieren wenn vorhanden
    var doc = this._sidebar.contentWindow.document;
    if (doc) {
      var elem = doc.getElementById("search-box");
      if (elem) {
        try {
          setTimeout(function(doc, elem){
            doc.defaultView.focus();
            elem.focus();
          }, 0, doc, elem)
        } catch(e) {}
      }
    }
  },
  _getDefaultCommandID: function(_command){
    if(!_command) _command = this._lastcommand;
    if(!_command) _command = this._DEFAULTCOMMAND;
    return _command;
  },
  _clearOpenCloseTimer: function() {
    if (this._close_Timeout)
      clearTimeout(this._close_Timeout);
    this._close_Timeout = null;
    if (this._open_Timeout)
      clearTimeout(this._open_Timeout);
    this._open_Timeout = null;
  },
  _checkMouseIsWindowEdge: function(x) {
    var sw = this._sidebar_splitter.getBoundingClientRect().width;
    if (this._SIDEBARPOSITION == "L") {
      //Linker Rand des Fensters x Koordinaten
      if ( 0 <= x && x <= sw + this._TOLERANCE)
        return true;
    }else if(this._SIDEBARPOSITION == "R") {
      //Rechter Rand des Fensters x Koordinaten
      if (-this._TOLERANCE <= x && x <= sw)
        return true;
    }
    return false;
  },
  _checkMouseIsSidebarEdge: function(x){
    var sw = this._sidebar_splitter.getBoundingClientRect().width;
    //this.debug("_checkMouseIsSidebarEdge " +(sw + this._TOLERANCE+"px ") + (x+"px "));
    if (this._SIDEBARPOSITION == "L") {
      //Linker Rand des Fensters x Koordinaten
      if(sw + this._TOLERANCE < x)
        return true;
    } else if(this._SIDEBARPOSITION == "R") {
      //Rechter Rand des Fensters x Koordinaten
      if (x <  -this._TOLERANCE)
        return true;
    }
    return false;
  },
  _checkWindowSideOrNot: function(event){ 
    var sidebar_box = this._sidebar_box;
    if (sidebar_box.getBoundingClientRect().width == 0) {
      sidebar_box.style.setProperty('width', this._defaultWidth + "px", "");//Seitenleiste Standardbreite
      //this._sidebar.style.setProperty('width', this._defaultWidth - 1 + "px", "");//Seitenleiste Standardbreite
    }
//this.debug(event.target.localName);
/*
    if(/tabbrowser/.test(event.target.localName)){
      return
    }
*/
    //Ob es außerhalb des oberen und unteren Bereichs des Inhaltsbereichs liegt
    var y = event.screenY - gBrowser.tabpanels.screenY;
    if(y < 0 || y > gBrowser.tabpanels.getBoundingClientRect().height){
      this._clearOpenCloseTimer();
      return
    }
//this.debug(event.type+"\n"+event.screenX+"\n"+this._sidebar_splitter.boxObject.screenX+"\n"+(event.target instanceof HTMLElement || /browser/.test(event.target.localName) ))
    var hidden = (sidebar_box.hasAttribute('hidden')?true:false) ||
                  sidebar_box.getAttribute('collapsed') == "true";
    var x = event.screenX - this._sidebar_splitter.screenX;
    //Fensterrand ermitteln
    if (hidden) {
      if (event.originalTarget == this._sidebar_splitter ||
          this._checkMouseIsWindowEdge(x)) {
        if (this._close_Timeout)
          clearTimeout(this._close_Timeout);
        this._close_Timeout = null;
        if (!this._open_Timeout) {
          this._open_Timeout = setTimeout(function(self){
            SidebarUI.toggle(self._getDefaultCommandID());
            self._openSidebar(self._getDefaultCommandID());
          }, this._OPEN_DELAY, this);
        }
      } else {
        if (this._open_Timeout)
          clearTimeout(this._open_Timeout);
        this._open_Timeout = null;
      }
      return;
    }
    //X-Koordinaten der Inhaltsseite der Seitenleiste
    if (!this._checkbox.checked && !hidden) {
//this.debug("this.isChrome(event) "+ this.isChrome(event));
      if (event.originalTarget != this._sidebar_splitter &&
          this._checkMouseIsSidebarEdge(x) &&
          !(this._DONOTCLOSE_XULELEMENT && this.isChrome(event)) /*||
          (event.type == "mouseover" &&
           (event.target instanceof HTMLElement || /browser/.test(event.target.localName)) )*/ ) {
        if (this._open_Timeout)
          clearTimeout(this._open_Timeout);
        this._open_Timeout = null;
        if (this._close_Timeout || this._opend)
          return;
        this._close_Timeout = setTimeout(function(self){
          self.toggleSidebar();
        }, this._CLOSE_DELAY, this);
      } else {
        if (this._close_Timeout)
          clearTimeout(this._close_Timeout);
        this._close_Timeout = null;
        this._opend = false;
      }
    }
  },
  isChrome: function(aEvent) {
    var x = aEvent.screenX;
    var y = aEvent.screenY;
    var sidebarBox = this._sidebar_box.getBoundingClientRect();
//userChrome_js.debug( this._sidebar_box.screenX <= x)
//userChrome_js.debug( x <= this._sidebar_box.screenX + sidebarBox.width )
    if (this._sidebar_box.screenX <= x && x <= this._sidebar_box.screenX + sidebarBox.width &&
        this._sidebar_box.screenY <= y && y <= this._sidebar_box.screenY + sidebarBox.height)
      return true;
    //if (aEvent.target instanceof HTMLElement)
    //  return false;
    if (/^(splitter|grippy|menu|panel|notification)/.test(aEvent.target.localName))
      return true;
    var box = gBrowser.tabpanels.getBoundingClientRect();
    var bx = gBrowser.tabpanels.screenX;
    var by = gBrowser.tabpanels.screenY;
    if (bx <= x && x <= bx + box.width &&
        by <= y && y <= by + box.height)
      return false;
    else
      return true;
  },
  //Einstellungen lesen
  getPref: function(aPrefString, aPrefType, aDefault){
    var xpPref = Components.classes['@mozilla.org/preferences-service;1']
                  .getService(Components.interfaces.nsIPrefBranch);
    try{
      switch (aPrefType){
        case 'complex':
          return xpPref.getComplexValue(aPrefString, Components.interfaces.nsILocalFile); break;
        case 'str':
          return xpPref.getCharPref(aPrefString).toString(); break;
        case 'int':
          return xpPref.getIntPref(aPrefString); break;
        case 'bool':
        default:
          return xpPref.getBoolPref(aPrefString); break;
      }
    }catch(e){
    }
    return aDefault;
  },
  //Einstellungen speichern
  setPref: function(aPrefString, aPrefType, aValue){
    var xpPref = Components.classes['@mozilla.org/preferences-service;1']
                  .getService(Components.interfaces.nsIPrefBranch);
    try{
      switch (aPrefType){
        case 'complex':
          return xpPref.setComplexValue(aPrefString, Components.interfaces.nsIFile, aValue); break;
        case 'str':
          return xpPref.setCharPref(aPrefString, aValue); break;
        case 'int':
          aValue = parseInt(aValue);
          return xpPref.setIntPref(aPrefString, aValue);  break;
        case 'bool':
        default:
          return xpPref.setBoolPref(aPrefString, aValue); break;
      }
    }catch(e){
    }
    return null;
  },
  debug: function(aMsg){
   // return;
    const Cc = Components.classes;
    const Ci = Components.interfaces;
    Cc["@mozilla.org/consoleservice;1"]
      .getService(Ci.nsIConsoleService)
      .logStringMessage(aMsg);
  }
};
// Einstiegspunkt
ucjs_expand_sidebar.init();
window.addEventListener("unload", function(){ ucjs_expand_sidebar.uninit(); }, false);
var sidebarpopuppanelResize = {
  drag   : false,
  size   : null,
  offset : null,
  PREF_SIZE : "extensions.sidebarpopuppanelResize.size.",
  get isRTL() {
    return document.defaultView
                .getComputedStyle(document.getElementById("nav-bar"), "")
                .direction == "rtl";
  },
  get sidebar() {
    return document.getElementById("sidebar");;
  },
  
  get sidebarbox() {
    return document.getElementById("sidebar-box");;
  },
  get sidebarcommand() {
    return this.sidebarbox.getAttribute('sidebarcommand');
  },
  init: function(){
    window.addEventListener("unload", this, false);
      this.SM_Observer = new MutationObserver(function(mutations) {
      mutations.forEach(function(mutation) {
        switch (mutation.attributeName) {
          case "style":
            let style = this.sidebarbox.getAttribute("style");
            if (style.includes("width: 0px")) {
              ucjs_expand_sidebar._loadKeepItSizes();
            }
            break;
        }
      }.bind(this));
    }.bind(this));
    // pass in the target node, as well as the observer options
    this.SM_Observer.observe(document.getElementById("sidebar-box"),
                             {attribute: true, attributeFilter: ["style"]});
  },
  uninit: function(){
    window.removeEventListener("unload", this, false);
    window.removeEventListener("mouseup", this, true);
    window.removeEventListener("mousemove", this, true);
  },
  handleEvent: function (event) {
    switch (event.type) {
      case "load":
        this.init();
        break;
      case "unload":
        this.uninit();
        break;
      case "mouseup":
        this.mouseup(event);
        break;
      case "mousemove":
        if (this.timer) {
            clearTimeout(this.timer);
        }
        this.timer = setTimeout(function (event, self) {
          self.mousemove(event);
        }, 10, event, this);
        break;
      default:;
    }
  },
  start: function(event){
    this.checked = ucjs_expand_sidebar._checkbox.checked;
    ucjs_expand_sidebar._checkbox.checked = true;
    this.drag = true;
    this.size = {height:parseInt(this.sidebarbox.getBoundingClientRect().height),
                 width:parseInt(this.sidebarbox.getBoundingClientRect().width)};
    this.offset = {x: event.screenX, y: event.screenY};
    window.addEventListener("mouseup", this, true);
    window.addEventListener("mousemove", this, true);
  },
  mouseup: function(event) {
    ucjs_expand_sidebar._checkbox.checked = this.checked;
    this.drag = false;
    window.removeEventListener("mousemove", this, true);
    window.removeEventListener("mouseup", this, true);
    ucjs_expand_sidebar._saveKeepItSizes(this.sidebarcommand, this.sidebarbox.getBoundingClientRect().width);
  },
  mousemove: function(event) {
    if (this.drag) {
      var newValue;
      var h = this.size.height;
      newValue = h + event.screenY - this.offset.y;
      if (newValue <= h - 50) {
        h = newValue;
      }
      var w = this.size.width;
      if (this.isRTL)
        newValue = w - (event.screenX - this.offset.x);
      else
        newValue = w + event.screenX - this.offset.x;
      if (newValue <= screen.width) {
        w = newValue;
      }
      this.setSize(h, w);
    }
  },
  setSize: function(h, w){
    if (h && h + this.sidebarbox.screenY <= screen.height - 50 && h >= 10) {
//      this.sidebar.style.setProperty('height', h + "px", "");
    }
    if (w && 0<=w ) {
      this.sidebar.style.setProperty('width', w - 1 + "px", "");
      this.sidebarbox.style.setProperty('width', w + "px", "");
    }
  }
};
sidebarpopuppanelResize.init();Oje, kaum gepostet habe ich eine funktionierende Version gefunden.
 
								
					userChrome.js/Firefox 127/expandsidebar.uc.js at master · Endor8/userChrome.js
					
			Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
					github.com
				Also wäre nur die 2. Frage nach besseren Alternativen noch aktuell.
 
		
		
	 
								




