Полезная информация

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№1377624-09-2019 20:00:53

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 315
UA: Firefox 52.0

Re: Custom Buttons

Andrey_Krropotkin
А для  FF55 UserCSSLoader нельзя приспособить?

Отредактировано Garalf (25-09-2019 08:31:03)

Отсутствует

 

№1377725-09-2019 10:47:34

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 69.0

Re: Custom Buttons

Garalf у меня нет 55, а что в ошибках пишет? У меня на 69 такой:

скрытый текст

Выделить код

Код:

/*Initialization Code*/
 
// ==UserScript==
// @name           UserCSSLoader
// @description    CSS Codes - Styles laden und verwalten
// @namespace      http://d.hatena.ne.jp/Griever/
// @author         Griever
// @charset        UTF-8
// @version        0.0.4f
// ==/UserScript==

var idb=this.id;
var button = document.getElementById(idb);
const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

(function(){

var editor = "C:\\Program Files\\AkelPad\\AkelPad.exe";

let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
if (!window.Services)
    Cu.import("resource://gre/modules/Services.jsm");
let list = Services.wm.getEnumerator("navigator:browser");
while(list.hasMoreElements()){ if(list.getNext() != window) return; }

if (window.UCL) {
    window.UCL.destroy();
    delete window.UCL;
}

window.UCL = {
    USE_UC: "UC" in window,
    AGENT_SHEET: Ci.nsIStyleSheetService.AGENT_SHEET,
    USER_SHEET : Ci.nsIStyleSheetService.USER_SHEET,
    readCSS    : {},
    get disabled_list() {
        let obj = [];
        try {
            obj = this.prefs.getCharPref("disabled_list").split("|");
        } catch(e) {}
        delete this.disabled_list;
        return this.disabled_list = obj;
    },
    get prefs() {
        delete this.prefs;
        return this.prefs = Services.prefs.getBranch("UserCSSLoader.")
    },
    get styleSheetServices(){
        delete this.styleSheetServices;
        return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
    },
    get FOLDER() {
        let aFolder;
        try {
            let folderPath = this.prefs.getCharPref("FOLDER");
            aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
            aFolder.initWithPath(folderPath);
        } catch (e) {
            aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
            aFolder.appendRelativePath("CSS");
        }
        if (!aFolder.exists() || !aFolder.isDirectory()) {
            aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0o664);
        }
        delete this.FOLDER;
        return this.FOLDER = aFolder;
    },
    getFocusedWindow: function() {
        let win = document.commandDispatcher.focusedWindow;
        if (!win || win == window) win = content;
        return win;
    },



    init: function() {

const  cbNS = "http://xsms.nm.ru/custombuttons/";
var menupopup = document.createElementNS(xulNS, "menupopup");
menupopup.onclick = function (event) {
  button.menuClick(event);
}
menupopup.addEventListener("popupshowing", function (event) {
  self.menuPopupShowing(event);
}, false);
button.appendChild(menupopup);
button.type = "menu";
button.orient = "horizontal";
button.menuClick = function (event) {
  event.preventDefault();
  event.stopPropagation();
  button.open = false;
}
button.menuPopupShowing = function (event) {
    var nodeList = event.target.childNodes;
  for (var i = nodeList.length - 1; i >= 0; i--)
    if (nodeList[i].hasAttributeNS(cbNS, "flag"))
      nodeList[i].parentNode.removeChild(nodeList[i]);

}
    
            let cssmenu = $C("menu", {
            id: "usercssloader-menu",
            label: "CSS",
        });
        menupopup.appendChild(cssmenu);
        
        let menupop = $C("menupopup", {
         id: "usercssloader-menupopup"
        });
        cssmenu.appendChild(menupop);

                let menu = $C("menu", {
                label: "Инструменты",
            });    
                menupopup.appendChild(menu);
                
        let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
        menu.appendChild(mp);
        mp.appendChild($C("menuitem", {
            label: "Обновить список файлов-стилей",
            accesskey: "R",
            acceltext: "Alt + R",
            oncommand: "UCL.rebuild();"
        }));
        mp.appendChild($C("menuseparator"));
        mp.appendChild($C("menuitem", {
            label: "Создать файл CSS",
            accesskey: "D",
            oncommand: "UCL.create();"
        }));
        mp.appendChild($C("menuitem", {
            label: "Открыть папку CSS",
            accesskey: "O",
            oncommand: "UCL.openFolder();"
        }));
        mp.appendChild($C("menuitem", {
            label: "Редактировать userChrome.css",
            hidden: false,
            oncommand: "UCL.editUserCSS(\'userChrome.css\');"
        }));
        mp.appendChild($C("menuitem", {
            label: "Редактировать userContent.css",
            hidden: false,
            oncommand: "UCL.editUserCSS(\'userContent.css\');"
        }));
        mp.appendChild($C("menuseparator"));
        mp.appendChild($C("menuitem", {
            label: "Тест стиля (Chrome)",
            id: "usercssloader-test-chrome",
            //hidden: true,
            accesskey: "C",
            oncommand: "UCL.styleTest(window);"
        }));
        mp.appendChild($C("menuitem", {
            label: "Тест стиля (Web)",
            id: "usercssloader-test-content",
            //hidden: true,
            accesskey: "W",
            oncommand: "UCL.styleTest();"
        }));
        mp.appendChild($C("menuitem", {
            label: "Поиск стиля на userstyles.org",
            accesskey: "S",
            oncommand: "UCL.searchStyle();"
        }));

        menu = $C("menu", {
            label: ".uc.css",
            accesskey: "U",
            hidden: !UCL.USE_UC
        });
        
        
        mp = $C("menupopup", { id: "usercssloader-ucmenupopup" });
        menu.appendChild(mp);
        mp.appendChild($C("menuitem", {
            label: "Importieren(.uc.js)",
            oncommand: "UCL.UCrebuild();"
        }));
        mp.appendChild($C("menuseparator", { id: "usercssloader-ucsepalator" }));

        $("mainKeyset").appendChild($C("key", {
            id: "usercssloader-rebuild-key",
            oncommand: "UCL.rebuild();",
            key: "R",
            modifiers: "alt",
        }));


        this.rebuild();
        this.initialized = true;
        if (UCL.USE_UC) {
            setTimeout(function() {
                UCL.UCcreateMenuitem();
            }, 1000);
        }
        window.addEventListener("unload", this, false);
    },
    uninit: function() {
        const dis = [];
        for (let x of Object.keys(this.readCSS)) {
            if (!this.readCSS[x].enabled)
                dis.push(x);
        }
        this.prefs.setCharPref("disabled_list", dis.join("|"));
        window.removeEventListener("unload", this, false);
    },
    destroy: function() {
        var i = document.getElementById("usercssloader-menu");
        if (i) i.parentNode.removeChild(i);
        var i = document.getElementById("usercssloader-rebuild-key");
        if (i) i.parentNode.removeChild(i);
        this.uninit();
    },
    handleEvent: function(event) {
        switch(event.type){
            case "unload": this.uninit(); break;
        }
    },
    rebuild: function() {
        let ext = /\.css$/i;
        let not = /\.uc\.css/i;
        let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);

        while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            if (!ext.test(file.leafName) || not.test(file.leafName)) continue;
            let CSS = this.loadCSS(file);
            CSS.flag = true;
        }
        for (let leafName of Object.keys(this.readCSS)) {
            const CSS = this.readCSS[leafName];
            if (!CSS.flag) {
                CSS.enabled = false;
                delete this.readCSS[leafName];
            }
            delete CSS.flag;
            this.rebuildMenu(leafName);
        }
        if (this.initialized) {
            if (typeof(StatusPanel) !== "undefined")
                StatusPanel._label = "Style importiert";
            else
                XULBrowserWindow.statusTextField.label = "Styles importieren";
        }
    },
    loadCSS: function(aFile) {
        var CSS = this.readCSS[aFile.leafName];
        if (!CSS) {
            CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile);
            if (this.disabled_list.indexOf(CSS.leafName) === -1) {
                CSS.enabled = true;
            }
        } else if (CSS.enabled) {
            CSS.enabled = true;
        }
        return CSS;
    },
    rebuildMenu: function(aLeafName) {
        var CSS = this.readCSS[aLeafName];
        var menuitem = document.getElementById("usercssloader-" + aLeafName);
        if (!CSS) {
            if (menuitem)
                menuitem.parentNode.removeChild(menuitem);
            return;
        }

        if (!menuitem) {
            menuitem = document.createElementNS(xulNS, "menuitem");
            menuitem.setAttribute("label", aLeafName);
             menuitem.setAttribute("id", "usercssloader-" + aLeafName);
            menuitem.setAttribute("class", "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : "USER_SHEET"));
            menuitem.setAttribute("type", "checkbox");
            menuitem.setAttribute("autocheck", "false");
            menuitem.setAttribute("oncommand", "UCL.toggle('"+ aLeafName +"');");
            menuitem.setAttribute("onclick", "UCL.itemClick(event);");
            document.getElementById("usercssloader-menupopup").appendChild(menuitem);
        }
        menuitem.setAttribute("checked", CSS.enabled);
    },
    toggle: function(aLeafName) {
        var CSS = this.readCSS[aLeafName];
        if (!CSS) return;
        CSS.enabled = !CSS.enabled;
        this.rebuildMenu(aLeafName);
    },
    itemClick: function(event) {
        if (event.button == 0) return;

        event.preventDefault();
        event.stopPropagation();
        let label = event.currentTarget.getAttribute("label");

        if (event.button == 1) {
            this.toggle(label);
        }
        else if (event.button == 2) {
            closeMenus(event.target);
            this.edit(this.getFileFromLeafName(label));
        }
    },
    getFileFromLeafName: function(aLeafName) {
        let f = this.FOLDER.clone();
        f.QueryInterface(Ci.nsIFile); // use appendRelativePath
        f.appendRelativePath(aLeafName);
        return f;
    },
    styleTest: function(aWindow) {
        aWindow || (aWindow = this.getFocusedWindow());
        new CSSTester(aWindow, function(tester){
            if (tester.saved)
                UCL.rebuild();
        });
    },
    searchStyle: function() {
        let word;
        try {
            word = gBrowser.currentURI.host;
        } catch {
            word = gBrowser.currentURI.spec;
        }
        
        var ctabpos = gBrowser.selectedTab._tPos +1;
                gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab("https://userstyles.org/styles/search/" + word), ctabpos);
    },
    openFolder: function() {
        this.FOLDER.launch();
    },
    editUserCSS: function(aLeafName) {
        let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
        file.appendRelativePath(aLeafName);
        this.edit(file);
    },
    edit: function(aFile) {
        try {
            var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
            UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
            var path = UI.ConvertFromUnicode(aFile.path);
            var app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            app.initWithPath(editor);
            var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
            process.init(app);
            process.run(false, [path], 1);
        } catch (e) {}
    },
    create: function(aLeafName) {
        if (!aLeafName) aLeafName = prompt("Имя файла", dateFormat(new Date(), "%Y_%m%d_%H%M%S"));
        if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, "");
        if (!aLeafName || !/\S/.test(aLeafName)) return;
        if (!/\.css$/.test(aLeafName)) aLeafName += ".css";
        let file = this.getFileFromLeafName(aLeafName);
        this.edit(file);
    },
    UCrebuild: function() {
        let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
        let query = "?" + new Date().getTime();
        Array.slice(document.styleSheets).forEach(function(css){
            if (!re.test(css.href)) return;
            if (css.ownerNode) {
                css.ownerNode.parentNode.removeChild(css.ownerNode);
            }
            let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"');
            document.insertBefore(pi, document.documentElement);
        });
        UCL.UCcreateMenuitem();
    },
    UCcreateMenuitem: function() {
        let sep = $("usercssloader-ucsepalator");
        let popup = sep.parentNode;
        if (sep.nextSibling) {
            let range = document.createRange();
            range.setStartAfter(sep);
            range.setEndAfter(popup.lastChild);
            range.deleteContents();
            range.detach();
        }

        let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
        Array.slice(document.styleSheets).forEach(function(css) {
            if (!re.test(css.href)) return;
            let fileURL = decodeURIComponent(css.href).split("?")[0];
            let aLeafName = fileURL.split("/").pop();
            let m = document.createElementNS(xulNS, "menuitem");
            m.setAttribute("label", aLeafName);
            m.setAttribute("tooltiptext", fileURL);
            m.setAttribute("id", "usercssloader-" + aLeafName);
            m.setAttribute("type", "checkbox");
            m.setAttribute("autocheck", "false");
            m.setAttribute("checked", "true");
            m.setAttribute("oncommand", "this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));");
            m.setAttribute("onclick", "UCL.UCItemClick(event);");
            m.css = css;
            popup.appendChild(m);
        });
    },
    UCItemClick: function(event) {
        if (event.button == 0) return;
        event.preventDefault();
        event.stopPropagation();

        if (event.button == 1) {
            event.target.doCommand();
        }
        else if (event.button == 2) {
            closeMenus(event.target);
            let fileURL = event.currentTarget.getAttribute("tooltiptext");
            let file = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(fileURL);
            this.edit(file);
        }
    },
};

