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

Mozilla Россия — свежие версии программ Mozilla, а также масса полезной информации по каждому продукту.

№1380104-10-2019 17:38:29

solombala
Участник
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 173
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)

Отсутствует

 

№1380205-10-2019 06:04:02

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 144
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)

Отсутствует

 

№1380305-10-2019 15:36:24

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 997
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)

Отсутствует

 

№1380405-10-2019 17:02:08

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

Re: Custom Buttons

Dumby пишет:

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

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

Отсутствует

 

№1380505-10-2019 21:38:53

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 997
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 потерялся. Добавил.

Отсутствует

 

№1380606-10-2019 23:25:29

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

Re: Custom Buttons

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

Отсутствует

 

№1380711-10-2019 08:39:14

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

Re: Custom Buttons

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

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

модальное окно
https://c.radikal.ru/c35/1910/18/3e721836c881.png

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

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

Отсутствует

 

№1380811-10-2019 09:54:05

dim222
Участник
 
Группа: Members
Зарегистрирован: 06-03-2016
Сообщений: 359
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

Отсутствует

 

№1380911-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)

Отсутствует

 

№1381011-10-2019 19:52:14

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 144
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());

Отсутствует

 

№1381115-10-2019 10:37:13

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

Re: Custom Buttons

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

Отсутствует

 

№1381216-10-2019 17:20:12

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

Re: Custom Buttons

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

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

Отсутствует

 

№1381324-10-2019 03:15:24

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 576
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 ); 
})();


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

Отсутствует

 

№1381424-10-2019 08:59:30

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4786
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); 
})();

Отсутствует

 

№1381524-10-2019 13:49:40

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

Re: Custom Buttons

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

Отсутствует

 

№1381624-10-2019 13:53:41

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

Re: Custom Buttons

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

Отсутствует

 

№1381724-10-2019 14:39:37

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

Re: Custom Buttons

Dumby раньше Вы мне показывали как создать в контекстном меню аддонов на странице about:addons.

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

Выделить код

Код:

var copyToClipboard = function (aString) {
            Cc["@mozilla.org/widget/clipboardhelper;1"].
                getService(Ci.nsIClipboardHelper).copyString(aString);
        };

