userChrome.js Scripte für den Fuchs (Diskussion)

Schrauberecke: Hier geht es um optische und funktionelle Veränderungen (ohne Themes oder Personas) von Firefox oder von Webseiten per CSS-Codes oder JavaScript.
Benutzeravatar
Endor
Senior-Mitglied
Beiträge: 12085
Registriert: Fr, 20. Apr 2007 15:41
Wohnort: Irgendwo ganz weit im Süden und doch mitten in den Bergen
Kontaktdaten:

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1621

Beitrag von Endor Themen-Starter » Mo, 16. Apr 2018 13:10

Ja da gibt es Unterschiede.
Links auf Interne Firefox Seiten = openTrustedLinkIn
Links auf externe Seiten = openWebLinkIn
Mfg.
Endor
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/Firefox/63.0b5
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/Firefox/64.0a1

OS: Windows 7 H. P. 64 Bit Versions Info Stand 06.09.2018
Kein Support per PN. Fragen bitte im Forum stellen!

Benutzeravatar
Sören Hentzschel
Administrator
Beiträge: 18442
Registriert: Mi, 23. Nov 2011 0:39
Wohnort: Salzburg
Kontaktdaten:

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1622

Beitrag von Sören Hentzschel » Mo, 16. Apr 2018 13:26

openUILink() gibt es in Firefox 61 zwar auch noch, ist aber deprecated und sollte nicht mehr verwendet werden zugunsten der zwei neuen Methoden openTrustedLinkIn() und openWebLinkIn(). Wird openUILink() verwendet, muss ein zusätzlicher Parameter "triggeringPrincipal" übergeben werden. Hier die wörtliche Erklärung aus dem Quellcode, wann was zu verwenden ist:

Code: Alles auswählen

openTrustedLinkIn(url, where, aParams) if the source is always a user event on a user- or product-specified URL (as opposed to URLs provided by a webpage)
openWebLinkIn(url, where, aParams) if the URI should be loaded with a specific triggeringPrincipal, for instance, if the url was supplied by web content.


Meine Beiträge zum Firefox-Quellcode (4 Beiträge; Letzter Beitrag: 05.09.2018)

Benutzeravatar
Boersenfeger
Senior-Mitglied
Beiträge: 52072
Registriert: So, 21. Mär 2004 13:21
Wohnort: Brunswiek anne Oker dranne

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1623

Beitrag von Boersenfeger » Mo, 16. Apr 2018 13:32

Dankeschön...
Stand 22.10.2018
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:62.0) 20100101 Firefox/62.0.3
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:63.0) 20181018 Firefox/63.0rc2
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:64.0) 20181022 Firefox/64.0a1

Meine Füchse|Fehlersuche|Anleitung für Fragen im Forum|Sicherheitskonzept für Windowsnutzer

Benutzeravatar
Endor
Senior-Mitglied
Beiträge: 12085
Registriert: Fr, 20. Apr 2007 15:41
Wohnort: Irgendwo ganz weit im Süden und doch mitten in den Bergen
Kontaktdaten:

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1624

Beitrag von Endor Themen-Starter » Mi, 25. Apr 2018 14:59

Hallo zusammen.
Bitte mal testen:

tabProtectModoki.uc.js = Tab Schützen
https://github.com/Endor8/userChrome.js ... doki.uc.js

tabLockModoki.uc.js = Tab Sperren
https://github.com/Endor8/userChrome.js ... doki.uc.js

Habe ich vorhin in den asiatischen Tiefen gefunden. Übersetzung auf Deutsch ist noch nicht 100%tig fertig.
Wenn es passt gebe ich die beiden an Mithrandir weiter.
Mfg.
Endor
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/Firefox/63.0b5
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/Firefox/64.0a1

OS: Windows 7 H. P. 64 Bit Versions Info Stand 06.09.2018
Kein Support per PN. Fragen bitte im Forum stellen!

Falck
Mitglied
Beiträge: 82
Registriert: Mi, 10. Nov 2010 21:34

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1625

Beitrag von Falck » Do, 26. Apr 2018 22:03

Hallo,
Tab sperren funktioniert nicht.
Tabhintergrund färbt sich Lila, lässt sich aber problemlos schließen.

Ich verwenden dies und es funktioniert wunderbar :D

Code: Alles auswählen

(function() {

  if (location != 'chrome://browser/content/browser.xul')
    return;

  let tabContextMenu = document.getElementById('tabContextMenu');

  let lockItem = document.createElement('menuitem');
  lockItem.id = 'context_lockTab';
  lockItem.setAttribute('label', 'Tab sperren');
  lockItem.setAttribute('oncommand', ' \
    let tab = TabContextMenu.contextTab; \
    tab.locked = true; \
    let image = document.createElement("image"); \
    image.setAttribute("anonid", "locked-icon"); \
    image.setAttribute("src", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKBAMAAAB/HNKOAAAABGdBTUEAALGPC/xhBQAAADBQTFRFAAAAgAAAAIAAgIAAAACAgACAAICAgICAwMDA/wAAAP8A//8AAAD//wD/AP//////ex+xxAAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAA5JREFUGNNjmAkCDGSRAIDlHeNaYTFnAAAAAElFTkSuQmCC"); \
    let closeButton = document.getAnonymousElementByAttribute(tab, "anonid", "close-button"); \
    closeButton.parentNode.appendChild(image); \
  ');

  let refItem = document.getElementById('context_pinTab');
  tabContextMenu.insertBefore(lockItem, refItem);

  let unlockItem = document.createElement('menuitem');
  unlockItem.id = 'context_unlockTab';
  unlockItem.setAttribute('label', 'Tab entsperren');
  unlockItem.setAttribute('oncommand', ' \
    let tab = TabContextMenu.contextTab; \
    tab.locked = false; \
    let image = document.getAnonymousElementByAttribute(tab, "anonid", "locked-icon"); \
    if (image) \
      image.parentNode.removeChild(image); \
  ');

  tabContextMenu.insertBefore(unlockItem, refItem);

  tabContextMenu.addEventListener('popupshowing', function(event) {
    if (event.target == this) {
      let locked = TabContextMenu.contextTab.locked;
      lockItem.hidden = locked;
      unlockItem.hidden = !locked;
    };
  });

  eval('gBrowser.removeTab = ' +
    gBrowser.removeTab.toString().replace('(aTab, aParams) {', '$& if (aTab.locked) return;')
  );

})();