function CSSEntry(aFile) {
    this.path = aFile.path;
    this.leafName = aFile.leafName;
    this.lastModifiedTime = 1;
    this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? 
        Ci.nsIStyleSheetService.AGENT_SHEET: 
        Ci.nsIStyleSheetService.USER_SHEET;
}
CSSEntry.prototype = {
    sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
    _enabled: false,
    get enabled() {
        return this._enabled;
    },
    set enabled(isEnable) {
        var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
        aFile.initWithPath(this.path);
    
        var isExists = aFile.exists(); // Wenn die Datei existiert true
        var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
        var isForced = this.lastModifiedTime != lastModifiedTime; 

        var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromFile(aFile);
        var uri = Services.io.newURI(fileURL, null, null);

        if (this.sss.sheetRegistered(uri, this.SHEET)) {
            if (!isEnable || !isExists) {
                this.sss.unregisterSheet(uri, this.SHEET);
            }
            else if (isForced) {
                // Nach Stornierung erneut einlesen
                this.sss.unregisterSheet(uri, this.SHEET);
                this.sss.loadAndRegisterSheet(uri, this.SHEET);
            }
        } else {
            if (isEnable && isExists) {
                this.sss.loadAndRegisterSheet(uri, this.SHEET);
            }
        }
        if (this.lastModifiedTime !== 1 && isEnable && isForced) {
            log(this.leafName + " wurde aktualisiert");
        }
        this.lastModifiedTime = lastModifiedTime;
        return this._enabled = isEnable;
    },
};