(function () {
addEventListener("shown", {
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        e.target.baseURI == this.url && !e.target.contains(this.item)
        && requestAnimationFrame(() => e.target.prepend(this.item));
    },
    get item() {
        var item = document.createElementNS(xhtmlns, "panel-item");
        item.append("Домашняя страница");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this.onAddon(item.closest("addon-card").addon);
        }
        addDestructor(() => item.remove());
        delete this.item; return this.item = item;
    },
    onAddon(addon) {
             var url = addon.homepageURL;
        if (!url) {
        if (addon.reviewURL) {
        url = addon.reviewURL.replace(/\/reviews\/.*$/, "/");
        } else {
        url = "https://addons.mozilla.org/search/?q="
            + encodeURIComponent(addon.name);
         }
        }
       openURL(url);
    }
}, true, gBrowser.tabpanels || 1);
})();
(function () {
addEventListener("shown", {
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        e.target.baseURI == this.url && !e.target.contains(this.item)
        && requestAnimationFrame(() => e.target.prepend(this.item));
    },
    get item() {
        var item = document.createElementNS(xhtmlns, "panel-item");
        item.append("Папка установки");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this.onAddon(item.closest("addon-card").addon);
        }
        addDestructor(() => item.remove());
        delete this.item; return this.item = item;
    },
    onAddon(addon) {
                    switch (addon.type) {
                case "plugin":
                    var pathes = addon.pluginFullpath;
                    for (var i = 0; i < pathes.length; i++) {
                        this.revealPath(pathes[i]);
                    }
                    return;
                case "userchromejs":
                    var file = addon._script.file;
                    if (file.exists())
                        file.reveal();
                    return;
            }

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

            var dir = Services.dirsvc.get("ProfD", Ci.nsIFile);
            dir.append("extensions");
            dir.append(addon.id);
            var fileOrDir = dir.path + (dir.exists() ? "" : ".xpi");

            try {
                (new nsLocalFile(fileOrDir)).reveal();
            } catch (ex) {
                var addonDir = /.xpi$/.test(fileOrDir) ? dir.parent : dir;
                try {
                    if (addonDir.exists()) {
                        addonDir.launch();
                    }
                } catch (ex) {
                    var uri = Services.io.newFileURI(addonDir);
                    var protSvc = Cc["@mozilla.org/uriloader/external-protocol-service;1"].
                    getService(Ci.nsIExternalProtocolService);
                    protSvc.loadUrl(uri);
                }
            }
    }
}, true, gBrowser.tabpanels || 1);
})();
(function () {
addEventListener("shown", {
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        e.target.baseURI == this.url && !e.target.contains(this.item)
        && requestAnimationFrame(() => e.target.prepend(this.item));
    },
    get item() {
        var item = document.createElementNS(xhtmlns, "panel-item");
        item.append("Файл установки");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this.onAddon(item.closest("addon-card").addon);
        }
        addDestructor(() => item.remove());
        delete this.item; return this.item = item;
    },
    onAddon(addon) {
            var gecko = parseInt(Services.appinfo.platformVersion);
            var nsLocalFile = Components.Constructor("@mozilla.org/file/local;1", (gecko >= 14) ? "nsIFile" : "nsILocalFile",
                "initWithPath");
            var dir = Services.dirsvc.get("ProfD", Ci.nsIFile); 
                        dir.append('extensions');
                        dir.append(addon.id);
                            if ( dir.exists() ) dir.launch();
                            var file = Components.classes['@mozilla.org/file/directory_service;1']
                                      .getService(Components.interfaces.nsIProperties)
                                     .get('ProfD', Components.interfaces.nsIFile);
                            file.append('extensions');
                            file.append( addon.id + '.xpi' )
                            if ( file.exists() ) file.launch(); 
                            return;
    }
}, true, gBrowser.tabpanels || 1);
})();
(function () {
addEventListener("shown", {
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        e.target.baseURI == this.url && !e.target.contains(this.item)
        && requestAnimationFrame(() => e.target.prepend(this.item));
    },
    get item() {
        var item = document.createElementNS(xhtmlns, "panel-item");
        item.append("Копировать имя и версию");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this.onAddon(item.closest("addon-card").addon);
        }
        addDestructor(() => item.remove());
        delete this.item; return this.item = item;
    },
    onAddon(addon) {
     copyToClipboard(addon.name + " " + addon.version);
    }
}, true, gBrowser.tabpanels || 1);
})();
(function () {
addEventListener("shown", {
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        e.target.baseURI == this.url && !e.target.contains(this.item)
        && requestAnimationFrame(() => e.target.prepend(this.item));
    },
    get item() {
        var item = document.createElementNS(xhtmlns, "panel-item");
        item.append("Копировать версию");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this.onAddon(item.closest("addon-card").addon);
        }
        addDestructor(() => item.remove());
        delete this.item; return this.item = item;
    },
    onAddon(addon) {
     copyToClipboard(addon.version);
    }
}, true, gBrowser.tabpanels || 1);
})();
(function () {
addEventListener("shown", {
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        e.target.baseURI == this.url && !e.target.contains(this.item)
        && requestAnimationFrame(() => e.target.prepend(this.item));
    },
    get item() {
        var item = document.createElementNS(xhtmlns, "panel-item");
        item.append("Копировать ID");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this.onAddon(item.closest("addon-card").addon);
        }
        addDestructor(() => item.remove());
        delete this.item; return this.item = item;
    },
    onAddon(addon) {
     copyToClipboard("ID: " + addon.id);
    }
}, true, gBrowser.tabpanels || 1);
})();
(function () {
addEventListener("shown", {
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        e.target.baseURI == this.url && !e.target.contains(this.item)
        && requestAnimationFrame(() => e.target.prepend(this.item));
    },
    get item() {
        var item = document.createElementNS(xhtmlns, "panel-item");
        item.append("Копировать имя");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this.onAddon(item.closest("addon-card").addon);
        }
        addDestructor(() => item.remove());
        delete this.item; return this.item = item;
    },
    onAddon(addon) {
     copyToClipboard(addon.name);
    }
}, true, gBrowser.tabpanels || 1);
})();


Мне пришлось какждый пункт делать отдельной функцией. Вопрос такой нельзя ли все упростить и второе как скрыть некоторые из этих пунктов, там где они не нужны (в других категориях - плагинах, темах и т.д.), а то что-то я зациклился.
И еще вопрос по другой кнопке. Пункты списка 1,2 при на нажатии кнопку Add-on открываются нормально, а начиная с третьего и далее открывается как пункт 2
скрытый текст

Выделить код

Код:

/*CODE*/
var hid = false; //false - скрыть скрытые адоны, true - показать скрытые адоны

