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

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

№1400104-01-2020 18:59:26

Alex_one
Участник
 
Группа: Members
Зарегистрирован: 27-09-2015
Сообщений: 151
UA: Firefox 71.0

Re: Custom Buttons

Dumby пишет

Вроде получалось

Опять в одну строчку стала на [firefox] 71.0
Возможно подкорректировать?

Вставка символа в текстовое поле

Выделить код

Код:

if (this.type != "menu") {
    this.type = "menu";
    if (!this.hasAttribute("is")) return;
}
(popup => {
    var columns = [
        "¤ ¦ § © « » ¬ ® ° ± µ ¶ — ‘ ’ “ ” • ‰ ‹ › ™",
        "… ≈ ≠ × ✓ ✗ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞",
        "\uD83E\uDD8A \uD83D\uDE0E ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞"
    ];
    var css = //0&&
    `
        #${_id} menuitem > .menu-text {
            font-size: 22px;
            font-family: Consolas, Rockwell, Verdana;
            text-align: center;
            -moz-appearance: none;
            margin: 0;
            padding: 0 14px;
        }
        #${_id} menuitem > :not(.menu-text) {
            display: none;
        }
        #${_id} > menupopup > arrowscrollbox {
            background-color: menu;
        }
    `.replace(/;/g, " !important;");

    var inserter = {
        get docShell() {
            delete this.docShell;
            return this.docShell = "docShell" in document
                && document.docShell instanceof Ci.nsIDocShell
                ? document.docShell : window.docShell;
        },
        get insertText() {
            delete this.insertText;
            return this.insertText = text => {
                if (!this.docShell.isCommandEnabled("cmd_insertText")) return;
                var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"]
                        .createInstance(Components.interfaces.nsICommandParams);
                params.setStringValue("state_data", text);
                this.docShell.doCommandWithParams("cmd_insertText", params);
            }
        },
        insert(text) {
            var br = document.activeElement;
            !br || br.localName != "browser" || !br.isRemoteBrowser
            ? this.insertText(text) : br.messageManager.loadFrameScript(
                `data:,(${this.insertText})${encodeURIComponent(text.toSource())}`
            , false, true);
        }
    };
    this.onmousedown = e => {
        if (e.button) return;
        popup.addEventListener("popupshowing", e => {
            var menugroup = popup.firstChild;
            var parent = "boxObject" in menugroup
                ? menugroup.boxObject.parentBox
                : menugroup.flattenedTreeParentNode;
            parent.setAttribute("orient", "horizontal");
            if (parent.localName == "scrollbox")
                parent.style.setProperty("-moz-box-orient", "horizontal", "important");
        }, {once: true});

        popup.setAttribute("context", "");
        popup.setAttribute("oncommand", "inserter.insert(event.target.label);");
        popup.onauxclick = e => {
            var sym = e.target.label;
            sym && inserter.insert(sym);
        }
        popup.inserter = inserter;
        var df = document.createDocumentFragment();
        for(var symbols of columns) {
            var menugroup = popup.appendChild(document.createElementNS(xulns, "menugroup"));
            menugroup.setAttribute("orient", "vertical");
            for(var sym of symbols.split(" ")) menugroup.appendChild(
                document.createElementNS(xulns, "menuitem")
            ).setAttribute("label", sym);
        }
        popup.append(df);
        this.onmousedown = null;
        if (!css) return;
        var dwu = "windowUtils" in window && windowUtils instanceof Ci.nsIDOMWindowUtils
            ? windowUtils : window.QueryInterface(Ci.nsIInterfaceRequestor)
                .getInterface(Ci.nsIDOMWindowUtils);
        var type = dwu.AGENT_SHEET;
        var url = "data:text/css," + encodeURIComponent(css);
        dwu.loadSheetUsingURIString(url, type);
        addDestructor(() => dwu.removeSheetUsingURIString(url, type));
    }
    this.prepend(popup);
})(document.createElementNS(xulns, "menupopup"));

Отсутствует

 

№1400204-01-2020 22:12:31

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1743
UA: Firefox 52.0

Re: Custom Buttons

Dumby
Есть ли способ в about:newtab открывать дилы "Топ сайты" ЛКМ в новой вкладке  в [firefox] 71 ?

Отредактировано kokoss (05-01-2020 01:33:38)


Win7

Отсутствует

 

№1400305-01-2020 12:06:30

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

Re: Custom Buttons

Alex_one пишет

Возможно подкорректировать?

Вроде нашлась какая-то.
Подзабил на неё уже, это правда.

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

Выделить код

Код:

(this.type != "menu" && (this.type = "menu") && !this.hasAttribute("is")) || (popup => {
    var columns = [
        "¤ ¦ § © « » ¬ ® ° ± µ ¶ — ‘ ’ “ ” • ‰ ‹ › ™",
        "… ≈ ≠ × ✓ ✗ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞",
        "\uD83E\uDD8A \uD83D\uDE0E ⊞ ⊞ ⊞ ⊞ ⊞ ⊞ ⊞"
    ];
    var css = //0&&
    `
        #${_id} menuitem > .menu-text {
            font-size: 22px;
            font-family: Consolas, Rockwell, Verdana;
            text-align: center;
            -moz-appearance: none;
            margin: 0;
            padding: 0 14px;
        }
        #${_id} menuitem > :not(.menu-text) {
            display: none;
        }
        #${_id} menugroup,
        #${_id} > menupopup > arrowscrollbox {
            background-color: menu;
        }
    `.replace(/;/g, " !important;");

    var inserter = {
        get docShell() {
            delete this.docShell;
            return this.docShell = "docShell" in document
                && document.docShell instanceof Ci.nsIDocShell
                ? document.docShell : window.docShell;
        },
        get insertText() {
            delete this.insertText;
            return this.insertText = text => {
                if (!this.docShell.isCommandEnabled("cmd_insertText")) return;
                var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"]
                        .createInstance(Components.interfaces.nsICommandParams);
                params.setStringValue("state_data", text);
                this.docShell.doCommandWithParams("cmd_insertText", params);
            }
        },
        insert(text) {
            var br = document.activeElement;
            !br || br.localName != "browser" || !br.isRemoteBrowser
            ? this.insertText(text) : br.messageManager.loadFrameScript(
                `data:,(${this.insertText})${encodeURIComponent(text.toSource())}`
            , false, true);
        }
    };
    addEventListener("popupshowing", function ps() {
        removeEventListener("popupshowing", ps, true, popup);
        if (css) {
            var dwu = "windowUtils" in window && windowUtils instanceof Ci.nsIDOMWindowUtils
                ? windowUtils : window.QueryInterface(Ci.nsIInterfaceRequestor)
                    .getInterface(Ci.nsIDOMWindowUtils);
            var type = dwu.AGENT_SHEET;
            var url = "data:text/css," + encodeURIComponent(css);
            dwu.loadSheetUsingURIString(url, type);
            addDestructor(() => dwu.removeSheetUsingURIString(url, type));
        }
        var df = document.createDocumentFragment();
        for(var symbols of columns) {
            var menugroup = popup.appendChild(document.createElementNS(xulns, "menugroup"));
            menugroup.setAttribute("orient", "vertical");
            for(var sym of symbols.split(" ")) menugroup.appendChild(
                document.createElementNS(xulns, "menuitem")
            ).setAttribute("label", sym);
        }
        popup.append(df);
        var parent = "boxObject" in menugroup
            ? menugroup.boxObject.parentBox
            : menugroup.flattenedTreeParentNode;
        if (parent.localName == "slot") parent = parent.parentNode;
        parent.setAttribute("orient", "horizontal");
        if (parent.localName == "scrollbox")
            parent.style.setProperty("-moz-box-orient", "horizontal", "important");
        popup.setAttribute("context", "");
        popup.inserter = inserter;
        popup.setAttribute("oncommand", "inserter.insert(event.target.label);");
        popup.onauxclick = e => {
            var sym = e.target.label;
            sym && inserter.insert(sym);
        }
    }, true, popup);
    this.prepend(popup);
})(document.createElementNS(xulns, "menupopup"));