function CSSTester(aWindow, aCallback) {
    this.win = aWindow || window;
    this.doc = this.win.document;
    this.callback = aCallback;
    this.init();
}
CSSTester.prototype = {
    sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
    preview_code: "",
    saved: false,
    init: function() {
        var url = "data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="ja"><head><title>CSSTester</title></head><body></body></html>');
        if (parseInt(Services.appinfo.platformVersion) >= 69 && Services.appinfo.browserTabsRemoteAutostart) {
    var chromeURL = `chrome://custombuttons/content/cbdialog${Date.now()}.xul`;
    Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup).registerChrome(
        Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)), [["override", chromeURL, url]]
    );
    url = chromeURL;
}
        this.dialog = openDialog(url,    "",    "width=550,height=400,dialog=no");
        this.dialog.addEventListener("load", this, false);
    },
    destroy: function() {
        this.preview_end();
        this.dialog.removeEventListener("unload", this, false);
        this.previewButton.removeEventListener("click", this, false);
        this.saveButton.removeEventListener("click", this, false);
        this.closeButton.removeEventListener("click", this, false);
    },
    handleEvent: function(event) {
        switch(event.type) {
            case "click":
                if (event.button != 0) return;
                if (this.previewButton == event.currentTarget) {
                    this.preview();
                }
                else if (this.saveButton == event.currentTarget) {
                    this.save();
                }
                else if (this.closeButton == event.currentTarget) {
                    this.dialog.close();
                }
                break;
            case "load":
                var doc = this.dialog.document;
                doc.body.innerHTML = '\
                    <style type="text/css">\
                        :not(input):not(select) { padding: 0px; margin: 0px; }\
                        table { border-spacing: 0px; }\
                        body, html, #main, #textarea { width: 100%; height: 100%; }\
                        #textarea { font-family: monospace; }\
                    </style>\
                    <table id="main">\
                        <tr height="100%">\
                            <td colspan="4"><textarea id="textarea"></textarea></td>\
                        </tr>\
                        <tr height="40">\
                            <td><input type="button" value="Vorschau" id="Vorschau"/></td>\
                            <td><input type="button" value="Speichern" id="Speichern"/></td>\
                            <td width="80%"><span class="log"></span></td>\
                            <td><input type="button" value="Schließen" id="Schliessen"/></td>\
                        </tr>\
                    </table>\
                ';
                this.textbox = doc.querySelector("textarea");
                this.previewButton = doc.querySelector('input[value="Vorschau"]');
                this.saveButton = doc.querySelector('input[value="Speichern"]');
                this.closeButton = doc.querySelector('input[value="Schließen"]');
                this.logField = doc.querySelector('.log');

                var code = "@namespace url(" + this.doc.documentElement.namespaceURI + ");\n";
                code += this.win.location.protocol.indexOf("http") === 0?
                    "@-moz-document domain(" + this.win.location.host + ") {\n\n\n\n}":
                    "@-moz-document url(" + this.win.location.href + ") {\n\n\n\n}";
                this.textbox.value = code;
                this.dialog.addEventListener("unload", this, false);
                this.previewButton.addEventListener("click", this, false);
                this.saveButton.addEventListener("click", this, false);
                this.closeButton.addEventListener("click", this, false);

                this.textbox.focus();
                let p = this.textbox.value.length - 3;
                this.textbox.setSelectionRange(p, p);

                break;
            case "unload":
                this.destroy();
                this.callback(this);
                break;
        }
    },
    preview: function() {
        var code = this.textbox.value;
        if (!code || !/\:/.test(code))
            return;
        code = "data:text/css;charset=utf-8," + encodeURIComponent(this.textbox.value);
        if (code == this.preview_code)
            return;
        this.preview_end();
        var uri = Services.io.newURI(code, null, null);
        this.sss.loadAndRegisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
        this.preview_code = code;
        this.log("Preview");
    },
    preview_end: function() {
        if (this.preview_code) {
            let uri = Services.io.newURI(this.preview_code, null, null);
            this.sss.unregisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
            this.preview_code = "";
        }
    },
    save: function() {
        var data = this.textbox.value;
        if (!data) return;

        var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
        fp.init(window, "", Ci.nsIFilePicker.modeSave);
        fp.appendFilter("CSS Files","*.css");
        fp.defaultExtension = "css";
        if (window.UCL)
            fp.displayDirectory = UCL.FOLDER;
        var res = fp.show();
        if (res != fp.returnOK && res != fp.returnReplace) return;

        var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
        suConverter.charset = "UTF-8";
        data = suConverter.ConvertFromUnicode(data);
        var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
        foStream.init(fp.file, 0x02 | 0x08 | 0x20, 0o664, 0);
        foStream.write(data, data.length);
        foStream.close();
        this.saved = true;
    },
    log: function() {
        this.logField.textContent = dateFormat(new Date(), "%H:%M:%S") + ": " + $A(arguments);
    }
};