var br = gBrowser;
var img2 = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAABwWjpocFs8zHFbPP9xWzz/cVs8/3FbPP9xWzz/cVs8/3FbPP9xWzz/cVs8/3FbPP9xWzz/cVs8/3BbPMxwWjpodWBB4bWwqv/o6Oj/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+rq6v+1sKr/dWBB4XtlR//f39//6Ojo/8e7q/+0oIf/po1t/6aNbf+mjW3/po1t/6aNbf+mjW3/po1t/+rq6v/s7Oz/39/f/3tlR/+Ba07/29vb/+fn5//f39//3Nzc/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/l5eX/5+fn/9vb2/+Ba07/h3FV/9bW1v/k5OT/5OTk/+Dg4P+bhGb/k3hX/5N4WP+TeFf/m4Rm/+Dg4P+WfF3/rp2H/+Dg4P/U1NT/h3FV/454XP/Z2dn/5+fn/+Pj4//j4+P/ysK3/8nCtv/Jwrb/xr2w/8e9sP/d29j/2NjY/5d9Xv+vnon/1dXV/454XP+UgGP/3Nzc/+rq6v/m5ub/lHlY/5d8XP+dhmf/lXpa/5R5WP+dhmf/uqyb/+bm5v+UeVj/r56I/9jY2P+UgGP/m4dr/97e3v/t7e3/6enp/93d3f/d3d3/3t7e/yOC5P+AsOD/3t7e/+Pj4/+lkHX/rp6J/+Li4v/c3Nz/m4dr/6KNc//h4eH/8PDw//Dw8P/w8PD/7Ozs/zKK6f/h4eH/C3To/+zs7P/s7Oz/4+Pj/+bm5v/u7u7/4eHh/6KNc/+olHr/5OTk//Pz8//z8/P/8/Pz//Dw8P8Seen/8PDw/xJ56f8Seen/8PDw//Dw8P/z8/P/8/Pz/+Tk5P+olHr/r5uC/+fn5//29vb/9vb2//b29v/z8/P/lL3o/xl96f/n5+f/grTo/yWE6v/z8/P/9vb2//b29v/n5+f/r5uC/7Whif/p6en/+fn5//n5+f/5+fn/+fn5//Dw8P+JuOr/JYXr/+/v7/+60ev/9fX1//n5+f/5+fn/6enp/7Whif+6p5D/7Ozs//v7+//7+/v/+/v7//v7+//6+vr/8/Pz/4y77f83juz/9fX1//v7+//7+/v/+/v7/+zs7P+6p5D/v6yW/+3t7f/8/Pz//f39//39/f/9/f3//f39//z8/P/09PT/xNnw//r6+v/9/f3//f39//z8/P/t7e3/v6yW/8Owm8ze2tX/9fX1//f39//39/f/9/f3//f39//39/f/9/f3//T09P/39/f/9/f3//f39//19fX/3trV/8Owm8zGsp9oyLWezMi1n//ItZ//yLWf/8i1n//ItZ//yLWf/8i1n//ItZ//yLWf/8i1n//ItZ//yLWf/8i1nszGsp9oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="; 
var img1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU0toU0EUPfPysx/tTxuDH9SCWhUDooIbd7oRUUTMouqi2iIoCO6lceHWhegy4EJFinWjrlQUpVm0IIoFpVDEIthm0dpikpf3ZuZ6Z94nrXhhMjM3c8895977BBHB2PznK8WPtDgyWH5q77cPH8PpdXuhpQT4ifR9u5sfJb1bmw6VivahATDrxcRZ2njfoaMv+2j7mLDn93MPiNRMvGbL18L9IpF8h9/TN+EYkMffSiOXJ5+hkD+PdqcLpICWHOHc2CC+LEyA/K+cKQMnlQHJX8wqYG3MAJy88Wa4OLDvEqAEOpJd0LxHIMdHBziowSwVlF8D6QaicK01krw/JynwcKoEwZczewroTvZirlKJs5CqQ5CG8pb57FnJUA0LYCXMX5fibd+p8LWDDemcPZbzQyjvH+Ki1TlIciElA7ghwLKV4kRZstt2sANWRjYTAGzuP2hXZFpJ/GsxgGJ0ox1aoFWsDXyyxqCs26+ydmagFN/rRjymJ1898bzGzmQE0HCZpmk5A0RFIv8Pn0WYPsiu6t/Rsj6PauVTwffTSzGAGZhUG2F06hEc9ibS7OPMNp6ErYFlKavo7MkhmTqCxZ/jwzGA9Hx82H2BZSw1NTN9Gx8ycHkajU/7M+jInsDC7DiaEmo1bNl1AMr9ASFgqVu9MCTIzoGUimXVAnnaN0PdBBDCCYbEtMk6wkpQwIG0sn0PQIUF4GsTwLSIFKNqF6DVrQq+IWVrQDxAYQC/1SsYOI4pOxKZrfifiUSbDUisif7XlpGIPufXd/uvdvZm760M0no1FZcnrzUdjw7au3vu/BVgAFLXeuTxhTXVAAAAAElFTkSuQmCC";
var trigger, trigger1, dialog, drives, count;
var icon1 = "data:image/png;base64,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";
var icon2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACa0lEQVR42oWTXUhTYRjH/+/50H1mZ/kRs5WstTKCcsFiTIVYUETUneAupEAqwSuD2obJokS78WawLrppu+uiSymCwFr2ceEcQoWM/MjK2odzNfd1ds7pbKCo2Py/HHh5nuf9v7/znOcQrKvP0sY1NPgMXJOdpiiRgCQAIsqZ2qxY4BZXlmdyyfR1+Kc+YpPIxu72mYtWm328y3IOGqpWzpCNgoV8AoHpF8XU1+/OnOvls50NZOked30622ZrtXBGoqBYSPLKCEWE5qbzodDEg+L9N8PYJrI9oAt0xy+1ddaf0BhQhIDX32YwEZp4wt99dQ07iGiGL3hMzS23GImUqQWVsYkz6wyMSdWIoiTg7coslheW0sKffOlHfDm46hof2GJwyO+MOh1XTJxCAwZU5SmKJZQksVKQD06hmoje1zVrs9nMsZ+/0cDppMONBqKU3z/B/0V07Rfs4wX09PTseDgYDILU3HP0quu0/alYclS9V9t92ma9rFGpEUnNI5ZJYTBytGJQLt6s9RiBy27B6GS4Eh3q9NWdaunnlRSy2SzAUvCGj1Un2BIZ7PDjYF0f9inl8WHAsCwG3xt3IXC390KSwhUKT/sjGPbchF4LSlkLDa3AQEi/C8GIY46oaiRpNbcENXsEzVo9WBpE/qw1NAP3jLk6ARk7/5k9vr+1lC1ALPCQaYD51HNk+AhoAi/jcFcloIc6MqL1gFqi5HbwAhCXmxdNXsXDd4FykdfrlaoSUHccomivJ2AZ+UIKdLYE/kvsqZRcu4GxD+l1g//3wNMZhYo2leeYVH4OApEX0ijwJzEyuVg2qDaJ/wCoeQGVklbGmAAAAABJRU5ErkJggg==";
var icon3 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAB3RJTUUH1wcREBAg9OD7NAAAAAlwSFlzAAAewQAAHsEBw2lUUwAAAARnQU1BAACxjwv8YQUAAAH6SURBVHjaxVNBaxNBFP4mGRNp06bSaGu9qXhRLOSQX6Dg0d48SMWC4Mmbv8AfYA7Sgp6UgteCF29CKahBsKKWglgam4rRxGxiks3u7Mz6zZIlSVHRk7N8vLcz7/vemzczwP8eorSCgtLJJeXpUGtMBQHgK5RptxbuYJUx5o8CL5bx+OzCkyuZ2cLIwtPihbVW9a1GiCyFQyusFD4S2zfv4x5DtI2TAphOZk8zbXFE4NKt5ctInDmY8OLd6zNrtI+IlhURG0Xs55dezZXXF9Gq7CA9NQvNbAH19W/wo+6gWXeaN1aQkybEXLv2Bb36Z+SvfUAynYLgB9Y+GLEv6Sl4HTdcvX0yy4kZqdkit1nFWC4Pme4ydvMXxNiOwwTfIVP5OCBlK0Cv8Y4C5xnXYM+bB0ixTwjWHwpUdzbh+ijZSWlYQefrcxwrLJJcIZxRAWM33qP1KTCOwJ9ErbyLno8trvqRgOrsITV5ik6pT2IXvbZdINmjVr8CmYMx09h7/8wKMBtUtIWgu4/DE8e5lxob4pLsDkhhvxJrjYfE2Am065/Et1ZUQRAJTBxJIDQJZrgKZDiRwYA03AlxCF1Ho92oYGM7ElCS5/qmVjXzLx+cg71tMex5D/8Pw+ng4etd2GYpER0ucJRI26v9l2/Ivg82CI2YIP+BPCyifwI91AzKs/qQkQAAAABJRU5ErkJggg==";
var icon4 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC5UlEQVR4AWIgFvxfaXzz/0tNC5wKbgpHCINoS9V+NW2TpVNlnPfc5Q0CsEkOwHItURRd3bfHeBh927Zt27Zt27Zt2/6xbdvJWFcnj8Xsqo1C42Ccw/mLnfNeeH2R5PcRWbG/J7+vcbC8GE3QAwPQP3L1DsnwlAcOWOv+waVg5F4dMdbu2Un8GlwX0nHO3vazHDoOGC07b/aHBEb8CLVj6MXw1HmvLVzvAJm89V7S/9B9ZdGV68gD11wtXLZcuNuW/kN2FckfIFI4usOPFn/5/iITEqcC6J+514St8oGpQIFNkovYIzORXNtinFqMtSOLwFJ8u+BQ8GaC73fQQ/lh3OSGnwDokGlc2GrVN7KUB6EOht0O+jyg3mHM2oegFTw1+UpmLbfBng6uB56L0SktY7IPGaPdcy3toZSA6WHQ46PQnlw//gH8lAtWis2//JvZh+9Btr0AZmPwBJHYZUZgNQEAXE8zc0GafrVdeWHFqdTDFqgKEKPhtXHmH0/z567nQ6YOwY1QEmyzzmLfO1LRZbF4sMw8FUJ8xZ+lrRhd3gwU4AtuE6RappavcdPun4LTBBtwLWVsLzSy6YYPdf0AKa9B3FR5eLtP2d8fQm7tEuGsx3V97qXvzDXZev3hEADyAAUQ3zXAwIqdOLTjEhJ2HQlAOZ9g69XmsrCU5LVhR7F0oZAsTOS+8z+CAlADxAWKX2vgg0K9zS3bCTw7gCobwhXNp/225+5PjqfvoAxru/34+pzn2CM1HfJAHSh7QrlxJQAdu/DIuNazpbje3iKbbS1y4PoiZ2dFboqJPKFFXkXk3Q6+38O3EP/JUAlAAwB3L6qs8cPyWoa6HYXFHVwQg/lxmJPoyGFYoiEPrFAdNL5fCJ4BoIDeX5hkuHD/2i0zb8vGFutIsAbpOrQ1oMWGmEPNMYgEh8WilUPVy8UVrAp9Q9dtOCNzwtPFdfee4G6yXVO23kLslbNU/v3cSvHRZVOdcnT1ADucXxaSvokQAAAAAElFTkSuQmCC";
var icon5 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjenhJ3MAAACvklEQVQ4T2NgQAL///9nA2LpusbW2PDoxKYFi5baA/k8yGrwsoGKRexdvJbxiyv8F5XX+C8kLv/21avXyqQYIKmmbXRFxdD6v7aVy39+Udnvd+/e1wIazIjTEKAkBxBLAbEyEBv1TZzaIKGo+V9O0+h/YmrWbJAYEMsBsRJUHSeKYSA/axqYX1fTNbkHwkoaBs90gLYbOfr8B/Ed3Hz2mtu6HIPK3waql4EZAGSzMAAJDVll7a9mroH/QdjCI/i/nX80GIP4+jZu/w3tPcFsBXX990D1akgGcIAM0JZT0/1r4R7438Y77L9zSAJWbOcb+V/T0OIFyEKot7mBNBfIAAWgFz7auXhdMLZyeGBs5/7fIzIFAzsFxfw3NLd7BlTv0DNhSkxyRm77pStXdUAG8CxdsRoUUKpfv35zMrV1eeYRnvTfLy4LBfvGZv7XMrL8nZZTuFTbyPKnmaPXfzefoFMgA0BOkYWGtJm7f+g5j7CE/8HJeRjYLzbjv5138H8QHRCf9d/YxukjyAB5c3u3r3GpWdvTc4vWmtg4/41IL/ofkVGMgZ39w/+D5B19Qv57RyT9d3D3ewaOBVtX788+kcn/vcIT/kdmlPz3BtKeoXH/QQbF5FSAcVRW2X9rF6/vnz59jqxubJ3oFxZ9pXfStEyQAaqeQeHPorNK/ycWVP+3c/f9m1tSsb6kqn65q2/w2+jMEqB4zf/4vKr/Dp7+34HqDYBYEIjFgZgXZIBiWHzKFZDCSKCNUckZZ4BipkCs09DWNdc/JuV/SkkDGDv5BP9/8OixBVCOCZ4aQSYlZxccDI5P/x+WnPPfJyzm7eOnz0BxLRmekHodJA7CfpFAbwVH/Z+9YIkfOAUipSbOdZu22ta3dfWV1zevyiwsW/Hq9RtQ3uDrnTw9ASg+qbGjZ8rM+YsKt+7c4wx1PtwFACct2zZrCHmoAAAAAElFTkSuQmCC";