Benutzeravatar
Boersenfeger
Senior-Mitglied
Beiträge: 52072
Registriert: So, 21. Mär 2004 13:21
Wohnort: Brunswiek anne Oker dranne

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1626

Beitrag von Boersenfeger » Fr, 27. Apr 2018 16:20

Stand 22.10.2018
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:62.0) 20100101 Firefox/62.0.3
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:63.0) 20181018 Firefox/63.0rc2
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:64.0) 20181022 Firefox/64.0a1

Meine Füchse|Fehlersuche|Anleitung für Fragen im Forum|Sicherheitskonzept für Windowsnutzer

Benutzeravatar
Endor
Senior-Mitglied
Beiträge: 12085
Registriert: Fr, 20. Apr 2007 15:41
Wohnort: Irgendwo ganz weit im Süden und doch mitten in den Bergen
Kontaktdaten:

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1627

Beitrag von Endor Themen-Starter » Fr, 27. Apr 2018 18:10

Hallo Boersenfeger.
Nimm die von meinem Github.
Die müsste passen.
Mfg.
Endor
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/Firefox/63.0b5
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/Firefox/64.0a1

OS: Windows 7 H. P. 64 Bit Versions Info Stand 06.09.2018
Kein Support per PN. Fragen bitte im Forum stellen!

Benutzeravatar
Boersenfeger
Senior-Mitglied
Beiträge: 52072
Registriert: So, 21. Mär 2004 13:21
Wohnort: Brunswiek anne Oker dranne

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1628

Beitrag von Boersenfeger » Sa, 28. Apr 2018 15:22

Danke! :)
Stand 22.10.2018
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:62.0) 20100101 Firefox/62.0.3
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:63.0) 20181018 Firefox/63.0rc2
Mozilla/5.0 (Windows NT 6.1 Win64 x64 rv:64.0) 20181022 Firefox/64.0a1

Meine Füchse|Fehlersuche|Anleitung für Fragen im Forum|Sicherheitskonzept für Windowsnutzer

Benutzeravatar
Speravir
Senior-Mitglied
Beiträge: 854
Registriert: Do, 15. Dez 2005 1:33
Wohnort: Potsdam

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1629

Beitrag von Speravir » Fr, 11. Mai 2018 20:39

