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

Beiträge von BrokenHeart

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 15. Januar 2025 um 07:25

    Endor

    Zwei Gründe warum die Kompakt-Lösung nicht funktioniert hat.

    1) Ich hatte eine ganz andere, ältere Version auf GitHub als Basis genommen. In der neueren Version gibt es noch zusätzliche Inline-Events, die ich nicht berücksichtigt hatte.

    Eine Bitte: in Zukunft immer gleich das ganze Skript posten, sonst wird es wirklich schwierig und fehleranfällig.

    2) Die Variable el hatte ich fälschlicherweise als e1 gelesen. Daher hatte das Skript natürlich sofort eine Exception geschmissen.

    Ich habe es jetzt nicht wirklich gründlich getestet, aber jetzt sollte die geänderte Funktion passen. Egal welches Skript du letztendlich verwendest, würde ich mich freuen, wenn du diese Lösung auch mal antesten könntest...:)

    JavaScript
    function $C(name, attr) {
        var el = document.createXULElement(name);
        if (attr) Object.keys(attr).forEach(function(n) {
    		
            if(n == "oncommand") {
    			el.addEventListener('command', function(event) { Function(attr[n])(); });
    		} 
    		else if(n == "onclick") {
    			el.addEventListener('click', function(event) { Function(attr[n])(); });
    		}
    		else if(n == "onmouseup") {
    			el.addEventListener('mouseup', function(event) { Function(attr[n])(); });
    		}
    		else {
    			el.setAttribute(n, attr[n]); 
    		}
    	});
        
    	return el;
    }
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 14. Januar 2025 um 20:09
    Zitat von Endor

    Habe ich auch getestet, dann geht das Script auch nicht mehr:

    Das wusste ich nicht, dass du es schon getestet hattest. Wenn es bei dir nicht läuft, dann kann ich das nur untersuchen, wenn ich das Skript bei mir installiere. Weiß aber nicht, ob ich das zeitnah machen werde ... :/

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 14. Januar 2025 um 19:51
    Zitat von Endor

    Was das Script: usercssloader.uc.js betrifft habe ich gestern
    weiter gemacht aber es funktioniert nicht.

    Hallo Endor

    Ich hatte dir hier:

    Beitrag

    RE: Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    […]

    Wenn man sich das gesamte Skript anschaut, ist es dann nicht tatsächlich besser '$C()' (warum dieses überflüssige '$'-Zeichen?) zu verändern und dort den EventListener hinzuzufügen? :/ Sonst müsste man ja zigmal Variablen definieren und jedes Mal einen Eventlistener erstellen. So kann man direkt in der Funktion das gerade erzeugte Element nutzen und es gibt den Code für den Eventlistener für alle Elemente nur einmal.



    Endor

    Normalerweise würde ich es ja testen, aber mit dem 'userCSSLoader'…
    BrokenHeart
    13. Januar 2025 um 20:50

    eine (ungetestete) Lösung angeboten. Wenn du magst, dann probier sie einfach aus. Dafür musst du nur eine einzige Funktion austauschen, sonst kannst du alles andere so lassen, wie es bisher war...

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 14. Januar 2025 um 14:17
    Zitat von Sören Hentzschel

    Die Frage hatte ich übersehen.

    Kein Problem...:)

    Zitat von Sören Hentzschel

    Man kann natürlich auch diesen Weg gehen. Dann muss man halt in dieser Funktion den Namen der Eigenschaft prüfen und für die on*-Eigenschaften den Listener ensprechend setzen statt das Attribut. Dann darf man nur nicht vergessen, den Namen dynamisch anzupassen, denn das on gehört ja nicht in den Event-Namen und der erste Buchstabe muss klein sein.

    Ja, so habe ich es ja in dem Beispielcode auch gemacht. Ganz verstehe ich nicht, was du meinst :/. 'oncommand' und 'onclick' werden nicht in die Attribute geschrieben, sondern stattdessen eben der entsprechende EventListener hinzugefügt mit 'command' und 'click'. Für alle anderen Eigenschaften des übergebenen Objekts wird die vorgegebene Standardzuweisung el.setAttribute(n, attr[n]);  verwendet.

    Zitat von Sören Hentzschel

    Wieso das $ verwendet wird, weiß ich nicht. Wenn ich so etwas sehe, vermute ich als erstes, dass der ursprüngliche Entwickler aus der jQuery-Entwicklung kommt und das daher hat. Aber vielleicht hatte der Entwickler auch eine ganz eigene Konvention, wann er das Dollar-Zeichen verwendet. Das müsste man den Entwickler mal fragen. Schlimmer finde ich, dass Funktionen als $, $A und $C benannt sind. Schön kurz, ja, aber nicht lesbar an den Stellen, an denen die Funktionen verwendet werden.

    Ja sehe ich auch so. In einigen Scriptsprachen wird auch dieses $ vor dem Variablennamen verwendet. Wahrscheinlich noch nicht ganz in der 'neuen' Sprache angekommen, da nutzt man dann immer wieder gerne gewohnte Strukturen aus der "Heimatsprache". Habe da auch so ein paar Baustellen...;)

    Würde mich schon interessieren, ob der Code auch funktioniert. Aber ich könnte Endor auch verstehen, wenn er es nicht nochmal testen möchte, wenn die andere Herangehensweise funktioniert hat.;)

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 13. Januar 2025 um 20:50
    Zitat von Sören Hentzschel

    Wenn die Funktion selbst nicht verändert werden soll, kann man das Element nutzen, welche die Methode zurück gibt. Weist man den Rückgabewert einer Variablen zu, kann man darauf dann addEventListener ausführen.

    Wenn man sich das gesamte Skript anschaut, ist es dann nicht tatsächlich besser '$C()' (warum dieses überflüssige '$'-Zeichen?) zu verändern und dort den EventListener hinzuzufügen? :/ Sonst müsste man ja zigmal Variablen definieren und jedes Mal einen Eventlistener erstellen. So kann man direkt in der Funktion das gerade erzeugte Element nutzen und es gibt den Code für den Eventlistener für alle Elemente nur einmal.


    Endor

    Normalerweise würde ich es ja testen, aber mit dem 'userCSSLoader' ist mir das ehrlich gesagt zu viel Aufwand.

    Hier die geändert $C()-Funktion (ab Zeile 630)

    Das ist ungetestet und kann sowohl syntaktische, als auch semantische Fehler aufweisen, was sogar sehr wahrscheinlich ist:!:

    Original:

    JavaScript
    function $C(name, attr) {
        var el = document.createXULElement(name);
        if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) });
        return el;
    }

    Neu:

    JavaScript
    function $C(name, attr) {
        var el = document.createXULElement(name);
        if (attr) Object.keys(attr).forEach(function(n) {
    		
            if(n == "oncommand") {
    			e1.addEventListener('command', function(event) { Function(attr[n])(); });
    		} 
    		else if(n == "onclick") {
    			e1.addEventListener('click', function(event) { Function(attr[n])(); });
    		}
    		else {
    			el.setAttribute(n, attr[n]); 
    		}
    	});
        
    	return el;
    }
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 13. Januar 2025 um 12:24
    Zitat von Mira_Belle

    Um welches Skript geht es eigentlich genau, bei der Konversation mit FuchsFan ?

    Das hier:

    Beitrag

    RE: Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    […]

    […]

    Die Einstellungen werden jetzt aufgerufen, aber ich weiß nicht, was die Änderung sonst noch bewirkt:/.

    Der Neustart wird mit einer Fehlermeldung quittiert. Das Verhalten habe ich aber auch im unveränderten Skript von #1 und auch in der FF134, daher frage ich mich, ob das wirklich immer so funktioniert hat oder ob bestimmte Bedingungen erfüllt sein müssen?



    Bitte mal testen:

    (Quelltext, 494 Zeilen)

    BrokenHeart
    12. Januar 2025 um 19:57
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 13. Januar 2025 um 11:55

    2002Andreas

    Gern geschehen :) und danke für die Erklärung zum Sinn dieses Skripts. :thumbup:

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 13. Januar 2025 um 11:42
    Zitat von 2002Andreas

    Es würde mich freuen, wenn sich das mal jemand ansehen/anpassen könnte, evtl. lerne ich dadurch ja doch etwas.

    Man sollte "nur von den Besten lernen" ... also nicht von mir ;). Aber hier mal das Skript. Hoffe es läuft.
    Setzt das wirklich nur den mediasource-Eintrag in about:config? Keine Ahnung wozu das gut ist...:/

    Code
    (function() {
    
      if(location.href != 'chrome://browser/content/browser.xhtml') return;
    
       try {
          CustomizableUI.createWidget({
             id: 'menu-button',
             type: 'custom',
             defaultArea: CustomizableUI.AREA_NAVBAR,
             onBuild: function(aDocument) {
                var button = aDocument.createXULElement('toolbarbutton');
                var attributes = {
                   id: 'menu-button',
                   class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                   removable: 'true',
                   label: 'Videos aufnehmen können',
                   tooltiptext: Services.prefs.getBoolPref('media.mediasource.enabled') ?
                      'Videos gesperrt' : 'Videos frei'
                };
                for (var a in attributes) {
                   button.setAttribute(a, attributes[a]);
                };
                return button;
             }
          });
       } catch(e) { };
      
       document.getElementById('menu-button').addEventListener('command', function(event) {
    	   var isEnabled = !Services.prefs.getBoolPref('media.mediasource.enabled');
    	   Services.prefs.setBoolPref('media.mediasource.enabled', isEnabled);
    	   event.target.ownerGlobal.BrowserCommands.reload(); 
    	   var windows = Services.wm.getEnumerator('navigator:browser');
    	   while (windows.hasMoreElements()) {
    		  let button = windows.getNext().document.getElementById('menu-button');
    		  if (isEnabled)
    			 button.setAttribute('tooltiptext', 'Videos gesperrt')
    		  else
    			 button.setAttribute('tooltiptext', 'Videos frei');
    	   };
       }, true);
    		  
       if (document.documentElement.hasAttribute('privatebrowsingmode') &&
           !Services.prefs.getBoolPref('media.mediasource.enabled'))
       {
          let button = document.getElementById('menu-button');
          button.click();
          window.addEventListener('unload', function() {
             button.click();
          });
       };
    
       var css =
       '#menu-button[tooltiptext="Videos gesperrt"] {list-style-image: url("file:///C:/Users/weiss/AppData/Roaming/Mozilla/Firefox/Profiles/i3gghgwc.default/chrome/Icons/.2.svg")}' +
       '#menu-button[tooltiptext="Videos frei"] {list-style-image: url("file:///C:/Users/weiss/AppData/Roaming/Mozilla/Firefox/Profiles/i3gghgwc.default/chrome/Icons/.1.svg")}';
       var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
       document.insertBefore(stylesheet, document.documentElement);
    
    })();
    Alles anzeigen

    Zitat von FuchsFan

    Danke! :thumbup: :) Wieder eine Hürde genommen. :)

    Gerne. Freut mich, wenn es jetzt läuft... :thumbup:

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 13. Januar 2025 um 11:01
    Zitat von Mira_Belle

    Worin bestehen die Vor, bzw. Nachteile der jeweiligen Versionen?

    Ergänzend zu dem was Sören Hentzschel geschrieben hat:

    Die 1.Version mit Function erzeugt aus dem String eine anonyme Funktion die dann zur Laufzeit (und damit auch im Debugger) aufgerufen wird. Das ist besonders bei generischen Funktionen hilfreich, die zur Laufzeit unterschiedliche command-events bekommen, wie wir es z.B. beim extraConfigMenu-Skript der Fall ist. Macht man es so, wie in der zweiten Version, dann müsste man eine Vielzahl von neuen Funktionsaufrufen schreiben oder Funktionen als Parameter übergeben. Im Normalfall
    ist es meiner Erachtens gleich, was für eine Version verwendet wird. Da es eigentlich immer nur einen(!) Funktionsaufruf für einen command-event geben sollte. In dieser Funktion wird dann das Ereignis behandelt. In vielen unserer genutzten Skripte steht aber oft schon der halbe Code in dem 'oncommand'-Attribute, was mehr als schlecht zu lesen und verstehen ist.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 12. Januar 2025 um 20:33
    Zitat von FuchsFan

    Sorry, dass kann ich Dir noch nicht beantworten, denn ich muss erst alles auf mein Script übertragen.

    Alles klar. Nicht hetzen lassen... ;)

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 12. Januar 2025 um 20:16
    Zitat von Endor

    Was den Neustart betrifft, setzt der noch das Script: addRestartButton.uc.js voraus.

    Danke für diese wichtige Info. Dann wird es natürlich klar, warum es nicht geht.

    Zitat von FuchsFan

    Nur noch mal als Bestätigung, es funktioniert in allen Versionen, nur nicht im neuen Nightly.

    Jetzt weiß ich immer noch nicht genau, ob die angesprochenen Punkte bei dir mit der neuen Version funktionieren oder nicht (Browserwerkzeuge)? :/

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 12. Januar 2025 um 19:57
    Zitat von Endor

    Beim Script extraconfigmenu.uc.js gibt es noch ein Problem:
    Wenn man im Script bei showNormalPrefs: 1 angibt,
    wird der Eintrag Einstellungen zum Öffnen der Firefox Einstellungen
    im Menü angezeigt. Nur es tut sich nichts bei klick drauf.

    Zitat von FuchsFan

    Das betrifft auch noch den Restart-Button (wenn genutzt wird), und außerdem noch ein eingebautes Menü für den Aufruf der Browser-Werkzeuge. Die Befehle werden so nicht angenommen. Aber was ändern, keine Ahnung.

    Die Einstellungen werden jetzt aufgerufen, aber ich weiß nicht, was die Änderung sonst noch bewirkt:/.

    Der Neustart wird mit einer Fehlermeldung quittiert. Das Verhalten habe ich aber auch im unveränderten Skript von #1 und auch in der FF134, daher frage ich mich, ob das wirklich immer so funktioniert hat oder ob bestimmte Bedingungen erfüllt sein müssen?

    Bitte mal testen:

    JavaScript
    /*
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 5*.*
    // @include        main
    // @version        1.0.20190504
    // @edit           @aborix 7/21 CSS Dateien als Untermenü eingefügt 
    // @edit           @2002Andreas 8/21 Shadow CSS Dateien als Untermenü + Ordner eingefügt
    // @edit 		   @BrokenHeart	1/25 Anpass. wg. Änderung der Sicherheitsrichtlinien bei 'inlineEvents'
    // ==/UserScript==
    */
    var uProfMenu = {
      // Beginn der Konfiguration
      // In der folgenden Zeile (11) den Pfad zum Texteditor eintragen (unter Ubuntu 10.04 z.B.: '/usr/bin/gedit'). Bei Fehleintrag wird view_source.editor.path ausgelesen:
      //TextOpenExe: 'C:\\Program Files (x86)\\Notepad++\\notepad++.exe',
      TextOpenExe: 'C:\\Program Files\\Notepad++\\notepad++.exe',
      // Falls gewuenscht, in Zeile 15 einen Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele:
      // vFileManager: 'E:\\Total Commander\\Totalcmd.exe',
      // vFileManager: 'C:\\Program Files (x86)\\FreeCommander\\FreeCommander.exe'
      vFileManager: '',
      // In der folgenden Zeile (19) 'menu' eintragen, damit es unter "Extras" als Menue erscheint, sonst die id des gewuenschten
      // Elements *nach* dem der Button erscheinen soll (z.B. 'urlbar', 'searchbar', 'undoclosetab-button','abp-toolbarbutton')
      // Bitte nicht so etwas wie die Menue- oder Navigationsleiste (sondern einen Menuepunkt oder einen Button mit id auf diesen Leisten) eintragen:
     warpmenuto: 'helpMenu',
     // Unter Linux sollte/kann versucht werden, die userChromeJS-Skripte zu sortieren, unter Windows ist das evtl. nicht noetig (die Sortierung wird Gross- und Kleinschreibung *nicht* beruecksichtigen - dazu wird die sort()-Funktion entsprechend mit einer Vergleichsfunktion aufgerufen)
      sortScripts: 0,   // 1 zum Erzwingen der Sortierung
      // Einbindung GM-Skripte-Ordner (0: nein, 1: Greasemonkey [Profil-Verzeichnis], 2: UserScriptLoader [Chrome-Verzeichnis], 3: Scriptish [Profil-Verzeichnis]):
      gmOrdner: 0,
      // Einbindung CSS-Ordner (0: nein, 1: UserCSSLoader-Ordner im Chrome-Verzeichnis):
      cssOrdner: 0,
      // In Zeile 30 gueltige about:Adressen eintragen, die ebenfalls aufgerufen werden sollen.
      // - Zum Ausblenden: abouts: [],
      // - Damit die about:-Seiten nicht als Untermenue, sondern direkt als Menuepunkte aufgefuehrt werden, muss das erste Element '0' sein:
      // abouts: ['0','about:about','about:addons','about:cache','about:config','about:support'],
      abouts: ['about:about','about:debugging#/runtime/this-firefox','about:cache','about:config','about:crashes','about:downloads','about:home','about:logins','about:memory','about:support','about:preferences','about:performance','about:profiles'],
      // Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja):
      showNormalPrefs: 1,
      // Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0):
      enableScriptsToClip: 1,
      // Um den Eintrag "Neustart" zu erzwingen (falls z.B. das andere Skript zu spaet eingebunden und nicht erkannt wird), auf 1 setzen:
      enableRestart: 1,
      // Ende der Konfiguration
    
      init: function() {
        if (this.warpmenuto.toLowerCase() == 'menu') {
          // aufgrund des gewaehlten warpmenuto als Untermenue von Extras anlegen
          var zielmenu = document.getElementById('menu_ToolsPopup');
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielmenue nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'zielmenu' kontrollieren.");
           return
          }
          var menu = zielmenu.appendChild(this.createME("menu","Config Men\u00FC",0,0,"ExtraConfigMenu"));
          menu.setAttribute("class","menu-iconic");
          menu.setAttribute("ondblclick","openTrustedLinkIn('about:config', 'tab');");
         } else {
    		 
    	/*	 
          // als Button nach dem per warpmenuto gewaehlten Element anlegen (s. Kommentar ueber warpmenuto im Konfigurationsabschnitt)
          var zielmenu = document.getElementById(this.warpmenuto);
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielpunkt '"+this.warpmenuto+"' nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'warpmenuto' kontrollieren.");
            return;
          }
          var menu = zielmenu.parentNode.insertBefore(document.createXULElement('toolbarbutton'), zielmenu.nextSibling);
          menu.setAttribute("id", "ExtraConfigMenu-button");
          menu.setAttribute("class", "toolbarbutton-1");
          menu.setAttribute("type", "menu");
          menu.setAttribute("tooltiptext", "Extra Config Menü\nMittelklick \öffnet about:config");
          menu.setAttribute("onclick", "if (event.button === 2 && !this.open) {openTrustedLinkIn('about:config','tab')};");
        }
    	*/
    	
    	 // als verschiebbaren Button anlegen
          if (window.__SSi == "window0") {
            CustomizableUI.createWidget({
              id: "ExtraConfigMenu-button",
              defaultArea: CustomizableUI.AREA_NAVBAR,
              label: "Extra Config Menü",
              tooltiptext: "Extra Config Menü\nRechtsklick \öffnet about:config"
            });
    		
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
          menu.setAttribute("type", "menu");
    	  menu.addEventListener('click', function(event) {
    			if (event.button == 2 && !this.open) { 
    				openTrustedLinkIn("about:config", "tab");
    				event.preventDefault();
    			};
    	 },true);
    	  
        }
    	
        //ab hier ist alles gleich, egal ob Button oder Menue
        var css = " \
          #ExtraConfigMenu, #ExtraConfigMenu-button { \
            list-style-image: url(file:///C:/Users/weiss/IconsFirefox/pencil.svg);  \
    		 margin-top: 0px !important; \
    		 opacity: 1 !important;\
          } \
          #ExtraConfigMenu-button > dropmarker, #ExtraConfigMenu-button > hbox > .toolbarbutton-menu-dropmarker { \
            display: none !important; \
          }";
        var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
        var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
        sss.loadAndRegisterSheet(uri,sss.AGENT_SHEET);
    	menu.addEventListener('popupshowing', function(event) {
    			uProfMenu.getScripts(0);
    			uProfMenu.getCss(3);
    			uProfMenu.getCss(4);
    			uProfMenu.getCss(5);
    	 },true);
    	
        var menupopup = menu.appendChild(this.createME("menupopup",0,0,0,"ExtraConfigMenu-popup"));
        // Anlegen von Untermenues fuer userChromeJS-Skripte und CSS-Dateien (befuellen spaeter)
        var submenu = menupopup.appendChild(this.createME("menu","Meine Scripte",0,0,"submenu-ucjs"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucjs-items"));
        // var submenu = menupopup.appendChild(this.createME("menu","uc.xul",0,0,"submenu-ucxul"));
        // var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucxul-items"));
        var submenu = menupopup.appendChild(this.createME("menu","css",0,0,"submenu-css"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-css-items"));
    	var submenu = menupopup.appendChild(this.createME("menu","CSSShadow",0,0,"submenu-CSSShadow"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-CSSShadow-items"));
        var submenu = menupopup.appendChild(this.createME("menu","cssweb",0,0,"submenu-cssweb"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-cssweb-items"));
        if (this.enableScriptsToClip) menupopup.appendChild(this.createME("menuitem","Skriptliste in Zwischenablage","uProfMenu.getScripts(1)","uProfMenu_clipboard",0));
        // Ende Anlegen von Untermenues
        menupopup.appendChild(document.createXULElement('menuseparator'));
        // Einbindung von Konfigdateien
     	menupopup.appendChild(this.createME("menuitem","Bild Url","uProfMenu.edit(0,'Bild Url.css');","uProfMenu_edit",0));
    	menupopup.appendChild(this.createME("menuitem","config Einträge.css","uProfMenu.edit(0,'config Einträge.css');","uProfMenu_edit",0));
    	/*menupopup.appendChild(this.createME("menuitem","Forum.css","uProfMenu.edit(0,'./CSSWeb/Forum.css');","uProfMenu_edit",0)); */
        menupopup.appendChild(this.createME("menuitem","userChrome.css","uProfMenu.edit(0,'userChrome.css');","uProfMenu_edit",0));
    	menupopup.appendChild(this.createME("menuitem","userChromeShadow.css","uProfMenu.edit(0,'userChromeShadow.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userContent.css","uProfMenu.edit(0,'userContent.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userChrome.js","uProfMenu.edit(0,'userChrome.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","prefs.js","uProfMenu.edit(1,'prefs.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","user.js","uProfMenu.edit(1,'user.js');","uProfMenu_edit"),0);
    
        // Ende Einbindung von Konfigdateien
        menupopup.appendChild(document.createXULElement('menuseparator'));
        // Einbindung von Ordnern
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME("menuitem","GM-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'gm_scripts');","uProfMenu_folder"),0);
            break;
          case 2:
            menupopup.appendChild(this.createME("menuitem","USL-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'UserScriptLoader');","uProfMenu_folder"),0);
            break;
          case 3:
            menupopup.appendChild(this.createME("menuitem","Skripty Scriptish","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'scriptish_scripts');","uProfMenu_folder"),0);
            break;
        }
    
        menupopup.appendChild(this.createME("menuitem","CSS-Ordner ","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'css');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","CSSShadow-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSShadow');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","CSSWeb-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSWeb');","uProfMenu_folder"),0);
    	 menupopup.appendChild(this.createME("menuitem","Chromeordner","uProfMenu.prefDirOpen('UChrm');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Profilordner","uProfMenu.prefDirOpen('ProfD');","uProfMenu_folder"),0);
    	    menupopup.appendChild(this.createME("menuitem","Icons-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'Icons');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Installationsordner","uProfMenu.prefDirOpen('CurProcD');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Addonordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'extensions');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Startup-Cacheordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfLD')+uProfMenu.getDirSep()+'startupCache');","uProfMenu_folder"),0);
      /*   menupopup.appendChild(this.createME("menuitem","Ordner about","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'about');","uProfMenu_folder"),0); */
        // Ende Einbindung von Ordnern
        // Einbindung von abouts
        if (this.abouts.length>0) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
          // falls der erste Eintrag des Arrays = '0' ist, dann kein Untermenue anlegen, sondern direkt als Menuepunkte einbinden
          if (this.abouts[0]=='0') {
            for (var i = 1; i < this.abouts.length; i++) {
            menupopup.appendChild(this.createME("menuitem",this.abouts[i],"openTrustedLinkIn('"+this.abouts[i]+"','tab')","uProfMenu_about"),0);
            }
           } else {
            // der erste Eintrag des arrays ist ungleich '0', deshalb als Untermenue einrichten
            var submenu = menupopup.appendChild(this.createME("menu","uc.js",0,0,"submenu-about"));
            var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-about-items"));
            this.fillMenu("submenu-about","submenu-about-items", "about:",this.abouts,"uProfMenu_about",1);
          }
        }
        // Ende Einbindung von abouts
        // Separator, falls dieser nicht schon durch abouts generiert wurde und weitere Menuepunkte folgen werden
        if (this.abouts.length==0 && (this.showNormalPrefs || typeof(ToolRstartMod) != "undefined")) menupopup.appendChild(document.createXULElement('menuseparator'));
        // Falls gewuenscht (s. Konfigurationsabschnitt), Zugriff auf die normalen Einstellungen
        if (this.showNormalPrefs) menupopup.appendChild(this.createME("menuitem","Einstellungen","try{openOptionsDialog();}catch(e){openPreferences();}","uProfMenu_prefs"),0);
        // Falls addRestartButton installiert ist, Neustart zur Verfuegung stellen (addRestartButton 1.0.20120105mod erforderlich)
        if(typeof(ToolRstartMod) != "undefined" || this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
        "try{ToolRstartMod.restartApp(false);} catch(e){alert(e);}","uProfMenu_restart"),0);
      },
    
      getDirSep:function() {
        // Betriebssystem nach https://developer.mozilla.org/en/Code_snippets/Miscellaneous ermitteln
        var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS;
        var dirsep = "/";
        switch(osString) {
          case "WINNT":
            dirsep = "\\";
            break;
          case "Linux":
            dirsep = "/";
            break;
          case "Darwin":
            dirsep = "/";
            break;
        }
        return dirsep;
      },
    
      edit:function(OpenMode,Filename){
        var Path = "";
        var dSep = this.getDirSep();  // die Trennzeichen zwischen Ordnern abhaengig vom Betriebssystem machen
        switch (OpenMode){
          //Current is Chrome Directory
          case 0:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename;
            break;
          //Current is Profile Directory
          case 1:
            var Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
            break;
          //Current is Root
          case 2:
            var Path = Filename;
            break;
          //Current is CSS folder
          case 3:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename;
            break;
          //Current is CSSWeb folder
          case 4:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename;
            break;
    		//Current is CSSShadow folder
          case 5:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSShadow" + dSep + Filename;
            break;
        }
        this.launch(this.TextOpenExe,Path);
      },
    
      dirOpen:function(Path){
        if (this.vFileManager.length != 0) {
          var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
          var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
          var args = [Path];
          file.initWithPath(this.vFileManager);
          process.init(file);
          // Verzeichnis mit anderem Dateimanager oeffnen
          process.run(false, args, args.length);
         } else {
          // Verzeichnis mit Dateimanager des Systems oeffnen
          var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          dir.initWithPath(Path);
          dir.launch();
        }
      },
    
      prefDirOpen:function(prefDir){
        Path = this.getPrefDirectoryPath(prefDir);
        this.dirOpen(Path);
      },
    
      getPrefDirectoryPath:function(str){
        // get profile directory
        var file = Components.classes["@mozilla.org/file/directory_service;1"]
          .getService(Components.interfaces.nsIProperties)
          .get(str, Components.interfaces.nsIFile);
        if (str == 'CurProcD') {
          file = file.parent;
        };
        return file.path;
      },
    
      launch:function(RanPath,OpenPath){
        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
        var proc = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
        var args = [OpenPath];
        file.initWithPath(RanPath);
        // falls der im Konfigurationsabschnitt definierte Editor nicht gefunden wird, auf Einstellung in about:config ausweichen:
        if (!file.exists()) {
          var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
          RanPath = pref.getCharPref("view_source.editor.path");
          file.initWithPath(RanPath);
        }
        proc.init(file);
        proc.run(false, args, args.length);
      },
    
      stringComparison:function(a, b){
        a = a.toLowerCase();
        a = a.replace(/ä/g,"a");
        a = a.replace(/ö/g,"o");
        a = a.replace(/ü/g,"u");
        a = a.replace(/ß/g,"s");
        b = b.toLowerCase();
        b = b.replace(/ä/g,"a");
        b = b.replace(/ö/g,"o");
        b = b.replace(/ü/g,"u");
        b = b.replace(/ß/g,"s");
        return(a==b)?0:(a>b)?1:-1;
      },
    
      getScripts:function(iType) {
        // Arrays (jeweils ein Array fuer uc.js und uc.xul) nehmen Namen der gefundenen Skripte auf
        let ucJsScripts = [];
        let ucXulScripts = [];
        // Suchmuster, also die Dateierweiterungen uc.js und uc.xul
        let extjs = /\.uc\.js$/i;
        //let extxul = /\.uc\.xul$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
        // files mit Eintraegen im Chrome-Ordner befuellen
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          // keine gewuenschte Datei, deshalb continue
          //if (!extjs.test(file.leafName) && !extxul.test(file.leafName)) continue;
          // uc.js gefunden -> im Array ablegen
          if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
          // uc.xul gefunden -> im Array ablegen
          //if (extxul.test(file.leafName)) ucXulScripts.push(file.leafName);
        }
        if (this.sortScripts) {
          ucJsScripts.sort(this.stringComparison);
          //ucXulScripts.sort(this.stringComparison);
        }
        // Aufruf der naechsten Methoden um die beiden Untermenues oder die Zwischenablage zu befuellen
        if (iType==0) {
          this.fillMenu("submenu-ucjs","submenu-ucjs-items", "Meine Scripte",ucJsScripts,"uProfMenu_ucjs",0);
          //this.fillMenu("submenu-ucxul","submenu-ucxul-items", "uc.xul",ucXulScripts,"uProfMenu_ucxul",0);
         } else {
          var result = this.fillClipboardValue(ucJsScripts,ucXulScripts);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    
      getCss:function(iType) {
        // Array nimmt Namen der gefundenen css-Dateien auf
        let cssFiles = [];
        // Suchmuster, also die Dateierweiterung css
        let extcss = /\.css$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        if (iType==3) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSS");
         } else if (iType==4) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSSWeb");
        }  else if (iType==5) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSSShadow");
        }
        // files mit Eintraegen im CSS- bzw. CSSWeb-Ordner befuellen
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          // css gefunden -> im Array ablegen
          if (extcss.test(file.leafName)) cssFiles.push(file.leafName);
        }
        if (this.sortScripts) {
          cssFiles.sort(this.stringComparison);
        }
        // Untermenue befuellen
        if (iType==3) {
          this.fillMenu("submenu-css","submenu-css-items","Meine CSS-Dateien",cssFiles,"uProfMenu_css",3);
         } else if (iType==4) {
          this.fillMenu("submenu-cssweb","submenu-cssweb-items","Meine CSSWeb-Dateien",cssFiles,"uProfMenu_css",4);
        }  else if (iType==5) {
          this.fillMenu("submenu-CSSShadow","submenu-CSSShadow-items","Meine CSSShadow-Dateien",cssFiles,"uProfMenu_css",5);
        }
      },
    
      fillMenu:function(whichsubmenu, whichsubmenuitems, strlabel, scriptArray,sClass,sTyp) {
        // Beschriftung des Untermenues mit Anzahl der gefundenen Dateien ergaenzen
        var e = document.getElementById(whichsubmenu);
        e.setAttribute('label',strlabel + ' (' + scriptArray.length + ')');
        var popup = document.getElementById(whichsubmenuitems);
        // zunaechst Untermenue zuruecksetzen
        while(popup.hasChildNodes()){
          popup.removeChild(popup.firstChild);
        }
        // Untermenue endlich befuellen
        for (var i = scriptArray.length-1; i > -1; i--) {
          // Typunterscheidung (userChromeJS-Skript oder about: oder css)
          if (sTyp==0){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(0,'"+scriptArray[i]+"')",sClass,0);
    		mitem.addEventListener('click', function(event) {
    			uProfMenu.openAtGithub(event,'"+scriptArray[i]+"');
    			event.preventDefault();
    		},true);
    		
            mitem.setAttribute("tooltiptext"," Linksklick: Bearbeiten,\n Mittelklick: https://github.com/.../"+this.cleanFileName(scriptArray[i])+" oeffnen,\n Rechtsklick: Suche auf GitHub");
           } else if (sTyp==1){
            var mitem = this.createME("menuitem",scriptArray[i],"openTrustedLinkIn('"+scriptArray[i]+"','tab')",sClass,0);
           } else if (sTyp==3){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(3,'"+scriptArray[i]+"')",sClass,0);
           } else if (sTyp==4){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(4,'"+scriptArray[i]+"')",sClass,0);
          }
    	  else if (sTyp==5){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(5,'"+scriptArray[i]+"')",sClass,0);
          }
          popup.insertBefore(mitem, popup.firstChild);
        }
      },
    
      fillClipboardValue:function(sArray,xArray) {
        var retValue;
        var s = 0;
        var x = 0;
        s = sArray.length;
        x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+
                       "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.join("\n");
            break;
          default:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------";
            for (var i = 0; i < s ; i++) {
              j = i + 1;
              retValue = retValue + "\n" + j + ". " + sArray[i];
            }
            retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";
            if (this.enableScriptsToClip==2) s = 0;
            for (var i = 0; i < x ; i++) {
              j = i + s + 1;
              retValue = retValue + "\n" + j + ". " + xArray[i];
            }
            break;
        }
        return retValue;
      },
    
      createME:function(sTyp,sLabel,sCommand,sClass,sId) {
        // Anlegen von menuitem, menu oder menupop - fuer bestimmte Typen nicht eingesetzte Parameter werden als 0 uebergeben
        const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        var m = document.createElementNS(XUL_NS, sTyp);
        switch (sTyp) {
          case "menuitem":
            // this.createME("menuitem","Label des Items","ZuzuweisenderCodeFueroncommand","GewuenschteKlasseDesItems",0)
            m.setAttribute('label', sLabel);
            m.setAttribute('class',sClass);
    		m.addEventListener('command', function(event) {
    			Function(sCommand)();
    		}, true);
    		
            break;
          case "menu":
            // this.createME("menu","Label des Menues",0,0,"GewuenschteIdDesMenues")
            m.setAttribute('label', sLabel);
            m.setAttribute('id', sId);
            break;
          case "menupopup":
            //this.createME("menupopup",0,0,0,"GewuenschteIdDesMenupopups");
            m.setAttribute('id', sId);
            break;
        }
        return m;
      },
    
      openAtGithub:function(e,sScript) {
        if (e.button==1){
          // Mittelklick - Seite auf GitHub oeffnen (funktioniert nur, wenn Ordner- und bereinigter Dateiname [ohne Erweiterung] uebereinstimmen):
          var sUrl = "https://github.com/ardiman/userChrome.js/tree/master/"+this.cleanFileName(sScript);
          openWebLinkIn(sUrl, 'tab');
        }
        if (e.button==2){
          // Rechtsklick - Suche auf GitHub starten (funktioniert nur, wenn der Dateiname im Code hinterlegt ist):
          e.preventDefault();
          var sUrl = "https://github.com/search?langOverride=&language=&q="+sScript+"&repo=&start_value=1&type=Code";
          openWebLinkIn(sUrl, 'tab');
        }
      },
    
      cleanFileName:function(sName) {
        sName = sName.toLowerCase();
        /* Das folgende Array enthaelt regulaere Ausdruecke, um ungueltige Zeichenfolgen entfernen:
        /Datei-Erweiterungen am Ende/, /"ucjs_" am Anfang/, /"_"gefolgtVonZahlUndDanachBeliebigenZeichen/
        / "_fx"gefolgtVonZahl(en)/, /"-" oder "+" oder "."/, /"_v"gefolgtVonZahlen
        */
        var regs = [/\.uc\.js$/,/\.uc\.xul$/,/^ucjs_/,/_\d.+/,/_fx\d+/,/[-+\.]/g,/_v\d+/];
        for (var i = 0; i < regs.length; i++) {
          sName = sName.replace(regs[i],"");
        }
        return sName;
      }
    
    };
    
    uProfMenu.init();
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 12. Januar 2025 um 17:00
    Zitat von Endor

    Hinweis: Zeile 82 muss noch geändert werden:

    Danke:thumbup:.

    Ich hab es in #168 geändert...

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 12. Januar 2025 um 16:35
    Zitat von milupo

    Ja, kann ich bestätigen. Ich frage mich, wie da grisu2099 und BrokenHeart meinen, dass das Skript funktioniert. :/

    Besser?

    Code
    // ==UserScript==
    // @name           newTabButtonUndoTabList.uc.js
    // @description    Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü
    // @description    der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt.
    // @description    Von BrokenHeart - camp-firefox.de wieder lauffähig gemacht
    // @adresse        https://www.camp-firefox.de/forum/thema/112673-userchrome-js-scripte-f%C3%BCr-den-fuchs-diskussion/?postID=1223749#post1223749
    // @include        main
    // ==/UserScript==
    (function () {
    
        if (!window.gBrowser){
            return;
        }
        
        gBrowser.tabContainer.addEventListener('click', function (e) {
            if (e.originalTarget.id != 'tabs-newtab-button') return;
            switch (e.button) {
                case 1:
                    undoCloseTab(0);
                    break;
                case 2:
                    UCT.makePopup(e);
                    event.preventDefault();
                    break;
            }
        }, false);
    
    })();
    
    var UCT = {
        init: function () {
            var mp = document.createXULElement("menupopup");
            mp.id = "undo-close-tab-list";
            //mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
    		mp.addEventListener('popupshowing', function(event) {
    				UCT.onpopupshowing(event);
    			}, true);
    		
            mp.setAttribute("placespopup", true);
            mp.setAttribute("tooltip", "bhTooltip");
            mp.setAttribute("popupsinherittooltip", true);
            document?.getElementById("mainPopupSet")?.appendChild(mp);
        },
    
        makePopup: function (e) {
            if (SessionStore.getClosedTabCountForWindow(window) != 0) {
                document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
            }
            else
            {
                console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
            }
        },
    
        onpopupshowing: function (e) {
            var popup = e.target;
    
            while (popup.hasChildNodes())
                popup.removeChild(popup.firstChild);
    
            let undoItems = SessionStore.getClosedTabDataForWindow(window);
            undoItems.map(function (item, id) {
                var m = document.createXULElement('menuitem');
                m.setAttribute('label', item.title);
                m.setAttribute('image', item.image );
                m.setAttribute('class', 'menuitem-iconic bookmark-item');
                //m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
    			let strCommand = 'undoCloseTab(' + id + ')';
    			m.addEventListener('command', function(event) {
    				Function("return " + strCommand)();
    			}, true);
                popup.appendChild(m);
            });
    
            popup.appendChild(document.createXULElement("menuseparator"));
            m = document.createXULElement("menuitem");
            m.setAttribute("label", "Chronik in der Sidebar öffnen");
            m.setAttribute("image", "chrome://browser/skin/history.svg");
            m.setAttribute("class", "menuitem-iconic");
            //m.setAttribute("oncommand", "SidebarUI.toggle('viewHistorySidebar');");
    		m.addEventListener('command', function(event) {
    			SidebarController.toggle('viewHistorySidebar');
    		}, true);
    		
            popup.appendChild(m);
        },
    
    };
    
    setTimeout(function() {
          UCT.init();
      },250);
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 12. Januar 2025 um 15:24

    Noch ein angepasstes Skript 'ViewImage.uc.js':

    Code
    // ViewImage.uc.js
    // Grafik über Kontextmenü im selben Tab (statt in einem neuen) anzeigen
    // Author: aborix
    
    (function() {
    
      if (!window.gBrowser)
        return;
    
      function viewMedia(event) {
        let where = BrowserUtils.whereToOpenLink(event, false, false);
        let referrerInfo = gContextMenu.contentData.referrerInfo;
        let systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
        if (gContextMenu.onCanvas) {
          gContextMenu._canvasToBlobURL(gContextMenu.targetIdentifier).then(function(blobURL) {
            openTrustedLinkIn(blobURL, where, {
              referrerInfo,
              triggeringPrincipal: systemPrincipal,
            });
          }, Cu.reportError);
        } else {
          urlSecurityCheck(
            gContextMenu.mediaURL,
            gContextMenu.principal,
            Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT
          );
          openTrustedLinkIn(gContextMenu.mediaURL, where, {
            referrerInfo,
            forceAllowDataURI: true,
            triggeringPrincipal: gContextMenu.principal,
            csp: gContextMenu.csp,
          });
        }
      }
    
      let item = document.getElementById('context-viewimage');
      let strCommand = '(' + viewMedia.toString() + ')(event);';
       item.addEventListener('command', function(event) {
    		Function("return " + strCommand)();
    		event.preventDefault();
    		event.stopPropagation();    
    		return
      }, false);
     
      item.label = 'Grafik anzeigen';
    })();
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 12. Januar 2025 um 00:46
    Zitat von milupo

    In Zeile 55 ist noch der Inline-Eventhandler onpopupshowing, auf den in Zeile 36 wohl Bezug genommen wird.

    Nein. onpopupshowing ist kein Inline-Eventhandler sondern ein vom Autor des Skripts gewählter Name für eine Funktion, wie bei OnCommand und OnCreated . Er hat sich halt nicht an eine etwaige Mozilla-Namenskonvention gehalten, falls es die überhaupt für Objekt-Eigenschaftsnamen gibt :/.

    Zitat von grisu2099

    Hier läuft es... Danke dafür! :thumbup:

    Gerne :).

    Ja, jetzt läuft es hier auch. Ich hatte sehr viele Tabs offen und dann wird der '+'-Button außerhalb des Scrollbereichs für die Tabs dargestellt und dann funktioniert es nicht mehr. Sollte man natürlich auch mal anpassen...

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 12. Januar 2025 um 00:18
    Zitat von milupo

    Im Skript aus Beitrag #91 ist in Zeile 55 noch ein schwerer Fall von ondblclick.

    Stimmt, danke für den Hinweis:thumbup:. Schau ich mir morgen an. Auf die Schnelle funktioniert hier der Doppelklick auf das Icon nicht. Öffnet 'about:config' schon bei einem einfachen Klick mit der rechten Maustaste. Daher eigentlich auch überflüssig, oder?

    Zitat von grisu2099

    Ich hab hier noch eins, wo du schon mal dran warst. Kriegst du das jetzt auch wieder hin?

    Das müsste eigentlich funktionieren, tut es aber (bei mir) nicht :(. Keine Ahnung, was da im Argen liegt :/. Schau ich mir morgen nochmal an.

    JavaScript
    // ==UserScript==
    // @name           newTabButtonUndoTabList.uc.js
    // @description    Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü
    // @description    der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt.
    // @description    Von BrokenHeart - camp-firefox.de wieder lauffähig gemacht
    // @adresse        https://www.camp-firefox.de/forum/thema/112673-userchrome-js-scripte-f%C3%BCr-den-fuchs-diskussion/?postID=1223749#post1223749
    // @include        main
    // ==/UserScript==
    (function () {
    
        if (!window.gBrowser){
            return;
        }
        
        gBrowser.tabContainer.addEventListener('click', function (e) {
            if (e.originalTarget.id != 'tabs-newtab-button') return;
            switch (e.button) {
                case 1:
                    undoCloseTab(0);
                    break;
                case 2:
                    UCT.makePopup(e);
                    event.preventDefault();
                    break;
            }
        }, false);
    
    })();
    
    var UCT = {
        init: function () {
            var mp = document.createXULElement("menupopup");
            mp.id = "undo-close-tab-list";
            //mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
    		mp.addEventListener('popupshowing', function(event) {
    				UCT.onpopupshowing(event);
    			}, true);
    		
            mp.setAttribute("placespopup", true);
            mp.setAttribute("tooltip", "bhTooltip");
            mp.setAttribute("popupsinherittooltip", true);
            document?.getElementById("mainPopupSet")?.appendChild(mp);
        },
    
        makePopup: function (e) {
            if (SessionStore.getClosedTabCountForWindow(window) != 0) {
                document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
            }
            else
            {
                console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
            }
        },
    
        onpopupshowing: function (e) {
            var popup = e.target;
    
            while (popup.hasChildNodes())
                popup.removeChild(popup.firstChild);
    
            let undoItems = SessionStore.getClosedTabDataForWindow(window);
            undoItems.map(function (item, id) {
                var m = document.createXULElement('menuitem');
                m.setAttribute('label', item.title);
                m.setAttribute('image', item.image );
                m.setAttribute('class', 'menuitem-iconic bookmark-item');
                //m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
    			m.addEventListener('command', function(event) {
    				undoCloseTab(' + id + ');
    			}, true);
                popup.appendChild(m);
            });
    
            popup.appendChild(document.createXULElement("menuseparator"));
            m = document.createXULElement("menuitem");
            m.setAttribute("label", "Chronik in der Sidebar öffnen");
            m.setAttribute("image", "chrome://browser/skin/history.svg");
            m.setAttribute("class", "menuitem-iconic");
            //m.setAttribute("oncommand", "SidebarUI.toggle('viewHistorySidebar');");
    		m.addEventListener('command', function(event) {
    			SidebarUI.toggle('viewHistorySidebar');
    		}, true);
    		
            popup.appendChild(m);
        },
    
    };
    
    setTimeout(function() {
          UCT.init();
      },250);
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 11. Januar 2025 um 23:48
    Zitat von grisu2099

    Mal bitte diese Version testen...

    Funktioniert hier...:thumbup:

    Zitat von Mira_Belle

    Wegen der Funktion an den Anfang oder das Ende einer Page zu scrollen,
    nutze ich dieses Skript:

    Funktioniert nicht, da in dem Skript menuitem.setAttribute('oncommand', [...] genutzt wird.


    Zitat von Mitleser

    Habe leider kein Nightly zum testen...

    Brauchst du auch gar nicht. Wenn du das angepasste Skript in der Release-Version testest und es genau das macht, was das Skript vorher gemacht hat, dann wird es auch in der Nightly funktionieren.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 11. Januar 2025 um 23:36
    Zitat von Mitleser

    Nö, ich auch (dann wären wir schon zu dritt).

    Oh, doch 50% mehr Nutzer, als vermutet... ;)

    Zitat von Mitleser

    Eine Lsg. bei diesem doch komplizierten Script wäre schön...

    Funktioniert das angepasste Script aus #91 bei dir nicht? :/

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 11. Januar 2025 um 23:23
    Zitat von FuchsFan

    Da würde ich vorschlagen ein Unterforum zu eröffnen, in dem nur die lauffähigen Scripte eingestellt werden,

    Als Alternative könnte man eine aktuell gehaltene "Linkliste" auf die einzelnen Beiträge mit den angepassten Skripten ganz oben im ersten Beitrag dieses Threads führen. Da 2002Andreas diesen Thread eröffnet hat, würde ihm natürlich die (ehrenvolle!) Aufgabe zufallen, geänderte bzw. neue Skripte dort zu verlinken. Klar - vorausgesetzt natürlich, dass er das auch machen möchte...

Unterstütze uns!

Jährlich (2025)

101,9 %

101,9% (662,48 von 650 EUR)

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