kokoss пишет

Есть ли возможность в about:newtab открывать дилы ЛКМ "Топ сайты" в новой вкладке  в [firefox] 71 ?

about:newtab же в другом процессе.
Надеюсь позволительно отказаться от душного
разворачивания чего-либо там, и вообще от всякого
межпроцессного взаимодействия.

Если хочешь рискнуть, то можно так попробовать.
Разумеется не уверен, и да, это дичь, конечно же.

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

Выделить код

Код:

addEventListener("mousedown", {
    handleEvent(e) {
        this[e.type](e);
    },
    mousedown(e) {
        if (e.button || e.ctrlKey || e.shiftKey || e.altKey) return;
        var {spec} = gBrowser.currentURI;
        if (spec != "about:newtab" && spec != "about:home") return;
        var br = gBrowser.selectedBrowser;
        if (!br.matches(":hover")) return;

        this.br = br;
        this.loadURI = br.loadURI;
        br.loadURI = this.tab;
        window.addEventListener("mousemove", this, {once: true});
        window.addEventListener("keydown", this, {once: true});
    },
    mousemove() {
        if (!this.br) return;
        window.removeEventListener("mousemove", this);
        window.removeEventListener("keydown", this);
        this.br.loadURI = this.loadURI;
        this.loadURI = this.br = null;
    },
    keydown() {
        this.mousemove();
    },
    get tab() {
        delete this.tab;
        return this.tab = (url, params) => {
            var {userContextId} = this.br.contentPrincipal;
            this.mousemove();
            openUILinkIn(url, "tab", Object.assign(params, {userContextId}));
        }
    }
}, true, gBrowser.tabpanels || 1);

Отсутствует

 

№1400405-01-2020 15:21:24

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1743
UA: Firefox 52.0

Re: Custom Buttons

Dumby
Круто 529d356c7ab0.gif, а есть ли вариант впихнуть этот код в этот


Win7

Отсутствует

 

№1400505-01-2020 18:36:30

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

Re: Custom Buttons

kokoss пишет

вариант впихнуть этот код в этот

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

Таким образом, если убрать CB-специфику, то можно просто дописать в конец.
В данном случае, меняем в коде первую и последнюю строку.

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

Выделить код

Код:

//addEventListener("mousedown", {
location.href.endsWith("/browser.xhtml") && gBrowser.tabpanels.addEventListener("mousedown", {

    // Посерёдка здесь

//}, true, gBrowser.tabpanels || 1);
}, true);

Отсутствует

 

№1400605-01-2020 18:54:32

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1743
UA: Firefox 52.0

Re: Custom Buttons

Dumby
Вот теперь вдвойне Круууто 529d356c7ab0.gif


Win7

Отсутствует

 

№1400705-01-2020 23:24:39

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

Re: Custom Buttons

Dumby подскажи как переделать скрипт для СВ

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

Выделить код

Код:

// ==UserScript==
// @name          Hover Links (v2)
// @namespace     http://userscripts-mirror.org/scripts/show/30002
// @description   A tooltip pops up when hovering over links.
// @include       *
// ==/UserScript==

const popTTDelay = 300;  //amount of time(in ms) after mouseover before popup (0 for immediatly)
var bg_color = "#ffffe0";
var border_color = "#ffd700";
var font_color = "#4682b4";
var font_face = "verdana";
var font_size = "10px"; // sorry, change slyles manually in function create_window   :-)
var add_favicon = false; 
const offSBRRight = 24;   //horizontal constant. if the popup makes horizontal scrollbars appear, increase this constant until it doesn't (default:18)
const offSBRTop = 24;     //vertical constant. if the popup makes vertical scrollbars appear, increase this constant until it doesn't (default:18)
var ttH, ttW; 