Das Skript Addonspage (aktuelle Version vom 13.01.2018) funktioniert bei mir mit Fx 60 nicht mehr. Wie sieht es bei euch aus? Überhaupt war es seit mindestens Anfang November nur noch bedingt hilfreich, aber eine damalige Anfrage von mir (#1185) ist hier untergegangen. Die dort erwähnte learnmoreURL gibt’s inzwischen aber n der Datei addons.json nicht mehr. Das einzig zuverlässige scheint die reviewURL zu ein, die aber um den letzten Teil der Adresse („reviews/“) gekürzt werden müsste.
Steffen "Speravir"
---
Spiro, ergo sum.
Avatar: Vorlage Fox Head and Tail Tribal by Majykal-Melodi on DeviantArt, bearbeitet (Lizenz: CC by-sa 3.0)

Benutzeravatar
Endor
Senior-Mitglied
Beiträge: 12085
Registriert: Fr, 20. Apr 2007 15:41
Wohnort: Irgendwo ganz weit im Süden und doch mitten in den Bergen
Kontaktdaten:

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1630

Beitrag von Endor Themen-Starter » Fr, 11. Mai 2018 20:59

Ja das ging nicht mehr.
Wurde bereits repariert, von einem Autor aus China.
Hier die aktuelle Version:

Code: Alles auswählen

// ==UserScript==
// @name         AddonsPage.uc.js
// @description  Bei about:addons (Add-ons Verwaltung) rechtsklick auf installierte Ereiterung
// @description  zum Anzeigen der neu hinzugefügen Kontextmenüeinträge.
// @description  Bei Detailseite (klick auf Mehr) wird die Installationsadresse - Pfad, hinzugefügt			
// @author       ywzhaiqi
// @include      main
// @charset      utf-8
// @version      2018.05.10
// @downloadURL  https://raw.github.com/ywzhaiqi/userChromeJS/master/AddonsPage/AddonsPage.uc.js
// @homepageURL  https://github.com/ywzhaiqi/userChromeJS/tree/master/AddonsPage
// @reviewURL    http://bbs.kafan.cn/thread-1617407-1-1.html
// @optionsURL   about:config?filter=view_source.editor.path
// @note         - 附件组件页面右键新增查看所在目录(支持扩展、主题、插件)、复制名字。Greasemonkey、Scriptish 自带已经存在
// @note         - 附件组件详细信息页面新增GM脚本、扩展、主题安装地址和插件路径,右键即复制
// @note         - 新增 uc脚本管理页面
// @note         - 右键菜单 "查看附加组件" 需要 DOM Inspector
// @note         uc脚本管理界面
// @note         - 启用禁用需要 rebuild_userChrome.uc.xul
// @note         - 编辑命令需要首先设置 view_source.editor.path 的路径
// @note         - 图标请自行添加样式,详细信息见主页
// @note         其它信息见主页
// ==/UserScript==

location == "chrome://browser/content/browser.xul" && (function(){

    var iconURL = "";  // uc 脚本列表的图标

    var Config = {
        debug: 0,  // 1 = Rechtsklickmenü UC Scriptverwaltung - Menüeinträge anzeigen, 0 = nicht anzeigen 
        detailView: 1,  // Auf Details-Seite Installation-Link hinzufügen
    };

    if(window.AM_Helper){  // 修改调试用,重新载入无需重启
        window.AM_Helper.uninit();
        delete window.AM_Helper;
    }
    if(window.userChromeJSAddon){
        window.userChromeJSAddon.uninit();
        delete window.userChromeJSAddon;
    }

    Cu.import("resource://gre/modules/Services.jsm");
    Cu.import("resource://gre/modules/AddonManager.jsm");

    let isCN = false;
    try {
        isCN = Services.prefs.getCharPref("general.useragent.locale").indexOf("zh") != -1;
    } catch (e) {
        try {
            isCN = Services.prefs.getCharPref("intl.locale.requested").indexOf("zh") != -1;
        } catch (e) {
        }
    }

    var ApplyPatchForScript = (function(){
        const USO_URL_RE = /(^https?:\/\/userscripts.org.*\/scripts\/source\/\d+)\.\w+\.js$/i;

        const GFO_URL_RE_1 = /(^https?:\/\/greasyfork.org\/scripts\/code\/\w+)\.\w+\.js$/i;
        const GFO_URL_RE_2 = /(^https?:\/\/greasyfork.org\/scripts\/[^\/]+\/)code[\.\/].*\w+\.js$/i;

        // (http://binux.github.io/ThunderLixianExporter/)master/ThunderLixianExporter.user.js
        const GITHUB_URL_RE_1 = /(^https?:\/\/\w+.github.io\/\w+\/)master\/.*.*\w+\.js$/i;
        // 从   https://raw.githubusercontent.com/ywzhaiqi/userscript/master/noNoticetitleflashOnBBS.user.js
        // 转为 https://github.com/ywzhaiqi/userscript/blob/master/noNoticetitleflashOnBBS.user.js
        const GITHUB_URL_RE_2 = /(^https?:\/\/raw.githubusercontent.com\/.*?\/master\/.*\.user\.js$)/i;

        function getScriptHomeURL(downURL) {
            var url;
            if (downURL && downURL.startsWith('http')) {
                if (USO_URL_RE.test(downURL)) {
                    url = RegExp.$1.replace(/source/, "show");
                } else if (GFO_URL_RE_1.test(downURL)) {
                    url = RegExp.$1;
                } else if (GFO_URL_RE_2.test(downURL)) {
                    url = RegExp.$1;
                } else if (GITHUB_URL_RE_1.test(downURL)) {
                    url = RegExp.$1;
                } else if (GITHUB_URL_RE_2.test(downURL)) {
                    url = RegExp.$1.replace('raw.githubusercontent.com', 'github.com')
                            .replace('/master/', '/blob/master/');
                }
            }
            return url ? decodeURIComponent(url) : null;
        }

        function addHomePage(){
            // 添加 Scriptish 脚本的主页
            if (window.Scriptish_config) {
                Scriptish_config.scripts.forEach(function(script){
                    if(script.homepageURL) return;

                    var url = script.updateURL || script.downloadURL;
                    script.homepageURL = getScriptHomeURL(url);
                });
            }

            // Greasemonkey Skripte-Homepage hinzufügen
            AddonManager.getAddonsByTypes(['greasemonkey-user-script'], function (aAddons) {
                aAddons.forEach(function (aAddon) {
                    if (aAddon.homepageURL) return;

                    var url = aAddon._script._downloadURL || aAddon._script._updateURL;
                    var homepageURL = getScriptHomeURL(url);
                    if (homepageURL) {
                        aAddon.homepageURL = homepageURL;
                    } else {
                        // console.log(aAddon.name, url);
                    }
                });
            });
        }

        return {
            init: addHomePage
        }
    })();

    setTimeout(function(){
        ApplyPatchForScript.init();
    }, 2000);

    window.AM_Helper = {
        init: function(){
            document.addEventListener("DOMContentLoaded", this, false);
        },
        uninit: function(){
            document.removeEventListener("DOMContentLoaded", this, false);
        },
        handleEvent: function(event){
            switch(event.type){
                case "DOMContentLoaded":
                    var doc = event.target;
                    var win = doc.defaultView;

                    if (["about:addons","chrome://mozapps/content/extensions/extensions.xul"].indexOf(doc.URL) == -1)
                        return;

                    this.addPopupMenu(doc);

                    // Menü-Aufruf
                    win.AM_Helper = AM_Helper;
                    this.win = win;

                    if (Config.detailView) {
                        var self = this;
                        var observer = new MutationObserver(function(e) {
                            e = e[e.length-1];
                            if(e.attributeName == "loading") {
                                var doc = e.target.ownerDocument;
                                self.setUrlOrPath(doc);
                            }
                        });
                        observer.observe(doc.getElementById("detail-view"), {attributes: true});
                    }
                    break;
                case "popupshowing":
                    this.getAddon(this.win.document.popupNode.value,
                                  this.setItemsAttributes,
                                  event);
                    break;
            }
        },
        addPopupMenu: function(doc){
            var ins = doc.getElementById("menuitem_uninstallItem");
            if(!ins) return;

            ins = ins.nextSibling;
            var popup = ins.parentNode;

            var menuitem = $C("menuseparator", {
                id: "AM-separator-1"
            });
            popup.insertBefore(menuitem, ins);

            menuitem = $C("menuitem", {
                id: "AM-inspect-addon",
                label: isCN ? "查看附加组件" : "Erweiterung inspizieren",
                accesskey: "i",
                tooltipText: isCN ? "调用 DOM Inspector 查看 addon 对象" : "Addon mit Dom Inspector inspizieren",
                oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.inspectAddon);"
            });
            popup.insertBefore(menuitem, ins);

            menuitem = $C("menuitem", {
                id: "AM-edit-script",
                label: isCN ? "编辑" : "Script bearbeiten",
                accesskey: "b",
                hidden: true,
                oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.editScript);"
            });
            popup.insertBefore(menuitem, ins);

            menuitem = $C("menuitem", {
                id: "AM-reload-uc",
                hidden: true,
                label: isCN ? "重载 uc 脚本(慎用)" : "uc Script neuladen",
                style: "font-weight:bold",
                tooltiptext: "Nur teilweise Skriptunterstützung. Bei Problemen Firefox Neustarten.",
                oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.reloadUserChromeJS);"
            });
            popup.insertBefore(menuitem, ins);

            menuitem = $C("menuitem", {
                id: "AM-browse-dir",
                label: isCN ? "查看所在目录" : "Installations-Verzeichnis",
                accesskey: "V",
                oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.browseDir);"
            });
            popup.insertBefore(menuitem, ins);

            menuitem = $C("menuitem", {
                id: "AM-open-url",
                label: isCN ? "打开安装页面" : "Installationsseite öffnen",
                accesskey: "s",
                tooltiptext: null,
                oncommand: "openURL(this.tooltipText)",
            });
            popup.insertBefore(menuitem, ins);

            menuitem = $C("menuitem", {
                id: "AM-copy-name",
                label: isCN ? "复制名称" : "Namen kopieren",
                accesskey: "k",
                oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.copyName);"
            });
            popup.insertBefore(menuitem, ins);

            // menuitem = $C("menuitem", {
            //     id: "AM-go-uso",
            //     class: "greasemonkey",
            //     hidden: true,
            //     label: isCN ? "在 Userscripts.org 上查看" : "Script bei Userscripts.org anzeigen",
            //     oncommand: "openURL(this.tooltipText);"
            // });
            // popup.appendChild(menuitem);

            // menuitem = $C("menuitem", {
            //     id: "AM-find-uso",
            //     class: "greasemonkey",
            //     hidden: true,
            //     label: isCN ? "在 Userscripts.org 上查找" : "Script bei Userscripts.org finden",
            //     oncommand: "openURL(this.getAttribute('find-on-uso'));"
            // });
            // popup.appendChild(menuitem);

            popup.addEventListener("popupshowing", this, true);
        },
        setItemsAttributes: function(aAddon, event){
            var popup = event.target;
            var doc = popup.ownerDocument;

            var
                isExtension = (aAddon.type == "extension"),
                isTheme = (aAddon.type == "theme"),
                isPlugin = (aAddon.type == "plugin"),
                isUserStyle = (aAddon.type == "userstyle"),
                isScriptish = (aAddon.type == "userscript"),
                isGreasemonkey = (aAddon.type == "user-script") || // Greasemonkey
                                (aAddon.type == "greasemonkey-user-script"), // Greasemonkey 1.7+
                isUserScript = isGreasemonkey || isScriptish,
                isUserChromeJS = (aAddon.type == "userchromejs"),
                isService = (aAddon.type == "service"),
                menuitem
            ;

            menuitem = doc.getElementById("AM-browse-dir");
            menuitem.hidden = isUserStyle || isUserScript || isService;

            menuitem = doc.getElementById("AM-edit-script");
            menuitem.hidden = !isUserChromeJS;

            menuitem = doc.getElementById("AM-reload-uc");
            menuitem.hidden = !Config.debug || !isUserChromeJS;

            var className = isGreasemonkey ? "greasemonkey" : "";

            // install url
            menuitem = doc.getElementById("AM-open-url");
            var installURL = isExtension ?
                        (this.getInstallURL(aAddon) || aAddon.homepageURL) :
                        (aAddon.homepageURL || this.getInstallURL(aAddon));
            menuitem.tooltipText = installURL;
            menuitem.hidden = !installURL;
            menuitem.className = installURL ? className : '';

            menuitem = doc.getElementById("AM-inspect-addon");
            menuitem.disabled = !("inspectObject" in window);
            menuitem.className = menuitem.disabled ? '' : className;

            menuitem = doc.getElementById("AM-copy-name");
            menuitem.tooltipText = aAddon.name;
            menuitem.className = className;

            // if(isUserScript && !isScriptish){
            //     var usoURL = "";
            //     if (aAddon._script) {
            //         var usDownloadURL = aAddon._script._downloadURL;
            //         var usUpdateURL = aAddon._script._updateURL;
            //         if (USO_URL_RE.test(usDownloadURL)) {
            //             usoURL = usDownloadURL;
            //         } else if (USO_URL_RE.test(usUpdateURL)) {
            //             usoURL = usUpdateURL;
            //         }
            //     }

            //     menuitem = doc.getElementById("AM-go-uso");
            //     menuitem.disabled = !USO_URL_RE.test(usoURL);
            //     menuitem.className = isUserScript ? menuitem.disabled ? "" : "greasemonkey" : "";
            //     menuitem.tooltipText = usoURL.replace(/source/, "show")
            //         .replace(/.\w+.js$/, "");

            //     menuitem = doc.getElementById("AM-find-uso");
            //     menuitem.disabled = USO_URL_RE.test(usoURL);
            //     menuitem.className = isUserScript ? menuitem.disabled ? "" : "greasemonkey" : "";
            //     menuitem.setAttribute("find-on-uso",
            //         "https://www.google.com.hk/search?q=site:userscripts.org+inurl:scripts+inurl:show+" +
            //         encodeURIComponent(aAddon.name));
            // }
        },

        getPopupNode: function (aNode) {
            var doc = aNode.ownerDocument;
            return "triggerNode" in aNode.parentNode ? aNode.parentNode.triggerNode : doc.popupNode;
        },
        getAddon: function (aId, aCallback, aEvent) {
            var self = this;

            if (this.win.gDetailView._addon) {
                aCallback.apply(this, [this.win.gDetailView._addon, aEvent]);
                return;
            }

            AddonManager.getAllAddons(function(aAddons) {
                for (var i = 0; i < aAddons.length; i++) {
                    if (aAddons[i].id == aId) {
                        aCallback.apply(self, [aAddons[i], aEvent]);
                        return;
                    }
                }
            });
        },

        inspectAddon: function (aAddon) {
            inspectObject(aAddon);
        },
        inspectUserscript: function (aAddon) {
            inspectObject(aAddon._script);
        },
        browseDir: function (aAddon) {
            switch(aAddon.type){
                case "plugin":
                    var pathes = aAddon.pluginFullpath;
                    for (var i = 0; i < pathes.length; i++) {
                        this.revealPath(pathes[i]);
                    }
                    return;
                case "userchromejs":
                    var file = aAddon._script.file;
                    if(file.exists())
                        file.reveal();
                    return;
            }

            // addon
            var gecko = parseInt(Services.appinfo.platformVersion);
            var nsLocalFile = Components.Constructor("@mozilla.org/file/local;1", (gecko >= 14) ? "nsIFile" : "nsILocalFile",
                "initWithPath");

            var dir = Services.dirsvc.get("ProfD", Ci.nsIFile);
            dir.append("extensions");
            dir.append(aAddon.id);
            var fileOrDir = dir.path + (dir.exists() ? "" : ".xpi");
            //Application.console.log(fileOrDir);
            try {
                (new nsLocalFile(fileOrDir)).reveal();
            } catch (ex) {
                var addonDir = /.xpi$/.test(fileOrDir) ? dir.parent : dir;
                try {
                    if (addonDir.exists()) {
                        addonDir.launch();
                    }
                } catch (ex) {
                    var uri = Services.io.newFileURI(addonDir);
                    var protSvc = Cc["@mozilla.org/uriloader/external-protocol-service;1"].
                    getService(Ci.nsIExternalProtocolService);
                    protSvc.loadUrl(uri);
                }
            }
        },
        editScript: function(aAddon) {
            if(aAddon.type == "userchromejs"){
                var path = aAddon._script.file.path;
                this.launchEditor(path);
            }
        },
        reloadUserChromeJS: function (aAddon) {
            if(aAddon.type != "userchromejs") return;

            var result = confirm("Sind Sie sicher, dass Sie neu laden möchten? \ n Mit Vorsicht dies wird nur von einigen Skripten unterstützt.Ununterstützte Skripte haben Probleme wie das wiederholte Hinzufügen von Schaltflächen oder Menüs oder Ereignissen. \ nBei Problemen, Firefox neu starten.");
            if(!result) return;

            var script = aAddon._script;

            Services.obs.notifyObservers(null, "startupcache-invalidate", "");
            Services.scriptloader.loadSubScript(script.url, {}, script.charset || "utf-8");
        },
        launchEditor: function(path){
            var editor = Services.prefs.getCharPref("view_source.editor.path");
            if (!editor) {
                toOpenWindowByType('pref:pref', 'about:config?filter=view_source.editor.path');
                return;
            }

            var UI = Cc['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Ci.nsIScriptableUnicodeConverter);
            var platform = window.navigator.platform.toLowerCase();
            UI.charset = platform.indexOf('win') > -1 ? 'GB2312' : 'UTF-8';
            path = UI.ConvertFromUnicode(path);

            var appfile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
            appfile.initWithPath(editor);
            var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
            process.init(appfile);
            process.run(false, [path], 1, {});
        },
        copyName: function (aAddon) {
            this.copyToClipboard(aAddon.name);
        },

        getInstallURL: function(aAddon){
            aAddon = aAddon || this.win.gViewController.viewObjects.detail._addon;
            if(!aAddon) return null;

            var url = null;
            switch(aAddon.type){
                case "extension":
                case "theme":
                    url = (aAddon.contributionURL || aAddon.reviewURL) || null;
                    return url && url.replace(/\/developers|\/reviews/g, "") || aAddon.creator.url;
                case "greasemonkey-user-script":
                    return aAddon._script._downloadURL || aAddon._script._updateURL;
                case "userscript":
                    url = aAddon._downloadURL || aAddon._updateURL;
                    return url;
                case "userchromejs":
                    return aAddon.homepageURL || aAddon.reviewURL || aAddon.downloadURL || aAddon.updateURL;
                default:
                    return aAddon.homepageURL;
            }
        },

        get getPath(){
            var url = this.win.gViewController.viewObjects.detail._addon;
            if(!url) return false;
            return url.pluginFullpath || false;
        },
        setUrlOrPath :function(doc){
            var installURL = this.getInstallURL();
            if (!installURL && !this.getPath) return;

            if(!doc.getElementById("detail-InstallURL-row")){
                var value = "",label = "";
                if(this.win.gViewController.currentViewId.indexOf("detail")!= -1){
                    var aAddon = this.win.gViewController.viewObjects.detail._addon;
                    switch (aAddon.type){
                        case "extension":
                        case "theme":
                        case "greasemonkey-user-script":
                            value = installURL;
                            label = "%Installations-Seite%";
                            break;
                        case "plugin":
                            value = this.getPath;
                            label = "%Pfad%";
                            break;
                    }
                }
                if(!!value && !!label){
                    var xul = "";
                    if(typeof(value) != "string"){
                        xul = "<vbox>";
                        for(var i=0;i< value.length;i++){
                            xul += ('<label class="detail-row-value text-link" crop="end" onclick="\
                                if(event.button == 0) { \
                                    AM_Helper.revealPath(this.value); \
                                } else if (event.button == 2){ \
                                    AM_Helper.copyToClipboard(this.value); \
                                } \
                                return false;" \
                                value="' + value[i] +'" href="'+ value[i] +'"/>');
                        }
                        xul += "</vbox>";
                    }else{
                        xul = '<label class="detail-row-value text-link" crop="end" onclick="\
                            if(event.button == 2){\
                                AM_Helper.copyToClipboard(this.value); \
                                return false;\
                            }" value="'+ value +'" href="'+ value +'"/>';
                    }
                    xul = '<row class="detail-row-complex" id="detail-InstallURL-row" label="'+ label +'">'+
                                '<label class="detail-row-label" value="'+ label +'"/>'+ xul +'</row>';
                    if(isCN){
                        xul = xul.replace(/\%Installpage\%/g, "Installations-Seite").replace(/\%Path\%/g, "Pfad");
                    }else{
                        xul = xul.replace(/\%/g,"");
                    }
                    // doc.getElementById("detail-rows").innerHTML += xul;
                    doc.getElementById("detail-rows").appendChild(doc.createElement("row")).outerHTML = xul;
                }
            }
        },
        revealPath: function(path){
            var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
            file.initWithPath(path);
            if(file.exists())
                file.reveal();
        },
        copyToClipboard: function (aString) {
            Cc["@mozilla.org/widget/clipboardhelper;1"].
                getService(Ci.nsIClipboardHelper).copyString(aString);
        }
    };

    window.userChromeJSAddon = {
        scripts:[],
        unloads: [],

        init: function(){
	        if ('userchromejs' in AddonManager.addonTypes) return;

            this.initScripts();
            this.registerProvider();
            this.addStyle();
        },
        uninit: function(){
            this.unloads.forEach(function(func){ func(); });
        },
        initScripts: function(){
            var scripts = window.userChrome_js.scripts.concat(window.userChrome_js.overlays);

            var self = this;
            scripts.forEach(function(script, i){
                self.scripts[i] = new ScriptAddon(script);
            });
        },
        getScriptById: function(aId){
            for (var i = 0; i < this.scripts.length; i++) {
                if(this.scripts[i].id == aId)
                    return this.scripts[i];
            }
            return null;
        },
        registerProvider: function(){
            var types = null;
            if (AddonManagerPrivate.AddonType) {
                types = [new AddonManagerPrivate.AddonType(
                    "userchromejs",
                    "",
                    isCN ? "uc Script" : "userChrome JS",
                    AddonManager.VIEW_TYPE_LIST,
                    9000)];
            }

            const provider = parseInt(Services.appinfo.version) < 61.0? {
                getAddonByID: function(aId, aCallback) {
                    let script = userChromeJSAddon.getScriptById(aId);
                    aCallback(script);
                },

                getAddonsByTypes: function(aTypes, aCallback) {
                    if (aTypes && aTypes.indexOf("userchromejs") < 0) {
                        aCallback([]);
                    } else {
                        aCallback(userChromeJSAddon.scripts);
                    }
                }
            }: {
                getAddonByID: async function(aId) {
                    return userChromeJSAddon.getScriptById(aId);
                },

                getAddonsByTypes: async function(aTypes) {
                    if (aTypes && aTypes.indexOf("userchromejs") < 0) {
                        return [];
                    } else {
                        return userChromeJSAddon.scripts;
                    }
                }
            };

            AddonManagerPrivate.registerProvider(provider, types);

            this.unloads.push(function(){
                AddonManagerPrivate.unregisterProvider(provider);
            });
        },
        addStyle: function(){
            let data = '@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\
                \
                @-moz-document url("about:addons"), url("chrome://mozapps/content/extensions/extensions.xul") {\
                    #category-userchromejs > .category-icon {\
                        list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAamSURBVEhLPVZpUJVVGP6AkAuyL7IEsckijAgSqZnplDpWFjVOoWNjaNNMigpmJtsFbWrGcRwVy7Zxwcom+2EzWbIvskeuiMrl7h+X6wUUTRERl6fnHLAf75xzvnvP87zPu32f4uPjg5CQEERGRiIhIQEHDhyAxWqBrb8fvfpeXLhwAbNmzUJsbCxCQqPg7e2P3UVhQL8XYHcG+pzwRHXieWI/blTwgDbaO7Eqvr6+CA0NRVRUlCTYvXs3HA4HjEYjenp60NXVhdS0NEnwXGQ8fH2DsKswEKMGVwl4n0DCYCOBlWc9933OuDf5TPHz80NQUBAiIiIwY8YMlJWVYXBwECaTCdeuXcPZs2elAuFASGgk/HwDsOPTGIypM3FbF4l7pjiMGOIwfC2a51g87IuhGvdJVS4TBGFhYZg+fTqSk5OxZ88eDAwMwGAwQNfbiytXrmDmzJny9/DwCIiQlmpz4LCdwe2hNtwabMOQvQl2tRGquRUjN07gX104HlsUPDRPhuipgqSkJOzduxdWqxV9fX3o7u7GxYsXkZ6eLhWIUPr5+6OoeCdU2zBM5kHYr9+B2ToEg2kIVts4hocu4o4+DqACES7FnxeEAhFjoWD//v2SQIRITxVXr179X4FwQigoLtZCVW3Mk5kEAzBbVFhVO4vCgeHBDoxZEmTSxwwkEBeeJlmACAWqqkpwkeTOfzqlgqcEwiGtVivzZLfbpSNCbX//dZgsgxiwNeKRLQmPGB5JIC4EBgZKgPiEeFlFN4dvQuUls9mMS5cuIY1VJMpYEIiQFhQUyEoTjlgsLGmbjQqoyDQAm6WOIYqVBOOmyRxMmzYNMTExsoqEAnFZhEmv10uClJQUkicgiv/xpUP5hYXoo/d97BWVq95sgs0xCNVxl2QNuG2MZmWxD1QSeHl5ySSLEAmCOXPmSFuydCkWLVqEhQsXyrP4LYyh9PH2RmlJCez02kaVdpKY2TMOuwP9TPytgVbcNyexF9xwT+86QSAUxMXFySpKTU1FRkaGrP158+bhxfnzkT57NtLj4zGD+UrSaJCzeDGObN2KI5s345fcXJzMy0PFp9tQv12LzsKP0b0tEsbtXrAU+EPx9ApEYFA4YqcnkSBZJnQ2AecTeO7cuVjw8stII2kKVaY7OeG1KVPwposLMrl/z9kZHykKPqPtcnXFQY07jkxxxUnXKah380C7ZiqUgIBgBAeLKnqOoyJeei4UiMQKgpcWLEBiYiIS6f08Ai8h2HJaFgmyuW7hWsz1Kzc3/Dh1Kn5106BW441Odx90e/hB2bk1AGWfB2P/F4koKV6PjRs/QW5uHvLz81FaWorCoiJoi4vxDsP1PD1e9swzyHJ3Rxb3awm+nuA7SVzG5+V8foJKKnhu4/k8TRk3e+CBWYNbuni0Nh5GdU0brQ5VVVVobm5GXUMDWltbUZCdjRd44VUCZhL8XYKs9vDAOoJuY+K/DAjAPobxa46e49z/TqviWREz47FV4aAKx5m673DqzwacPl2FisoKEtWgsakJdXV12L5mDVII/grtDdoKhmOM1XODjXab6ziraUy14jGr6wF7Y4Qlfo+mCHBcd8Gtnii0njmMmtp21FBBRUWFVFFL8NraWmx7/32kE1goWM7QZAX4o58A1iHOIPaNhf1g476HzWm0s3T5TMdGVOSLggT/6qLR2XYM9Q2dBK6R4NXV1aisrkITVRSuXYvUSYKltFXTgtDPaWsisJneW2g9VNPNZ0aqMPHcxb0i3jywOVFBNDpajhGwnSFpopJ6afWNTWhuakF+9lpk0HMRoreZg0zG3nDuHHoZHh1nll6nQxcn72V2/hW+pK5evixXRcxssKVHjHFobjyOP/7sRF39PwSesEomvbKqGXmr1iCN4MsI/ibXt0j27bp1OJqzAeVcT7HZqrdsQcX69WjZtAkdOTn4m3tFDCQwDyOGCLQ3lKCh9hia6g/JcP3dUo6WM4dwruNnaNetwCwCL1acJHgm9ytpG1hZ20laxqR/Q1XHuf7Bbm/19EQ7z1LBKF8MT1QN8/AsRk3xMlx3eids1ByNu4YEHMyLxWzFBa86ueJ1Aq8i6Ie0XJLt4Pkrgh0l+C9suEraeRJcEgQiB2Jui/Uh1YgxK0ctvwhE6MZFCO1T8QMbMo0ES5w1sg9EJ68WCmha7vcQ9Hv2xU/0/hStgwQdXJVH7IP7JBChEnuhSLzqxCeH/FLgp8ljqwcJgpHh7EYFbpJgJRvtAwILghKu++htORvuNw7Pvwjcyf15T0/8BxKwaUMvdQeUAAAAAElFTkSuQmCC);\
                    }\
                }';
            let styleService = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
            let styleURI = Services.io.newURI("data:text/css," + encodeURIComponent(data), null, null);
            styleService.loadAndRegisterSheet(styleURI, Ci.nsIStyleSheetService.USER_SHEET);

            this.unloads.push(function(){
                styleService.unregisterSheet(styleURI, Ci.nsIStyleSheetService.USER_SHEET);
            });
        },
    };

    function ScriptAddon(aScript){
        this._script = aScript;

        this.id = this._script.url;
        this.name = this._script.filename;
        this.description = this._script.description;
        this.enabled = !userChrome_js.scriptDisable[this.name];

        // Änderung - Anpassung für userChrome.js
        this.version = this._script.version || null;
        this.author = this._script.author || null;
        this.homepageURL = this._script.homepageURL || null;
        this.reviewURL = this._script.reviewURL || null;
        this.reviewCount = 0;
        this.fullDescription = this._script.fullDescription || null;
        this.downloadURL = this._script.downloadURL || null;

        this.iconURL = iconURL;
    }

    ScriptAddon.prototype = {
        version: null,
        type: "userchromejs",
        isCompatible: true,
        blocklistState: 0,
        appDisabled: false,
        scope: AddonManager.SCOPE_PROFILE,
        name: null,
        creator: null,
        pendingOperations: AddonManager.PENDING_NONE,  // 必须,否则所有都显示 restart
        operationsRequiringRestart: 6,
        // operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_DISABLE,

        get optionsURL(){
            if (this.isActive && this._script.optionsURL)
                return this._script.optionsURL;
        },

        get isActive() {
            return !this.userDisabled? true: false;
        },
        get userDisabled() {
            return !this.enabled? true: false;
        },
        set userDisabled(val) {
            if (val == this.userDisabled) {
                return val;
            }

            AddonManagerPrivate.callAddonListeners(val ? 'onEnabling' : 'onDisabling', this, false);

            if(this.pendingOperations == AddonManager.PENDING_NONE){
                this.pendingOperations = val ? AddonManager.PENDING_DISABLE : AddonManager.PENDING_ENABLE;
            }else{
                this.pendingOperations = AddonManager.PENDING_NONE;
            }

            this.enabled = !val;
            if(window.userChromejs){
                userChromejs.chgScriptStat(this.name);
            }

            AddonManagerPrivate.callAddonListeners(val ? 'onEnabled' : 'onDisabled', this);
        },
        get permissions() {
            // var perms = AddonManager.PERM_CAN_UNINSTALL;
            // perms |= this.userDisabled ? AddonManager.PERM_CAN_ENABLE : AddonManager.PERM_CAN_DISABLE;
            var perms = this.userDisabled ? AddonManager.PERM_CAN_ENABLE : AddonManager.PERM_CAN_DISABLE;
            // if (this.updateURL) perms |= AddonManager.PERM_CAN_UPGRADE;
            return perms;
        },

        uninstall: function() {
            AddonManagerPrivate.callAddonListeners("onUninstalling", this, false);
            this.needsUninstall = true;
            this.pendingOperations |= AddonManager.PENDING_UNINSTALL;
            AddonManagerPrivate.callAddonListeners("onUninstalled", this);
        },
        cancelUninstall: function() {
            this.needsUninstall = false;
            this.pendingOperations ^= AddonManager.PENDING_UNINSTALL;
            AddonManagerPrivate.callAddonListeners("onOperationCancelled", this);
        },
    };


    AM_Helper.init();

    userChromeJSAddon.init();

    function $C(name, attr) {
        var el = document.createElement(name);
        if (attr) Object.keys(attr).forEach(function(n){ el.setAttribute(n, attr[n])});
        return el;
    }
})();
Mfg.
Endor
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/Firefox/63.0b5
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/Firefox/64.0a1

