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

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

№1430113-02-2020 23:52:01

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

Re: Custom Buttons

voqabuhe пишет

Ну для меня желательно в адресной строке, панели закладок и в окне Редактирования закладки это которое при нажатие на звёздочку, там Имя и Адрес.

Попробуй:


Выделить код

Код:

// Прокруткой колёсиком мыши очистить текстовые поля на панель поиска, адресной строке, в окне редактирования закладки, от 13.02.2020.
addEventListener('DOMMouseScroll', (e, trg = e.target)=> {
   if (/editBMPanel|urlbar/.test(trg.id)) trg.value = '';
   if (trg.tagName = "textbox") trg.value = ''; //searchbar
}, false);

Отсутствует

 

№1430214-02-2020 01:11:45

bezuma
Участник
 
Группа: Members
Откуда: Москва
Зарегистрирован: 26-01-2014
Сообщений: 156
UA: Firefox 68.0

Re: Custom Buttons

Dumby

Ну, тогда вот набросок, добро пожаловать(ся).

Теперь все корректно со вставкой СКМ :beer: Низкий поклон

Отсутствует

 

№1430314-02-2020 03:54:32

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

Re: Custom Buttons

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

Отсутствует

 

№1430414-02-2020 07:48:08

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 180
UA: Firefox 52.0

Re: Custom Buttons

firepox пишет

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



Выделить код

Код:

/*CODE*/

gBrowser.removeAllTabsBut(gBrowser.selectedTab);

Отсутствует

 

№1430514-02-2020 15:49:01

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 2643
UA: Firefox 73.0

Re: Custom Buttons

bunda1 пишет

Попробуй:

Спасибо. Да в общем везде очищает, но вот после применения в боковой панели, дерево закладок, журнал остаются свёрнутыми и чтобы их восстановить приходится переключать. А в FindBar возникает конфликт с кнопкой от Dumby №14154, сразу очищает и прокручивает страницу на первое слово в поиске. Поэтому я в FindBar и не просил, у Dumby  там своя очистка хорошо реализована. Можно для меня вариант без FindBar?

Отредактировано voqabuhe (14-02-2020 15:49:44)

Отсутствует

 

№1430614-02-2020 19:36:45

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

Re: Custom Buttons

voqabuhe пишет

Спасибо. Да в общем везде очищает, но вот после применения в боковой панели, дерево закладок, журнал остаются свёрнутыми и чтобы их восстановить приходится переключать. А в FindBar возникает конфликт с кнопкой от Dumby №14154, сразу очищает и прокручивает страницу на первое слово в поиске. Поэтому я в FindBar и не просил, у Dumby  там своя очистка хорошо реализована. Можно для меня вариант без FindBar?



Выделить код

Код:

// Прокруткой колёсиком мыши очистить текстовые поля на панели поиска, адресной строке, в окне редактирования закладки, от 13.02.2020.
addEventListener('DOMMouseScroll', (e, trg = e.target)=> {
   // адресная строка и окно редактирования закладки
   if (/editBMPanel|urlbar/.test(trg.id)) trg.value = '', trg.focus();
   // боковая панель     
   if (trg.id == "search-box") trg._clearSearch();
   // панель поиска              
   if (trg.className == "searchbar-textbox") trg.value = '', trg.focus(); 
}, false);

Отсутствует

 

№1430714-02-2020 20:00:00

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 261
UA: Firefox 73.0

Re: Custom Buttons

vending_machine пишет

shadow_user пишет: vending_machine пишет: Нет окошка, какого-либо, куда вводить код.Не там смотришь. ПКМ на панели инструментов, панели вкладок, строке меню -> Добавить новую кнопку...Всё равно оно какое-то кривое. Не реагирует на кликскрытый текст

Сегодня обновился ФФ и у меня возникла та же проблема.  Полистал топик но решение не нашел.  Может быть есть мысли от чего так?
CB исполняет коды, старые кнопки видны и все как-будто работает. Но новую кнопку ни создать и не отредачить старую.
Не видно ни кода, ни интерфейса расширения.


2020-02-14_23-52-51.1581699259.jpg

Отредактировано leex (15-02-2020 10:31:32)

Отсутствует

 

№1430814-02-2020 20:21:14

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 2643
UA: Firefox 73.0

Re: Custom Buttons

bunda1
Теперь в боковой панели перестала совсем очищать.

Добавлено 14-02-2020 20:32:40

leex пишет

Сегодня обновился ФФ и у меня возникла та же проблема.  Полистал топик но решение не нашел.  Может быть есть мысли от чего так?
CB исполняет коды, старые кнопки видны и все как-будто работает. Но новую кнопку не создать и не отредачить старую.
Не видно ни кода, ни интерфейса расширения.

Возможно что дело в какой-то кнопке, которая стала несовместима с новой версией [firefox]. Я как-то устаревшую кнопку попробовал поставить, так у меня всего Лиса перекособочило и сделало полностью не рабочим. Пришлось кнопки из бекапа восстанавливать, чтоб он очухался. Можно попробовать временно перенести  куда-нибудь из профиля папку custombuttons, перезапустить [firefox] и посмотреть появится возможность добавлять кнопки.

Отредактировано voqabuhe (14-02-2020 20:33:11)

Отсутствует

 

№1430914-02-2020 20:36:15

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

Re: Custom Buttons

leex, было что-то похожее, но там не в самом CB а в контекстном меню и всплывающие окошки, в общем еще где-то тупо ни текста ни иконок, оказалось виновен был код, VConsole(Andrey_Krropotkin) точно название не помню он октрывал консоль ошибок в вертикальном-тулбаре, сам код вроде работал и т.д. но я стал искать и нашел удалил терь все видно.
В общем, что хочу сказать проблема может быть где угодно;) я искал в папке chrome, но нашел в другом месте, может какой код ломает.
Ну а про сам код он старый был еще с [firefox] 70+, может какие функций или что изменились так как кнопка мне малонужна удалил, консолью почти не пользуюсь, да и не пойму что там написано.
Можно в каждый код добавить "if(true)return; //Disabled by Disable Initialization", и искать код п.с. нужно каждый раз делать рестарт, иначе не заметишь.

Отредактировано func4ptch4 (14-02-2020 20:41:11)

Отсутствует

 

№1431014-02-2020 20:42:27

shadow_user
Участник
 
Группа: Members
Зарегистрирован: 14-02-2007
Сообщений: 156
UA: IE 11.0

Re: Custom Buttons

leex пишет

CB исполняет коды, старые кнопки видны и все как-будто работает. Но новую кнопку не создать и не отредачить старую.

Установленный CB несовместим с новой версией FF. Пробуй, https://forum.mozilla-russia.org/viewto … 20#p778020 скачай с upload.ee, найди в папках архива .xpi и установи.

Отсутствует

 

№1431114-02-2020 21:40:33

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 261
UA: Firefox 73.0

Re: Custom Buttons

Всем спасибо за ваши советы, но не сработало.