function jarLoaded(e) {        var val = gURLBar.value;
    if(val.search(/(file|jar):/) == 0 && val.search(/\.(ja|jar|xpi|zip)$/i) > -1) loadURI("jar:" + val + "!/");
}
function jarClicked(e) {    if(e.button == 0) {
    var tabUrl = gURLBar.value;
    if(tabUrl.search(/(file|jar):/) == 0 && tabUrl.search(/\/$/) > -1 || tabUrl.search(/view-source:/) == 0) {
        var node = e.target.href;
        if(node && node.search(/\.(exe|dll|sqlite|sqlite-shm|sqlite-wal)$/i) == -1) {
            if(tabUrl.search(/view-source:/) == 0 &&
                 node.search(/view-source:/) == 0    || node.search(/\.(ja|jar|xpi|zip)$/i) > -1) {
                e.preventDefault();    e.stopPropagation();    br.selectedTab = br.addTab(node);
            } else if(node.search(/\/$/) == -1) {
                e.preventDefault();    e.stopPropagation();    br.selectedTab = br.addTab("view-source:" + un(node));
}}}}}


function intf(drives, count) {
    var data = '<?xml version="1.0"?>';
    data += '<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>';
    data += '<window title="Firefox Explorer" onload="self.load()" xmlns="' + xulns + '">';
    data +=   '<keyset>';
    data +=     '<key keycode="VK_ESCAPE" oncommand="close()"/>';
    data +=   '</keyset>';
    data +=   '<vbox flex="1">';
    data +=     '<richlistbox id="listbox" flex="1" >';
    data +=       '<listcols>';
    data +=         '<listcol/>';
    data +=         '<listcol flex="1" />';
    data +=       '</listcols>';
    data +=     '</richlistbox>';
    data +=     '<hbox>';
    data +=       '<button image="' + icon2 + '" label=" Add-on" oncommand="self.addon(event)" tooltiptext="Ctrl+ = Без закрытия диалога"/>';
    data +=       '<button image="' + img2 + '" label=" 1 omni.ja" oncommand="self.omni(event)" tooltiptext="Ctrl+ = Без закрытия диалога"/>';
    data +=       '<button image="' + img2 + '" label=" 2 omni.ja" oncommand="self.omni1(event)" tooltiptext="Ctrl+ = Без закрытия диалога"/>';
    data +=       '<button image="' + icon4 + '" label=" Firefox" oncommand="self.folder(event,' + "'GreD'" + ')" tooltiptext="Ctrl+ = Без закрытия диалога"/>';
    data +=       '<button image="' + icon3 + '" label=" Профиль" oncommand="self.folder(event,' + "'ProfD'" + ')" tooltiptext="Ctrl+ = Без закрытия диалога"/>';
    data +=       '<button label="Закрыть" oncommand="self.close()"/>';
    data +=     '</hbox>';
    data +=     '<hbox>';
    for(i = 0; i < count; i++)    data += '<button image="' + icon1 + '" label="   ' + drives[i] + '" oncommand="self.mydrives(event,' +
                        "'" + drives[i] + "'" + ')" tooltiptext="Ctrl+ = Без закрытия диалога"/>';
    data +=     '</hbox>';
    data +=   '</vbox>';
    data += '</window>';
    return data.replace(/self/g, "opener.document.getElementById(&quot;" + self.id + "&quot;)");
}
this.load = function() {
    if(!("AddonManager" in window))
            Components.utils.import("resource://gre/modules/AddonManager.jsm");

    if(!("Services" in window))
            Components.utils.import("resource://gre/modules/Services.jsm");

      var then, promise = AddonManager.getAddonsByTypes(["extension"], then = function(addons) {

        var list = new Array();
        addons.forEach( function(addon) { 
            if (addon.hidden == false || addon.hidden == hid) {
            list.push(addon);
                }
        });

        function key(addon) {
           return addon.name.toLowerCase();
            }

        list.sort( function( a, b){
                        var ka = key(a);
                var kb = key(b);
                return ka == kb ? 0 : ka < kb ? -1 : 1;
            });

    var {document} = dialog;
  for(var addon of list){
          var item = document.createXULElement("richlistitem");
          item.setAttribute("selected", "false");
          var cell1 = document.createXULElement("vbox");
          cell1.setAttribute("class", "icon-container");
          item.appendChild(cell1);
          var cell2 = document.createXULElement("image");
          cell2.setAttribute("anoid", "icon");
          cell2.setAttribute("class", "icon");
          cell2.setAttribute("src", addon.iconURL);
          if (addon.iconURL == null) cell2.setAttribute("src", icon5);
          cell2.style.height="16px";
          cell2.style.width="16px";
          cell1.appendChild(cell2);
          var cell = document.createXULElement("label");
          cell.setAttribute("value", addon.name);
          cell.style.height="16px";
          item.appendChild(cell);
          var cell = document.createXULElement("label");
          cell.setAttribute("value", addon.version);
          item.appendChild(cell);
          var box = dialog.document.getElementById("listbox");
          box.appendChild(item).addon = addon;
          box.focus();
           }
            });
        promise && typeof promise.then == "function" && promise.then(then, Components.utils.reportError); // Firefox 61+
}