UCL.init();

function $(id) { return document.getElementById(id); }
function $A(arr) { return Array.slice(arr); }
function $C(name, attr) {
    var el = document.createElementNS(xulNS, name);
    if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) });
    return el;
}
function dateFormat(date, format) {
    format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4));
    format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2));
    format = format.replace("%d", ("0" + date.getDay()).substr(-2));
    format = format.replace("%H", ("0" + date.getHours()).substr(-2));
    format = format.replace("%M", ("0" + date.getMinutes()).substr(-2));
    format = format.replace("%S", ("0" + date.getSeconds()).substr(-2));
    return format;
}

function log() { Application.console.log(Array.slice(arguments)); }
})();

Отредактировано Andrey_Krropotkin (25-09-2019 11:53:02)

Отсутствует

 

№1377825-09-2019 20:48:51

JKT
Участник
 
Группа: Members
Зарегистрирован: 14-01-2016
Сообщений: 81
UA: Firefox 69.0

Re: Custom Buttons

Уважаемые, на FF 68 какой из них надо ставить?
custom_buttons-0.0.7.0.0.6-fx-paxmod.xpi
custom_buttons-0.0.7.0.0.6-fx-bootstrap.xpi

Отсутствует

 

№1377926-09-2019 12:58:24

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 69.0