(function() {
    function locate(event)
    {   
        var ttWin = find_window();
        if (ttWin) {
        var tempLeft=(event.clientX + window.pageXOffset)+9;
        var tempTop=(event.clientY + window.pageYOffset)+10;

        if( (tempLeft+ttW) > (window.innerWidth+window.pageXOffset-offSBRRight) ) { //if its too far right
        tempLeft= (window.innerWidth+window.pageXOffset-offSBRRight-ttW-10);
        }

        if( (tempTop+ttH) > (window.innerHeight+window.pageYOffset-offSBRTop) ) { //if its too far down
        tempTop-=(ttH+offSBRTop);
        }

        if(tempLeft < window.pageXOffset) { //if it is too far left, i.e. it is a super-wide box
            tempLeft=window.pageXOffset+1; //set it all the way to the left
        }
        ttWin.style.top = tempTop + "px";
        ttWin.style.left = tempLeft + "px";
        }
    }

    function find_window()
    {    return document.getElementById("link_tt");
    }

    function create_window(id, ttTitle)
    {  
        var tt_err ='';
        var tt_div = document.createElement("div");
        tt_div.setAttribute("id", "link_tt");
        tt_div.setAttribute("style", "text-align: left; background:" + bg_color + ";border:1px solid " + border_color + ";padding:2px;color:" + font_color + ";font-family:" + font_face + ";font-size:" + font_size + ";position:absolute;z-index:1000000;"+
                                'padding-left: 8px; padding-right: 8px; padding-top: 3px; padding-bottom: 3px; ' +
                                'max-width: 95% !important; line-height: 1.2 !important; width: auto !important;' +
                                '-moz-border-radius: 0.7em !important;' );

        try {var decodedUrl=decodeURIComponent(id.href); }
        catch (err) { tt_err += '<br><font style="font-size: 8px; color: grey;">'+'bad url )'+'</font>';
                        decodedUrl=id.href;} // ?? :)

        var ttUrlHost=decodedUrl.split('/'); ttUrlHost=ttUrlHost[2];
        var favIco = '';
        if (ttUrlHost) {favIco="<img style='display: none;' onLoad=this.style.display=''; src=http://"+ttUrlHost+"/favicon.ico>  ";} 
        else {ttUrlHost='';}
        var dUrlLeng=decodedUrl.length;
        var urlPage =decodedUrl.slice(decodedUrl.indexOf(ttUrlHost)+ttUrlHost.length,decodedUrl.length);
        if (urlPage=='/') {urlPage='';} else {urlPage='<br>'+urlPage;}

        if (ttTitle) {ttTitle='<font style="font-size: 13px; color: #8b0000;">' + ttTitle+'</font><br>';} 
         else {ttTitle='';}

        tt_div.innerHTML = ttTitle+favIco + 
        '<font style="font-size: 12px">' + ttUrlHost+'</font>' + urlPage+tt_err;

        document.body.appendChild(tt_div);
        ttH=tt_div.offsetHeight;
        ttW=tt_div.offsetWidth;
    }

    function show_windowTT()
    {if (find_window()) {find_window().style.display = '';}
    }

    function kill_window()
    {        if (find_window()) find_window().parentNode.removeChild(find_window());
    }

    function create_event(id)
    {    if (id.title)
        { var ttTitle = id.title;
            id.addEventListener("mouseover", function() { create_window(id, ttTitle); }, false);
            id.title='';
        }
        else {id.addEventListener("mouseover", function() { create_window(id); }, false);}

        id.addEventListener("mouseout", function() { kill_window(); }, false);
        id.addEventListener("mousemove", function(event) { locate(event); }, true);

        if (add_favicon) // add favicon on page before link
         { var idH = id.href; 
            if(idH&&(!idH.match(document.domain+'|@|javascript:|mailto:'))) {
                var C=idH.split("/");
                id.style.background="url("+C[0]+"//"+C[2]+"/favicon.ico) center left no-repeat";
                id.style.paddingLeft="18px";
    
            }
          }

    }

unsafeWindow.show_windowTT = show_windowTT;
var link = document.getElementsByTagName("a");
for (i = 0; i < link.length; i++)
 {     create_event(link[i]);
 }
})()

Отсутствует

 

№1400806-01-2020 00:24:49

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

Re: Custom Buttons

Andrey_Krropotkin
Бумажка потерялась?

Отсутствует

 

№1400906-01-2020 01:21:56

Alex_one
Участник
 
Группа: Members
Зарегистрирован: 27-09-2015
Сообщений: 151
UA: Firefox 71.0

Re: Custom Buttons

Dumby пишет

Вроде нашлась какая-то.

Спасибо большое, всё красиво!
smile173.gif

Отсутствует

 

№1401006-01-2020 16:25:46

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

Отсутствует

 

№1401106-01-2020 20:01:35

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

Re: Custom Buttons

Может не в тему, но https://forum.mozilla-russia.org/viewto … 48#p773048
Кнопка(скрипт) auto-popup перестал работать с 72+, пробовал отдельно как uc.js похоже дело в коде, смотрел консоль но он молчит или.. в общем там много ошибок и ничего не понятно, не знаю вроде то что менялось в коде нет.
Да и код какой-то большой там половина лишняя похоже, надо лишь чтобы попап был в CB и менюшках, а аддоны не нужны.
Не знаю, если не получится придется искать... видел на гитхабе обновленный ну пол года назад, сейчас не тестил но там он тупо все открывает, и быстро, удалил.

Отредактировано func4ptch4 (06-01-2020 20:01:59)

Отсутствует

 

№1401207-01-2020 14:45:48

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

Re: Custom Buttons

egorsemenov06
У меня на 72 вот такая кнопка перевода в Google работает

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

Выделить код

Код:

/*Initialization Code*/
  
var lc = navigator.lastClick = {};
addEventListener("mouseup", e => {
    if (e.button) return;
    lc.X = e.screenX - mozInnerScreenX;
    lc.Y = e.screenY - mozInnerScreenY;
}, false, gBrowser.tabpanels || 1);