this.addon = e => {
    var item1 = dialog.document.querySelector("richlistitem[selected]");
    var uri = item1.addon.getResourceURI();
    if (uri.schemeIs("jar"))
        uri = uri.spec
    else {
        var file = uri.QueryInterface(Ci.nsIFileURL).file;
        uri = file.isDirectory() ? uri.spec : "jar:" + uri.spec + "!/";
    }
    if (!e.ctrlKey) {
        dialog.close();
        dialog = null;
    }
    br.selectedTab = br.addTrustedTab(uri);
}

this.omni1 = function(e) {
    var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
   .get("GreD", Components.interfaces.nsIFile)
    .path;
    var file = profileDir + "\\browser\\omni.ja";
    var vert="jar:" + "file:///" + file + "!/";
    br.selectedTab = br.addTrustedTab(vert);
    if(!e.ctrlKey) dialog.close();
}
this.omni = function(e) {
    var file = Services.dirsvc.get("GreD", Ci.nsIFile);
    file.append("omni.ja");
    var uri = Services.io.newFileURI(file);
    br.selectedTab = br.addTrustedTab("jar:" + uri.spec + "!/");
    if(!e.ctrlKey) dialog.close();
}
this.folder = function(e, shortcut) {
    var uri = Services.io.newFileURI(Services.dirsvc.get(shortcut, Ci.nsIFile));
    br.selectedTab = br.addTrustedTab(uri.spec);
    if(!e.ctrlKey) dialog.close();
}
this.mydrives = function(e, letter) {    
        br.selectedTab = br.addTrustedTab("file:///" + letter + "/");
    if(!e.ctrlKey) dialog.close();
}
this.close = function() {    dialog.close();
}