Re: Custom Buttons

Неподписанные расширения сдохли, а править omni.ja считаю некроманством 81лвл) я не настолько крут, просто каждый раз при обнове его править... итак хватает что надо после обнов править тут еще это, хотя наверно пару файлов подсунуть на автомате можно, с помощью "user_chrome.manifest" от Vitaliy V.

Отредактировано func4ptch4 (26-09-2019 13:03:20)

Отсутствует

 

№1378029-09-2019 12:33:03

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 68.0

Re: Custom Buttons

Dumby
Нет кнопки html код вытащить? Закладка FireBug сдохла. Attributes Inspector - то, да не то...

Отсутствует

 

№1378101-10-2019 10:33:28

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 68.0

Re: Custom Buttons

Andrey_Krropotkin
Кнопка SAVE , совмещенная , Сохранить как HTML -там все нормально? Обратно в браузере и шняга какая-то...
Вопрос снят, Это 69.0.1 глючила, правда, выбранное Html - никак...

Отредактировано solombala (01-10-2019 11:14:35)

Отсутствует

 

№1378201-10-2019 11:51:14

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: unknown 0.0

Re: Custom Buttons

solombala проверить пока не могу в командировке до 15

Отсутствует

 

№1378301-10-2019 14:01:37

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 69.0

Re: Custom Buttons

Dumby
Save page Html - шняга какая-то , то сценарий java тормозит на youtube? , то не все открывает . Код по умолчанию saveBrowser(gBrowser.selectedBrowser); тоже не то...

Отсутствует

 

№1378402-10-2019 09:26:21

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 69.0

Re: Custom Buttons

Кто знает, что делает этот код? вроде "long left click"? (если) так то он не работает.

скрытый текст

Выделить код

Код:

//Uncnown code
(code=>{
    var delay = 500;              // время удержания в мс
    var inBackground = true;      // открывать в фоновой вкладке
    var relatedToCurrent = true;  // открывать рядом с related вкладкой

    var p = "CB" + _id.slice(20) + ":LongPressHandler:";
    var msgDestroy = p + "Destroy", msgResponse = p + "Response";
    code = code.replace(/%MD%/g, msgDestroy).replace("%MR%", msgResponse)
        .replace("%DL%", delay).replace("%BG%", inBackground);

    var url = "data:," + encodeURIComponent(code);
    var mm = window.getGroupMessageManager("browsers");
    mm.loadFrameScript(url, true);

    function handleLongPress(msg) {
        var [link, ref, ctrl] = msg.data;
        var bg = inBackground != null ? inBackground
            : Services.prefs.getBoolPref("browser.tabs.loadInBackground");
        gBrowser.loadOneTab(link, {
            relatedToCurrent, inBackground: ctrl != bg, //referrerURI: makeURI(ref)
        });
    }
    mm.addMessageListener(msgResponse, handleLongPress);

    addDestructor(() => {
        mm.removeDelayedFrameScript(url);
        mm.broadcastAsyncMessage(msgDestroy);
        mm.removeMessageListener(msgResponse, handleLongPress);
    });
})(`({
    init() {
        addEventListener("mousedown", this, false);
        addMessageListener("%MD%", this);
    },
    receiveMessage() {
        removeEventListener("mousedown", this, false);
        removeMessageListener("%MD%", this);
    },
    handleEvent(e) {
        if (e.type == "mousedown") {
            if (e.button || e.shiftKey || e.altKey || e.detail != 1) return;

            var a = e.originalTarget.closest("a[href]");
            if (!a || a.href.startsWith("javascript:")) return;

            this.ctrl = e.ctrlKey;
            this.initLongPress(a);
        } else {
            if (e.type == "click" && !this.link) e.preventDefault();
            this.destroyLongPress();
        }
    },
    get timer() {
        delete this.timer;
        return this.timer = Cc["@mozilla.org/timer;1"]
            .createInstance(Ci.nsITimer);
    },
    notify() {
        sendSyncMessage("%MR%", [this.link.href, this.link.ownerDocument.URL, this.ctrl]);
        this.link = null;
        if (!%BG%) this.destroyLongPress();
    },
    initLongPress(a) {
        addEventListener("click", this, true);
        addEventListener("dragstart", this, false);
        this.timer.initWithCallback(this, %DL%, this.timer.TYPE_ONE_SHOT);
        this.link = a;
    },
    destroyLongPress() {
        removeEventListener("click", this, true);
        removeEventListener("dragstart", this, false);
        this.link && this.timer.cancel();
        this.link = null;
    }
}).init();`);