var createWindow = function(text, status, title, id, pos, size){
var win = window, doc = win.document, wId = 'ujs_window'+(id || ''), w = doc.getElementById(wId);
    var keyDown = function(e){if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 27)doc.getElementById(wId).closeWin()};
    if(w)w.closeWin();
    w = doc.createElementNS(xhtmlns, 'div');
    w.setAttribute('style', 'position:fixed;display:block;visibility:hidden;left:0;top:0;width:auto;height:auto;border:1px solid gray;padding:3px;margin:0;z-index:99999;overflow:hidden;cursor:move;'+(typeof w.style.borderRadius === 'string' ? 'background-color:#f3f5f7;padding-top:4px;border-radius:4px;box-shadow:0 0 12px rgba(0,0,0,.4);' : 'background:-o-skin("Window Skin");'));
    w.id = wId;
    w.closeWin = function(){
        doc.removeEventListener('keydown', keyDown, false);
        this.parentNode.removeChild(this);
    };
    w.addEle = function(str, style){
        var ele = doc.createElementNS(xhtmlns, 'div');
        ele.setAttribute('style', style);
        if(str){
            ele.innerHTML = str;
            for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
                el = all[i];
                if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
                    el.parentNode.removeChild(el);
                }
                else{
                    for(var att = el.attributes, j = att.length; j--;){
                        if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
                    }
                }
            }
        };
        return this.appendChild(ele);
    };
    var img = doc.createElement('div');
    img.setAttribute('style', 'display:block;float:right;width:18px;height:18px;padding:0;margin:0;border:none;cursor:pointer;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAZElEQVR42mNgGNyAGQixsVGU/AdCXjCbHczmxKaMFywlAlWiw6DAwIZNmQhYGqJEDWoqFiAGVmKKTwk73CRJ/Ep0GIyhbsPpO4hbIG4TwKaMk0EZ7hYBBk1cvmNDEmbDrmSwAADE8h10+qICXwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=");background:-o-skin("Caption Close Button Skin");');
    img.title = (win.navigator.language.indexOf('ru') == 0) ? '\u0417\u0430\u043A\u0440\u044B\u0442\u044C' : 'Close';
    img.addEventListener('click', function(){this.parentNode.closeWin()}, false);
    w.appendChild(img);
    var title = w.addEle(title, 'display:table;color:#000;font:16px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
        title.onclick = e => {
        e.preventDefault();
        var url = e.target.href;
        // Здесь открываем url как хотим.
        var ctabpos = gBrowser.selectedTab._tPos +1;
        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
    }
    var cnt = w.addEle(text, 'display:block;border:1px solid #aaa;margin:2px 0 1px 0;padding:4px;background-color:#fafcfe;color:#000;font:14px Times New Roman;width:240px;height:120px;overflow:auto;cursor:text;');
    w.addEle(status, 'display:table;color:#555;font:10px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
    w.addEventListener('mousedown', function(e){
        if(e.target == w){
            e.preventDefault();
            var grabX = e.clientX, grabY = e.clientY, origX = parseInt(w.style.left), origY = parseInt(w.style.top);
            var mouseMove = function(ev){
                w.style.left = origX+ev.clientX-grabX+'px';
                w.style.top = origY+ev.clientY-grabY+'px';
            };
            doc.addEventListener('mousemove', mouseMove, false);
            doc.addEventListener('mouseup', function(){doc.removeEventListener('mousemove', mouseMove, false)}, false);
        }
    }, false);
    doc.documentElement.appendChild(w);
  
    if(size){
        cnt.style.height = size.height;
        cnt.style.width = size.width;
    }
    else{
        for(var i = 3; i < 10; i++){
            if(cnt.scrollHeight > cnt.offsetHeight || cnt.scrollWidth > cnt.offsetWidth){
                cnt.style.height = 50*i+'px';
                cnt.style.width = 100*i+'px';
            }
            else break;
        }
    };

    var docEle = (doc.compatMode == 'CSS1Compat' && win.postMessage) ? doc.documentElement : doc.body;
    var mX = docEle.clientWidth-w.offsetWidth, mY = docEle.clientHeight-w.offsetHeight;
    if(mX < 0){cnt.style.width = parseInt(cnt.style.width)+mX+'px'; mX = 0};
    if(mY < 0){cnt.style.height = parseInt(cnt.style.height)+mY+'px'; mY =0};
    var hW = parseInt(w.offsetWidth/2);
    w.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px';
    w.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px';
    w.style.visibility = 'visible';
    doc.addEventListener('keydown', keyDown, false);
    return w;
};

var getHash = function (txt) {
    TKK=eval('((function(){var a\x3d817046147;var b\x3d-335196159;return 410049+\x27.\x27+(a+b)})())');
    function sM(a) {
        var b;
        if (null !== yr)
            b = yr;
        else {
            b = wr(String.fromCharCode(84));
            var c = wr(String.fromCharCode(75));
            b = [b(), b()];
            b[1] = c();
            b = (yr = window[b.join(c())] || "") || ""
        }
        var d = wr(String.fromCharCode(116))
            , c = wr(String.fromCharCode(107))
            , d = [d(), d()];
        d[1] = c();
        c = "&" + d.join("") + "=";
        d = b.split(".");
        b = Number(d[0]) || 0;
        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var l = a.charCodeAt(g);
            128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 == (l & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023),
                e[f++] = l >> 18 | 240,
                e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224,
                e[f++] = l >> 6 & 63 | 128),
                e[f++] = l & 63 | 128)
        }
        a = b;
        for (f = 0; f < e.length; f++)
            a += e[f],
                a = xr(a, "+-a^+6");
        a = xr(a, "+-3^+b+-f");
        a ^= Number(d[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return c + (a.toString() + "." + (a ^ b))
    }

    var yr = null;
    var wr = function(a) {
        return function() {
            return a
        }
    }
        , xr = function(a, b) {
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2)
                , d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d)
                , d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
            a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
        }
        return a
    }; 

    return sM(txt);
}; 
 
  
 