Cu.import("resource://gre/modules/FileUtils.jsm");
var root = new FileUtils.File("\\\\.");
var drivesEnum = root.directoryEntries;
drives = [];
while (drivesEnum.hasMoreElements()) { drives.push(drivesEnum.getNext().QueryInterface(Ci.nsIFile).path); }
count = drives.length;
//var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(intf(drives, count));
var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(intf(drives, count));
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;
}
var feature = "chrome,centerscreen,width=580,height=410,alwaysRaised";
dialog = window.openDialog(url, "", feature);

Отредактировано Andrey_Krropotkin (25-10-2019 14:10:20)

Отсутствует

 

№1381824-10-2019 18:31:11

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

Re: Custom Buttons

bunda1
Похоже, теперь в адресной строке не работает прокрутка. Пробовал интерфейс и со строкой поиска и без. В "urlbar" никак.

скрытый текст
hbox [658.167×26]
namespaceURI: XUL
margin: 0
border: 1px
padding: 0
id = urlbar
defaultPlaceholder = Введите поисковый запрос или адрес
flex = 1
pageproxystate = invalid

searchbar [144.083×26]
namespaceURI: XUL
margin: 0
border: 1px
padding: 0
id = searchbar
flex = 1
src = moz-extension://243005c3-3d6a-465d-9496-850fde7893be/yandex-ru.ico