Отредактировано func4ptch4 (02-10-2019 09:33:39)

Отсутствует

 

№1378504-10-2019 17:38:29

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 69.0

Re: Custom Buttons

Кто знает в 69 загрузки не исчезают из библиотеки

скрытый текст

Выделить код

Код:

DownloadsCommon.getData(content).removeFinished();
  Cc["@mozilla.org/browser/download-history;1"]
 .getService(Ci.nsIDownloadHistory)
 .removeAllDownloads();


Короче, это не катит в 69
.removeAllDownloads();

Отредактировано solombala (04-10-2019 18:15:11)

Отсутствует

 

№1378605-10-2019 06:04:02

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 69.0

Re: Custom Buttons

Тоже заметил когда тестил твою сборку), вроде в однопроцессорном пашет точно не знаю, в многоп. не пашет.
Да и вообще сам не разберешься будешь ждать год, темболее скоро праздники я просто забил настроив ПКМ открытие самой библиотеки или ctrl+j.

Выделить код

Код:

(btn=>{addEventListener("contextmenu",e=>e.ctrlKey||e.preventDefault()||DownloadsPanel.showDownloadsHistory(),false,btn);})(document.getElementById("downloads-button"));

(возможно код с ошибками... но пашет) удобнее конечно если при выходе очищает, но... крутимся как можем.

Отредактировано func4ptch4 (05-10-2019 06:09:41)

Отсутствует

 

№1378705-10-2019 15:36:24

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2240
UA: Firefox 52.0

Re: Custom Buttons

func4ptch4 пишет

удобнее конечно если при выходе очищает

Может так

скрытый текст

Выделить код

Код:

((g, id, {history}) => addDestructor(r => id in g && g[id].destroy(r)) || id in g || ({
    clearOnRestart: false,
    su: Services.startup,
    init() {
        g.AsyncShutdown.quitApplicationGranted.addBlocker(
            id, this.condition = this.condition.bind(g[id] = this)
        );
    },
    destroy(reason) {
        if (reason[5] != "e") return;
        delete g[id];
        g.AsyncShutdown.quitApplicationGranted.removeBlocker(this.condition);
    },
    condition() {
        return this.su.restarting && !this.clearOnRestart || history.removeVisitsByFilter({
            transition: history.TRANSITIONS.DOWNLOAD
        });
    }
}).init())(
    Cu.import("resource://gre/modules/AsyncShutdown.jsm", {}),
    "Custom Buttons button: Clear downloads history.", PlacesUtils
);

Отредактировано Dumby (05-10-2019 21:38:20)

Отсутствует

 

№1378805-10-2019 17:02:08

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 69.0

Re: Custom Buttons

Dumby пишет

Круть, спасибо) вопрос насчет кода https://forum.mozilla-russia.org/viewto … 42#p773842 что он точно делает? так то он не нужен, просто что он делает.
Upd: еще раз спасибо, даже не знаю что и сказать)

Отредактировано func4ptch4 (06-10-2019 13:50:39)

Отсутствует

 

№1378905-10-2019 21:38:53

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2240
UA: Firefox 52.0

Re: Custom Buttons

func4ptch4 пишет

вопрос насчет кода https://forum.mozilla-russia.org/viewto … 42#p773842 что он точно делает?

Ну, почти правильно сказал, только не long click, а long press.
Если добавить triggeringPrincipal, то даже будет работать, но криво:
при открытии в активной вкладке залипает курсор.

И, такое использование frame script'а, когда в каждом разворачивается
новый отдельный обработчик считается не по-перформансу.
Плюс, unload не учитывается, хотя, может и не надо.
Вобщем, код неудачный, лучше избавься от него.

P.S. У меня в предыдущем посте return потерялся. Добавил.

Отсутствует

 

№1379006-10-2019 23:25:29

fokanik
Участник
 