var ujs_google_translate = function (dir){
    var lng = window.navigator.language.slice(0, 2), txt = gContextMenu.selectionInfo.fullText, l = dir.split('|');
    var encTxt = encodeURIComponent(txt);
    var winWait = function(lng){createWindow('', (lng == 'ru' ? '\u041F\u0435\u0440\u0435\u0432\u043E\u0434\u0438\u043C' : 'Translating')+'\u2026', 'Google Translate', '_gt', window.navigator.lastClick)};
    
    if (txt) {
   
        winWait(lng);
    
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        var urle = "http://translate.google.com/translate_t?text="+encTxt+"&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&ujs=gtt";
                  
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0'));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                    result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();
                    createWindow(result, status, '<a href="'+urle.replace(/&/g,'&amp;')+'"  style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', window.navigator.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
    } else {
        var urlt = gBrowser.currentURI.spec;  
        var url = "http://translate.google.com/translate?u="+encodeURIComponent(urlt)+"&hl="+lng+"&langpair="+dir+"&tbb=1";
        var ctabpos = gBrowser.selectedTab._tPos +1;
        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
    };
};

var contextMenu = document.getElementById("contentAreaContextMenu");
var nextEleMenu = document.getElementById("context-inspect");

var menuId = "context-ext-google-translate";
var menuItem = document.getElementById(menuId);
if (menuItem) {
    contextMenu.removeChild(menuItem.nextElementSibling);
    contextMenu.removeChild(menuItem.nextElementSibling);
    contextMenu.removeChild(menuItem);
};

menuItem = document.createXULElement("menuitem");
menuItem.setAttribute("id", menuId);
menuItem.setAttribute("label", "Перевести на русский");
menuItem.setAttribute("class", "menuitem-iconic");
menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABBUlEQVR4Ac2RMU4DMRREB2MqihQpAkUaqnAduuQw4Sx03CGcJYIiDYqQ0lCsZ77535ZFcgAkRuPvV7zd/dLiz3N1PFb8hmRckrfELZrF9ONQ1B6Yz0MyM7S0O6zGkVprh/3+Kw/JzkHSpRpJKZkpr9fYbOx0cjVsCbWG31oHBM9mtt0q73ZcrdLhAMlYQKkUI22aqsNo8HKZAMQhvVaKSHWj2Q2aPU3mJQFY7nuHyvYFduP83WF3AJRfcPNYnr/Lp1G1uK4m9sno1LaUbnX/htf8BNzoneUD5NhjvLCMhURQSQ93QCZwXYjFwg3I0NZKrvoknQPMIHkt/jRAQKMeG2yX89/mB4EJbKbZxIhFAAAAAElFTkSuQmCC");
menuItem.addEventListener("command", function(){ujs_google_translate('auto|ru')}, false);
contextMenu.insertBefore(menuItem, nextEleMenu);

menuItem = document.createXULElement("menuitem");
menuItem.setAttribute("label", "Перевести на английский");
menuItem.setAttribute("class", "menuitem-iconic");
menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAAB5UlEQVR4AWOgPZg0c9+Oq2+qpx9LaQaiw4mNB27efbs2uXFNQh2Q4Zm9zSNth23MhqjGnXMC86vnHmUS4udxv7OvOd2yPE7PTlfCTk9GVVEoyJA7WI8dyPA0k3U1l+jJMV7CeThpTZeoKDdDUsvBPSff/V+6/P/Bvf///2+bdvU/EKRm/k9IBNIlfZe+LFrzvbsbyJ636pKkyQyQhoUb7tZNvPpw3/0/TfX/ISAm5n94BIiRm/n/xYsLd946ei4vajoiqDuRAejQf//+o4PQ0P9+fmhiQGVnrr1kXJNYG2zEzXDxDsPv3wy/fkFJoOTPn39+/fr/69e/37//AUX+/mXRkO458wWHDba2f8wswCyQ3N+/f//8/fP7z5+TV18w2Mdt6plzPiptx5Wr7/+/ffMzOR6kysjkt74hWMPfp06O+2dulZCeFZKwnkE4m8E8bN3i9aCQ+dxY96GrK6bkGJD9R1v3l6Y20NVW9kt+/v//ZdbcFwkxTVPPMQimM8XEqkb7a/zoqLxkH9v4zVyI5+///wyMmtKMmhJAnbLqQjHxaw5r2orOmZN5uj470Zahat6BKS7JzpmLBHXm8GhM5lCdcP7ai1ZpixZxk9NXXjKIFzOIFjAI54oY1vXuue5qmscw+AAAW0tKxtPoicEAAAAASUVORK5CYII=");
menuItem.addEventListener("command", function(){ujs_google_translate('auto|en')}, false);
contextMenu.insertBefore(menuItem, nextEleMenu);

contextMenu.insertBefore(document.createXULElement("menuseparator"), nextEleMenu);

Отредактировано Garalf (07-01-2020 14:46:47)

Отсутствует

 

№1401307-01-2020 18:43:56

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

Re: Custom Buttons

egorsemenov06 пишет

Ночной режим

А что с ней не так?
Она же только регистрацию стиля со Справки переключает.
У меня работает даже на втором билде Firefox 74.0a1

Отсутствует

 

№1401408-01-2020 09:27:41

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

Re: Custom Buttons

Нашел тот AutoPopup.uc.js, но он не универсальный, работает только на аддоны и на гамбургер-меню, не на всех менюшках как тут(не работает на CB), когда проверял на 71 работал везде. Больше тот код(старый) интересует его реанимировать никак? нашел еще такой код, но это же ... столько кнопок, сколько меню, да и работает ли не ясно.
Можно просто маленький код для CB и стандартные окна фф(меню и т.д.) без аддонов сделать?
Хоть пошлите а то сижу как не знаю кто думаю может кто заметит, или хотя бы скажите что трудно и делать не будете, хоть какой-то отклик а то будто самому себе пишу. Прошлый раз писал про кнопку, там код маленький и по теме так тоже игнор, я тут под игнором?

Отредактировано func4ptch4 (08-01-2020 10:02:00)

Отсутствует

 

№1401508-01-2020 15:04:42

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

Re: Custom Buttons

Dumby подскажи что изменить в кнопке для 72. Кнопка работает, если включить и выключить персонализацию

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

Выделить код

Код:

/*Initialization Code*/
this.type != "menu" ? this.type = "menu" : (popup => {
    var inserter = {
        get docShell() {
            delete this.docShell;
            return this.docShell = "docShell" in document
                && document.docShell instanceof Ci.nsIDocShell
                ? document.docShell : window.docShell;
        },
        get insertText() {
            delete this.insertText;
            return this.insertText = text => {
                if (!this.docShell.isCommandEnabled("cmd_insertText")) return;
                var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"]
                        .createInstance(Components.interfaces.nsICommandParams);
                params.setStringValue("state_data", text);
                this.docShell.doCommandWithParams("cmd_insertText", params);
            }
        },
        insert(text) {
            var br = document.activeElement;
            !br || br.localName != "browser" || !br.isRemoteBrowser
            ? this.insertText(text) : br.messageManager.loadFrameScript(
                `data:,(${this.insertText})${encodeURIComponent(text.toSource())}`
            , false, true);
        }
    };
    this.onmousedown = e => {
        if (e.button) return;
        this.onmousedown = null;

        var data, save = () => {
            var link = custombuttons.makeButtonLink("update", _id);
            var params = custombuttons.cbService.getButtonParameters(link).wrappedJSObject;
            params.help = JSON.stringify(data, null, "\t");
            custombuttons.cbService.installButton(params.wrappedJSObject = params);
        }
        popup.setAttribute("context", "");
        popup.setAttribute("onpopupshowing", "firstChild.disabled = !gClipboard.read();");

        popup.add = () => save(data.push(gClipboard.read()));

        var menuitem = popup.appendChild(document.createXULElement("menuitem"));
        menuitem.setAttribute("label", "Добавить из буфера");
        menuitem.setAttribute("oncommand", "parentNode.add();");

        if (!(data = JSON.parse(this.Help || "[]")).length) return;

        popup.insert = ind => inserter.insert(data[ind]);
        popup.delete = ind => save(data.splice(ind, 1));

        var df = document.createDocumentFragment();
        df.append(document.createXULElement("menuseparator"));

        var menugroup = df.appendChild(document.createXULElement("menugroup"));
        menugroup.setAttribute("oncommand", "parentNode.insert(event.target.index);");
        menugroup.setAttribute("orient", "vertical");
        menugroup.setAttribute("context", "_child");

        var context = menugroup
            .appendChild(document.createXULElement("menupopup"))
            .appendChild(document.createXULElement("menuitem"));
        context.setAttribute("label", "Удалить элемент?");
        context.setAttribute("oncommand", "event.stopPropagation(); menupopup.delete(popupNode.index);");
        context.menupopup = popup;

        data.forEach((text, ind) => {
            var menuitem = menugroup.appendChild(document.createXULElement("menuitem"));
            menuitem.setAttribute("label", text.trimLeft().replace(/\s+/g, " ").slice(0, 70));
            menuitem.index = ind;
        });
        popup.append(df);
    }
})(this.appendChild(document.createXULElement("menupopup")));


и еще одна нарисовалась
скрытый текст

Выделить код

Код:

/*Initialization Code*/
window.arycb_BBCodeClipboardStrings = this.clipboardStrings = [];   // Массив буфера обмена

// -------------------------------------------------------
// Функция fHLD_Get_ListClipboardPrim 
// получить список сохранёного буфера обмена
//
fnHLD_Get_ListClipboardPrim = function (){
var cs = arycb_BBCodeClipboardStrings; 
return (cs.slice(0)); 
}; 

//Список сохранёного буфера обмена
//Не вызываем это, обработка по таймеру или по событию ЛКМ
//-----Обработчики буфера обмена

this.MAX_ENTRIES = 16;               //Максимальное число записей 16
this.CHECK_INTERVAL = 1000;      //Время опроса буфера 1000 миллисекунд
this.type = "menu";
this.orient = "horizontal";
this._menupopup = this.appendChild(document.createXULElement("menupopup"));
this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);");