В консоли вроде всё чисто.

Отсутствует

 

№1381924-10-2019 20:06:29

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

Re: Custom Buttons

xrun1 пишет:

bunda1
Похоже, теперь в адресной строке не работает прокрутка. Пробовал интерфейс и со строкой поиска и без. В "urlbar" никак.

:/

Выделить код

Код:

document.getElementById("urlbar").onwheel =e=> {
   e.target.value = '';
};

Добавлено 24-10-2019 20:13:59

Выделить код

Код:

addEventListener('wheel', (e, trg = e.target)=> {
   if ( trg.id != 'urlbar' ) return;
   trg.value = '';
}); 

Отредактировано bunda1 (24-10-2019 20:13:59)

Отсутствует

 

№1382025-10-2019 03:57:04

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

Re: Custom Buttons

bunda1
1-й вариант работает. Спасибо! :)

Выделить код

Код:

// Очистить панель адреса прокруткой колёсиком мыши на панели адреса
(()=>{
document.getElementById("urlbar").onwheel =e=> {
   e.target.value = '';
};
})();

// Очистить панель поиска прокруткой колёсиком мыши на панели поиска
(()=>{
document.getElementById("searchbar").onwheel =e=> {
   e.target.value = '';
};
})();

Отсутствует

 

№1382125-10-2019 08:32:08

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