Первым делом из профиля выдернул папку custombuttons с моими кнопками
Перестартанул ФФ - эффекта нет.
Потом удалил сам СВ и установил новый из пака с upload.ee,  рестарт - эффекта нет.
Потом удалил все свои конфиги из C:\Program Files (x86)\Mozilla Firefox и заменил на те что в паке, рестарт ФФ - эффекта нет.

Отредактировано leex (14-02-2020 21:43:10)

Отсутствует

 

№1431214-02-2020 21:44:56

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

Re: Custom Buttons

voqabuhe пишет

bunda1
Теперь в боковой панели перестала совсем очищать.

У меня вроде работает. А что консоль показывает?

Отсутствует

 

№1431314-02-2020 22:36:23

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 2643
UA: Firefox 73.0

Re: Custom Buttons

bunda1 пишет

А что консоль показывает?

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

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


Добавлено 14-02-2020 22:37:32

bunda1 пишет

У меня вроде работает.

А на какой версии [firefox] проверяешь?

Выделить код

Код:

TypeError: this.contentWindow.windowRoot is null PictureInPictureChild.jsm:353:5
Warning: attempting to write 12282 bytes to preference browser.uiCustomization.state. This is bad for general performance and memory usage. Such an amount of data should rather be written to an external file. This preference will not be sent to any content processes.
[Custom Buttons :: Source Editor] 26:23:658 initWindow(): isFrame: false
[Custom Buttons :: Source Editor] 26:24:162 loadOverlay(): chrome://global/content/editMenuOverlay.xul
[Custom Buttons :: Source Editor] 26:24:163 loadOverlay(): chrome://browser/content/devtools/source-editor-overlay.xul
[Custom Buttons :: Source Editor] 26:48:433 destroyWindow(): isFrame: undefined
Unchecked lastError value: Error: Could not establish connection. Receiving end does not exist. 2 background.js:4408
Unchecked lastError value: Error: Could not establish connection. Receiving end does not exist. background.js:68
Warning: attempting to write 12307 bytes to preference browser.uiCustomization.state. This is bad for general performance and memory usage. Such an amount of data should rather be written to an external file. This preference will not be sent to any content processes.
TypeError: doc.getAnonymousElementByAttribute is not a function button.js:2429:11
TypeError: doc.getAnonymousElementByAttribute is not a function button.js:2429:11
toggleImage aftercustomization
toggleImage aftercustomization done

Отредактировано voqabuhe (14-02-2020 22:37:32)

Отсутствует

 

№1431414-02-2020 23:03:50

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

Re: Custom Buttons

voqabuhe пишет

А на какой версии [firefox] проверяешь?

На Firefox 64 и Firefox 67 + e10 включен.

Добавлено 14-02-2020 23:10:49

voqabuhe пишет

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

Нет это не то. Я думал _clearSearch() не работает на Firefox 73. Не понятно. Надо устанавливать Firefox 73 но лень возится :/

Отредактировано bunda1 (14-02-2020 23:10:49)

Отсутствует

 

№1431515-02-2020 00:18:52

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

Re: Custom Buttons

leex попробуй метод вычитания, в новом чистом профиле, если не работает виновник не в профиле, так как у меня пак работает.
Да и портабельная версия как по мне лучше, чем установленная там легче все проверять тестить, да и вообще.
У тебя надо смотреть в Win+R > %UserProfile%\AppData > папки точно не знаю, но там будет Mozilla, там уже чистить или если там профиль смотреть, тоже не знаю.
Также custombuttons.xpi с пака надо в папку "extensions" потом в адоннах включить, это не установочник, папка "custombuttons>buttonsoverlay.xul" это сами кнопки. Ну не знаю, если чистый профиль и CB не сработают, еще "Source Editor" у меня конфликтует на 75 я его удалил, как в 73 без понятий. Портабельная удобна еще тем что все под руками, и ты примерно уже знаешь где может быть проблема, а не бегать и искать что где и т.д.

скрытый текст
:: Дальнейшие строки просто для информации :: Изредка обновляемая страница о файлах и папках FF :: Сод.ошибки :: https://mozilla-russia.org/products/firefox/profiles.html
:: extensions + storage\default --- Addons + Настройки дополнений
:: places.sqlite + favicons.sqlite --- закладки,загрузки и история просмотров ([Bookmarks+Icons!])
:: [?]addonStartup.json.lz4 - Все запущенные дополнения, без расположения.
:: [?]xulstore - настройки панелей инструментов, окон (Customize)
::
:: extension-preferences.json - расширения-приватные окна(PrivateWin)
:: handlers.json - действия при загрузке файлов
:: sessionstore.jsonlz4 - сохранённая сессия
:: formhistory.sqlite - история заполнения веб-форм, в том числе и строки поиска :: (История автозаполнения)
:: permissions.sqlite - разрешения для сайтов :: (Настройки сайтов)
:: blocklist.xml - список заблокированных дополнений
:: content-prefs.sqlite - настройки масштаба(zoom) сайтов
:: cookies.sqlite - куки
:: logins.json - сохраненные пароли
:: key4.db - ключ шифрования паролей
:: cert9.db - сертификаты безопасности
:: secmod.db - база данных модулей защиты
:: cert_override.txt - user-исключения сертификатов
:: mimeTypes.rdf - типы файлов "открыть-сохранить"
:: parent.lock - создается в активном профиле
:: persdict.dat - слова, добавленные вами в словарь
:: search.json.mozlz4 - поисковые системы
:: signons.sqlite - сайты с "не сохранять пароль"
:: pref.js - about:config
:: user.js - значения переписываемые в "pref.js" при запуске, изменить может только пользователь
:: webappsstore.sqlite - хранилище DOM, для веб-сайтов

можно пропустить, мысли вслух
Разные методы они рабочие, просто нужно терпение и время, метод проб и т.д. :)
Вся наша жизнь это один большой метод, только если есть деньги можно купить чужое время,терпение,стресс. (ну конечно если деньги считать аксиомой всему ценному), ладно чет меня понесло).
Философия это по большой времени трата времени, ведь истинна не всегда истинна, и если истинна что она дает материального, только действие способно что то менять, но и действия бывают бездейственными но попытка, то есть ты сыграл в кости, бог играет в кости), кто не пьет..

Отредактировано func4ptch4 (15-02-2020 00:20:57)

Отсутствует

 

№1431615-02-2020 01:10:59

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 2643
UA: Firefox 73.0

Re: Custom Buttons

bunda1 пишет

Надо устанавливать Firefox 73 но лень возится :/

Дык портабельную скачай, чтоб не возиться. :)

Отсутствует

 

№1431715-02-2020 01:43:32

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

Re: Custom Buttons

leex пишет

Первым делом из профиля выдернул папку custombuttons с моими кнопками
Перестартанул ФФ - эффекта нет.
Потом удалил сам СВ и установил новый из пака с upload.ee,  рестарт - эффекта нет.
Потом удалил все свои конфиги из C:\Program Files (x86)\Mozilla Firefox и заменил на те что в паке, рестарт ФФ - эффекта нет.

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

