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. Mira_Belle

Beiträge von Mira_Belle

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 12. Januar 2026 um 00:20

    Was für'ne Geburt!

    Erst ein mal ein ganz <3liches DANKE an Endor, Horstmann, FuchsFan, milupo & 2002Andreas.

    Ihr habt mir sehr weitergeholfen und ich habe mal wieder mit den Browserwerkzeugen hantieren dürfen.
    Eure Kommentare, Hinweise und Codebeispiele haben mich inspiriert und irgendwann hatte ich dann
    auch mal eine Lösung.

    Hier nun das passende CSS zu meiner Version der "rebuild_userChrome.uc.js".
    Das CSS habe ich ganz bewusst in das JavaScript integriert.

    CSS
        /* Symbol vor dem JavaScript-Loader-Menü */
        #userChrome_js_menu {
          background-image: url("${ProfileDirectory}/js.svg") !important;
          padding-left: 36px;
        }
    
        /* Menüpopup "Alle UserScripte aktivieren/deaktivieren */
        #userChromejs_options {
          margin-left: 5px !important;
        }
    
            /* Menüpopup "Alle UserScripte aktivieren/deaktivieren */
        #userChromejs_options {
          margin-left: 5px !important;
        }
    
        /* Menüpopup "Alle UserScripte in "scripts" aktivieren/deaktivieren */
        #userChromejs_options > menu:nth-child(6) > menupopup:nth-child(4) {
          margin-left: 5px !important;
        }
    
        /* Alle UserScripte aktivieren/deaktivieren */
        #userChromejs_options > menuitem:not([checked="true"]) {
            background-image: url("${ProfileDirectory}/${ButtonIcon}") !important;
            background-repeat: no-repeat !important;   
            background-position: 11px 5px !important;
            background-size: 16px 16px !important;
        }
        #userChromejs_options > menuitem[checked="false"] {
            padding-left: 12px !important;
        }
    
        /* Alle UserScripte in "scripts" */
        #userChromejs_options > menu[label='Alle UserScripte in "scripts"'] {
            padding-left: 12px !important;
            background-image: url("chrome://global/skin/icons/menu-check.svg") !important;
            background-repeat: no-repeat !important;   
            background-position: 12px 5px !important;
            background-size: 16px 16px !important;
        }
        #userChromejs_options > menu[style="font-style:italic;"] {
            background-image: url("${ProfileDirectory}/${ButtonIcon}") !important;
            background-repeat: no-repeat !important;   
            background-position: 11px 5px !important;
            background-size: 16px 16px !important;
        }
    
        /* Alle UerScripte in "scripts" aktivieren/deaktivieren */
        #userChromejs_options > menu[label='Alle UserScripte in "scripts"'] > menupopup[hasbeenopened="true"] > menuitem:not([checked="true"]){
            background-image: url("${ProfileDirectory}/${ButtonIcon}") !important;
            background-repeat: no-repeat !important;   
            background-position: 12px 5px !important;
            background-size: 16px 16px !important;
        }
        #userChromejs_options > menu[label='Alle UserScripte in "scripts"'] > menupopup[hasbeenopened="true"] > menuitem[checked="false"]{
            padding-left: 12px !important;
        }
    Alles anzeigen

    Nun funktioniert wirklich alles, so wie ich mir das vorgestellt habe.
    Werde mich im Laufe der Woche drann machen und die Dateien von Coderesten zu befreien
    und den einen oder anderen Kommentar noch hinzufügen.
    Denke, werde bis spätestens nächstes Wochenende dann alles hier veröffentlichen können
    und auch noch einmal eine kleine Erklärung dazu abgeben zu können.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 11. Januar 2026 um 20:21

    Horstmann Sorry, hatte nur kurz reingeschaut
    und Deinen Kommentar nicht als Frage nach dem Code aufgefasst!

    Hier mal der vorläufige Code für die "rebuild_userChrome.uc.js".

    CSS
      var userChromejs = {
    // --- config ---
        editor: (AppConstants.platform == "win") 
            //     ? "C:\\Program Files\\Notepad++\\notepad++.exe"
                 ? "C:\\Program Files\\Microsoft VS Code\\Code.exe"
                 : ((AppConstants.platform == "linux")
                   ?"/usr/bin/gedit" /*"/usr/bin/xed"*/
                   : ""),
    // --- config ---
        _statusDisplay: null,
    
        get statusDisplay() {
          if (!this._statusDisplay)
            this._statusDisplay = document.getElementById('status-bar') ||
                                  document.getElementById('statusbar-display');
          return this._statusDisplay;
        },
    
        _addonbar: null,
        get addonbar() {
          if (!this._addonbar)
            this._addonbar = document.getElementById('addon-bar');
          return this._addonbar;
        },
    
        handleEvent: function(event) {
          switch(event.type) {
            case 'dragover':
              this.dragover(event);
              break;
            case 'drop':
              this.drop(event);
              break;
            case 'unload':
              this.uninit();
              break;
          }
        },
    
        createElement: function(localName, arryAttribute) {
          let elm = document.createXULElement(localName);
          for(let i = 0; i < arryAttribute.length; i++) {
            elm.setAttribute(arryAttribute[i].attr, arryAttribute[i].value);
          }
          return elm;
        },
    
        init: function(){
          window.addEventListener("unload",this , false);
    
          let ref = document.getElementById("menu_preferences");
          let menu = ref.parentNode.insertBefore(
            this.createElement("menu",
              [{attr: "id", value:"userChrome.js_menu"},
               {attr: "label", value:"JavaScript-Loader-Menü"},
               /*{attr: "accesskey", value:"u"}*/
              ]), ref);
          let popup = menu.appendChild(this.createElement("menupopup",
            [{attr: "id", value:"userChromejs_options"},
             /*{attr: "onpopupshowing", value:"userChromejs.onpopup()"},*/
             {attr: "context", value:""}
            ]));
          popup.appendChild(this.createElement("menuitem",
            [{attr: "id", value:"userChrome_setting"},
             {attr: "label", value:"Skript für jedes Fenster neuladen"},
             {attr: "accesskey", value:"u"},
             /*{attr: "oncommand", value:"userChromejs.setting();"},*/
             {attr: "type", value:"checkbox"}
            ]));
          popup.appendChild(this.createElement("menuitem",
            [{attr: "id", value:"userChrome_rebuild"},
             {attr: "label", value:"userChrome.js/Neues Fenster neu erstellen"},
             {attr: "accesskey", value:"x"},
             /*{attr: "oncommand", value:"userChromejs.rebuild();"}*/
            ]));
          popup.appendChild(this.createElement("menuitem",
            [{attr: "id", value:"userChrome_restartApp"},
             {attr: "label", value:"Browser neustarten"},
             {attr: "accesskey", value:"r"},
             /*{attr: "oncommand", value:"userChromejs.restartApp();"}*/
            ]));
          popup.appendChild(this.createElement("menuitem",
            [{attr: "id", value:"userChrome_openChrome"},
             {attr: "label", value:"chrome Ordner öffnen"},
             {attr: "accesskey", value:"h"},
             /*{attr: "oncommand", value:'new Components.Constructor("@mozilla.org/file/local;1","nsIFile", "initWithPath")(Services.dirsvc.get("UChrm", Components.interfaces.nsIFile).path).reveal();'}*/
            ]));
    
          menu = ref.parentNode.insertBefore(
            this.createElement("menu",
              [{attr: "id", value:"userChromejs_script_options_Menu"},
               {attr: "label", value:"userChrome.js Scripte"},
               {attr: "accesskey", value:"s"}
              ]), ref);
          popup = menu.appendChild(this.createElement("menupopup",
            [{attr: "id", value:"userChromejs_script_options"}
            ]));
    
    
          document.getElementById('userChrome_setting').addEventListener("command", () => userChromejs.setting());
          document.getElementById('userChrome_rebuild').addEventListener("command", () => userChromejs.rebuild());
          document.getElementById('userChrome_restartApp').addEventListener("command", () => userChromejs.restartApp());
          document.getElementById('userChrome_openChrome').addEventListener("command", () => {new Components.Constructor("@mozilla.org/file/local;1","nsIFile", "initWithPath")(Services.dirsvc.get("UChrm", Components.interfaces.nsIFile).path).reveal()});
    
          if (AppConstants.platform == "linux")
            userChromejs.onpopup();
    
    
          if ("nsDragAndDrop" in window && this.statusDisplay) {
            this.statusDisplay.addEventListener('dragover',function(event){nsDragAndDrop.dragOver(event,userChromejs.dndObserver);},true);
            this.statusDisplay.addEventListener('dragdrop',function(event){nsDragAndDrop.drop(event,userChromejs.dndObserver);},true);
          } else if(this.addonbar) {
            this.addonbar.addEventListener('dragover', this ,true);
            this.addonbar.addEventListener('drop', this ,true);
          }
          this.addPrefListener(userChromejs.readLaterPrefListener); // 登録処理
          document.getElementById("menu_ToolsPopup").addEventListener("popupshowing", function(event) {if (event.target == this) userChromejs.onpopup(event);}, false);
        },
        uninit: function(){
          if ("nsDragAndDrop" in window && this.statusDisplay) {
            this.statusDisplay.removeEventListener('dragover',function(event){nsDragAndDrop.dragOver(event,userChromejs.dndObserver);},true);
            this.statusDisplay.removeEventListener('dragdrop',function(event){nsDragAndDrop.drop(event,userChromejs.dndObserver);},true);
          } else if(this.addonbar) {
            this.addonbar.removeEventListener('dragover', this ,true);
            this.addonbar.removeEventListener('drop', this ,true);
          }
          this.removePrefListener(userChromejs.readLaterPrefListener); // 登録解除
        },
    
        dragover: function(event) {
          var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                            .getService(Ci.nsIDragService);
          var dragSession = dragService.getCurrentSession();
          var supportedTypes = ["text/x-moz-url", "text/unicode", "application/x-moz-file"];
          for (let type of supportedTypes) {
            if (event.dataTransfer.types.contains(type)) {
              var data = event.dataTransfer.getData(type);
              var url = (/^\s*(.*?)\s*$/m.test(data))
                         ? RegExp.$1 : null;
              if (/(\.uc\.js|\.uc\.xul|\.uc\.xul\.txt)$/.test(url)) {
                dragSession.canDrop = true;
                event.preventDefault();
                return;
              }
            }
          }
        },
    
        drop: function(event) {
          var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                            .getService(Ci.nsIDragService);
          var dragSession = dragService.getCurrentSession();
          var supportedTypes = ["text/x-moz-url", "text/unicode", "application/x-moz-file"];
          for (let type of supportedTypes) {
            if (event.dataTransfer.types.contains(type)) {
              var data = event.dataTransfer.getData(type);
              this.dndObserver.onDrop(event, {data: data}, dragSession);
              return;
            }
          }
        },
    
        dragDropSecurityCheck: function dragDropSecurityCheck(event, dragSession, url) {
          if (!url)
            return false;
    
          // need to do a security check to make
          // sure the source document can load the dropped URI.
          url = url.replace(/^\s*|\s*$/g, '');
    
          if (url.indexOf('chrome://') == 0 || url.indexOf('file://') == 0)
            return url;
    
          // urlSecurityCheck
          try {
            urlSecurityCheck(url, gBrowser.contentPrincipal, Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
          }
          catch(e) {
            event.stopPropagation();
            //throw 'Drop of ' + url + ' denied.';
            return false;
          }
          return url;
        },
    
        dndObserver: {
          getSupportedFlavours : function () {
            var flavours = new FlavourSet();
            flavours.appendFlavour("text/x-moz-url");
            flavours.appendFlavour("text/unicode");
            flavours.appendFlavour("application/x-moz-file");
            return flavours;
          },
          onDragOver: function (evt,flavour,session){},
          onDrop: function (evt,dropdata,session){
            var fname;
            evt.stopPropagation();
            evt.preventDefault();
            if (dropdata.data!=""){
              //ステータスバーの左1/3にドロップしたか
              var target = evt.target;
              while(target){
                if(target == userChromejs.statusDisplay ||
                   target == userChromejs.addonbar)
                  break;
                target = target.parentNode;
              }
              if(!target) return;
              if(evt.screenX > target.boxObject.screenX + target.boxObject.width/3) return;
    
              //saveFolderModokiが必要
              if(!saveFolderModoki) return;
              //ドロップしたurl
              var url = (/^\s*(.*?)\s*$/m.test(dropdata.data))?RegExp.$1:null;
              //保存ホルダ nsIFile
              var folder = Services.dirsvc.get("UChrm", Components.interfaces.nsIFile);
              //デフォルトのファイル名
              if(/(.*)\n?(.*)?/m.test(dropdata.data) )
                fname = RegExp.$2?RegExp.$2:"";
              //データスキームか
              if(/(^data:text\/javascript(;.*)?,?)|(^data:application\/x-javascript(;.*)?,?)/.test(url)){
                // urlSecurityCheck は saveFolderModoki.directSaveLinkで実施している
                saveScript(url, fname, folder);
              }else{
                //リンクか
                if(!/(^h?ttps?:\/\/)|(^ftp:\/\/)/.test(url)) return;
                if (/^h?.?.p(s?):(.+)$/i.test(url)){
                  url = "http" + RegExp.$1 + ':' + RegExp.$2;
                  if(!RegExp.$2) return null;
                  fname = url.match(/.+\/(.+)$/)[1];
                }
                fname = fname.replace(/\.uc\.xul\.txt$/,'.uc.xul');
                //スクリプトファイルか?
                if(/(\.uc\.js|\.uc\.xul|\.uc\.xul\.txt)$/.test(url)){
                  if (typeof gBrowser.dragDropSecurityCheck == 'function')
                    gBrowser.dragDropSecurityCheck(evt, session, url);
                  else {
                    userChromejs.dragDropSecurityCheck(evt, session, url)
                  }
                  saveScript(url, fname, folder);
                }
              }
            }
            function saveScript(url, fname, folder){
              //ファイルピッカによりnsIFile決定
              var aFile = getFolderPath(fname, folder)
              if(!aFile) return;
              //フォルダパス
              folder = aFile.path.replace(aFile.leafName,'');
              //nsILocalFileのフォルダ
              var aFolder = saveFolderModoki.initFileWithPath(folder);
              if(!aFolder) return;
              //リンクを保存
              saveFolderModoki.directSaveLink(null, url, aFile.leafName, gBrowser.currentURI, aFolder);
            }
            function getFolderPath(fname, folder){
              //ファイルピッカにより保存先決定
              var fp = Components.classes['@mozilla.org/filepicker;1']
                        .createInstance(Components.interfaces.nsIFilePicker);
                fp.init(window, "Save script As", fp.modeSave);
                fp.appendFilter("Script Files","*.uc.js; *.uc.xul");
              if(/\.uc\.js$/.test(fname)){
                fp.defaultExtension = "uc.js";
                fp.defaultString = fname;
              }else if(/\.uc\.xul$/.test(fname)){
                fp.defaultExtension = "uc.xul";
                fp.defaultString = fname;
              }else{
                fp.defaultExtension = "uc.js";
                fp.defaultString = fname + ".uc.js";
              }
              fp.displayDirectory = folder;
              if ( fp.show() == fp.returnCancel || !fp.file ) return;
              //nsIFile
              return fp.file;
            }
          }
        },
    
        rebuild: function(){
          var flag = this.getPref("userChrome.enable.reuse",'bool',true);
          this.setPref("userChrome.enable.reuse",'bool',false);
          setTimeout(function(){OpenBrowserWindow();},  0);
          setTimeout(function(self,flag){self.setPref("userChrome.enable.reuse",'bool',flag);},2000,this,flag);
        },
        setting: function(){
          var flag = this.getPref("userChrome.enable.reuse",'bool',true);
          this.setPref("userChrome.enable.reuse",'bool',!flag);
        },
        onpopup: function(event){
          var menu;
          var flag = this.getPref("userChrome.enable.reuse",'bool',true);
          var menuitem = document.getElementById('userChrome_setting');
          menuitem.setAttribute('checked', !flag);
    
          var menupopup = document.getElementById("userChromejs_options");
          for(var i = 4, len = menupopup.childNodes.length; i < len; i++){
            menupopup.removeChild(menupopup.lastChild);
          }
    
        /*  var menuseparator = document.createXULElement('menuseparator'); */
        /*  menupopup.appendChild(menuseparator); */
    
          menuitem = document.createXULElement('menuitem');
    //      menuitem.setAttribute('label','userCrome.js Aktivieren/Deaktivieren');
          menuitem.setAttribute('label','Alle UserScripte aktivieren/deaktivieren');
          //menuitem.setAttribute('oncommand','userChromejs.chgDirStat("*");');
          //menuitem.setAttribute('onclick','userChromejs.clickDirMenuitem(event,true);');
          menuitem.setAttribute('type','checkbox');
          menuitem.setAttribute('checked', !userChrome_js.dirDisable['*']);
          menuitem.dirName = '*';
          menupopup.appendChild(menuitem);
          menuitem.addEventListener('command', () => userChromejs.chgDirStat("*"));
          menuitem.addEventListener('click', (event) => userChromejs.clickDirMenuitem(event,true));
    
          for(var j = 0, lenj = userChrome_js.arrSubdir.length; j < lenj; j++){
            var dirName = userChrome_js.arrSubdir[j] == "" ? "root" : userChrome_js.arrSubdir[j];
            var flg = false;
            for(var i = 0, len = userChrome_js.scripts.length; i < len; i++){
              var script = userChrome_js.scripts[i];
              if(script.dir != dirName) continue;
              flg = true;
              break;
            }
            if(!flg){
              for(var i = 0, len = userChrome_js.overlays.length; i < len; i++){
                var script = userChrome_js.overlays[i];
                if(script.dir != dirName) continue;
                flg = true;
                break;
              }
            }
            if(!flg) continue;
    
    
            menu = document.createXULElement('menu');
    //        menu.setAttribute('label','chrome/' + (dirName=="root"?"":dirName) );
            menu.setAttribute('label','Alle UserScripte in ' +'"'+ (dirName=="root"?"":dirName) +'"');
            menu.addEventListener('click', (event) => userChromejs.clickDirMenu(event));
            //menu.setAttribute('onclick','userChromejs.clickDirMenu(event);');
            if(userChrome_js.dirDisable[dirName])
              menu.setAttribute('style', 'font-style:italic;');
            menu.dirName = dirName;
    
            menupopup = document.createXULElement('menupopup');
            //menupopup.setAttribute('onpopupshowing','event.stopPropagation();');
    
            menuitem = document.createXULElement('menuitem');
    //        menuitem.setAttribute('label','chrome/' + (dirName=="root"?"":dirName) + ' Aktivieren/Deaktivieren  Scripte Chromeordner');
            menuitem.setAttribute('label','Alle UserScripte in ' +'"'+ (dirName=="root"?"":dirName) +'"' + ' aktivieren/deaktivieren');
            //menuitem.setAttribute('oncommand', 'userChromejs.chgDirStat(this.dirName);');
            //menuitem.setAttribute('onclick','userChromejs.clickDirMenuitem(event);');
            menuitem.setAttribute('type', 'checkbox');
            menuitem.setAttribute('checked', !userChrome_js.dirDisable[dirName]);
            menuitem.dirName = dirName;
            menupopup.appendChild(menuitem);
            menuitem.addEventListener('command', () => userChromejs.chgDirStat(this.dirName));
            menuitem.addEventListener('click', (event) => userChromejs.clickDirMenuitem(event));
    
            menuseparator = document.createXULElement('menuseparator');
            menupopup.appendChild(menuseparator);
    
            var flg = false;
            for(var i = 0, len = userChrome_js.scripts.length; i < len; i++){
              var script = userChrome_js.scripts[i];
              if(script.dir != dirName) continue;
                flg = true;
                menuitem = document.createXULElement('menuitem');
                menuitem.setAttribute('label',script.filename);
                //menuitem.setAttribute('oncommand','userChromejs.chgScriptStat(this.script.filename);');
                //menuitem.setAttribute('onclick','userChromejs.clickScriptMenu(event);');
                //menuitem.setAttribute('onmouseup','if(event.button == 1) event.preventDefault();');
                menuitem.setAttribute('type','checkbox');
                menuitem.setAttribute('autocheck','false');
                menuitem.setAttribute('checked',!userChrome_js.scriptDisable[script.filename] );
                if(script.description)
                  menuitem.setAttribute('tooltiptext',script.description);
                menuitem.script = script;
                menupopup.appendChild(menuitem);
                menuitem.addEventListener('command', () => userChromejs.chgScriptStat(this.script.filename));
                menuitem.addEventListener('click', (event) => userChromejs.clickScriptMenu(event));
                menuitem.addEventListener('mouseup', (event) => {if(event.button == 1) event.preventDefault()});
            }
            for(var i = 0, len = userChrome_js.overlays.length; i < len; i++){
              var script = userChrome_js.overlays[i];
              if(script.dir != dirName) continue;
                if(flg){
                  menuseparator = document.createXULElement('menuseparator');
                  menupopup.appendChild(menuseparator);
                }
                flg = false;
                menuitem = document.createXULElement('menuitem');
                menuitem.setAttribute('label',script.filename);
                //menuitem.setAttribute('oncommand','userChromejs.chgScriptStat(this.script.filename);');
                //menuitem.setAttribute('onclick','userChromejs.clickScriptMenu(event);');
                //menuitem.setAttribute('onmouseup','if(event.button == 1) event.preventDefault();');
                menuitem.setAttribute('type','checkbox');
                menuitem.setAttribute('autocheck','false');
                menuitem.setAttribute('checked',!userChrome_js.scriptDisable[script.filename] );
                if(script.description)
                  menuitem.setAttribute('tooltiptext',script.description);
                menuitem.script = script;
                menupopup.appendChild(menuitem);
                menuitem.addEventListener('command', () => userChromejs.chgScriptStat(this.script.filename));
                menuitem.addEventListener('click', (event) => userChromejs.clickScriptMenu(event));
                menuitem.addEventListener('mouseup', (event) => {if(event.button == 1) event.preventDefault()});
            }
            menu.appendChild(menupopup);
            menupopup = document.getElementById("userChromejs_options");
            menupopup.appendChild(menu);
          }
        },
    
        clickDirMenu: function(event){
          if(event.button == 1 || event.button == 2){
            event.stopPropagation();
            event.preventDefault();
            userChromejs.chgDirStat(event.target.dirName);
            if(event.target.firstChild && event.target.firstChild.firstChild)
              event.target.firstChild.firstChild.setAttribute('checked',!userChrome_js.dirDisable[event.target.dirName] );
            if(!!userChrome_js.dirDisable[event.target.dirName])
              event.target.setAttribute('style', 'font-style:italic;');
            else
              event.target.removeAttribute('style');
          }
        },
    
        clickDirMenuitem: function(event,stop){
          if(event.button == 1 || event.button == 2){
            event.stopPropagation();
            event.preventDefault();
            userChromejs.chgDirStat(event.target.dirName);
            event.target.setAttribute('checked',!userChrome_js.dirDisable[event.target.dirName] );
            if(!stop && !!userChrome_js.dirDisable[event.target.dirName])
              event.target.parentNode.parentNode.setAttribute('style', 'font-style:italic;');
            else
              event.target.parentNode.parentNode.removeAttribute('style');
          }
        },
    
        clickScriptMenu: function(event){
          if(event.button==1){
            event.stopPropagation();
            event.preventDefault();
            userChromejs.chgScriptStat(event.target.script.filename);
            event.target.setAttribute('checked',!userChrome_js.scriptDisable[event.target.script.filename] );
          }else if(event.button==2){
            event.stopPropagation();
            event.preventDefault();
            this.launchEditor(event.target.script);
          }
        },
    
        launchEditor: function(aScript){
          var editor = this.editor;
          var path = Services.io.newURI(aScript.url)
                     .QueryInterface(Ci.nsIFileURL).file.path;
    
          var appfile = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsIFile);
          appfile.initWithPath(editor);
          var process = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
          process.init(appfile);
          process.runw(false, [path], 1, {});
        },
    
        chgDirStat: function(adirName){
          var s = userChromejs.getPref("userChrome.disable.directory", "str", "");
          if(!userChrome_js.dirDisable[adirName]){
            s = (s+',').replace(adirName+',','') + adirName+',';
          }else{
            s = (s+',').replace(adirName+',','');
          }
          s = s.replace(/,,/g,',').replace(/^,/,'');
          userChromejs.setPref("userChrome.disable.directory", "str", s);
          userChrome_js.dirDisable = this.restoreState(s.split(','));
        },
    
        chgScriptStat: function(afilename){
          var s = userChromejs.getPref("userChrome.disable.script", "str", "");
          if(!userChrome_js.scriptDisable[afilename]){
            s = (s+',').replace(afilename+',','') + afilename+',';
          }else{
            s = (s+',').replace(afilename+',','');
          }
          s = s.replace(/,,/g,',').replace(/^,/,'');
          userChromejs.setPref("userChrome.disable.script", "str", s);
          userChrome_js.scriptDisable = this.restoreState(s.split(','));
        },
    
        restoreState: function (arr){
          var disable = [];
          for(var i = 0,len = arr.length; i < len; i++)
            disable[arr[i]] = true;
          return disable;
        },
    
    
        //prefを読み込み
        getPref: function(aPrefString, aPrefType, aDefault){
          var xpPref = Services.prefs;
          try {
            switch (aPrefType){
              case 'complex':
                return xpPref.getComplexValue(aPrefString, Components.interfaces.nsIFile); break;
              case 'str':
                return unescape(xpPref.getCharPref(aPrefString).toString()); break;
              case 'int':
                return xpPref.getIntPref(aPrefString); break;
              case 'bool':
              default:
                return xpPref.getBoolPref(aPrefString); break;
            }
            } catch(e) {}
          return aDefault;
        },
        //prefを書き込み
        setPref: function(aPrefString, aPrefType, aValue){
          var xpPref = Services.prefs;
          try {
            switch (aPrefType){
              case 'complex':
                return xpPref.setComplexValue(aPrefString, Components.interfaces.nsIFile, aValue); break;
              case 'str':
                return xpPref.setCharPref(aPrefString, escape(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;
        },
        // 監視を開始する
        addPrefListener: function(aObserver) {
            try {
                var pbi = Services.prefs;
                pbi.addObserver(aObserver.domain, aObserver, false);
            } catch(e) {}
        },
    
        // 監視を終了する
        removePrefListener: function(aObserver) {
            try {
                var pbi =  Services.prefs;
                pbi.removeObserver(aObserver.domain, aObserver);
            } catch(e) {}
        },
    
        readLaterPrefListener:{
            domain  : 'userChrome.disable',
                //"userChrome.disable"という名前の設定が変更された場合全てで処理を行う
    
            observe : function(aSubject, aTopic, aPrefstring) {
                if (aTopic == 'nsPref:changed') {
                    // 設定が変更された時の処理
                    setTimeout(function(){
                      var s = userChromejs.getPref("userChrome.disable.directory", "str", "");
                      userChrome_js.dirDisable = userChromejs.restoreState(s.split(','));
                      s = userChromejs.getPref("userChrome.disable.script", "str", "");
                      userChrome_js.scriptDisable = userChromejs.restoreState(s.split(','));
                    }, 0);
                }
            }
        },
    
        restartApp: function() {
          if ("BrowserUtils" in window && typeof BrowserUtils.restartApplication == "function") {
            Components.classes["@mozilla.org/xre/app-info;1"]
                      .getService(Components.interfaces.nsIXULRuntime).invalidateCachesOnRestart();
            BrowserUtils.restartApplication();
            return;
          }
    
          const appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
                            .getService(Components.interfaces.nsIAppStartup);
    
          // Notify all windows that an application quit has been requested.
          var os = Components.classes["@mozilla.org/observer-service;1"]
                             .getService(Components.interfaces.nsIObserverService);
          var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"]
                                     .createInstance(Components.interfaces.nsISupportsPRBool);
          os.notifyObservers(cancelQuit, "quit-application-requested", null);
    
          // Something aborted the quit process.
          if (cancelQuit.data)
            return;
    
          // Notify all windows that an application quit has been granted.
          os.notifyObservers(null, "quit-application-granted", null);
    
          // Enumerate all windows and call shutdown handlers
          var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                             .getService(Components.interfaces.nsIWindowMediator);
          var windows = wm.getEnumerator(null);
          var win;
          while (windows.hasMoreElements()) {
            win = windows.getNext();
            if (("tryToClose" in win) && !win.tryToClose())
              return;
          }
          let XRE = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
          if (typeof XRE.invalidateCachesOnRestart == "function")
            XRE.invalidateCachesOnRestart();
          appStartup.quit(appStartup.eRestart | appStartup.eAttemptQuit);
        }
      }
      userChromejs.init();
    
      //メニューが長くなりすぎるので, あまり使わないメニューを"userChrome.jsの各スクリプトの設定"の下に移動させる
      var userChromejsScriptOptionsMenu = {
        //あまり使わないメニューのリスト
        menues: [
          "GrabScroll_optionsMenu",
          "Patch_XULrubySupportMenu",
          "menutabTooltip",
          "PipeliningToggle",
          "linkInNewTabForSpecifiedPageToolMenu",
          "ieviewModokiTool",
          "linkloadInBackgroundToolMenu",
          "SaveFolderToolsMenu",
          "ucjs_copysysinfo-menu",
        ],
    
        interval: 500, //0.5秒間隔
        maxcount: 50,   //最大50回までトライ
        count: 0,
        timer: null,
    
        run: function() {
          //DOMの構築が完了するのを待ってからメニューを移動させる(5秒間隔で最大50回までトライ)
          this.timer = setInterval(function(self){
            if (++self.count > self.maxcount || self.moveMenu())
              clearInterval(self.timer);
          }, this.interval, this);
        },
    
        moveMenu: function(){
          var menupopup = document.getElementById('userChromejs_script_options');
          if (!menupopup)
            return false;
          var i = 0;
          while (i < this.menues.length) {
            var menu = document.getElementById(this.menues[i])
            if (menu) {
              setTimeout(function(menupopup, menu){menupopup.appendChild(menu);}, 100, menupopup, menu);
              this.menues.splice(i, 1);
              continue;
            }
            i++;
          }
          return this.menues.length == 0 ? true : false;
        },
      }
      userChromejsScriptOptionsMenu.run();
    
    (function () {
      let sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);       
      let uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
    
        #userChrome_setting,
        #userChrome_rebuild,
        #userChrome_restartApp,
        #userChrome_openChrome,
        #userChromejs_script_options_Menu {
          display: none  !important;
        }
    
      `), null, null);
      sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    })();
    Alles anzeigen
  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 11. Januar 2026 um 17:30

    Horstmann

    Hat sich mit dem Code von 2002Andreas aus #36 erledigt,
    wenn er auf das Loadermenü eingegrenzt werden könnte.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 11. Januar 2026 um 13:58

    Danke 2002Andreas

    CSS
      menuitem[checked="false"]  {
       background: url("file:///C:/Users/weiss/IconsFirefox/2.jpg") no-repeat !important;
       height: 25px !important;
       padding-top: 5px !important;
       padding-left: 15px !important;
       background-position: 7px 3px !important;
    }

    Das reicht schon fast!
    Der Selektor müsste nur etwas "genauer" sein.
    Es würde möglicherweise schon reichen, wenn das CSS nur auf das Skript. bzw, das Loadermenü eingeschränkt wäre.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 11. Januar 2026 um 12:45

    Hallo 2002Andreas ,
    ich bin fast so weit mit dem JavaScript-Loader fertig!
    Ich bräuchte aber mal Deine Hilfe, CSS, wieder so 'ne widerspenstige Sache!

    Man kann in dem Menü Scripte aktivieren bzw. deaktivieren, so weit, so gut.
    Nun mein Problem, wenn ein Skript aktiviert ist, ist ein Häkchen davor,
    ist es deaktiviert, nicht, aber der Eintrag springt dann ein Stück nach rechts!
    Blöd, sieht einfach nicht gut aus.
    Schöner wäre es, wenn anstatt des Häkchens einfach ein anderes Symbol angezeigt werden würde.
    Nur ich bekomme das einfach nicht gebacken.

    Dieses Verhalten ist auch bei anderen Menüeinträgen, wo aktiviert/deaktiviert werden kann, zu beobachten.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 10. Januar 2026 um 02:12

    Fertig, Finito, Finish, Listo, 完成.

    Nachtrag!

    Eine Hürde muss ich noch nehmen, das Aktivieren der einzelnen Skripten funktioniert nur per Mittelklick.
    Ich würde das aber lieben mit Linksklick machen wollen.

    Danach gehts ans Aufräumen und Putzen,
    und wenn ich dann richtig fertig bin,
    gibt es eine kleine Anleitung nebst Dateien.

  • Hinweise auf DeepL dauerhaft deaktivieren

    • Mira_Belle
    • 10. Januar 2026 um 00:39

    uBlock Origin ist Dein Freund.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 10. Januar 2026 um 00:26

    Habe soeben entdeckt, dass mit Mittelklick die Häkchen in der "Liste" der UserScripte ein bzw. aus geblendet werden.
    Muss mal die originalen Dateien zurückspielen und ausprobieren, ob ich nicht zu viel Code entsorgt habe.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 9. Januar 2026 um 23:45

    Hi Merci chao, vielen Dank für Dein Hilfeangebot, aber ich bin total verwirrt von den ganzen Dateien von verschieden Leuten, dass ich mich mithilfe von verschiedenen KIs selber dran gemacht habe eine Lösung zu finden!

    Stand der Dinge ist jetzt, ich kann ALLE meine UserScripte mit dem ganzen Wust von Dateien,
    laden und sie werden auch ausgeführt!

    Was bis jetzt nicht funktioniert, dass ich einzelne Skripte beenden kann, bzw. laden kann.
    Und der Firefox muss auch immer neu gestartet werden.

    Mal schauen, ob ich das noch irgendwie hinbekomme!
    Nur mal zum Überblick!
    In der "userChrome.js" steht:

    Code
    userChrome.ignoreCache = true;
    userChrome.import("*", "UChrm");
    userChrome.import("userChrome", "UChrm");

    Damit wird der Ordner "userChrome" eingebunden.
    Das ist wichtig, weil sich dort zum einen die "rebuild_userChrome.uc.js" befindet,
    aber eben auch die "userChrome.js" von Alice, die nachgeladen wird!
    Es gibt natürlich auch noch den Order "utils" mit den Dateien
    "chrome.manifest", "userChrome.js" und "xPref.sys.mjs".

    Im Augenblick kann ich nicht so genau sagen, an welche Datei ich nicht Hand angelegt habe,
    das muss ich dann per WinMerge herausfinden und dann werde ich diese Dateien,
    bzw. dem Code dann auch hier einstellen.

    Ich fürchte aber, das wird noch etwas dauern, es sei denn jemand will die Dateien schon mal zur Prüfung haben.
    Ich würde mich wirklich freuen, wenn mir bei dem Unterfangen jemand helfen würde.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 8. Januar 2026 um 19:36

    So, ich habe mal etwas getrixt!
    Ich habe die "kleine" userChrome.js umgeschrieben!

    JavaScript
    userChrome.ignoreCache = true;
    userChrome.import("*", "UChrm");
    userChrome.import("scripts", "UChrm");
    userChrome.import("userChrome", "UChrm");

    Alle UserSkripts, welche über die "große" userChrome.js von Alice geladen und ausgeführt werden
    in den neuen Ordner "scripts_test" geschoben.
    Im Ordner "userChome" liegen nun die Dateien "rebuild_userChrome.uc.js" und "userChromeJS.js".
    Nicht wundern, ich habe die "userChrome.js"von Alice so umbenannt:!:

    Das Resultat, alle Skripte werden geladen.
    Jene im Ordner "script" durch die "kleine" userChrome.js
    und jene im Ordner "scripts_test" über die umbenannte "userChrome.js"von Alice.

    Zwei Dinge sind mir noch unklar.
    1. Warum werden manche UserSkripte geladen und ausgeführt und andere eben nicht,
    und
    2. Was ist mit dem Menü "userChrome,js Scripte"? Warum wird da nichts angezeigt?

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 8. Januar 2026 um 18:26
    Zitat von milupo

    Sind denn die Einstellungen der Zeilen 25 und 26 auch so in about:config gesetzt?

    Ja.

    Interresant ist ja, dass alle Skripte geladen und ausgeführt werden,
    wenn ich die "kleine" userChrome.js nutze.
    Gut, das rebuild_userChrome.uc.js funktioniert dann nicht mehr richtig, ist ja klar.

    JavaScript
    userChrome.ignoreCache = true;
    userChrome.import("*", "UChrm");
    userChrome.import("scripts", "UChrm");

    Dass eben nicht alle Skripte geladen und ausgeführt werden,
    geschieht nur bei Nutzung der "großen" userChrome.js von Alice.

    userChrome.js/135/userChrome.js at master · alice0775/userChrome.js
    Contribute to alice0775/userChrome.js development by creating an account on GitHub.
    github.com

    Dafür funktioniert dann aber die rebuild_userChrome.uc.js
    mit der Einschränkung, dass das Menü "userChrome Skripte" nichts anzeigt!

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 8. Januar 2026 um 18:04
    Zitat von FuchsFan

    Eventuell würde das ja funktionieren.

    Nein, das ist es nicht. Schade, aber Danke.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 8. Januar 2026 um 17:04

    Es funktioniert, so teilweise!

    Unter Extras habe ich zwei neue Einträge.
    1. userChrome.js Einstellungen

    und

    2. userChrome.js Scripte.

    Unter "userChrome.js Einstellungen" gibt es noch weitere Menüpunkte
    und die funktionieren auch so weit!
    Und ich habe die "userChrome.js" dahingehend erweitert, dass auch den Ordner "scripts" (.../chome/scripts) eingebunden wird.
    Unter "userChrome.js Scripte" sollte auch irgendetwas sein, jedoch ist da nichts:!:


    Kommen wir noch zu einem anderen Problem!
    Was sind die Voraussetzungen, dass Skript überhaupt eingebunden werden?
    Denn ich hätte da welche, wie z.B. About-Dialog.uc.js, welches nicht "auftaucht. (geladen wird)
    Wo hin gegen Downloadbutton.uc.js sehr wohl auftaucht und geladen wird!

    JavaScript
    // About-Dialog.uc.js
    // Das Script erstellt einen Button, der den About-Dialog öffnet.
    
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    
    (function() {
    
      if (!window.gBrowser)
    	return;
    
       const
       // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                id = 'aboutname', // Id des Buttons
             label = 'aboutname', // Bezeichnung des Buttons
       tooltiptext = 'Über Firefox',
       // Icon-------------------------------------------------------
              icon = 'firefox_logo_16.svg',  // [Name.Dateiendung] des Symbols
          iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
       curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); // Pfad zum Profil
       // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
    	if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
    		Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
    	}
       //BUTTON
    	try {
          CustomizableUI.createWidget({
             id: id,
             defaultArea: CustomizableUI.AREA_NAVBAR,
             label: label,
             tooltiptext: tooltiptext,
    
             onCreated: (button) => {
                button.style.MozContextProperties = 'fill, stroke, fill-opacity';
                button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
                button.style.minWidth = 'fit-content';
             }
          });
    	} catch(e) {};
    
      //click
      (function add_button() {
        const button = document.getElementById(id);
        if (button) {
          button.addEventListener('click', event => {
            if (event.button !== 0) return;
              openAboutDialog();
          });
        } else {
          setTimeout(add_button, 100);
        }
      })();
    
    })();
    Alles anzeigen

    und

    JavaScript
    // Downloadbutton.uc.js
    // Das Script erstellt einen Button, der das Downloadfenster öffnet.
    
    // Source file https://www.camp-firefox.de/forum/thema/140072/?postID=1282691#post1282691
     
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    
    (function() {
    
      if (!window.gBrowser) 
        return;
      
      const
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
               id = 'Download-button', // Id des Buttons
            label = 'Download Fenster öffnen', // Bezeichnung des Buttons
      tooltiptext = 'Download Fenster öffnen',
      // Icon-------------------------------------------------------
             icon = 'Download.png',  // [Name.Dateiendung] des Symbols
         iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
    
    	if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
    		Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
    	}
      //BUTTON
    	try {
        CustomizableUI.createWidget({
          id: id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: label,
          tooltiptext: tooltiptext,
    
          onCreated: (button) => {
            button.style.MozContextProperties = 'fill, stroke, fill-opacity';
            button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
            button.style.minWidth = 'fit-content';
          }
        });
    	} catch(e) {};
    
      (function add_button() {
        const button = document.getElementById(id);
        if (button) {
          button.addEventListener('click', (event) => {
            if (event.button === 0) {
              event.target.ownerGlobal.window.open(
                'chrome://browser/content/downloads/contentAreaDownloadsView.xhtml',
                'Downloads',
                'chrome,resizable=yes,width=800,height=600,left=120,top=100'
              );
            }
          });
        } else {
        // Button existiert noch nicht → später erneut versuchen
        setTimeout(add_downloads_button_listener, 100);
        }
      })();
    
    })();
    Alles anzeigen

    Sieht da irgendwer irgendetwas?

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 8. Januar 2026 um 09:43
    Zitat von milupo

    ... dann muss die userChrome.sys.mjs heißen und die xPrefs.jsm muss xprefs.sys.mjs heißen. ....

    In der userChrome.sys.mjs muss dann oben in den Zeilen 3-5 stehen: ...

    Habe ich mir auch schon überlegt. Werde das so heute Abend mal ausprobieren.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 7. Januar 2026 um 23:05

    Endor Habe es gerade nochmals mit den "neuen" Dateien ausprobiert. Funktioniert nicht!

    milupo Diese Dateien werden in den anzulegenden Ordner "utils" abgelegt
    und von der "neuen" Datei "config.js" im Installationsordner geladen. So verstehe ich das.

    JavaScript
    // skip 1st line
    lockPref('xpinstall.signatures.required', false);
    lockPref('extensions.install_origins.enabled', false);
    
    try {
      const cmanifest = Services.dirsvc.get('UChrm', Ci.nsIFile);
      cmanifest.append('utils');
      cmanifest.append('chrome.manifest');
      Components.manager.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(cmanifest);
    
      Services.scriptloader.loadSubScript('chrome://userchromejs/content/BootstrapLoader.js');
    } catch (ex) {};
    
    try {
      ChromeUtils.import('chrome://userchromejs/content/userChrome.jsm');
    } catch (ex) {};
    Alles anzeigen

    Es funktioniert halt warum auch immer nicht!


    Es wäre doch wunderbar gewesen, wenn man ohne neu starten zu müssen,
    im laufenden Betrieb, Skripte hätte ein und aus schalten können.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 7. Januar 2026 um 20:45

    Danke Endor

    Habe alles wieder rückgängig gemacht!
    Werde es die Tage noch einmal ausprobieren.

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 7. Januar 2026 um 19:50

    Backup eingespielt!
    Alles auf anfang!
    1. "fx-folder.zip" heruntergeladen und ins Installationsverzeichnis entpackt.
    2. "utils.zip" heruntergeladen und in den Chrome-Ordner entpackt.
    3. Ein Skript ohne den Eintrag "@shutdown" am Anfang des Codes heruntergeladen und in den Chrome-Ordner kopiert.
    4. Das Skript "rebuild_userChrome.uc.js" heruntergeladen und ebenfalls in den Chrome-Ordner kopiert.
    5. "Clear startup cache ..." geleert und den Firefox neu gestartet!

    Kein Button, kein Menü!

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 7. Januar 2026 um 18:55

    Horstmann Bist Du fit in Englisch?
    Ich bin es nicht! Und für diesen doch eher komplizierten Sachverhalt ist DeepL dann wahrscheinlich nicht wirklich gut geeignet!

    Das ist die Fehlermeldung in der Konsole zu seinem Skript!

    Code
    Uncaught ReferenceError: UC is not defined
        <anonymous> file:///C:/Users/Mira/AppData/Roaming/Mozilla/Firefox/Profiles/Mira/chrome/rebuild_userChrome.uc.js:10
        loadScript file:///C:/Program Files/Mozilla Firefox/userChromeJS/utilities.js:114

    Damit kann ich leider nichts anfangen!


    AH!
    Ok, die Variable oder Funktion namens UC wird in der Datei "userChrome.jsm" definiert!
    Nur, diese wird gar nicht geladen!
    Kopiere ich den Code in die userChrome.js, wird weder CSS noch irgendein Skript geladen.

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • Mira_Belle
    • 7. Januar 2026 um 14:08
    Zitat von Merci chao

    Yup, it's very clear and good to understand.

    Fine. :)

  • JavaScriptLoader, läuft bei mir nicht!

    • Mira_Belle
    • 7. Januar 2026 um 14:06

    So gemacht, funktioniert nicht!
    Der Firefox stört sich an der Zeile "UC.rebuild = {", genauer an "UC".
    Keine Ahnung was ich da machen müsste.
    Also habe ich das originale Skript von Alice mal ausprobiert.
    Und hier ist es die Zeile "Components.utils.import('resource://gre/modules/Services.jsm');"
    die dem Firefox nicht schmeckt.
    Dann kam ich auf die glorreiche Idee, diese Zeile einfach mal auszukommentieren.
    Resultat:

    Code
    Content-Security-Policy: Die Einstellungen der Seite haben die Ausführung eines Ereignis-Handlers (script-src-attr) blockiert, weil er gegen folgende Direktive verstößt: "script-src chrome: moz-src: resource: 'report-sample'". Ziehen Sie die Verwendung eines Hashs ('sha256-Yo856KonK7sMiCcoaLH+CnMDTWwrIcP+CGJILK4m+io=') zusammen mit 'unsafe-hashes' in Erwägung. rebuild_userChrome.uc.js:84:13
    Content-Security-Policy: Die Einstellungen der Seite haben die Ausführung eines Ereignis-Handlers (script-src-attr) blockiert, weil er gegen folgende Direktive verstößt: "script-src chrome: moz-src: resource: 'report-sample'". Ziehen Sie die Verwendung eines Hashs ('sha256-+Xakl4WneZC5/yvSUqot7GeFXStIl/9kK3URiQZhhvo=') zusammen mit 'unsafe-hashes' in Erwägung. rebuild_userChrome.uc.js:84:13
    Content-Security-Policy: Die Einstellungen der Seite haben die Ausführung eines Ereignis-Handlers (script-src-attr) blockiert, weil er gegen folgende Direktive verstößt: "script-src chrome: moz-src: resource: 'report-sample'". Ziehen Sie die Verwendung eines Hashs ('sha256-D55EV9fCTb45t0mchWvDSDKYcuszkVcBW9eCs3JsiAs=') zusammen mit 'unsafe-hashes' in Erwägung. rebuild_userChrome.uc.js:84:13
    Content-Security-Policy: Die Einstellungen der Seite haben die Ausführung eines Ereignis-Handlers (script-src-attr) blockiert, weil er gegen folgende Direktive verstößt: "script-src chrome: moz-src: resource: 'report-sample'". Ziehen Sie die Verwendung eines Hashs ('sha256-yGuA4eVq9wdPJ0khBXvZg9ydMYkU+EQc1jmcyvrBNDw=') zusammen mit 'unsafe-hashes' in Erwägung.

    Na ja, wäre ja auch zu einfach gewesen.

Unterstütze uns!

Jährlich (2026)

21,3 %

21,3% (138,31 von 650 EUR)

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