OS: Windows 7 H. P. 64 Bit Versions Info Stand 06.09.2018
Kein Support per PN. Fragen bitte im Forum stellen!

Benutzeravatar
Speravir
Senior-Mitglied
Beiträge: 854
Registriert: Do, 15. Dez 2005 1:33
Wohnort: Potsdam

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1631

Beitrag von Speravir » Fr, 11. Mai 2018 22:34

Endor hat geschrieben:
Fr, 11. Mai 2018 20:59
Ja das ging nicht mehr.
Wurde bereits repariert, von einem Autor aus China.
Hier die aktuelle Version:
Cool, wie auch immer Du das gefunden hast – auf der verlinkten Githubseite sehe ich nur die 2014er Version. Das Problem, dass die contributionURL unzuverlässig ist, bleibt aber bestehen.
Steffen "Speravir"
---
Spiro, ergo sum.
Avatar: Vorlage Fox Head and Tail Tribal by Majykal-Melodi on DeviantArt, bearbeitet (Lizenz: CC by-sa 3.0)

Benutzeravatar
Endor
Senior-Mitglied
Beiträge: 12085
Registriert: Fr, 20. Apr 2007 15:41
Wohnort: Irgendwo ganz weit im Süden und doch mitten in den Bergen
Kontaktdaten:

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1632