Re: Custom Buttons

Ну тогда хорошо. Кстати, не обязательно засовывать эти коды в анонимную функцию (()=>{ })();

Отсутствует

 

№1382225-10-2019 14:17:02

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

Re: Custom Buttons

А так работает? зачем их разделять если надо в обойх.
(()=>{document.getElementById("urlbar","searchbar").onwheel=e=>{e.target.value='';};})();
без (()=>{ })();
document.getElementById("urlbar","searchbar").onwheel=e=>{e.target.value='';};

Отредактировано func4ptch4 (25-10-2019 14:18:47)

Отсутствует

 

№1382325-10-2019 15:01:52

FireFox Future
Участник
 
Группа: Members
Зарегистрирован: 13-06-2013
Сообщений: 505
UA: Firefox 70.0

Re: Custom Buttons

Где это расширение взять для FireFox Quantum ?

Отсутствует

 

№1382425-10-2019 15:24:39

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

Re: Custom Buttons

Нет так не работает, но вот должно работать:

Нет так не работает, код document.getElementById("urlbar","searchbar") отдает только первый элемент, но вот так должно работать:

Выделить код

Код:

["urlbar", "searchbar"].forEach(el=> document.getElementById(el).onwheel=e=> e.target.value = "");

Отсутствует

 

№1382525-10-2019 15:34:57

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

Re: Custom Buttons

Andrey_Krropotkin пишет:

Вопрос такой нельзя ли все упростить и второе как скрыть некоторые из этих пунктов

Так достаточно просто?

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

Выделить код

Код:

(lst => {
    addEventListener("shown", lst, true, gBrowser.tabpanels || 1);
    addDestructor(() => lst.item && lst.item.remove(lst.item = null));
})({
    //------------------------------------------------------------------
    "Копировать имя"(addon, hideOn) {
        if (hideOn) return false;

        gClipboard.write(addon.name);
    },
    //------------------------------------------------------------------
    "Копировать ID"(addon, hideOn) {
        if (hideOn) return false;

        gClipboard.write(addon.id);
    },
    //------------------------------------------------------------------
    "Копировать версию"(addon, hideOn) {
        if (hideOn) return ["custombuttons"];

        gClipboard.write(addon.version);
    },
    //------------------------------------------------------------------
    url: "chrome://mozapps/content/extensions/aboutaddons.html",
    handleEvent(e) {
        if (e.target.baseURI != this.url) return;
        var item = this.getItem(e.target.ownerDocument);
        var type = e.target.closest("addon-list").getAttribute("type");
        
        for(var child of item.children) {
            var res = this[child.textContent](null, type);
            child.hidden = res && res.includes(type);
        }
        e.target.contains(item) || requestAnimationFrame(
            () => e.target.prepend(item)
        );
    },
    item: null,
    getItem(doc) {
        if (this.item) {
            if (this.item.ownerDocument == doc) return this.item;
            this.item.remove();
        }
        var item = doc.createElement("div");
        item.onclick = e => {
            e.stopPropagation();
            item.parentNode.hide();
            this[e.target.textContent](
                e.target.closest("addon-card").addon
            );
        }
        for(var lab of this.labels) item.appendChild(
            doc.createElement("panel-item")
        ).append(lab);
        return this.item = item;
    },
    get labels() {
        delete this.labels;
        return this.labels = Object.entries(this).map(
            ([key, val]) => String(val).startsWith('"') && key
        ).filter(Boolean);
    }
});

Отсутствует

 

Board footer

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