egorsemenov06 пишет

открывает настройки в непотребном виде

Добавил немного целебных от непотребства правил из
chrome://browser/skin/preferences/in-content/preferences.css

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


Выделить код

Код:

// Настройка функций кликов мыши для кнопки ...................
this.onmousedown = e => {

    if (e.button == 0) // длинный левый клик
        self.timer = setTimeout(() => {
            self.onmouseup = null;
            cbu.getPrefs("CB.Proxy.connectionsInTab")
                ? openConnectionsInTab() : openConnections();
        }, 500);

    this.onmouseup = e => { // левый клик
        if (e.button) return;
        clearTimeout(self.timer);

        switch(cbu.getPrefs("network.proxy.type")) {
            case 0:  var data = 1; break;
            case 1:  var data = 2; break;
            //case 2:  var data = 0; break;
            default: var data = 0; 
        }
        cbu.setPrefs("network.proxy.type", data);
    }
}
// правый клик
this.oncontextmenu = e => e.detail == 2 && !menuPopup.hidePopup()
    || e.ctrlKey || !!menuPopup.openPopup(this, "after_start");


// Подсказка для кнопки ...................
this.onmouseover = () => this.tooltipText =
    "Proxy \nЛ:  Переключить прокси \nДЛ: Открыть настройки прокси" +
    "\nП:  Mеню кнопки \nДП: CB меню \n\nТекущие настройки прокси: " +
    "\nIP: " + cbu.getPrefs("network.proxy.http") + "\nПорт: " +
    cbu.getPrefs("network.proxy.http_port");


// Создать меню для кнопки ...................
var array = [
    {label: "Добавление прокси в контекстом меню", value: 'CB.Proxy.inContextMenu'},
    {label: "Открывать настройки прокси как вкладку", value: 'CB.Proxy.connectionsInTab'},
    {label: "Переключать на режим 'Без прокси' при закрытии браузера ", value: 'CB.Proxy.reset'}
];

var menuPopup = document.getElementById('mainPopupSet').appendChild(document.createElementNS(xulns, "menupopup"));
array.forEach(m => {
    var mItem = document.createElementNS(xulns, "menuitem");
    mItem.setAttribute("label", m.label);
    mItem.setAttribute("type", "checkbox");
    mItem.setAttribute("checked", cbu.getPrefs(m.value));
    mItem.onclick = () => cbu.setPrefs(m.value, !cbu.getPrefs(m.value));  
    menuPopup.appendChild(mItem);
});
addDestructor(() => menuPopup.remove());


var listenClick = win => {
    var args = ["click", win.close.bind(win), true];
    var unload = () => gBrowser.removeEventListener(...args);
    gBrowser.addEventListener(...args);
    win.addEventListener("unload", unload, {once: true});
}
var version = parseInt(Services.appinfo.platformVersion);
var url = `chrome://browser/content/preferences/connection.x${version >= 72 ? "htm" : "u"}l`;

var fox73 = version >= 73, noop = () => {};
if (fox73) var grid = win => {
    var url = "data:text/css;charset=utf-8," + encodeURIComponent(`
        #proxy-grid, #dnsOverHttps-grid {
            display: grid;
            grid-template-columns: auto 1fr;
            align-items: center;
        }
        #proxy-grid > .thin {
            grid-column-end: 3;
            height: 20px;
        }
        #dnsOverHttps-grid.custom-container-hidden #networkCustomDnsOverHttpsInput,
        #dnsOverHttps-grid.custom-container-hidden #networkCustomDnsOverHttpsInputLabelContainer {
            display: none;
        }
    `);
    (grid = win => win.windowUtils.loadSheetUsingURIString(url, win.windowUtils.AUTHOR_SHEET))(win);
}
var winOpen = win => win.addEventListener("readystatechange", winReady, {once: true, capture: true});
var winReady = e => {
    var win = e.target.ownerGlobal, cw = win.isChromeWindow;
    if (cw || (win.location == url && !win.docShell.name)) winPatch(win, cw);
}
var winPatch = (win, cw) => {
    win.opener = {gSubDialog: {_dialogs: [{
        _frame: {get contentDocument() {
            cw && listenClick(win);
            delete this.contentDocument;
            return this.contentDocument = win.document;
        }},
        resizeVertically: cw ? () => win.sizeToContent() : noop
    }]}};
    fox73 && grid(win);
}
addEventListener("MozBeforeInitialXULLayout", winReady, false, gBrowser.tabpanels || 1);

for(var {contentWindow: win} of gBrowser.browsers)
    win && win.location == url && !win.opener && winPatch(win);


// Функция открывает настройки прокси в окне ...................  
function openConnections() {
    var win = [...Services.wm.getEnumerator(null)].find(w => w.location == url);
    win ? win.focus() : winOpen(openDialog(url, "Proxy", "centerscreen"));
}

// Функция открывает настройки прокси в вкладке ...................
function openConnectionsInTab() {
    var connections = gBrowser.getBrowserForTab(
        gBrowser.selectedTab = gBrowser.addTrustedTab(url)
    );

    // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут
    connections.addEventListener("pageshow",
        e => e.target.documentElement.setAttribute("type", "prefwindow")
    , {once: true});
}


// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ...................
var s = "network.proxy.type";
function toggleImage() {
    var {icon} = self;
    switch( cbu.getPrefs(s) ) {
        //case 0: icon.src = self.image; break;
        case 1: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAA4GQAAnFmkAHQ5fAAQAKAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAQBJBFQOLQ+nX38ecev/mu6of8gfFvtAyUXewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLUza7PKd//3S7oP2849X9zuvh/mW4mf4XiV7/AB4QZwAAAAAAAAAAAQEBAQAAAAAZGhgTKSwnLyYqJDErKCUnID8vXgaAUP9BlnH8b7ea/ojHrv+q2sf/a7CT+zGWbf8PakXGAAIAAAEBAQMHBwcbAAAAD2BiXn76/ff/4ebg/Onm4f+DtZ7/A31L/j2Wb/+Fwaj/ls23/7rh0v9+vaT+M5du/xKGWO0DIxIdAAAAAAEBAQEAAAABBgYFEaSmorbP08z239vX/4OwnP4ail3/RJlz/5HHsP/T7+X/ms64/3K2mP40k2r/D3tM7AUiExwhIx8meXt1mXt+eKJ3eXSce353n6esouDMysf/o7eq/kOdeP92uZv/vuPT/9Hs4P/C4tT/eLWa+juWbv8bcEq7AAYBAF1gWn7//////f39/P//////////////////////////lcKx/3i9pf/K7OD/2O/l/7ndzf6Fw6n/VK+I/AsxHj8AAAAAXF5bf+Ln2P+AnU/4fZ1N+4WiV/yKp13+jKlh/5CsZf+GpFj/Zpxh/4C5nf+i0L7+k8ex/1udf+UTOCZFAAAAAAEBAQJfYF5/3uXR/16IIPxciiH/Z5Iv/26YOP9ymz3/cpw+/3OcPf9wlzb/YI80/1mKNPu707X/YmZjiAAAAAAEBAQGAAAAAF9gXoDg5tT/cJU6/HGaPf9/pE3/hqtX/4uvXf+NsF7/iKxZ/4KoU/9+o0r/cpY6+9zjyf9ubm2JAAAAAAMEAwQAAAAAX2BegODm1P94nEX8e6JJ/4quXP+Vt2n/nb1z/6LBef+jwXz/ob96/527d/+NrGP71+HG/2praogAAAAABAQDBAAAAABfYF2A4ObU/4WlVvyPsmP/osB7/7HMj/+81J3/wdik/8DXo/+60pz/tc6X/6G6ffvY4sf/amtqiAAAAAAEBAMEAAAAAF9gXn/e5dL/n7l7/LLMk//B16X/zuG2/9jpwv/b68b/2enE/9Pkvv/Q4bv/uMud+9jhyP9qa2mHAAAAAAQEAwQAAAAAX2Bef97k0v+gt335sceT/LrNnfzC1Kj8ydmx/MzatfzK2bP8xtav/MbVr/ywwpL41+HH/2tsaokAAAAABAQDBAAAAABZW1Z3+fz1/+Dm1Pzj6db/5u3b/+nv3v/r8eD/6vDe/+ft2//k69j/4efT/9ngzPv7//b/ZGdhfwAAAAADBAMEAAAAABcZFRpZW1Z6YGFfgWBiYIBhYmGAYmJhgGJjYoBiY2KAYmJhgGFiYYBgYWCAX2BegF1fWoAbHRkeAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; break;
        case 2: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAcHQAAYGGkAEBBfAAEBKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgICAAICAgACAgMBAQEAAAEBJAA6OrQAf3/8ALCw/gCiov8AXl7tABkZewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMAOTm7AIOD/wCjo/0A1tb9AOHh/gCcnP4AY2P/ABISZwAAAAAAAAAAAAEBAQAAAAAAGBgTACgoLwAmJjEAJiYnADIyXgBWVv8Adnb8AJ2d/gCxsf8Aycn/AJeX+wBycv8ASkrGAAACAAABAQMABwcbAAAADwBfX34A+fn/AOHh/ADj4/8AoaH/AFJS/gB1df8Aq6v/ALm5/wDT0/8Ap6f+AHNz/wBeXu0AFRUdAAAAAAABAQEAAAABAAUFEQCjo7YAzs72ANnZ/wCfn/4AY2P/AHl5/wCzs/8A5ub/ALu7/wCcnP4AcHD/AFNT7AAVFRwAICAmAHd3mQB6eqIAdXWcAHl5nwClpeAAyMj/AK2t/gB9ff8An5//ANXV/wDh4f8A1tb/AJ6e+gB0dP8AUFC7AAEGAABcXH4A////AP39/AD///8A////AP///wD///8A////ALOz/wCnp/8A4eH/AObm/wDPz/4ArKz/AI2N/AAhIT8AAAAAAFxcfwDd3f8Aa2v4AGpq+wBycvwAeHj+AHt7/wB/f/8Ac3P/AHNz/wCiov8AwMD+ALS0/wCEhOUAKSlFAAAAAAABAQIAXl5/ANjY/wBGRvwARkb/AFJS/wBaWv8AX1//AF9f/wBfX/8AWVn/AFRU/wBRUfsAvr7/AGNjiAAAAAAABAQGAAAAAABeXoAA2tr/AFtb/ABeXv8AbGz/AHV1/wB6ev8Ae3v/AHd3/wBxcf8Aamr/AFtb+wDS0v8AbW2JAAAAAAADAwQAAAAAAF5egADa2v8AZGT8AGlp/wB5ef8AhYX/AI2N/wCTk/8AlJT/AJKS/wCPj/8AfX37AM/P/wBqaogAAAAAAAMDBAAAAAAAXl6AANra/wBycvwAf3//AJOT/wClpf8AsLD/ALa2/wC1tf8Ar6//AKqq/wCTk/sA0ND/AGpqiAAAAAAAAwMEAAAAAABeXn8A2dn/AJGR/ACnp/8At7f/AMXF/wDQ0P8A09P/ANHR/wDLy/8AyMj/AK2t+wDR0f8AaWmHAAAAAAADAwQAAAAAAF5efwDY2P8AkpL5AKWl/ACurvwAuLj8AL+//ADCwvwAwMD8AL29/AC8vPwAo6P4ANDQ/wBqaokAAAAAAAMDBAAAAAAAV1d3APf3/wDa2vwA3d3/AOHh/wDk5P8A5ub/AOTk/wDh4f8A39//ANra/wDT0/sA+fn/AGNjfwAAAAAAAwMEAAAAAAAWFhoAV1d6AF9fgQBgYIAAYWGAAGFhgABiYoAAYmKAAGFhgABhYYAAYGCAAF5egABbW4AAGhoeAAAAAAABAQEAAAAA/oOAQeEAgEH6AIBBoACAQQAAAEGAAABBAACAQQAAgEEAAQBBAAKAQQACgEEAAoBBAAKAQQACgEEAAoBBAAKAQQACgEE='; break;
        default: icon.src = self.image;
    }
}
toggleImage();
Services.prefs.addObserver(s, toggleImage, false);
addDestructor(() => Services.prefs.removeObserver(s, toggleImage));


// Переключать на режим 'Без прокси' при закрытии браузера если это разрешено в 'about:config' ...................
var toggleButton = {
    observe(s, t, data) {
        cbu.getPrefs("CB.Proxy.reset") && data == "shutdown" && cbu.setPrefs("network.proxy.type", 0);
    }
};
Services.obs.addObserver(toggleButton, "quit-application", false);


// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ...................
var contextMenu = document.getElementById("contentAreaContextMenu");
var menuitem = document.createElementNS(xulns,"menuitem");
menuitem.setAttribute("label", "Добавить прокси");
menuitem.setAttribute("class", "menuitem-iconic");
menuitem.setAttribute("image", self.image);
menuitem.onclick =()=> addNewProxy(menuitem);
contextMenu.appendChild(menuitem); // как последний пункт меню
addDestructor(() => menuitem.remove());
addEventListener("popupshowing", () => {
    menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected;
}, false, contextMenu);