Группа: Members
Зарегистрирован: 05-02-2014
Сообщений: 268
UA: Seamonkey 2.49

Re: Custom Buttons

Дайте пожалуйста функцию для нажатия клавиши "Print Screen" для [seamonkey] 2.49.5

Отсутствует

 

№1379111-10-2019 08:39:14

dim222
Участник
 
Группа: Members
Зарегистрирован: 06-03-2016
Сообщений: 423
UA: Firefox 69.0

Re: Custom Buttons

Сори если не в тему!

Во-общем ,  у меня работают скрипты в цикле через прокси.
  Но когда происходит какая-та ерунда у поставщика проксей , (обычно  ддос) то авторизация слетает и появляется модальное окно

модальное окно
3e721836c881.png

И все встает мертвым колом :angry: , пока не закроешь это самое окно.

Можно ли это как то обойти?

Отсутствует

 

№1379211-10-2019 09:54:05

dim222
Участник
 
Группа: Members
Зарегистрирован: 06-03-2016
Сообщений: 423
UA: Yandex 19

Re: Custom Buttons

Решил костылем на vbs.

vbs

Выделить код

Код:

Set shell = WScript.CreateObject("WScript.Shell")
title = "Authentication Required"
 

If shell.AppActivate(title) Then
    shell.SendKeys "%{F4}" 
End If

Отсутствует

 

№1379311-10-2019 14:23:15

Parazit
Участник
 
Группа: Members
Зарегистрирован: 04-02-2017
Сообщений: 17
UA: Firefox 50.0

Re: Custom Buttons

Подскажите, а почему не получаются простые команды JavaScript, типа вывести в консоль?

Выделить код

Код:

console.log(111);

Отредактировано Parazit (11-10-2019 17:28:11)

Отсутствует

 

№1379411-10-2019 19:52:14

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 69.0

Re: Custom Buttons

Здравствуйте, как можно сделать из этого меню чтобы автопопап был и открывался нормально, он снизу открывает и подкошенный какой-то.

скрытый текст

Выделить код

Код:

this._handleClick=()=>popup.openPopup(this);

var popup=addElement("menupopup",{position:"after_start",oncontextmenu:"return false",
style:"-moz-appearance:none;border:1px solid rgb(220,220,220);"},self);

var mainBox=addElement("hbox",{},popup);
var leftBox=addElement("vbox",{style:"background-color:rgb(217,231,215);"},mainBox);

// ========================================================
const _proxyieo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAEAklEQVR42pWTbUxTVxzGn9veyy20FYTJCpTXUah0CbpFYS6TgIZN4hTYIhi/KFuWZQmL2zJhYcxkiYbFDy4bDJxR58YcwgQWl+EUBqWAvBSQgKBApZDaUt6hQGl7e+9OXez0wxL3T07yP/c893fPec5zKfzf8oUSbgTACQOZ2R8/ph43+zL27RcD/o4Nu40GzYMHJXgEROH2CASB9DxcHC/QrM8mB+e8o23RDj8Fejs3J7fml6pS0gatAxsS8pron3UPi3wchAu4wFM2x7oQysqYwYGBzrz33yvWd3ZrvaBDOTkfVFZVlVXf78CibQmKgCBIxAxYhoWPmCYiARzPezYF8+IM1GEvYMVgGjuZ//Gn7V2dv3lBmZkHj16qq64obatnbesr7jhFuMiflUEulcGPZj3HElwc59kWZbCauJiQCGZ1Yrr/zCdFhe36rpv/grKyjl6trS0/2fyTZHppVtAooymFPBCBsk2QMX6PfHK6neBcLoxaTNyL4Sp6wzjb99XxE4Xanq5bXtDBrMy8utq6smP1X0vumscFtTKKCpUFwl8qhx8jAU2JwfNu8G4Oo1Yzl65Jpv1m7f0l+QWfNfd0/OkFZRPQNQJ662qJRG8cElQh4VQQgXg8YmkGYiJz8wLcnBtjM2bu2K4DdMSaT29J/onCpp7Wxqc8qq2rL0/9oUjSNtbrjgsOE22WyEHTNEUTsz1XZ3c54XA6YZqzuD7ae4TRcJv15cWnC27oGv/ygrKys/JqrtVWpF/+gtHe70ZE4BbIGSkYhgbjAfEiOBw2BIgckFICl5H4Ci1Zck021NSf+rWy5bwXlHPk8PGqyitnddYH5Hot8PeVQkx8EZHwkBNhbtEijE+2Q/2cnNKEJQg+rC81bhmErveWcWHO/k3F501nH4FS0/fsOV/2/aVVpz3Itrw873Y4F1gJK1UEh0T4sqzPvYdtwqhVh5fid1Hq8CSSdDGGjJ3ovPcHRk39U60Nd4u8v0j5uYoUGSuhNHFqa1OrNjU8Ourd6JjY7STo0A6fw9RKP5I0mUhLPASOJHPgQQffb2gUGcx9mJgwtnhBpEjy4Ijbqo6/eOHCmeSkpDd5kRjmWQMu3vwQQ5M6JMdnkpGBQH8FLAtGvnvkBjVi0lGrG9apJ0FSMtb2vJ6+/btvSw/HqVSxZL7SPtjI/NhY8OqCayxyW+QbiAxOQIwyAWtrq1z3cIPIMNMtmpufHngS9F8likpF4e4Dz5/aFpuGWMXLUIXuwOyyWWgevEwZHvbxA9r5smcBISQBO/bmRv6ctHOnandiNrYqUjBi7kC1tgR3hnr1v58W8p4J5KktkaKc/e9EFaelvBatDFVSt/XtzuvXW3pvX8GXZFn7N/UMs/PM0CK5AAAAAElFTkSuQmCC";
var leftItem1=addElement("menuitem",{label:"Open Connections",image:_proxyieo,oncommand:"openConnections()"},leftBox);
//Функция открывает настройки прокси в окне ...................
this.openConnections=function openConnections(){self.win&&self.win.close();
self.win=openDialog("chrome://browser/content/preferences/connection.xul","Proxy","centerscreen");
self.win.addEventListener("load",function f(e){this.removeEventListener("load",f,true);e.target.documentElement.setAttribute("type","prefwindow");},true); //добавить атрибут "prefwindow"
gBrowser.addEventListener("click",function c(){this.removeEventListener("click",c);try{self.win.close()}catch(e){};},true);};                              //закрыть настройки прокси по клику на странице /**/
// ========================================================