Beitrag von Endor Themen-Starter » Sa, 12. Mai 2018 10:47

Ja wie gesagt. der Autor selber hat schon lange nichts mehr aktualisiert.
Andere interessierte haben eben dann versucht es zu reparieren.
Mfg.
Endor
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/Firefox/63.0b5
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/Firefox/64.0a1

OS: Windows 7 H. P. 64 Bit Versions Info Stand 06.09.2018
Kein Support per PN. Fragen bitte im Forum stellen!

Benutzeravatar
edvoldi
Senior-Mitglied
Beiträge: 1881
Registriert: Mo, 18. Aug 2008 13:40

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1633

Beitrag von edvoldi » So, 13. Mai 2018 12:15

Hallo zusammen,
kann es sein das dass Script "UpdateBookmark2" im Firefox 60 nicht mehr funktioniert?

Gruß
EDV-Oldi
WIN10 pro & WIN10 Home Version 1803 (Build17134.345)
Firefox 62.0.3 (64-Bit)
Thunderbird 60.2.1 (64-Bit) / Lightning 6.2.2.1
Meine Erweiterungen

JeffWood
Mitglied
Beiträge: 108
Registriert: Mi, 04. Dez 2013 14:23

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1634

Beitrag von JeffWood » Di, 22. Mai 2018 8:49