// добавление прокси ...................
function addNewProxy(menuitem) {
    var sel = gBrowser.contentDocument
        ? gBrowser.contentDocument.defaultView.getSelection().toString() // Pale Moon  
        : gContextMenu.selectionInfo.fullText; // Firefox

    sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
    sel = sel.replace(/\s+/g, ":");      // заменить пробелы внутри строки

    // если только порт ...
    if (sel.length < 6 && isFinite(sel)) { 
        var lab = 'порт';
        cbu.setPrefs("network.proxy.http_port", +sel);                    
    }

    // если только адрес ...
    if (sel.length > 5 && !/:/.test(sel) && sel.split(".").length == 4) {
        var lab = 'адрес';
        cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", sel));  
    }

    // если адрес и порт ...    
    if (sel.length > 5 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4) {
        var lab = 'адрес и порт';
        var arr = sel.split(":"), IP = arr[0], port = arr[1];
        cbu.setPrefs("network.proxy.http_port", +port);
        cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", IP));
    }

    // всплывающая подсказка рядом с выделенным текстом ...
    var mainPopupSet = document.getElementById('mainPopupSet');
    var tooltip = mainPopupSet.appendChild(document.createElementNS(xulns,"tooltip"));
    tooltip.style.cssText = "color: red !important; font-weight: bold !important; font-size: 14px !important; -moz-box-orient: horizontal; text-align: center;";

    var image = tooltip.appendChild(document.createElementNS(xulns, "image"));
    image.setAttribute("src", self.image);

    var label = tooltip.appendChild(document.createElementNS(xulns, "label"));
    label.setAttribute("value", "Установлен " + lab + " прокси: " + sel);

    tooltip.openPopup(menuitem.parentNode, "before_start");
    setTimeout(() => mainPopupSet.removeChild(tooltip), 3000);
};


// Конвертировать текст в юникод .............  
function convertFromUnicode(charset, str) {
    var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    converter.charset = charset;
    str = converter.ConvertFromUnicode(str);
    return str + converter.Finish();
}

Отсутствует

 

№1431815-02-2020 02:00:40

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 99
UA: Firefox 73.0

Re: Custom Buttons

Dumby пишет

Добавил немного целебных от непотребства правил из
chrome://browser/skin/preferences/in-content/preferences.css

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


Огромное Спасибо!!!

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ...................
this.onmousedown = e => {

    if (e.button == 0) // длинный левый клик
        self.timer = setTimeout(() => {
            self.onmouseup = null;
            cbu.getPrefs("CB.Proxy.connectionsInTab")
                ? openConnectionsInTab() : openConnections();
        }, 500);

    this.onmouseup = e => { // левый клик
        if (e.button) return;
        clearTimeout(self.timer);

        switch(cbu.getPrefs("network.proxy.type")) {
            case 0:  var data = 1; break;
            case 1:  var data = 2; break;
            //case 2:  var data = 0; break;
            default: var data = 0; 
        }
        cbu.setPrefs("network.proxy.type", data);
    }
}
// правый клик
this.oncontextmenu = e => e.detail == 2 && !menuPopup.hidePopup()
    || e.ctrlKey || !!menuPopup.openPopup(this, "after_start");


// Подсказка для кнопки ...................
this.onmouseover = () => this.tooltipText =
    "Proxy \nЛ:  Переключить прокси \nДЛ: Открыть настройки прокси" +
    "\nП:  Mеню кнопки \nДП: CB меню \n\nТекущие настройки прокси: " +
    "\nIP: " + cbu.getPrefs("network.proxy.http") + "\nПорт: " +
    cbu.getPrefs("network.proxy.http_port");


// Создать меню для кнопки ...................
var array = [
    {label: "Добавление прокси в контекстом меню", value: 'CB.Proxy.inContextMenu'},
    {label: "Открывать настройки прокси как вкладку", value: 'CB.Proxy.connectionsInTab'},
    {label: "Переключать на режим 'Без прокси' при закрытии браузера ", value: 'CB.Proxy.reset'}
];

var menuPopup = document.getElementById('mainPopupSet').appendChild(document.createElementNS(xulns, "menupopup"));
array.forEach(m => {
    var mItem = document.createElementNS(xulns, "menuitem");
    mItem.setAttribute("label", m.label);
    mItem.setAttribute("type", "checkbox");
    mItem.setAttribute("checked", cbu.getPrefs(m.value));
    mItem.onclick = () => cbu.setPrefs(m.value, !cbu.getPrefs(m.value));  
    menuPopup.appendChild(mItem);
});
addDestructor(() => menuPopup.remove());


var listenClick = win => {
    var args = ["click", win.close.bind(win), true];
    var unload = () => gBrowser.removeEventListener(...args);
    gBrowser.addEventListener(...args);
    win.addEventListener("unload", unload, {once: true});
}
var version = parseInt(Services.appinfo.platformVersion);
var url = `chrome://browser/content/preferences/connection.x${version >= 72 ? "htm" : "u"}l`;

var fox73 = version >= 73, noop = () => {};
if (fox73) var grid = win => {
    var url = "data:text/css;charset=utf-8," + encodeURIComponent(`
        #proxy-grid, #dnsOverHttps-grid {
            display: grid;
            grid-template-columns: auto 1fr;
            align-items: center;
        }
        #proxy-grid > .thin {
            grid-column-end: 3;
            height: 20px;
        }
        #dnsOverHttps-grid.custom-container-hidden #networkCustomDnsOverHttpsInput,
        #dnsOverHttps-grid.custom-container-hidden #networkCustomDnsOverHttpsInputLabelContainer {
            display: none;
        }
    `);
    (grid = win => win.windowUtils.loadSheetUsingURIString(url, win.windowUtils.AUTHOR_SHEET))(win);
}
var winOpen = win => win.addEventListener("readystatechange", winReady, {once: true, capture: true});
var winReady = e => {
    var win = e.target.ownerGlobal, cw = win.isChromeWindow;
    if (cw || (win.location == url && !win.docShell.name)) winPatch(win, cw);
}
var winPatch = (win, cw) => {
    win.opener = {gSubDialog: {_dialogs: [{
        _frame: {get contentDocument() {
            cw && listenClick(win);
            delete this.contentDocument;
            return this.contentDocument = win.document;
        }},
        resizeVertically: cw ? () => win.sizeToContent() : noop
    }]}};
    fox73 && grid(win);
}
addEventListener("MozBeforeInitialXULLayout", winReady, false, gBrowser.tabpanels || 1);

for(var {contentWindow: win} of gBrowser.browsers)
    win && win.location == url && !win.opener && winPatch(win);


// Функция открывает настройки прокси в окне ...................  
function openConnections() {
    var win = [...Services.wm.getEnumerator(null)].find(w => w.location == url);
    win ? win.focus() : winOpen(openDialog(url, "Proxy", "centerscreen"));
}

// Функция открывает настройки прокси в вкладке ...................
function openConnectionsInTab() {
    var connections = gBrowser.getBrowserForTab(
        gBrowser.selectedTab = gBrowser.addTrustedTab(url)
    );

    // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут
    connections.addEventListener("pageshow",
        e => e.target.documentElement.setAttribute("type", "prefwindow")
    , {once: true});
}


// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ...................
var s = "network.proxy.type";
function toggleImage() {
    var {icon} = self;
    switch( cbu.getPrefs(s) ) {
        //case 0: icon.src = self.image; break;
        case 1: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAA4GQAAnFmkAHQ5fAAQAKAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAQBJBFQOLQ+nX38ecev/mu6of8gfFvtAyUXewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLUza7PKd//3S7oP2849X9zuvh/mW4mf4XiV7/AB4QZwAAAAAAAAAAAQEBAQAAAAAZGhgTKSwnLyYqJDErKCUnID8vXgaAUP9BlnH8b7ea/ojHrv+q2sf/a7CT+zGWbf8PakXGAAIAAAEBAQMHBwcbAAAAD2BiXn76/ff/4ebg/Onm4f+DtZ7/A31L/j2Wb/+Fwaj/ls23/7rh0v9+vaT+M5du/xKGWO0DIxIdAAAAAAEBAQEAAAABBgYFEaSmorbP08z239vX/4OwnP4ail3/RJlz/5HHsP/T7+X/ms64/3K2mP40k2r/D3tM7AUiExwhIx8meXt1mXt+eKJ3eXSce353n6esouDMysf/o7eq/kOdeP92uZv/vuPT/9Hs4P/C4tT/eLWa+juWbv8bcEq7AAYBAF1gWn7//////f39/P//////////////////////////lcKx/3i9pf/K7OD/2O/l/7ndzf6Fw6n/VK+I/AsxHj8AAAAAXF5bf+Ln2P+AnU/4fZ1N+4WiV/yKp13+jKlh/5CsZf+GpFj/Zpxh/4C5nf+i0L7+k8ex/1udf+UTOCZFAAAAAAEBAQJfYF5/3uXR/16IIPxciiH/Z5Iv/26YOP9ymz3/cpw+/3OcPf9wlzb/YI80/1mKNPu707X/YmZjiAAAAAAEBAQGAAAAAF9gXoDg5tT/cJU6/HGaPf9/pE3/hqtX/4uvXf+NsF7/iKxZ/4KoU/9+o0r/cpY6+9zjyf9ubm2JAAAAAAMEAwQAAAAAX2BegODm1P94nEX8e6JJ/4quXP+Vt2n/nb1z/6LBef+jwXz/ob96/527d/+NrGP71+HG/2praogAAAAABAQDBAAAAABfYF2A4ObU/4WlVvyPsmP/osB7/7HMj/+81J3/wdik/8DXo/+60pz/tc6X/6G6ffvY4sf/amtqiAAAAAAEBAMEAAAAAF9gXn/e5dL/n7l7/LLMk//B16X/zuG2/9jpwv/b68b/2enE/9Pkvv/Q4bv/uMud+9jhyP9qa2mHAAAAAAQEAwQAAAAAX2Bef97k0v+gt335sceT/LrNnfzC1Kj8ydmx/MzatfzK2bP8xtav/MbVr/ywwpL41+HH/2tsaokAAAAABAQDBAAAAABZW1Z3+fz1/+Dm1Pzj6db/5u3b/+nv3v/r8eD/6vDe/+ft2//k69j/4efT/9ngzPv7//b/ZGdhfwAAAAADBAMEAAAAABcZFRpZW1Z6YGFfgWBiYIBhYmGAYmJhgGJjYoBiY2KAYmJhgGFiYYBgYWCAX2BegF1fWoAbHRkeAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; break;
        case 2: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAcHQAAYGGkAEBBfAAEBKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgICAAICAgACAgMBAQEAAAEBJAA6OrQAf3/8ALCw/gCiov8AXl7tABkZewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMAOTm7AIOD/wCjo/0A1tb9AOHh/gCcnP4AY2P/ABISZwAAAAAAAAAAAAEBAQAAAAAAGBgTACgoLwAmJjEAJiYnADIyXgBWVv8Adnb8AJ2d/gCxsf8Aycn/AJeX+wBycv8ASkrGAAACAAABAQMABwcbAAAADwBfX34A+fn/AOHh/ADj4/8AoaH/AFJS/gB1df8Aq6v/ALm5/wDT0/8Ap6f+AHNz/wBeXu0AFRUdAAAAAAABAQEAAAABAAUFEQCjo7YAzs72ANnZ/wCfn/4AY2P/AHl5/wCzs/8A5ub/ALu7/wCcnP4AcHD/AFNT7AAVFRwAICAmAHd3mQB6eqIAdXWcAHl5nwClpeAAyMj/AK2t/gB9ff8An5//ANXV/wDh4f8A1tb/AJ6e+gB0dP8AUFC7AAEGAABcXH4A////AP39/AD///8A////AP///wD///8A////ALOz/wCnp/8A4eH/AObm/wDPz/4ArKz/AI2N/AAhIT8AAAAAAFxcfwDd3f8Aa2v4AGpq+wBycvwAeHj+AHt7/wB/f/8Ac3P/AHNz/wCiov8AwMD+ALS0/wCEhOUAKSlFAAAAAAABAQIAXl5/ANjY/wBGRvwARkb/AFJS/wBaWv8AX1//AF9f/wBfX/8AWVn/AFRU/wBRUfsAvr7/AGNjiAAAAAAABAQGAAAAAABeXoAA2tr/AFtb/ABeXv8AbGz/AHV1/wB6ev8Ae3v/AHd3/wBxcf8Aamr/AFtb+wDS0v8AbW2JAAAAAAADAwQAAAAAAF5egADa2v8AZGT8AGlp/wB5ef8AhYX/AI2N/wCTk/8AlJT/AJKS/wCPj/8AfX37AM/P/wBqaogAAAAAAAMDBAAAAAAAXl6AANra/wBycvwAf3//AJOT/wClpf8AsLD/ALa2/wC1tf8Ar6//AKqq/wCTk/sA0ND/AGpqiAAAAAAAAwMEAAAAAABeXn8A2dn/AJGR/ACnp/8At7f/AMXF/wDQ0P8A09P/ANHR/wDLy/8AyMj/AK2t+wDR0f8AaWmHAAAAAAADAwQAAAAAAF5efwDY2P8AkpL5AKWl/ACurvwAuLj8AL+//ADCwvwAwMD8AL29/AC8vPwAo6P4ANDQ/wBqaokAAAAAAAMDBAAAAAAAV1d3APf3/wDa2vwA3d3/AOHh/wDk5P8A5ub/AOTk/wDh4f8A39//ANra/wDT0/sA+fn/AGNjfwAAAAAAAwMEAAAAAAAWFhoAV1d6AF9fgQBgYIAAYWGAAGFhgABiYoAAYmKAAGFhgABhYYAAYGCAAF5egABbW4AAGhoeAAAAAAABAQEAAAAA/oOAQeEAgEH6AIBBoACAQQAAAEGAAABBAACAQQAAgEEAAQBBAAKAQQACgEEAAoBBAAKAQQACgEEAAoBBAAKAQQACgEE='; break;
        default: icon.src = self.image;
    }
}
toggleImage();
Services.prefs.addObserver(s, toggleImage, false);
addDestructor(() => Services.prefs.removeObserver(s, toggleImage));


// Переключать на режим 'Без прокси' при закрытии браузера если это разрешено в 'about:config' ...................
var toggleButton = {
    observe(s, t, data) {
        cbu.getPrefs("CB.Proxy.reset") && data == "shutdown" && cbu.setPrefs("network.proxy.type", 0);
    }
};
Services.obs.addObserver(toggleButton, "quit-application", false);


// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ...................
var contextMenu = document.getElementById("contentAreaContextMenu");
var menuitem = document.createElementNS(xulns,"menuitem");
menuitem.setAttribute("label", "Добавить прокси");
menuitem.setAttribute("class", "menuitem-iconic");
menuitem.setAttribute("image", self.image);
menuitem.onclick =()=> addNewProxy(menuitem);
contextMenu.appendChild(menuitem); // как последний пункт меню
addDestructor(() => menuitem.remove());
addEventListener("popupshowing", () => {
    menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected;
}, false, contextMenu);


// добавление прокси ...................
function addNewProxy(menuitem) {
    var sel = gBrowser.contentDocument
        ? gBrowser.contentDocument.defaultView.getSelection().toString() // Pale Moon  
        : gContextMenu.selectionInfo.fullText; // Firefox

    sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
    sel = sel.replace(/\s+/g, ":");      // заменить пробелы внутри строки

    // если только порт ...
    if (sel.length < 6 && isFinite(sel)) { 
        var lab = 'порт';
        cbu.setPrefs("network.proxy.http_port", +sel);                    
    }

    // если только адрес ...
    if (sel.length > 5 && !/:/.test(sel) && sel.split(".").length == 4) {
        var lab = 'адрес';
        cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", sel));  
    }

    // если адрес и порт ...    
    if (sel.length > 5 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4) {
        var lab = 'адрес и порт';
        var arr = sel.split(":"), IP = arr[0], port = arr[1];
        cbu.setPrefs("network.proxy.http_port", +port);
        cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", IP));
    }

    // всплывающая подсказка рядом с выделенным текстом ...
    var mainPopupSet = document.getElementById('mainPopupSet');
    var tooltip = mainPopupSet.appendChild(document.createElementNS(xulns,"tooltip"));
    tooltip.style.cssText = "color: red !important; font-weight: bold !important; font-size: 14px !important; -moz-box-orient: horizontal; text-align: center;";

    var image = tooltip.appendChild(document.createElementNS(xulns, "image"));
    image.setAttribute("src", self.image);

    var label = tooltip.appendChild(document.createElementNS(xulns, "label"));
    label.setAttribute("value", "Установлен " + lab + " прокси: " + sel);

    tooltip.openPopup(menuitem.parentNode, "before_start");
    setTimeout(() => mainPopupSet.removeChild(tooltip), 3000);
};


// Конвертировать текст в юникод .............  
function convertFromUnicode(charset, str) {
    var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    converter.charset = charset;
    str = converter.ConvertFromUnicode(str);
    return str + converter.Finish();
}

Отсутствует

 

№1431915-02-2020 02:22:39

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 2643
UA: Firefox 73.0

Re: Custom Buttons

Dumby пишет

Добавил немного целебных от непотребства правил из
chrome://browser/skin/preferences/in-content/preferences.css
скрытый текст

Без прокси некрасиво - звёздочка,   где иконку тройную взять? 
А всё, у bunda1 утащил. :)

Отредактировано voqabuhe (17-02-2020 01:56:35)

Отсутствует

 

№1432015-02-2020 09:45:45

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 261
UA: Firefox 73.0

Re: Custom Buttons

Dumby пишет

leex пишет: А у меня вообще нет такой папки в профилеЕщё раз: имеется в виду «Локальный каталог», а не «Корневой каталог».Открой вкладку с адресом about:profiles

Опять двадцать пять. Как же я забыл про этот способ

Удалил папку startupCache - СВ заработал

Спасибо Dumby

Отредактировано leex (17-02-2020 12:13:04)

Отсутствует

 

№1432115-02-2020 21:54:15

_backup
Участник
 
Группа: Members
Зарегистрирован: 12-02-2007
Сообщений: 15
UA: unknown 0.0

Re: Custom Buttons

Выложите, пожалуйста, последнюю версию CB для FF 56.

Отсутствует

 

№1432216-02-2020 00:02:40

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

Re: Custom Buttons

_backup пишет

Выложите, пожалуйста, последнюю версию CB для FF 56.

Последняя не знаю, а вот эта версия работает: https://forum.mozilla-russia.org/viewto … 43#p744943

Отсутствует

 

№1432317-02-2020 18:33:55

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

Re: Custom Buttons

У кого-нибудь есть рабочая кнопка "Clipboard"? Была она у меня но перестала работать после 73+.

Clipboard+BBCode(не работает)


Выделить код

Код:

/*Initialization Code*/
self.image='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHvSURBVDjLjZI/aFNRFMZ/Ly+GlCYlaMF/1D+4FQRJREigk7OiIAguHSwUkrkgLhVcpIurQjdBcLAITi4FETpIAw46CGIHJ0tFamlt3rvnfA7Ji2kTwQOXe4b7/c73HW4kCYCnc+engU8M1/b88kaFf1T05O65KvAAuFY6epw79xfZ3XoPwPjkFZ4t3uP37i+A58DK/PLGy0FAHli5euPmmbFSmfTrByRhnV0AJDFzcYrcyQtIuvXm1evrwBDg7FhpgmRnk+CBjRePQQLEltoIsb/5jeLk6QJQOBwhD4AbCoFc5QRuAckP5tzfI9neG7mDPIDc8RDwtIOnnZ6D/6seIOCW9ie7Ij7+mGDfYlB3F4oKfD8yTavVWnJ3zAwz+9wDGB5SsICbkYQc8dgkt+cekiTJ4aELkojjOG02m0t9ACFF5ig4bsLN6XQ6rK2toYFIWV+v1wkh8NeBOR4cD4ZbhJkBUK1WDwizXtIgwPHUUHAUDLcc3hO02+2+eBBSr9cxsy6gO70L8CwChqSRDrLqO8CEp97bgSGL8CgAsL6+PiSURKPR6Dt4lybJzPipKeRC7uRTiH+WkUStVhsSZ3cGePR2dbUMXMoeGXl2KpcpFotEUTTyA8VxjJkRjco2OzubM7MFMzvW+zD94+6D58sfRXpka4kRkDcAAAAASUVORK5CYII=';
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Блок инициализации глоб. переменных и функций
// срок существования - один сеанс браузера
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
bbBBCodeStat=true                                               // разрешить/включить BBCode
window.arycb_BBCodeClipboardStrings=this.clipboardStrings=[];   // Массив буфера обмена

//
//********************************************************
//--------Общие функции для вставки BBCode----------------
//*********************************************************

//++++++++++++++++++BEGIN DEF++++++++++++++++++++++++++++++
//--------------------------------------------------------
// Функция lb_BBCodePrim 
// [bbCode]выделенный[/bbCode]
//  по умолчанию от ЛКМ)
lb_BBCodePrim = function (open,close){
var theBox = document.commandDispatcher.focusedElement;
var startPos = theBox.selectionStart;
var endPos = theBox.selectionEnd;
var oPosition = theBox.scrollTop;
var oHeight = theBox.scrollHeight;
var text=theBox.value.substring(0,startPos);
text +=open+theBox.value.substring(startPos, endPos)+close;
text +=theBox.value.substring(endPos, theBox.value.length);
theBox.value = text;
var nHeight = theBox.scrollHeight - oHeight;
theBox.scrollTop = oPosition + nHeight;
};