function addElement(elementName,attributes,parent){
   var element=document.createXULElement(elementName);
   element.id=_id+"-"+elementName+"-"+Date.now();
   for(var attribute in attributes)element.setAttribute(attribute,attributes[attribute]);
   if(["menu","menuitem"].indexOf(elementName)!=-1)element.classList.add(elementName+"-iconic");

     return parent.appendChild(element);};addDestructor(()=>popup.remove());

Отсутствует

 

№1379515-10-2019 10:37:13

andrew22
Участник
 
Группа: Members
Зарегистрирован: 15-10-2019
Сообщений: 2
UA: Firefox 66.0

Re: Custom Buttons

Dumby
Такое дело, разкрошил 66 МАС кнопка в видео плеер, как команду передать? Link -не катит, может кто знает, виндовская команд.сторка не подходит...

Отсутствует

 

№1379616-10-2019 17:20:12

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 315
UA: Firefox 55.0

Re: Custom Buttons

Кто-нибудь проверял CB на 71b3? У меня не пашет.

Отредактировано Garalf (22-10-2019 10:35:14)

Отсутствует

 

№1379724-10-2019 03:15:24

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1219
UA: Firefox 70.0

Re: Custom Buttons

В 70-й отвалилась кнопка "Очистить панель адреса прокруткой колёсиком мыши"

скрытый текст

Выделить код

Код:

// Очистить панель адреса прокруткой колёсиком мыши .....................................
(function () { 
   var urlbar = document.getElementById("urlbar");
   if ( !urlbar ) return;

   addEventListener('DOMMouseScroll', function(){ urlbar.value = ''; }, false, urlbar ); 
})();


Точно такая же для панели поиска работает.
скрытый текст

Выделить код

Код:

// Очистить панель поиска прокруткой колёсиком мыши на панели поиска, от 19.09.2014. ..............
(function () { 
   var searchbar = document.getElementById("searchbar");
   if ( !searchbar ) return;
 
   addEventListener('DOMMouseScroll', function(){ searchbar.textbox.value = ''; }, false, searchbar ); 
})();


Можно поправить?

Отсутствует

 

№1379824-10-2019 08:59:30

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 52.0

Re: Custom Buttons

xrun1

Может так.

Выделить код

Код:

// Очистить панель адреса прокруткой колёсиком мыши, на панели адреса от 24.10.2019. ..............
(()=>{
   var urlbar = document.getElementById("urlbar");
   if ( !urlbar ) return;

   addEventListener('wheel', ()=> urlbar.value = '', false, urlbar); 
})();


// Очистить панель поиска прокруткой колёсиком мыши на панели поиска, от 24.10.2019. ..............
(()=>{
   var searchbar = document.getElementById("searchbar");
   if ( !searchbar ) return;
 
   addEventListener('wheel', ()=> searchbar.value = '', false, searchbar); 
})();

Отсутствует

 

№1379924-10-2019 13:49:40

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1219
UA: Firefox 70.0

Re: Custom Buttons

bunda1
В "searchbar" работает, а в "urlbar" не хочет. Проверял на почти чистом профиле. [firefox] 70x64 и CB 0.0.7.0.0.6 :(

Отсутствует

 

№1380024-10-2019 13:53:41

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 52.0

Re: Custom Buttons

Проверь с Attributes Inspector, может у urlbar изменился id. Что консоль показывает по поводу кода?

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]