Hallo,

versuche jetzt gerade von der FF-Version 52.x auf die aktuelle FF-Version zu wechseln. Für (fast) jede Funktionalität habe ich nun - auch dank dieses Forums - brauchbaren Ersatz gefunden. Bis auf eine Sache: Die Anzeige von mehrzeiligen Tabs, die mir extrem wichtig ist:

Die bestehenden Lösungen mittel css funktionieren bei mir nur sehr unbefriedigend. Daher habe ich gehofft, dass mir dieses Skript viewtopic.php?p=1064933#p1064933 von Endor die Lösung bringt. Aber irgendwie funktioniert das gar nicht. Beim Erstellen eines neuen Tabs wandert nur alles unter der Tableiste befindliche ein paar Millimeter nach unten um dann sofort wieder an den alten Platz zu springen. Mehrzeilig wird auf jeden Fall nichts dargestellt :(

Meine Frage: Ist dieses Skript prinzipiell nicht mehr lauffähig oder habe ich wohl doch irgendwo einen Fehler gemacht? Oder gibt es mittlerweile andere Alternativen?

Gruß
JeffWood

Benutzeravatar
ArisCTR
Mitglied
Beiträge: 231
Registriert: Sa, 22. Mär 2014 1:09

Re: userChrome.js Scripte für den Fuchs (Diskussion)