//---------------------------------------------------------
// Функция mb_BBCodePrim 
// Резерв
// по умолчанию от CКМ
mb_BBCodePrim=function(open,close){};

// -------------------------------------------------------
// Функция rb_BBCodePrim 
// [bbCode]параметр PASTE по умолчанию из буфер обмена[/bbCode]
// по умолчанию от ПКМ
rb_BBCodePrim=function(open,close,paste){
if(paste==undefined){open +=close;} //буфер обмена пуст
else                {open +=paste+close;}
   
var theBox = document.commandDispatcher.focusedElement;
var startPos = theBox.selectionStart;
var endPos = theBox.selectionEnd;
var selectionLen = endPos - startPos
var oPosition = theBox.scrollTop;
var oHeight = theBox.scrollHeight;
var text=theBox.value.substring(0,startPos); 
var nHeight = theBox.scrollHeight - oHeight;
text +=open;
text +=theBox.value.substring(endPos, theBox.value.length);
theBox.value = text; 
theBox.selectionStart = endPos + open.length;
theBox.selectionEnd = endPos + open.length - selectionLen;
theBox.scrollTop = oPosition + nHeight;
};

// -------------------------------------------------------
// Функция fHLD_Get_ListClipboardPrim 
// получить список сохранёного буфера обмена
//
fnHLD_Get_ListClipboardPrim=function (){
var cs=arycb_BBCodeClipboardStrings; 
return(cs.slice(0)); 
}; 
//++++++++++++++++++END DEF+++++++++++++++++++++++++++++++++++
//Список сохранёного буфера обмена
//Не вызываем это, обработка по таймеру или по событию ЛКМ
//-----Обработчики буфера обмена

this.MAX_ENTRIES=11;            //Максимальное число записей 11
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)
        this.insertText(this.clipboardStrings[indx]);
};

this.insertText=function(str){
    var cmd="cmd_insertText";
    var controller=document.commandDispatcher.getControllerForCommand(cmd);
    if(controller&&controller.isCommandEnabled(cmd)){
        controller=controller.QueryInterface(Ci.nsICommandController);
        var params="createCommandParams" in Cu
                    ? Cu.createCommandParams()
                    : Cc["@mozilla.org/embedcomp/command-params;1"]
                        .createInstance(Ci.nsICommandParams);;
        params.setStringValue("state_data",str);
        controller.doCommandWithParams(cmd,params);
    }
};

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

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

var ios=Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var sss=Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.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()");

Отредактировано func4ptch4 (17-02-2020 20:23:00)

Отсутствует

 

№1432418-02-2020 08:40:11

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

Re: Custom Buttons

func4ptch4 попробуй замени var indx = Array.prototype.indexOf.call(mi.parentNode.childNodes, mi);
У меня она без BBкода и чуть по другому настроен css (меняет тултипы для всех кнопок)

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


Выделить код

Код:

/*Initialization Code*/
window.arycb_BBCodeClipboardStrings = this.clipboardStrings = [];   // Массив буфера обмена
//this.label="";
// -------------------------------------------------------
// Функция 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);
    var indx = Array.prototype.indexOf.call(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 {';
css = css + "-moz-appearance: none !important;";
css = css + "border: 1px solid black !important;";
css = css + "max-width: none !important;";
css = css + "background: #ffffe0 !important;";
css = css + "color: #8b0000 !important; !important;";
css = css + "font-family: verdana !important;";
css = css + "border-radius: 5px !important;";
css = css + "-moz-border-radius: 5px !important;";
css = css + "font-size: 14px !important;";
css = css + "padding: 4px 8px !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()");

Отредактировано Andrey_Krropotkin (18-02-2020 08:41:27)

Отсутствует

 

№1432518-02-2020 10:19:38

VORON
Участник
 
Группа: Members
Зарегистрирован: 03-04-2013
Сообщений: 140
UA: Firefox 68.0

Re: Custom Buttons

И снова здравствуйте)
На 54-й лисе была у меня кнопка - Очистить кэш и удалить флэш куки

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


Можно для 68го что-то с ней придумать,или может аналог какой то есть?

Выделить код

Код:

this._handleClick =()=> {
   // очистить кэш ....
   try { 
       Services.cache.evictEntries(1);
       Services.cache.evictEntries(2);
       } 
   catch(e) { Services.cache2.clear() };

   // Удалить Flash кукисы ....
   var dir = Services.dirsvc.get('Home', Ci.nsIFile);
   dir.append("Application Data");
   dir.append("Macromedia");
   dir.exists() && dir.remove(true);
   !dir.exists() && dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);

   // Всплывающее сообщение ....
   Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   .showAlertNotification(self.image, self.label, 'Очистил кеш и удалил Flash кукиси');
};


// Всплывающая подсказка у счётчика отображает заполнение дискового кеша ..............
var data = {
    memory: "Memory Cache:  ",
    disk: "Disk Cache:  ",
    offline: "Offline Cache:  "
};   
function getSize(size) {
   if (!size) return size === 0 ? "0" : "?";
   for(var count = -1; size >= 1024; size /= 1024, count++);
   return size.toFixed(2).replace(/0+$/, "").replace(/\.$/, "") + " " + ("KMGT"[count] || "") + "B";
}
function setInf(tot, max, type, i) {
   var inf = getSize(tot) + " / " + getSize(max);
   var key = "browser.cache." + type + ".enable";
   if (!Services.prefs.getBoolPref(key)) inf += " (disabled)";
   self.tooltipText = self.tooltipText.replace(zws(i), inf);
}
function zws(ind) "\u200B\u200B\u200B".slice(0, ++ind);

var types = Object.keys(data);
var ttt = types.map(function(key, i) data[key] + zws(i)).join("\n");
   
var context = Cu.import("resource://gre/modules/LoadContextInfo.jsm", {}).LoadContextInfo.default;
self.onmouseenter = function() {
   self.tooltipText = "Л: Очистить кэш и удалить Flash-куки\n" + ttt;
   try {
       var entries = {};
       Services.cache.visitEntries({
       visitDevice: function(device, info) entries[device] = info,
       visitEntry: function() {}
       });
   types.forEach(function(type, i) {
      var info = entries[type];
      setInf(info && info.totalSize, info && info.maximumSize, type, i)
   });
       } 
   catch(ex) {
       Services.cache2 && types.forEach(function(type, i) {
       var func = function(aEntryCount, aConsumption, aCapacity, aDiskDirectory)
                  setInf(aConsumption, aCapacity, type, i);
       var storage = Services.cache2[(type == "offline" ? "app" : type) + "CacheStorage"](context, null);
       try { storage.asyncVisitStorage({onCacheStorageInfo: func}, false) } catch(ex) {};
       });
       }
};











Отсутствует

 

Board footer

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