this.checkClipboard = function() {
    var clipStr = readFromClipboard();
    if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1)
        this.storeString(clipStr);
};

this.storeString = function(str) {
    var cs = this.clipboardStrings;
    cs.push(str);
    while(cs.length > this.MAX_ENTRIES)
        cs.shift(); 

    var mi = document.createXULElement("menuitem");
    mi.setAttribute("label", str);
   

    this._menupopup.appendChild(mi);
    while(this._menupopup.childNodes.length > this.MAX_ENTRIES)
        this._menupopup.removeChild(this._menupopup.firstChild);
};

this.handleCommand = function(mi) {
    var indx = Array.indexOf(mi.parentNode.childNodes, mi);
    if(indx != -1)
        inserter.insert(this.clipboardStrings[indx]);
};

var inserter = {
        get docShell() {
            delete this.docShell;
            return this.docShell = "docShell" in document
                && document.docShell instanceof Ci.nsIDocShell
                ? document.docShell : window.docShell;
        },
        get insertText() {
            delete this.insertText;
            return this.insertText = text => {
                if (!this.docShell.isCommandEnabled("cmd_insertText")) return;
                var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"]
                        .createInstance(Components.interfaces.nsICommandParams);
                params.setStringValue("state_data", text);
                this.docShell.doCommandWithParams("cmd_insertText", params);
            }
        },
        insert(text) {
            var br = document.activeElement;
            !br || br.localName != "browser" || !br.isRemoteBrowser
            ? this.insertText(text) : br.messageManager.loadFrameScript(
                `data:,(${this.insertText})${encodeURIComponent(text.toSource())}`
            , false, true);
        }
    };

setInterval(function(button) {
    button.checkClipboard();
}, this.CHECK_INTERVAL, this);

this.setAttribute("onpopupshowing", "this.checkClipboard();");


var ios = Components.classes["@mozilla.org/network/io-service;1"].
  getService(Components.interfaces.nsIIOService);
var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].
  getService(Components.interfaces.nsIStyleSheetService);
  
var css = new String();
css = css + '@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");';
css = css + 'tooltip[label^="' + this.label + '\\000a\\000a"] {';
css = css + "-moz-appearance: none !important;";
css = css + "border: 1px solid silver !important;";
css = css + "max-width: none !important;";
css = css + "background: black !important;";
css = css + "color: silver !important;";
css = css + "font-family: monospace !important;";
css = css + "}";
var uss = ios.newURI("data:text/css," + encodeURIComponent(css), null, null);

if (!sss.sheetRegistered(uss, sss.AGENT_SHEET)) sss.loadAndRegisterSheet(uss, sss.AGENT_SHEET);
this.onDestroy = function(reason) {
  if (reason == "update") {
    if (sss.sheetRegistered(uss, sss.AGENT_SHEET)) sss.unregisterSheet(uss, sss.AGENT_SHEET);
  }
  if (reason == "delete") {
    if (sss.sheetRegistered(uss, sss.AGENT_SHEET)) sss.unregisterSheet(uss, sss.AGENT_SHEET);
  }
}

this.showClipboard = function() {
  var code = custombuttons.cbService.readFromClipboard();
 this.tooltipText = code ? this.label + "\n\n" + code: this.label;
}
this.setAttribute("onmouseover", "this.showClipboard()");


В последней требуется заменить Array.indexOf (на что?)
скрытый текст

Выделить код

Код:

this.handleCommand = function(mi) {
    var indx = Array.indexOf(mi.parentNode.childNodes, mi);
    if(indx != -1)
        inserter.insert(this.clipboardStrings[indx]);
};

Отредактировано Andrey_Krropotkin (08-01-2020 15:54:47)

Отсутствует

 

№1401608-01-2020 17:27:32

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

Re: Custom Buttons

func4ptch4 пишет

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

Это про «New Button at Right from current»?
Если так, то да, небольшой момент игнора есть.

Дело в том, что не так давно обсуждалось,
и тут опять вдогонку снова-здорово.
Теперь уже можешь пробовать ставить.

А насчёт трудно, для меня, например, да.
Просидел несколько часов, и ничего не получилось.

Andrey_Krropotkin пишет

подскажи что изменить

Первую строку.
Там, как-бы, небольшая оптимизация под XBL, чтобы
код не исполнялся целиком при переинициализации,
которая происходила при установке this.type = "menu"

Но XBL теперь тю-тю, а при соответствующей переделке в CB,
я не стал делать какую-либо специальную мимикрию,
чтобы принудително имитировать эту особенность кнопок.

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