#1635

Beitrag von ArisCTR » Di, 22. Mai 2018 13:59

Neustarten Schaltfläche / Restart button (Firefox 60-62+)

Falls ein solcher Code hier bereits in ähnlicher Form existiert, kann der Beitrag gelöscht werden.

Da die Kommandozeile in Firefox 62 entfernt wurde, habe ich mich dafür entschieden ein Script fürs einfache Neustarten zu suchen. Einige haben nicht so funktioniert, wie ich sie haben wollte, andere gar nicht.
Deswegen gibt es diese "zusammengetragene" Modifikation von mir hier in der Hoffnung, dass sie auch anderen nützlich sein wird:

Linksklick: Neustarten
Mittelklick: Neustarten und Cache leeren
Eigenes Symbol: "chrome://browser/skin/reload.svg" -> Pfad zu neuem Symbol setzen
Symbol nicht mehr spiegeln: "transform: scaleX(-1);" Zeile entfernen
Eigene Symbolfarbe: "red" durch andere Farbe bzw. anderen Farbcode ersetzen
Eigener Titel: "Restart" durch "Neustarten" o.ä. ersetzten

Code: Alles auswählen

// Restart button script for Firefox 60+ by Aris
//
// left-click on restart button: normal restart
// middle-click on restart button: restart + clear caches
// right-click on restart button: no special function
//
// based on 'Quit' button code by 2002Andreas
// restart code from Classic Theme Restorer add-on
// invalidate caches from Session Saver add-on