(this.type != "menu" && (this.type = "menu") && !this.hasAttribute("is")) || (popup => {

Andrey_Krropotkin пишет

требуется заменить Array.indexOf (на что?)

Парочка вариантов

    var indx = Array.prototype.indexOf.call(mi.parentNode.childNodes, mi);

    var indx = Array.from(mi.parentNode.childNodes).indexOf(mi);

Отсутствует

 

№1401708-01-2020 17:39:21

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

Re: Custom Buttons

Dumby спасибо, все работает

Отсутствует

 

№1401811-01-2020 04:22:14

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Chrome 79.0
Веб-сайт

Re: Custom Buttons

Вопрос к знающим людям.
Если мне надо получить список линков на текущей странице, я получаю это так:
var links = window.document.getElementsByTagName("a");
и alert(links.lenght) говорит сколько на ней линков
Как мне получить список линков на другой странице, заданной url?
Я пытался сделать это так:
var g = document.createElement("window");
g.src = 'https://youtu.be/8PvVaYmjlk4';
var links = g.document.getElementsByTagName("a");
alert(links.lenght);

Однако
var links = g.document.getElementsByTagName("a");
всё портит - до алерта вообще не доходит.
Как же мне получить список линков на другой странице, заданной url, удалённо, то есть не заходя на неё?

Отредактировано difabor (11-01-2020 04:29:04)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1401911-01-2020 05:11:49

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: unknown 0.0

Re: Custom Buttons

difabor.  Есть у мя такая ф-ция для этого дела. Как на 57+ не знаю, пользуюсь на PM и >57 .
Т.к. это все находися в меню, то сделано через this.  Замени на function  getUrls() {  и вызывай отдельно.

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

Выделить код

Код:

// ---------------------------- Взять все Ссылки на странице ----------------------------------------------------------------   
 this.getUrls =()=> {
     const foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
      let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
      let prof = Services.dirsvc.get('ProfD', Ci.nsIFile);
       prof.append("custombuttons");
       prof.append("urllist" + Math.random() + ".txt");     

 let win = document.commandDispatcher.focusedWindow, doc = win.document;
 let sel = doc, winSel = win.getSelection();

    if(winSel.toString()){
       sel = doc.createElement('div');
       sel.appendChild(winSel.getRangeAt(0).cloneContents());
       };

   let str = '', links = sel.getElementsByTagName('a');
       for(let i = 0, lnk; lnk = links[i]; i++) {
         if(lnk.href)str += lnk.href + '\r\n'
         };

// в буфер берем домен сайта, для своих нужд. другая ф-ция берет домен, здесь не привожу.
//      gClipboard.write(getDomain());

     foStream.init(prof, 0x02|0x08|0x20, 0666, 0);
     foStream.write(str, str.length);
     foStream.close();
     launchAP(prof);
// можно просто сразу запустить файл с сылками в текстовом редакторе ОС. 
// тогда то шо ниже разделителя убрать\закоментить 
//     file.launch(); 
// ----------------------------------------------------------------------------

function launchAP(file) {
      progPath = PROF.path + "\\SOFT_PM\\AkelPad-my\\sAkelPad.cmd";
     arg = [file.path];
      startProcess(progPath, arg);  // тоже другая ф-ция, проверяет параметры, наличие файла и запускает программу. не стандартная. не привожу(есть тут на форуме)
     }
// -----------------------------------------------------------------------------
  };

Добавлено 11-01-2020 05:16:19
ай, не понял что надо. Звиняй, не то.
Надо ж наверное загрузить этот документ который в window  и только потом считать ссылки. Онож незагруженно и ничего не считает КМК.

Отредактировано mokujin (11-01-2020 05:16:19)


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№1402011-01-2020 07:03:40

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Chrome 79.0
Веб-сайт

Re: Custom Buttons

mokujin пишет

difabor.  Есть у мя такая ф-ция для этого дела. Как на 57+ не знаю, пользуюсь на PM и >57 .
Т.к. это все находися в меню, то сделано через this.  Замени на function  getUrls() {  и вызывай отдельно.
...
Добавлено 11-01-2020 05:16:19
ай, не понял что надо. Звиняй, не то.
Надо ж наверное загрузить этот документ который в window  и только потом считать ссылки. Онож незагруженно и ничего не считает КМК.

Спасибо, mokujin!
Вот мне и нужно как-то загрузить этот документ...
Причём, я хочу это сделать скриптом и не зависеть ни от СВ ни от браузера.
Моя мозилла полетела с треском, я уже неделю её пытаюсь привести в чувство, пока сижу на Гугл Хроме и пытаюсь что-то наворотить на Тамперманки (аналог Грэйсманки)

Отредактировано difabor (11-01-2020 07:08:51)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1402111-01-2020 08:54:16

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

Re: Custom Buttons

difabor попробуй

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

Выделить код

Код:

javascript:var sLFd=document,DlnK=document.links;sLFw=window.name;w=window.open();w.document.write('<base%20target='+sLFw+'><b>%20Всего%20ссылок '+DlnK.length+' с</b>:<br><b>'+sLFd.title+'</b><br>'+sLFd.URL.link(sLFd.URL)+'<hr>');for(lNK=0;lNK<DlnK.length;lNK++) w.document.write('<p>'+'<b>'+lNK+'. '+'</b>'+DlnK[lNK].text+'&nbsp;'+DlnK[lNK].href.link(DlnK[lNK]));


Dumby в этом коде на 72 не определяется селектор в var elm = doc.querySelector(selectors.shift());
скрытый текст

Выделить код

Код:

//Добавыть в контекстное меню страницы пункт "Запомнить изображение как base64"..........................................................................................
(popup => addEventListener("popupshowing", {
    handleEvent(e) {
        if (this.shouldHide) return;

        var menuitem = document.createXULElement("menuitem");
        menuitem.id = "content-baseItem";
        menuitem.className = "menuitem-iconic";
        menuitem.setAttribute("oncommand", "copyImageAsBase64()");
        menuitem.setAttribute("label", "Запомнить изображение как base64");
        menuitem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AIAQ/wCAEf8AgA//AIAR/wCAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AgBX/AIAVAAAAAAAAAAD/AIAo/wCA//8AgP//AID//wCA//8AgP//AIAoAAAAAAAAAAAAAAAAAAAAAP8AgBL/AID//wCA//8AgA3/AIAL/wCA//8AgP//AID//wCA//8AgP//AID//wCA//8AgBAAAAAAAAAAAAAAAAD/AIAR/wCA//8AgP//AIAK/wCACv8AgP//AID//wCAIf8AgAX/AIAh/wCA//8AgP//AIAQAAAAAAAAAAAAAAAA/wCACv8AgP//AID//wCAB/8AgAf/AID//wCA//8AgAUAAAAA/wCABf8AgP//AID//wCACgAAAAD/AIAQ/wCADP8AgCH/AID//wCA//8AgAf/AIAH/wCA//8AgP//AIAh/wCABf8AgCH/AID//wCA//8AgAv/AIAh/wCA//8AgP//AID//wCA//8AgP//AIAH/wCAB/8AgP//AID//wCA//8AgP//AID//wCA//8AgP//AIAg/wCA//8AgP//AID//wCA//8AgP//AID//wCAB/8AgAf/AID//wCA//8AgP//AID//wCA//8AgP//AIAh/wCAC/8AgP//AID//wCAHP8AgBz/AID//wCA//8AgAf/AIAH/wCA//8AgP//AIAh/wCACf8AgA7/AIAMAAAAAP8AgAj/AID//wCA//8AgAP/AIAD/wCA//8AgP//AIAH/wCAB/8AgP//AID//wCABQAAAAAAAAAA/wCADf8AgAr/AIAL/wCA//8AgP//AIAH/wCAB/8AgP//AID//wCAB/8AgAr/AID//wCA//8AgCH/AIAH/wCAJf8AgP//AID//wCAI/8AgP//AID//wCAB/8AgAf/AID//wCA//8AgAf/AIAL/wCA//8AgP//AID//wCA//8AgP//AID//wCA//8AgCT/AID//wCA//8AgAr/AIAK/wCA//8AgP//AIAKAAAAAP8AgCj/AID//wCA//8AgP//AID//wCA//8AgCP/AIAM/wCA//8AgP//AIAN/wCADf8AgP//AID//wCADQAAAAAAAAAA/wCAEP8AgBH/AIAP/wCAEf8AgBAAAAAAAAAAAP8AgBT/AIAVAAAAAAAAAAD/AIAV/wCAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQcH5rEGA8KxBAHCsQQBwrEEIQKxBAACsQQAArEEAAKxBAQCsQQwArEEAAKxBAACsQYAArEHBmaxB//+sQQ==");
        popup.append(menuitem);
        addDestructor(() => menuitem.remove());

        menuitem.copyImageAsBase64 = () => gBrowser.selectedBrowser.messageManager
            .loadFrameScript("data:;charset=utf-8," + encodeURIComponent(this.code()), false);

        this.handleEvent = () => menuitem.hidden = this.shouldHide;
    },
    get shouldHide() {
        return !gContextMenu.onImage;
    },
    code: () => `(selectors => {

        var getImage = doc => {
            var elm = doc.querySelector(selectors.shift());
            if (selectors.length) elm = getImage(elm.contentDocument);
            return elm;
        }
        var image = getImage(content.document);

        var canvas = image.ownerDocument.createElementNS("${xhtmlns}", "canvas");
        canvas.width = image.naturalWidth;
        canvas.height = image.naturalHeight;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(image, 0, 0);
        var base64 = canvas.toDataURL();

        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper)
            .copyStringToClipboard(base64, Ci.nsIClipboard.kGlobalClipboard);

        Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
            .showAlertNotification(base64, "${self.label}", "Запомнил изображение как base64");
    })(${
        JSON.stringify(gContextMenu.targetSelectors)
    })`
}, false, popup || 1))(document.getElementById("contentAreaContextMenu"));


а такая же беда только в другом куске коде для for(var sel of selectors)
скрытый текст

Выделить код

Код:

cmd() {
        var msg = "CB:GetImageScreenRectForMosuseZoom";
        var code = `(selectors => {
            var doc = content.document;
            for(var sel of selectors) {
                var node = doc.querySelector(sel);
                node instanceof HTMLImageElement
                    ? sendAsyncMessage("${msg}", Object.assign(
                        {src: node.currentSrc}, BrowserUtils.getElementBoundingScreenRect(node)
                    )) : doc = node.contentDocument;
            }
        })(`;
        messageManager.addMessageListener(msg, this);
        addDestructor(() => messageManager.removeMessageListener(msg, this));


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

Отредактировано Andrey_Krropotkin (11-01-2020 13:59:18)

Отсутствует

 

№1402211-01-2020 13:59:07

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Chrome 79.0
Веб-сайт

Re: Custom Buttons

Я что-то совсем не понял.
Мне нужно как-то загрузить документ со страницы, например, https://lenta.ru/, а нахожусь я на другой странице, напр. на этом форуме.
Как это сделать?
Когда я пытаюсь определить некую переменную g как var g = document.createElement("window");
то g.src = 'https://lenta.ru/'; для объекта window не релевантно: он не создаёт полноценно этот объект
Когда же я пытаюсь определить g как var g = document.createElement("iframe");,
то b]g.src = 'https://lenta.ru/';[/b]  релевантно для объекта iframe,
но для iframe не релевантно var links = g.document.getElementsByTagName("a"); которое релевантно для window
Получается замкнутый (для меня) круг:
Я не могу создать g как window т.к. для него вообще не релевантно g.src,
и хотя могу создать g как iframe, но не знаю, как получить от него список линков,
поскольку для iframe не релевантно вот это: g.document.getElementsByTagName("a");
Получается замкнутый круг...

Отредактировано difabor (11-01-2020 14:02:08)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1402311-01-2020 14:12:31

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

Re: Custom Buttons

difabor да я Вас не дочитал до конца, этот скрипт дает ссылки с текущей страницы, на которой Вы находитесь. Попробую доделать

Отсутствует

 

№1402411-01-2020 15:28:24

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Chrome 79.0
Веб-сайт

Re: Custom Buttons

Andrey_Krropotkin пишет

difabor да я Вас не дочитал до конца, этот скрипт дает ссылки с текущей страницы, на которой Вы находитесь. Попробую доделать

Спасибо, Андрей.
Мне нужно создать объект по урл который будет содержать линки, подобно объекту window и знать как получить список этих линков.
Собственно говоря, число линков мне особо не важно - я просто с помощью alert(links.length) проверяю или я получил линки в переменную links или не получил.
Для меня самое важное - получить линки в некую переменную, которую я обозвал links.
Если я на текущей странице - у меня нет проблем, я получаю линки так:
var links = window.document.getElementsByTagName("a");
и дальше знаю, что с этим делать.
Проблема в том, что я не знаю как создать объект типа window, задав урл (подобно iframe),
а если я создаю объект типа iframe по урл, то не знаю как получить линки типа ххх.document.getElementsByTagName("a");
То есть мне нужно:
- либо знать как можно получить объект типа window но с заданным урл, тогда дальше я знаю, что делать,
- либо знать как от объекта iframe получить список линков (я ведь даже не знаю, содержит iframe линки подобно window или нет);
Если я получу список линков, дальше я сам знаю что делать.

Отредактировано difabor (11-01-2020 15:37:16)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1402511-01-2020 16:33:40

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

Re: Custom Buttons

difabor там чуть посложней будет, чтобы получить линки в некую переменную - links, надо скорей всего формировать GET запрос страницы, получить ответ и вставить, примерно как перевод в окне.

Отсутствует

 

Board footer

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