(function() {

try {
  Components.utils.import("resource:///modules/CustomizableUI.jsm");
  var {Services} = Components.utils.import("resource://gre/modules/Services.jsm", {});
  var sss =  Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
  
  CustomizableUI.createWidget({
	id: "uc-restart", // button id
	defaultArea: CustomizableUI.AREA_NAVBAR,
	removable: true,
	label: "Restart", // button title
	tooltiptext: "Restart", // tooltip title
	onClick: function(event) {
	  
	  var cancelQuit   = Components.classes["@mozilla.org/supports-PRBool;1"].createInstance(Components.interfaces.nsISupportsPRBool);
	  var observerSvc  = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
			
	  if(event.button=='1') { // middle-click - clear caches
		Components.classes["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).invalidateCachesOnRestart();
	  }
	  
	  if(event.button=='0' || event.button=='1') { // left/middle-click - restart
		observerSvc.notifyObservers(cancelQuit, "quit-application-requested", "restart");
			
		if(cancelQuit.data) return false;
				
		Services.startup.quit(Services.startup.eRestart | Services.startup.eAttemptQuit);
	  }
	},
	onCreated: function(button) {
	  return button;
	}
		
  });
  
  // style button icon
  var uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent('\
	\
	  #uc-restart .toolbarbutton-icon {\
		list-style-image: url("chrome://browser/skin/reload.svg"); /* icon / path to icon */ \
		transform: scaleX(-1); /* icon mirroring */\
		fill: red; /* icon color name/code */\
	  }\
	\
  '), null, null);
  
  sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
  
} catch (e) {
	Components.utils.reportError(e);
};

})();

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste