Как сделать в кнопке TabScroll(Firefox) прокрутку не через 1 вкладку, а подряд.

Как это подряд?

с 1-й на 2-ю с 2-й на 3-ю итд)) а не как в кнопке: с 1 на 3-ю с 3-й на 5-ю. (все значения на 1 ед прокрутки колеса)

Мне кажется кнопка вообще не работает.

А что для этого кнопка нужна? У меня и так крутит.:)

25-11-2012 17:14:46
Упс. Это оказывается FireGestures так делает:dumb:

Да крутит, но кнопка вроде может крутить по кругу с последней на первую.

:dumb: меня либо глючит по полной... либо возможно кнопки не отличается стабильностью (после перезапуска лиси - кнопку тоже нужно перезапускать, 2-ю точно) :dumb: непонял как я её (1-ю) запустил - помню что пробывал и раньше (ок 10-й версии) и было также.
http://forum.mozilla-russia.org/viewtop … 20#p500720 поставил вашу, и кроме проблемы после рестарты лисы - других не вижу.

Ставим в рабочий режим, рестарт [firefox], кнопка не работает.

feas
Эта 21-06-2011 20:26:26 совсем левая я её удаляю, мне стыдно за такой код.
Ты лучше напиши что ты хочешь от этой кнопки.

bunda1 пишет

что ты хочешь от этой кнопки.

Чтобы не было проблемы с перезагрузкой. И может тогда сделать её только в инициализации, чтоб не пришлось нажимать каждый раз.

Какие функции нужны от кнопки.

25-11-2012 17:40:48

feas пишет

Пока на время удаления код кнопки пусть тут побудет.

:(

1 вариант. Чисто прокрутка колесом вкладок, без этой (в цитате) проблемы. Мне такая подойдет.

feas пишет

Ставим в рабочий режим, рестарт [firefox], кнопка не работает.

2 вариант - для искушенных. ЛКМ - переход на самую левую. ПКМ - на самую правую.

25-11-2012 17:46:21

bunda1 пишет

:(

ок

Прокрутка колесом вкладок у FF и так есть.

feas пишет

2 вариант - для искушенных. ЛКМ - переход на самую левую. ПКМ - на самую правую.

По кругу что ли?

bunda1 пишет

По кругу что ли?

имел ввиду на самую крайнюю. Тогда во 2-м варианте по кругу не будет нужна.
Как пример: 100 вкладок, мы на 50-й. Тогда переход на крайнюю будет куда полезнее.

ЛКМ - переход на самую левую и ПКМ - на самую правую

Выделить код

Код:

//Перейти на последнюю вкладку ....
gBrowser.selectedTab = gBrowser.mTabs[gBrowser.mTabs.length - 1];

//Перейти на первую вкладку .... 
gBrowser.selectedTab = gBrowser.mTabContainer.childNodes[0];

Прокрутка колесом вкладок у FF и так есть.

А что с этим.

bunda1 пишет

Прокрутка колесом вкладок у FF и так есть.

незаметил....
Колесо вверх - переход на след. вкладку влево, колесо вниз - переход на след. вкладку вправо
И было 2 настройки которые думаю будут по душе остальным. Порядок наоборот "вниз - влево" и по кругу.

Попробую, но не знаю что получится.

Чето в [nightly] куча кнопок отвалилась (Save, Undo Closed Tab, User-agent change, Cookies permissions и много других). Это только у меня так? :)

23-12-2012 10:08:28
Даже можно сказать, что отвалились почти все - работает только Переводчик google и простые кнопки, вроде кнопок bbcode и/или для запуска внешней программы.

23-12-2012 12:20:08

voqabuhe пишет

:beer: Как то я это пропустил. :blush:

adidharma пишет

Чето в [nightly] куча кнопок отвалилась (Save, Undo Closed Tab, User-agent change, Cookies permissions и много других). Это только у меня так? :)

№6070

Если не в тему то удалите .
Подскажите пожалуйста, может кто-нибудь сделать кнопку при нажатии на которую открывалась указанная программа Windows( например notepad.exe) или по указанному пути.
Спасибо.

№19

26-12-2012 22:34:14
№4 открыть файл который

bunda1 пишет

Прокрутка колесом вкладок у FF и так есть.

без дополнений? нет.
tab wheel scroll этим же занимается

okkamas_knife
это хорошо, но [seamonkey] - не нужен :P

У меня лежит код кнопки. Ввечером скину сюда

iDev.Pi пишет
bunda1 пишет

Прокрутка колесом вкладок у FF и так есть.

без дополнений? нет.

А вот и есть. Открой столько вкладок что бы появились кнопки прокрутки вкладок и покрути колёсиком мыши на вкладках.

feas пишет

№19Добавлено Вчера 18:34:14№4 открыть файл который
                    Отредактировано feas (Вчера 18:34:14)

СПАСИБО!!!

bunda1 пишет

Открой столько вкладок что бы появились кнопки прокрутки вкладок и покрути колёсиком мыши на вкладках.

не очень удобно((( к сожалею кода у меня не осталось - стучите автору (см. начало темы)

Кто может состряпать простенькую кнопку, чтобы при нажатии в новой вкладке [firefox] открывался https://www.google.ru ?

1fesFFFF пишет

Кто может состряпать простенькую кнопку, чтобы при нажатии в новой вкладке [firefox] открывался https://www.google.ru ?

Создай кнопку с кодом:

Выделить код

Код:

getBrowser().selectedTab = getBrowser().addTab("https://www.google.ru");

05-01-2013 23:17:34

Пример:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Egoogle.ru%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%2C%2589PNG%250D%250A%251A%250A%2500%2500%2500%250DIHDR%2500%2500%2500%2510%2500%2500%2500%2510%2508%2506%2500%2500%2500%251F%25F3%25FFa%2500%2500%2500%2504sBIT%2508%2508%2508%2508%257C%2508d%2588%2500%2500%2500%2509pHYs%2500%2500%250E%25C3%2500%2500%250E%25C3%2501%25C7o%25A8d%2500%2500%2500%251CtEXtSoftware%2500Adobe%2520Fireworks%2520CS4%2506%25B2%25D3%25A0%2500%2500%2500%2516tEXtCreation%2520Time%250008%252F11%252F09%25D12_v%2500%2500%2501%25C6IDAT8%258Du%2592%25CDj%2513Q%2514%25C7%257F%29%25D9g%2593%2507%25B8%25FA%2500%25A2%250B%25B7%25E6%25AE%255C%25F9%2502YH%25B3%25E9%25C6%2597p%25B2u%25E7%25BEB%250A%258D%25D9%250A%25A2%251B%25A9%25DC%252C%25A4%2582%2510%25BA%25E9%25A6%28%258E%25AD%2514%25D2%250A%25C9%2540%25F0%2583%25CC%253D%257F%25173%2519%2526iz%25E00%25E7p%25CE%25FD%259D%258F9%2500%2592%25A4%25F05%25C8%25F5%2582%25F0A%25C9%2520H%2592%25B4%259C%252Bx%25AF%25D4%21qS%2501%25EDH%2502%2560p%2508%29%2580%2583%2524%2500y%2506%25CD%2516%259D%250Fo%25B8M%2504%25EC%25AC%259C%2590%25AE%2507%25FB%25C3%2593%25C2h%25B6%25C0%25F9%25AD%2580%251F%25AE%2506pn%253D%2598%25D6%2581%251B%25B1%25BA4W%2586w%251B%255D%25D4%251E%25A5%2501%25D2%250DH%25A7%25CCmh9%2517%25CD%2516%25E4%2519w%25F6NX1%255E%253F%25BBO%25F7a%258B%2583%2583%21I%25BA%25BF%250EH%25C1%25A7%25E0C%25A0%25E1z%2589%2592%259Eg%25B7%25D3%2501%2560%25F4%2525%25A3%25FB%2500h%25B6%25E8%258F%25FB%2524%21%25DC%253EB%250A%250D%25D7%250B%2522%250D8%25E7%25F1%251E%259E%25EF%2516%25A0%25F1%25B71%25FE%25D0o_%25E0%25DA%25A8%25BD%25A0%25E9%25EC%259F%25CCLf%25A6J%252C%25EA%25C9%25DB%253D1%25F0%253A%25BA%259C%28%25B7%25A8%25A3%25CB%2589%2518x%251D_%259C*%25B7%25A8%25E3%258BS%25E1%257C%25223%2513%25E5a%25D4U%2516%25E5%2507%2589r%258B%2502%258A%25EF%25C0o%25F8%25A1%25B8%253A%25CA%258B%255CI%25DD%258Fe%2581%25AD%2580%25FA%2583%259B%251D%25E4%25C54%25AA%2501%2512%25AFX%2503%25EC%2590ge%253EHB%25B2%25C2%25B6Hv%253E%252C%25FE5%258DjgO%25EF%253D%255E_%25A8%2596s%25A9%25AC%2520%2599%25FE%25CC%253EV%25FEr1U%2511%252F%253A43E%258B%2595%253F%25FF%25BBX%258D%2560%25D5%25CC%253F%253F%25DF%2595lY%2501%2525%25E9%25FB%25D5U%25D5%25F6J%25A3E%25BD%259A%25BC%2517%25F5D%25C9%2594%2506%25AF%25EC%257C%2524%2595%2595%25CE%25AE%25CF%25F4%25E8eW%25FB%2593w%259A.f%25CA-%25EA%25D7%25EFL%252F%253E%258D%25D4n%25B7%25F5%251FN2%25C0e-%2526g9%2500%2500%2500%2500IEND%25AEB%2560%2582%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BgetBrowser%28%29.selectedTab%20%3D%20getBrowser%28%29.addTab%28%22https%3A//www.google.ru%22%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%u041E%u043D%u043B%u0430%u0439%u043D-%u043F%u0435%u0440%u0435%u0432%u043E%u0434%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0435%u043C%20%u043E%u043A%u043D%u0435%0A%u0411%u0435%u0437%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u044F%20%u043F%u0435%u0440%u0435%u0432%u043E%u0434%u0438%u0442%u0441%u044F%20%u0432%u0441%u044F%20%u0442%u0435%u043A%u0443%u0449%u0430%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%0A%0A%3Clabel%3E%20%0Aid%20%3D%20%3Cid%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Открыть url в новой вкладке без проверки

Выделить код

Код:

var url="http://custombuttons.mozdev.org/";
getBrowser (). selectedTab = getBrowser (). addTab (url);

Открыть url в новой вкладке если она не пустая, если пустая то в текущей

Выделить код

Код:

var url="http://custombuttons.mozdev.org/";
if(getBrowser().currentURI.spec == "about:blank") loadURI (url);
 else{ getBrowser (). selectedTab = getBrowser (). addTab (url);
};

Открыть url в новой вкладке если она не пустая, если пустая то в текущей вариант 2 для ФФ 4+

Выделить код

Код:

var url = "http://custombuttons.mozdev.org/";
if(
    (
        gBrowser.currentURI.spec == "about:blank"
        || gBrowser.currentURI.spec == cbu.getPrefs("browser.newtab.url")
    )
    && !gBrowser.selectedBrowser.webProgress.isLoadingDocument
)
    loadURI(url);
else
    gBrowser.selectedTab = gBrowser.addTab(url);

Открыть url в текущей вкладке

Выделить код

Код:

var url="http://custombuttons.mozdev.org/";
loadURI (url);

см.тему готовые кнопки там всё есть

- короче уже вынес сюда:)))

05-01-2013 23:56:42
А что будет если изменить её на вертикальную? И как это сделать?
311779_kiss_11kb.jpg

Ну и ещё вариант.
Открыть url в новой вкладке.
В раздел "Код":

gBrowser.loadOneTab("https://www.google.ru", null, null, null, false, false);

feas пишет

А что будет если изменить её на вертикальную? И как это сделать?

Что изменить на вертикальную?

bunda1 пишет

Что изменить на вертикальную?

картинку видишь? это то ли персональная панель, то ли элементы панели закладок.
http://img.ii4.ru/images/2013/01/05/311 … s_11kb.jpg

feas пишет

картинку видишь? это то ли персональная панель, то ли элементы панели закладок.

Вижу. Я сейчас изменил orient на vertikal используя DOM Inspector Plus и ничего. Вот так.

bunda1 пишет

vertikal

vertical

Infocatcher пишет

:) Упс.
Если изменить orient на vertical используя DOM Inspector Plus то можно увидеть забавную но не практичную картину:
thumbyem.jpg

bunda1 пишет

то можно увидеть забавную но не практичную картину:

Ещё как практичную)))
311813_kiss_16kb.jpg
http://img.ii4.ru/images/2013/01/06/311 … s_16kb.jpg
profit!!!
Как закрепить результат?

06-01-2013 02:27:52
наверное так, вроде работает (стиль)

Выделить код

Код:

#moz-box-orient:  vertical {
display: -moz-box !important;
}

feas

Выделить код

Код:

document.getElementById("PlacesToolbarItems").setAttribute("orient", "vertical");

Infocatcher, bunda1 спасибо вам. Решил пока стилем сделать.

feas пишет

#moz-box-orient: vertical { display: -moz-box !important; }

Какой-то неказистый стиль, может должно быть:
{-moz-box-orient: vertical;
display: -moz-box !important;}

Kamui пишет

может должно быть:

может. А на что влияет синтаксис "{}"

feas
То что находится перед {} это селектор, то что внутри это свойства, которые изменяем. Судя по вашему стилю, #moz-box-orient: vertical это селектор, хотя есть свойство -moz-box-orient: vertical; и я предположил что это все-таки свойство, а не селектор.

Похоже на 18 [firefox] отвалилась Stf.

Pony_Smile_Pack пишет

Похоже на 18 [firefox] отвалилась Stf.

Я исправлю.

Установил кнопку VT на [aurora] 20 https://forum.mozilla-russia.org/viewto … 73#p596373 и сломал всю инициализацию в профиле.
Пробовал удалять расширение, с удалением всех кнопок - не помогло.
Как починить без сброса, перезда на новый профиль?

feas
Если ты используешь на Nightly custombuttons-0.0.5.6pre3-20111120 то должны быть проблемы, об этом тут почитай 13-12-2012 16:46:41

Может я тут накосячил:
user_pref("javascript.options.xml.chrome", true);
user_pref("javascript.options.xml.content", true);
user_pref("browser.tabs.closeButtons", 0);
user_pref("dom.placeholder.show_on_focus", false);

От версии CB независит. (хоть релиз хоть тот пре что выше)

Внешне выглядит так... кнопки вытянуты в высоту, большинство не работает, но там где голый код без инициализации пашут без проблем.

02-02-2013 21:04:26
Мда зря я бил тревогу... закрыт. Настройку випилили и из 20 [aurora] http://forum.mozilla-russia.org/viewtop … 70#p592570

feas
Попробуй новую версию custombuttons-0.0.5.6pre4-20130127

bunda1 пишет

Попробуй новую версию custombuttons-0.0.5.6pre4-20130127

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

bunda1
а возможно ли как-то подружить Autocopy+3 ( Firefox 3.6 + ) с Quick Search Bar ?
дело в том, что при включенном Autocopy пропадает пункт поиска из контекстного меню. Примеры на скринах.

s_1360608923_2731946_0fea74b767.png

s_1360608956_5265311_13b83b5daf.png

извините, если не туда пишу :blush:

sonyas75
Надо в настройках кнопки отключить - Выделенный текст мигает при автокопировании :)

о! благодарствую. :)

Подскажите пожалуйста, максимально простой код для кнопки вкл/выкл навигационной панели.

vom

Выделить код

Код:

document.getElementById("nav-bar").collapsed = !document.getElementById("nav-bar").collapsed;

bunda1
Спасибо, а не подскажете по userChrome, нужно изменить иконку в identity-box с 6f20dbda211d.jpg на b0528ab8afb5.jpg. Но чтоб первая проявлялась при наведении на urlbar.

vom
Иконка та же самая, но менее заметная?
Так:

Выделить код

Код:

#page-proxy-favicon {
opacity: .5 !important;
}

#urlbar:hover #page-proxy-favicon {
opacity: 1 !important;
}

Kamui
Ох респект, я про opacity совсем забыл.

Подскажите как сделать чтобы кнопка Linkification всегда была активной?

fish08
Замени иконку кнопки.

bunda1 пишет

Замени иконку кнопки.

Иконку поменял но после перезагрузки страницы или браузера она опять не активна..

fish08
Странно но у меня после замены иконка отображается нормально. Может удали все из вкладки инициализации.

bunda1 пишет

Странно но у меня после замены иконка отображается нормально. Может удали все из вкладки инициализации.

может не поняли друг друга. Мне надо чтобы кнопка всегда была нажатой.

fish08 пишет

может не поняли друг друга. Мне надо чтобы кнопка всегда была нажатой.

Значит тебе нужно что бы кнопка автоматически превращала на страницах текстовые ссылки в обычные. Ну это не так сразу не сделаешь, может просто установи Linkification :: Дополнения Firefox или http://userscripts.org/scripts/show/67744

Ясно, поставил скрипт но кнопка все же лучше работает(поставлю ее если переделаете). Спасибо.

Можно вернуть к жизни эту кнопку? Master Edit Button №130 после Конвертирование старых кнопок с XML (E4X)

01-04-2013 22:48:21
№100 аналогично
Кнопка подходит под то что мне нужно, но не работает пока что.
Нужно чтобы открывало меню, где будут меню названия кодов скриптов. При нажатии текст копируется в буфер обмена, а если фокус в поле ввода, то вставляло прямо туда.

feas
http://downloads.mozdev.org/custombutto … 130226.xpi даёт возможность редактировать кнопку в менеджере кнопок.

02-04-2013 20:39:14

feas пишет

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

Вот пример такой кнопки:

Выделить код

Код:

// Настройка функций кликов мыши ................................................................ 
this.onclick = function(e) {
     if ( e.button == 0 ) menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
};


// Создать меню .................................................................................
var array = [
    "scripts 1",
    "scripts 2",
    "scripts qwerty",
    "scripts 44 55 66",
    
       "separator",

    "scripts some 1",
    "scriptssome 2",
    "scripts some 3"
            ];

var node = document.getElementById(this.id + "-menuPopup");
if ( node && node.parentNode ) node.parentNode.removeChild(node); // блокировать дублирование меню

var menuPopup = document.getElementById("mainPopupSet").appendChild(document.createElement("menupopup"));
menuPopup.id = this.id + "-menuPopup";

array.forEach(function(str) {
     if ( str == "separator" ) { menuPopup.appendChild( document.createElement("menuseparator") ); return }; 
     var menuItem = document.createElement("menuitem");
     menuItem.setAttribute("label", str );
     menuItem.addEventListener("command", insertOrCopyText, false); 
     menuPopup.appendChild(menuItem);
});
//this.type = "menu"; 



// Ставить текст в текстовое поле или скопировать из меню ..........................................
function insertOrCopyText( text ) { 

   var text = this.label;
   
   try { document.commandDispatcher.focusedElement.type; }
   catch(e) { gClipboard.write( text); return };
   
   var cmd = "cmd_insertText";
   var controller = document.commandDispatcher.getControllerForCommand(cmd);
   if ( controller && controller.isCommandEnabled(cmd) ) {
        var controller = controller.QueryInterface(Components.interfaces.nsICommandController);
        var params = Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams);
        params.setStringValue("state_data", text);
        controller.doCommandWithParams(cmd, params);
        }
};

bunda1 пишет

даёт возможность редактировать кнопку в менеджере кнопок.

пока ПКМ не сделал, не догадался бы =) спасиб)

bunda1 пишет

Вот пример такой кнопки:

спасиб, работает. (остальным: вставляйте в инициализацию)

Интересный момент с отвалом кнопок - на официальном FF 20 некоторые кнопки отвалились, а на неофициальной сборке (из моей подписи) всё нормально. :music: Как сиё объяснить - :sick: :)
Ступил. :dumb:

adidharma
javascript.options.xml.chrome = true в about:config?

Infocatcher
Ошибся я. :dumb: На beta 21 кнопки не заработали (с учётом javascript.options.xml.chrome = true), а в 20-й версии без разницы, оф. билд или сборка - кнопки работают.

adidharma пишет

На beta 21 кнопки не заработали (с учётом javascript.options.xml.chrome = true)

Там эта настройка уже удалена, как и E4X, который она включала.

Infocatcher пишет

Там эта настройка уже удалена, как и E4X, который она включала.

И, больше ничего не сделать, для 21 и выше? :(  Других вариантов нет?

adidharma пишет

И, больше ничего не сделать, для 21 и выше? :(  Других вариантов нет?

Кроме как переписать неработающий код без использования E4X? Ничего.
В некоторых простых случаях можно конвертировать кнопкой Convert E4X.

Infocatcher пишет

В некоторых простых случаях можно конвертировать кнопкой Convert E4X.

Спасибо. :beer: БОльшую часть кнопок получилось исправить. :)

adidharma пишет

БОльшую часть кнопок получилось исправить.

И работают даже после перезапуска?

Pony_Smile_Pack пишет

И работают даже после перезапуска?

Да.

Infocatcher

adidharma пишет

Спасибо. :beer: БОльшую часть кнопок получилось исправить. :)

Аналогично! Присоединяюсь с благодарностям!
Возник один вопрос уже после того, как их исправил:
т.е. можно было их пока не править, а изменить javascript.options.xml.chrome на true ??
С FF21 они бы тогда отвалились?

Inko7 пишет

т.е. можно было их пока не править, а изменить javascript.options.xml.chrome на true ??
С FF21 они бы тогда отвалились?

Все верно.

Причем при javascript.options.xml.chrome = false редактировать кнопки можно только в экспериментальной версии CB, иначе потом чинить придется.

Просьба.
Кто в теме пофиксите пожалуйста кнопку User-agent change - не работает на 20-м фоксе.

Здравствуйте.
Есть вопросы по поводу 2х кнопок:
1.VT(вертикальная панель)-нельзя ли её сделать пошире?-очень узкая -http://images.vfl.ru/ii/1365142610/816714dc/2084817.jpg
2.Context translate-не до конца отображаются предложения по выбору действий в проводнике -http://images.vfl.ru/ii/1365142612/714ffe8d/2084819.jpg
И ещё странный какой то глюк-при запуске лисы запускаются все кнопки:срабатывает антибосскей,показывает пароли,очищается кеш,показывается список установленных расширений и тд.Почему?И/или что тогда означает Left=› в описаниях кнопки?Потому что при  нажатии ЛКМ на иконку антибосскея и списка расширений ничего не происходит,а при запуске лисы они запускаются.....

VORON пишет

Здравствуйте.
1.VT(вертикальная панель)-нельзя ли её сделать пошире?-очень узкая -http://images.vfl.ru/ii/1365142610/816714dc/2084817.jpg

Расстояние от курсора и длительность нахождения курсора рядом с вертикальной панелью при котором она появляется или сворачивается можно изменить в начале кода инициализации в кнопке изменяя эти константы: showDelay, distanceShow, distanceHide.
Ширину панели можно изменить в начале кода инициализации в кнопке изменяя это значение: vtWidthCorrection

bunda1
Спасибо,панель подправил.
Может подскажете и по поводу глюка не срабатывания кнопок  по нажатию левой кнопкой на них(антибосскей,список расширений,очистка кеша) и срабатывании их всех при запуске лисы?

VORON пишет

Здравствуйте.
И ещё странный какой то глюк-при запуске лисы запускаются все кнопки:срабатывает антибосскей,показывает пароли,очищается кеш,показывается список установленных расширений и тд.Почему?И/или что тогда означает Left=› в описаниях кнопки?Потому что при  нажатии ЛКМ на иконку антибосскея и списка расширений ничего не происходит,а при запуске лисы они запускаются.....

Так не должно быть, ты наверно положил код из вкладки Код в вкладку Инициализация.

05-04-2013 19:16:47
В этих кнопках я имею в виду :)

05-04-2013 19:35:26

oopsididagainster пишет

Просьба.
Кто в теме пофиксите пожалуйста кнопку User-agent change - не работает на 20-м фоксе.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EUser-agent%20change%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODdhEAAQAPcAAAAAAAAAALi4uMjIyNDQ0Pj4+MC8vCAUFAgEBLxYWLxAQMhYWMhAQNRYWBAEBNRAQLwgIMggIORYWNQgIORAQOQgIPBgYPAoKPRAQPQcILwICMgICNQICOQICPAEBPgIBP8AAP8oKP9gYPQQCPQoHPRgVPRAKNQgCOQgCPQgCNRAKORAKPRYQLwgCMggCNRYQLxAKMhAKORYQMhYQLxYQPRYKPRADORYKMBAFNRADORADNRYKMhYKLxYKPRYDMBABNRYFORYDMBYFNRYBMBYBCAUBNDQyCAkDCA0BCA0FCBEDCBUDAgUBCB0BCBkDCCEDCCUDCB0FCCkDCC0DCDECCDUCCDkCCD0CCj0HBD0CCDEICDUICDkICjwKBz0IAi0DAjECAjUCAjkCAj0BADwBAD/ACj/KCCUJCC0JAhkDAh0DAiEDAiUDAikDAD4CCB0JAhEDAhUDAT0ECBUJCCkLAg0DAjUIAjkIAj0ICCELCC0NAjEIAgkDCBkLCCUNCD0RCA0JCDURAi0LCDkTAikLCB0NCC0RAiULCD0VCDETCDUVAiELAjkTAj0TCD0ZCBELCCkTCC0VAh0LAjUTCCUTCDUZAjETCBUNCDkbAhkLCD0dAi0TAj0ZAjkZCB0RCCETAikTBD0dAD4cCC0ZCDEbCDUdAhULAj0dAD/eAiUTAjUbAjkdADwdLjAvMjQzLzMxAAIBAjEbCC0dAiETCCUZCCkbAi0bAhELCB0VAh0TAikbCBkTCCUdAiUbCCEbAhkTAiEbCB0ZAg0LCBUTAhUTAh0bCA0NAgUFCB0dAhkbCBkbAhETCBETCBUZAgkLAhUbAg0TCBUdAhEbCA0RCBEbAg0bAgkTCA0VCAkLAgULCA0ZAgkbCA0dAgUTAgUbCAkTCAkbLi4wMjI0Ly8zAAACAgEbAgETAgELCAUdCAUZCAUTAgEFCAEbCAUNCAETCAELCAUJNDIzCAEDLxAWMhAWNRAWORAWPRAWLwIIMgIINQIIOQIIPQIIPQEEPRUWPgACCwAAAAAEAAQAAAIhwAJCBxIsOBABAIRmFlohmDDhAsVMjRThkAZVAcjlinjZiJFgWYkIkwocSHIkAjEkfR4cqErAghSTvwjMIRNmzEZ5nxo81+ImC8FkkNgsyZOogd/fvggEMNSDx6YwiTwM4QIozdvxox51egHqyJwhkVgYKDUr1pDeBgpUCqBD//+fYhqsK7dgAA7%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20ps%20%3D%20Components.%20classes%20%5B%22@mozilla.org/preferences-service%3B1%22%5D.%20getService%20%28Components.%20interfaces.%20nsIPrefService%29.%20getBranch%20%28%22general.%22%29%3B%0A%20%20%20%20ps.%20setCharPref%20%28%22useragent.override%22%2C%20%22reset%22%29%3B%0A%0Athis.PS%20%3D%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.PS.clearUserPref%28%22general.useragent.override%22%29%3B%0Athis.image%3D%0A%27data%3Aimage/gif%3Bbase64%2CR0lGODdhEAAQAPcAAAAAAAAAAHh4eJiYmLi4uMjIyNDQ0Pj4+MC8vKCYmJiMjHBgYJB0dKCIiJhgYCAUFKxwcHRAQAgEBKxYWJRAQLxYWKBAQKxAQDgUFMxwcHQoKLxAQMxYWIQoKNhwcJQoKMxAQBAEBFAUFKwoKNhYWLwoKNhAQKAgIMwoKNgoKCAEBDgEBFAEBKAoJKAwKNhgWNhYUIxkYIRIQLx4cJhgWNhAKLxAKNhYQMxAKMxYQKxAKNhwWKCQjJhoXLxYQMxwWKBAKFAUBKxYQJRAKFg0KLxwWIRAKFAkFNhYKHhkXKxwWMxYKDgUBHRAKLxYKNhwQHBgWEw0KMxwQJh0YKxYKLxwQNhwKFAkBKxwQDgkFMxwKIx0YLxwKFA0FKxwKCAUBHBoXDgkBFA0BJyYjDg0KDg0FDg0BHh4cNDQyHR0YCAkBCAkFCA0BCA0FJCcjAgUBAgkBAg0BIigiFhwWCg0KFh4XDR0QIiYjAg0FCh0QIigkFhwYFB0XCB0PBh4OBhwPBh4QAgkFLjAvMjQzLzMxER0XBw0KBx0SAAIBDR0WCB0WAg0KIycmHB0dAgUFAgkKAg0QCA0QAg0WCAkKAgkQCA0WAgUKAgkWAgUQAgUWCAkQCAkWIyMkLi4wMjI0Ly8zAAACAgEQAgEWDg0WAgEKCAUWAgEFCAUQDg0QCAEWBwUKDgkWCAEQDgUWDgEWEw0WDgkQCAEKDgUQFAkWDgEQFAUWFAEWHRkdFg0WCgUKHQocHRAcFAEQIQocJyMmFAUQIRAcDgEKJQocFAkQHQoWKAocJRAcCAEFDgUKKwocHhwdNDIzKBAcIQoWLwocHRAWFAEKFA0QKxAcJQoWMwocNgocLxAcKAoWJBkdKwoWKCIkIRAWMxAcFAUKHQoQLwoWNhAcKxYcJRAWMwoWDgEFNgoWHRkaLxYcKBAWIQoQKxAWJQoQDgkKLxAWMxYcKAoQFAEFMxAWKwoQNhYcLwoQNhAWMwoQNgoQKAkMJhkaFAkKNhUYIQ8QLxscKAgKNhQVCwAAAAAEAAQAAAIpgANCBxIsOBACQIl+Fnoh6CAg3L8KOzTZ2EdA3X2HFwooY5Hjwv7XDQwQKFETwklVFwoUIBEhCkX5qkokBPDQQYkSBi0kqKBQUnyCc2nkyEiRCwN9OgxoodOnCmXChTqVEK+g0RH4BM4ocWIFmATDnKaj8fUfD2EhkurUyePZQJ7hGsx4cULtBL+EUUwsAXOFmjZ9mgBU+CIgSMSgx2B0qBAqI4NBAQAOw%3D%3D%27%3B%0A%0A%0Avar%20%u043C%u0435%u043D%u044E%20%3D%0A%27%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%5Cn%5C%0A%20%20%20%20%20%20%20oncommand%3D%22this.parentNode.%u0441%u043C%u0435%u043D%u0438%u0442%u044C%u042E%u0437%u0435%u0440%u0430%u0433%u0435%u043D%u0442%28event%29%22%3E%5Cn%5C%0A%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22reset%22%20label%3D%22Default%20User-Agent%22/%3E%5Cn%5C%0A%20%20%20%20%20%20%20%20%20%20%3Cmenuseparator/%3E%5Cn%5C%0A%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28Windows%3B%20U%3B%20Windows%20NT%205.1%3B%20ru%3B%20rv%3A1.9.2.3%29%20Gecko/20100401%20Firefox/3.6.15%20YB/3.5.1%22%20label%3D%22FF%203.6.15+yandexbar%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28Windows%3B%20U%3B%20Windows%20NT%205.1%3B%20ru%3B%20rv%3A1.9.1.4%29%20Gecko/20091016%20Firefox/1.5.4%22%20label%3D%22firefox%201.5.4%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/4.76C-SGI%20%5Bru%5D%20%28X11%3B%20I%3B%20IRIX64%206.5%20IP30%29%22%20label%3D%22Mozilla%20SGI%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/4.0%20%28compatible%3B%20MSIE%206.0%3B%20Windows%20NT%205.1%3B%20SV1%29%22%20label%3D%22IE-6%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Googlebot/2.1%20%28+http%3A//www.google.com/bot.html%29%22%20label%3D%22Googlebot%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22iCab/3.0.2%20%28Macintosh%3B%20U%3B%20PPC%20Mac%20OS%29%22%20label%3D%22iCab/Mac%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28X11%3B%20Linux%20x86_64%3B%20rv%3A2.0b6pre%29%20Gecko/20100401%20Firefox/3.6.3%22%20label%3D%22Linux%20x86_64%3B%20rv%3A2.0b6pre%29%20Gecko/20100401%20Firefox/3.6.3%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22AmigaVoyager/3.2%20%28AmigaOS/MC680x0%29%22%20label%3D%22AmigaVoyager%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28X11%3B%20U%3B%20Linux%20x86_64%3B%20en-US%3B%20rv%3A1.9.1.3%29%20Gecko/20090914%20Slackware/13.0_stable%20Firefox/3.5.3%22%20label%3D%22Slackware%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28Macintosh%3B%20U%3B%20PPC%20Mac%20OS%20X%2010.4%3B%20ru%3B%20rv%3A1.9.2.3%29%20Gecko/20100401%20Firefox/3.6.3%22%20label%3D%22Firefox/3.6.3%20Mac%20OS%20X%2010.4%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22NCSA%20Mosaic/1.0%20%28X11%3BSunOS%204.1.4%20sun4m%29%22%20label%3D%22NCSA%20Mosaic/1.0%20%28X11%3BSunOS%204.1.4%20sun4m%29%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22NetSurf/2.0%20%28RISC%20OS%3B%20armv5l%29%22%20label%3D%22NetSurf/2.0%20%28RISC%20OS%3B%20armv5l%29%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/1.10%20%5Ben%5D%20%28Compatible%3B%20RISC%20OS%203.70%3B%20Oregano%201.10%29%22%20label%3D%22Mozilla/1.10%20%5Ben%5D%20%28Compatible%3B%20RISC%20OS%203.70%3B%20Oregano%201.10%29%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28BeOS%3B%20U%3B%20Haiku%20BePC%3B%20en-US%3B%20rv%3A1.8.1.10pre%29%20Gecko/20080112%22%20label%3D%22Mozilla/5.0%20%28BeOS%3B%20U%3B%20Haiku%20BePC%3B%20en-US%3B%20rv%3A1.8.1.10pre%29%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28OS/2%3B%20U%3B%20Warp%204.5%3B%20en-US%3B%20rv%3A1.8.1.3pre%29%20Gecko/20070307%22%20label%3D%22Mozilla/5.0%20%28OS/2%3B%20U%3B%20Warp%204.5%3B%20en-US%3B%20rv%3A1.8.1.3pre%29%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28PLAYSTATION%203%3B%202.00%29%22%20label%3D%22Mozilla/5.0%20%28PLAYSTATION%203%3B%202.00%29%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Links%20%286.9%3B%20Unix%206.9-astral%20sparc%3B%2080x25%29%22%20label%3D%22Links%20%286.9%3B%20Unix%206.9-astral%20sparc%3B%2080x25%29%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22NCSA_Mosaic/2.0%20%28Windows%203.1%29%22%20label%3D%22NCSA_Mosaic/2.0%20%28Windows%203.1%29%22/%3E%5Cn%5C%0A%20%20%20%20%3Cmenuitem%20type%3D%22radio%22%20value%3D%22Mozilla/5.0%20%28Windows%3B%20U%3B%20Windows%20NT%206.1%3B%20en-US%29%20AppleWebKit/532.9%20%28KHTML%2C%20like%20Gecko%29%20Chrome/5.0.307.0%20Safari/532.9%22%20label%3D%22Chrome/5.0.307.0%22/%3E%5Cn%5C%0A%3C/menupopup%3E%27%3B%0A%0A%0A%u043C%u0435%u043D%u044E%20%3D%20e4xConv_parseXULFromString%20%28%u043C%u0435%u043D%u044E%29%3B%0A%u043C%u0435%u043D%u044E.%20childNodes%20%5B0%5D.%20setAttribute%20%28%22checked%22%2C%20%22true%22%29%3B%0Athis.%20orient%20%3D%20%22horizontal%22%3B%0Athis.%20type%20%3D%20%22menu%22%3B%0Athis.%20appendChild%20%28%u043C%u0435%u043D%u044E%29%3B%0Athis.%20%u0441%u043C%u0435%u043D%u0438%u0442%u044C%u042E%u0437%u0435%u0440%u0430%u0433%u0435%u043D%u0442%20%3D%20function%20%28%u0441%u043E%u0431%u044B%u0442%u0438%u0435%29%0A%7B%0A%20%20%20%20var%20%u044E%u0437%u0435%u0440%u0430%u0433%u0435%u043D%u0442%20%3D%20%u0441%u043E%u0431%u044B%u0442%u0438%u0435.%20target.%20getAttribute%20%28%22value%22%29%3B%0A%20%20%20%20%20%20%20var%20ps%20%3D%20Components.%20classes%20%5B%22@mozilla.org/preferences-service%3B1%22%5D.%20getService%20%28Components.%20interfaces.%20nsIPrefService%29.%20getBranch%20%28%22general.%22%29%3B%0A%20%20%20%20ps.%20setCharPref%20%28%22useragent.override%22%2C%20%u044E%u0437%u0435%u0440%u0430%u0433%u0435%u043D%u0442%29%3B%0Athis.PS%20%3D%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.pref%3D%27general.useragent.override%27%3B%0Avar%20state%3Dthis.PS.getCharPref%28this.pref%29%3B%0Aif%20%28state%3D%3D%22reset%22%29%20%7B%20%0Athis.PS%20%3D%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.pref%3D%27general.useragent.override%27%3B%0Avar%20state%3Dthis.PS.getCharPref%28this.pref%29%3B%0Athis.PS%20%3D%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.PS.clearUserPref%28%22general.useragent.override%22%29%3B%20%0Athis.image%3D%0A%27data%3Aimage/gif%3Bbase64%2CR0lGODdhEAAQAPcAAAAAAAAAAHh4eJiYmLi4uMjIyNDQ0Pj4+MC8vKCYmJiMjHBgYJB0dKCIiJhgYCAUFKxwcHRAQAgEBKxYWJRAQLxYWKBAQKxAQDgUFMxwcHQoKLxAQMxYWIQoKNhwcJQoKMxAQBAEBFAUFKwoKNhYWLwoKNhAQKAgIMwoKNgoKCAEBDgEBFAEBKAoJKAwKNhgWNhYUIxkYIRIQLx4cJhgWNhAKLxAKNhYQMxAKMxYQKxAKNhwWKCQjJhoXLxYQMxwWKBAKFAUBKxYQJRAKFg0KLxwWIRAKFAkFNhYKHhkXKxwWMxYKDgUBHRAKLxYKNhwQHBgWEw0KMxwQJh0YKxYKLxwQNhwKFAkBKxwQDgkFMxwKIx0YLxwKFA0FKxwKCAUBHBoXDgkBFA0BJyYjDg0KDg0FDg0BHh4cNDQyHR0YCAkBCAkFCA0BCA0FJCcjAgUBAgkBAg0BIigiFhwWCg0KFh4XDR0QIiYjAg0FCh0QIigkFhwYFB0XCB0PBh4OBhwPBh4QAgkFLjAvMjQzLzMxER0XBw0KBx0SAAIBDR0WCB0WAg0KIycmHB0dAgUFAgkKAg0QCA0QAg0WCAkKAgkQCA0WAgUKAgkWAgUQAgUWCAkQCAkWIyMkLi4wMjI0Ly8zAAACAgEQAgEWDg0WAgEKCAUWAgEFCAUQDg0QCAEWBwUKDgkWCAEQDgUWDgEWEw0WDgkQCAEKDgUQFAkWDgEQFAUWFAEWHRkdFg0WCgUKHQocHRAcFAEQIQocJyMmFAUQIRAcDgEKJQocFAkQHQoWKAocJRAcCAEFDgUKKwocHhwdNDIzKBAcIQoWLwocHRAWFAEKFA0QKxAcJQoWMwocNgocLxAcKAoWJBkdKwoWKCIkIRAWMxAcFAUKHQoQLwoWNhAcKxYcJRAWMwoWDgEFNgoWHRkaLxYcKBAWIQoQKxAWJQoQDgkKLxAWMxYcKAoQFAEFMxAWKwoQNhYcLwoQNhAWMwoQNgoQKAkMJhkaFAkKNhUYIQ8QLxscKAgKNhQVCwAAAAAEAAQAAAIpgANCBxIsOBACQIl+Fnoh6CAg3L8KOzTZ2EdA3X2HFwooY5Hjwv7XDQwQKFETwklVFwoUIBEhCkX5qkokBPDQQYkSBi0kqKBQUnyCc2nkyEiRCwN9OgxoodOnCmXChTqVEK+g0RH4BM4ocWIFmATDnKaj8fUfD2EhkurUyePZQJ7hGsx4cULtBL+EUUwsAXOFmjZ9mgBU+CIgSMSgx2B0qBAqI4NBAQAOw%3D%3D%27%3B%0A%0A%20%7D%0A%20else%20%7B%20this.image%3D%0A%27data%3Aimage/gif%3Bbase64%2CR0lGODdhEAAQAPcAAAAAAAAAALi4uMjIyNDQ0Pj4+MC8vCAUFAgEBLxYWLxAQMhYWMhAQNRYWBAEBNRAQLwgIMggIORYWNQgIORAQOQgIPBgYPAoKPRAQPQcILwICMgICNQICOQICPAEBPgIBP8AAP8oKP9gYPQQCPQoHPRgVPRAKNQgCOQgCPQgCNRAKORAKPRYQLwgCMggCNRYQLxAKMhAKORYQMhYQLxYQPRYKPRADORYKMBAFNRADORADNRYKMhYKLxYKPRYDMBABNRYFORYDMBYFNRYBMBYBCAUBNDQyCAkDCA0BCA0FCBEDCBUDAgUBCB0BCBkDCCEDCCUDCB0FCCkDCC0DCDECCDUCCDkCCD0CCj0HBD0CCDEICDUICDkICjwKBz0IAi0DAjECAjUCAjkCAj0BADwBAD/ACj/KCCUJCC0JAhkDAh0DAiEDAiUDAikDAD4CCB0JAhEDAhUDAT0ECBUJCCkLAg0DAjUIAjkIAj0ICCELCC0NAjEIAgkDCBkLCCUNCD0RCA0JCDURAi0LCDkTAikLCB0NCC0RAiULCD0VCDETCDUVAiELAjkTAj0TCD0ZCBELCCkTCC0VAh0LAjUTCCUTCDUZAjETCBUNCDkbAhkLCD0dAi0TAj0ZAjkZCB0RCCETAikTBD0dAD4cCC0ZCDEbCDUdAhULAj0dAD/eAiUTAjUbAjkdADwdLjAvMjQzLzMxAAIBAjEbCC0dAiETCCUZCCkbAi0bAhELCB0VAh0TAikbCBkTCCUdAiUbCCEbAhkTAiEbCB0ZAg0LCBUTAhUTAh0bCA0NAgUFCB0dAhkbCBkbAhETCBETCBUZAgkLAhUbAg0TCBUdAhEbCA0RCBEbAg0bAgkTCA0VCAkLAgULCA0ZAgkbCA0dAgUTAgUbCAkTCAkbLi4wMjI0Ly8zAAACAgEbAgETAgELCAUdCAUZCAUTAgEFCAEbCAUNCAETCAELCAUJNDIzCAEDLxAWMhAWNRAWORAWPRAWLwIIMgIINQIIOQIIPQIIPQEEPRUWPgACCwAAAAAEAAQAAAIhwAJCBxIsOBABAIRmFlohmDDhAsVMjRThkAZVAcjlinjZiJFgWYkIkwocSHIkAjEkfR4cqErAghSTvwjMIRNmzEZ5nxo81+ImC8FkkNgsyZOogd/fvggEMNSDx6YwiTwM4QIozdvxox51egHqyJwhkVgYKDUr1pDeBgpUCqBD//+fYhqsK7dgAA7%27%3B%0A%0A%20%7D%3B%0A%7D%0A%20%20%0A%0Afunction%20e4xConv_parseXULFromString%28xul%29%20%7B%0A%09xul%20%3D%20xul.replace%28/%3E%5Cs+%3C/g%2C%20%22%3E%3C%22%29%3B%0A%09return%20new%20DOMParser%28%29.parseFromString%28xul%2C%20%22application/xml%22%29.documentElement%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Мда:angel:вот это я дал маху.Действительно,на 3х кнопках положил не туда.
На автомате видать-код кнопки»инициализация:beer:

У кого-нибудь кнопка Plugins Permissions работает?
Fx 20, CB 0.0.5.6pre5-20130226

humnmind
Видимо, ни у кого.
Даже about:permissions сломали.
Там теперь записывается разрешение не для "plugins", а для "plugin:flash" – свое для каждого плагина.
Можно изменить в коде

Выделить код

Код:

permissionType: "plugins",

на

Выделить код

Код:

permissionType: "plugin:flash",

– будет частично работать для Flash.

07-04-2013 17:18:10

Infocatcher пишет

будет частично работать для Flash

Это, впрочем, легко подправить, но вот для контроля всех плагинов придется делать по кнопке на каждый...

07-04-2013 17:24:40

Infocatcher пишет

записывается разрешение не для "plugins", а для "plugin:flash"

Это все видно в %профиль%/permissions.sqlite – таблица moz_hosts, столбец type.

А в SeaMonkey 2.17 не работает ни "plugins", ни "plugin:flash", ни встроенная переключалка (переключает, но не сохраняет). Ну, вообще молодцы, чё.

07-04-2013 18:15:52
Подправил, всяко лучше, чем вообще никак: https://forum.mozilla-russia.org/viewto … 91#p608391 :)

Infocatcher
Чего-то у меня и 0.1.1 не работает.:/
Включен только Flash плагин.
У вас 0.1.1 точно работает?

humnmind
Ой, там еще хуже все.
Я на Nightly смотрел – там "plugin:flash", а в 20 – "plugin:NPSWF32_11_6_602_180.dll". =(

Infocatcher
Тока хотел написать.
Это поправимо? Или таки ждать следующих версий Fx?

humnmind пишет

Это поправимо?

Вроде бы, да, обновил.

07-04-2013 19:49:40
okkamas_knife
Да план-то нормальный. Изменение полезное. Другое дело, что SeaMonkey за изменениями не поспевает.
Ну, и убого, что в разных версиях свой способ настройки, это да. =(

bunda1 пишет

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

Вот пример такой кнопки.

Возникла проблема - это для символов и даже ссылок, но вот мне нужно такой формат в буфере, и в меню желательно отдельное название:

Выделить код

Код:

jQuery(function(){

jQuery.fn.getTitle = function() { // Copy the title of every IMG tag and add it to its parent A so that fancybox can show titles
    var arr = jQuery("a.fancybox");
    jQuery.each(arr, function() {
        var title = jQuery(this).children("img").attr("title");
        jQuery(this).attr('title',title);
    })
}

// Supported file extensions
var thumbnails = jQuery("a:has(img)").not(".nolightbox").filter( function() { return /\.(jpe?g|png|gif|bmp)$/i.test(jQuery(this).attr('href')) });

thumbnails.addClass("fancybox").attr("rel","fancybox").getTitle();
jQuery("a.fancybox").fancybox({
    'cyclic': true,
    'autoScale': true,
    'padding': 10,
    'opacity': true,
    'speedIn': 500,
    'speedOut': 500,
    'changeSpeed': 300,
    'overlayShow': true,
    'overlayOpacity': "0.3",
    'overlayColor': "#666666",
    'titleShow': true,
    'titlePosition': 'inside',
    'enableEscapeButton': true,
    'showCloseButton': true,
    'showNavArrows': true,
    'hideOnOverlayClick': true,
    'hideOnContentClick': false,
    'width': 560,
    'height': 340,
    'transitionIn': "elastic",
    'transitionOut': "elastic",
    'centerOnScroll': true
});


})
</script>
feas пишет

Возникла проблема - это для символов и даже ссылок, но вот мне нужно такой формат в буфере, и в меню желательно отдельное название:

Сделал по простому, твой большой код в вкладке Справка:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Eeksperimental%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-4%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20................................................................%20%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%7D%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20.................................................................................%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%22scripts%201%22%2C%0A%20%20%20%20%22scripts%202%22%2C%0A%20%20%20%20%22scripts%20qwerty%22%2C%0A%20%20%20%20%22scripts%2044%2055%2066%22%2C%20%20%20%20%0A%20%20%20%20%20%20%20%22separator%22%2C%0A%20%20%20%20%22scripts%20some%201%22%2C%0A%20%20%20%20%22scriptssome%202%22%2C%0A%20%20%20%20%22scripts%20some%203%22%2C%0A%20%20%20%20this.Help%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%3B%0A%0Avar%20node%20%3D%20document.getElementById%28this.id%20+%20%22-menuPopup%22%29%3B%0Aif%20%28%20node%20%26%26%20node.parentNode%20%29%20node.parentNode.removeChild%28node%29%3B%20//%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0434%u0443%u0431%u043B%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%u043C%u0435%u043D%u044E%0A%0Avar%20menuPopup%20%3D%20document.getElementById%28%22mainPopupSet%22%29.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0AmenuPopup.id%20%3D%20this.id%20+%20%22-menuPopup%22%3B%0A%0Aarray.forEach%28function%28str%29%20%7B%0A%20%20%20%20%20if%20%28%20str%20%3D%3D%20%22separator%22%20%29%20%7B%20menuPopup.appendChild%28%20document.createElement%28%22menuseparator%22%29%20%29%3B%20return%20%7D%3B%20%0A%20%20%20%20%20var%20menuItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20menuItem.setAttribute%28%22label%22%2C%20str.substring%28%200%2C%2020%20%29%20%29%3B%20%0A%20%20%20%20%20menuItem.setAttribute%28%22value%22%2C%20str%20%29%3B%20%0A%20%20%20%20%20menuItem.addEventListener%28%22command%22%2C%20insertOrCopyText%2C%20false%29%3B%20%0A%20%20%20%20%20menuPopup.appendChild%28menuItem%29%3B%0A%7D%29%3B%0A//this.type%20%3D%20%22menu%22%3B%20%0A%0A%0A%0A//%20%u0421%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u0435%20%u043F%u043E%u043B%u0435%20%u0438%u043B%u0438%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0438%u0437%20%u043C%u0435%u043D%u044E%20..........................................%0Afunction%20insertOrCopyText%28%29%20%7B%20%0A%0A%20%20%20var%20text%20%3D%20this.value%3B%0A%20%20%20%0A%20%20%20try%20%7B%20document.commandDispatcher.focusedElement.type%3B%20%7D%0A%20%20%20catch%28e%29%20%7B%20gClipboard.write%28%20text%29%3B%20return%20%7D%3B%0A%20%20%20%0A%20%20%20var%20cmd%20%3D%20%22cmd_insertText%22%3B%0A%20%20%20var%20controller%20%3D%20document.commandDispatcher.getControllerForCommand%28cmd%29%3B%0A%20%20%20if%20%28%20controller%20%26%26%20controller.isCommandEnabled%28cmd%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20var%20controller%20%3D%20controller.QueryInterface%28Components.interfaces.nsICommandController%29%3B%0A%20%20%20%20%20%20%20%20var%20params%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/command-params%3B1%22%5D.createInstance%28Components.interfaces.nsICommandParams%29%3B%0A%20%20%20%20%20%20%20%20params.setStringValue%28%22state_data%22%2C%20text%29%3B%0A%20%20%20%20%20%20%20%20controller.doCommandWithParams%28cmd%2C%20params%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%0A%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5BjQuery%28function%28%29%7B%0A%0AjQuery.fn.getTitle%20%3D%20function%28%29%20%7B%20//%20Copy%20the%20title%20of%20every%20IMG%20tag%20and%20add%20it%20to%20its%20parent%20A%20so%20that%20fancybox%20can%20show%20titles%0A%20%20%20%20var%20arr%20%3D%20jQuery%28%22a.fancybox%22%29%3B%0A%20%20%20%20jQuery.each%28arr%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20title%20%3D%20jQuery%28this%29.children%28%22img%22%29.attr%28%22title%22%29%3B%0A%20%20%20%20%20%20%20%20jQuery%28this%29.attr%28%27title%27%2Ctitle%29%3B%0A%20%20%20%20%7D%29%0A%7D%0A%0A//%20Supported%20file%20extensions%0Avar%20thumbnails%20%3D%20jQuery%28%22a%3Ahas%28img%29%22%29.not%28%22.nolightbox%22%29.filter%28%20function%28%29%20%7B%20return%20/%5C.%28jpe%3Fg%7Cpng%7Cgif%7Cbmp%29%24/i.test%28jQuery%28this%29.attr%28%27href%27%29%29%20%7D%29%3B%0A%0Athumbnails.addClass%28%22fancybox%22%29.attr%28%22rel%22%2C%22fancybox%22%29.getTitle%28%29%3B%0AjQuery%28%22a.fancybox%22%29.fancybox%28%7B%0A%20%20%20%20%27cyclic%27%3A%20true%2C%0A%20%20%20%20%27autoScale%27%3A%20true%2C%0A%20%20%20%20%27padding%27%3A%2010%2C%0A%20%20%20%20%27opacity%27%3A%20true%2C%0A%20%20%20%20%27speedIn%27%3A%20500%2C%0A%20%20%20%20%27speedOut%27%3A%20500%2C%0A%20%20%20%20%27changeSpeed%27%3A%20300%2C%0A%20%20%20%20%27overlayShow%27%3A%20true%2C%0A%20%20%20%20%27overlayOpacity%27%3A%20%220.3%22%2C%0A%20%20%20%20%27overlayColor%27%3A%20%22%23666666%22%2C%0A%20%20%20%20%27titleShow%27%3A%20true%2C%0A%20%20%20%20%27titlePosition%27%3A%20%27inside%27%2C%0A%20%20%20%20%27enableEscapeButton%27%3A%20true%2C%0A%20%20%20%20%27showCloseButton%27%3A%20true%2C%0A%20%20%20%20%27showNavArrows%27%3A%20true%2C%0A%20%20%20%20%27hideOnOverlayClick%27%3A%20true%2C%0A%20%20%20%20%27hideOnContentClick%27%3A%20false%2C%0A%20%20%20%20%27width%27%3A%20560%2C%0A%20%20%20%20%27height%27%3A%20340%2C%0A%20%20%20%20%27transitionIn%27%3A%20%22elastic%22%2C%0A%20%20%20%20%27transitionOut%27%3A%20%22elastic%22%2C%0A%20%20%20%20%27centerOnScroll%27%3A%20true%0A%7D%29%3B%0A%0A%0A%7D%29%0A%3C/script%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

09-04-2013 22:13:15
Или вот так, названия пунктов в коде меню а сами скрипты в вкладке Справка:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Eeksperimental%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-4%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20................................%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%7D%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20................................%0Avar%20section%20%3D%20%22%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%22%3B%0Asection%20%3D%20%22%5Cn%22%20+%20section%20+%20%22%5Cn%22%3B%0Avar%20item%20%3D%20this.Help.split%28%20section%20%29%3B%0A%0Avar%20node%20%3D%20document.getElementById%28this.id%20+%20%22-menuPopup%22%29%3B%0Aif%20%28%20node%20%26%26%20node.parentNode%20%29%20node.parentNode.removeChild%28node%29%3B%20//%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0434%u0443%u0431%u043B%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%u043C%u0435%u043D%u044E%0A%0Avar%20menuPopup%20%3D%20document.getElementById%28%22mainPopupSet%22%29.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0AmenuPopup.id%20%3D%20this.id%20+%20%22-menuPopup%22%3B%0A%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%22scripts%201%22%2C%0A%20%20%20%20%22scripts%202%22%2C%0A%20%20%20%20%22scripts%20qwerty%22%2C%0A%20%20%20%20%22scripts%2044%2055%2066%22%2C%20%20%20%20%0A%20%20%20%20%22separator%22%2C%0A%20%20%20%20%22scripts%20some%201%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%3B%0A%0Avar%20node%20%3D%20document.getElementById%28this.id%20+%20%22-menuPopup%22%29%3B%0Aif%20%28%20node%20%26%26%20node.parentNode%20%29%20node.parentNode.removeChild%28node%29%3B%20//%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0434%u0443%u0431%u043B%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%u043C%u0435%u043D%u044E%0A%0Avar%20menuPopup%20%3D%20document.getElementById%28%22mainPopupSet%22%29.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0AmenuPopup.id%20%3D%20this.id%20+%20%22-menuPopup%22%3B%0Avar%20i%20%3D%200%3B%0Aarray.forEach%28function%28%20m%20%29%20%7B%0A%20%20%20%20%20if%20%28%20m%20%3D%3D%20%22separator%22%20%29%20%7B%20menuPopup.appendChild%28%20document.createElement%28%22menuseparator%22%29%20%29%3B%20return%20%7D%3B%20%0A%20%20%20%20%20var%20menuItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20menuItem.setAttribute%28%22label%22%2C%20m%20%29%3B%20%0A%20%20%20%20%20menuItem.setAttribute%28%22value%22%2C%20i++%20%29%3B%20%0A%20%20%20%20%20menuItem.addEventListener%28%22command%22%2C%20insertOrCopyText%2C%20false%29%3B%20%0A%20%20%20%20%20menuPopup.appendChild%28%20menuItem%20%29%3B%0A%7D%29%3B%0A//this.type%20%3D%20%22menu%22%3B%20%0A%0A%0A%0A//%20%u0421%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u0435%20%u043F%u043E%u043B%u0435%20%u0438%u043B%u0438%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0438%u0437%20%u043C%u0435%u043D%u044E%20%20................................%0Afunction%20insertOrCopyText%28%29%20%7B%20%0A%0A%20%20%20var%20text%20%3D%20item%5Bthis.value%5D%3B%0A%20%20%20%0A%20%20%20try%20%7B%20document.commandDispatcher.focusedElement.type%3B%20%7D%0A%20%20%20catch%28e%29%20%7B%20gClipboard.write%28%20text%29%3B%20return%20%7D%3B%0A%20%20%20%0A%20%20%20var%20cmd%20%3D%20%22cmd_insertText%22%3B%0A%20%20%20var%20controller%20%3D%20document.commandDispatcher.getControllerForCommand%28cmd%29%3B%0A%20%20%20if%20%28%20controller%20%26%26%20controller.isCommandEnabled%28cmd%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20var%20controller%20%3D%20controller.QueryInterface%28Components.interfaces.nsICommandController%29%3B%0A%20%20%20%20%20%20%20%20var%20params%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/command-params%3B1%22%5D.createInstance%28Components.interfaces.nsICommandParams%29%3B%0A%20%20%20%20%20%20%20%20params.setStringValue%28%22state_data%22%2C%20text%29%3B%0A%20%20%20%20%20%20%20%20controller.doCommandWithParams%28cmd%2C%20params%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%0A%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5BtoggleImage%28%29%3B%0Avar%20ps%20%3D%20Cc%5B%22@mozilla.org/preferences-service%3B1%22%5D.getService%28Ci.nsIPrefBranch%29.QueryInterface%28Ci.nsIPrefBranch2%29%3B%0Aps.addObserver%28%20s%2C%20toggleImage%2C%20false%20%29%3B%0Athis.onDestroy%20%3D%20function%28%29%20%7B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A%20%20%20%20%20%20%20if%20%28%20%21%21gFindBar._findField.style.color%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20gFindBar.getElement%28%27highlight%27%29.setAttribute%28%22checked%22%2C%20%22true%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20gFindBar._findField.removeAttribute%28%22style%22%29%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A%20%20%20var%20mItem%20%3D%20e.target%3B%0A%20%20%20var%20value%20%3D%20mItem.getAttribute%28%22value%22%29%3B%0A%20%20%20var%20label%20%3D%20mItem.getAttribute%28%22label%22%29%3B%0A%20%20%20var%20image%20%3D%20mItem.getAttribute%28%22image%22%29%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A%20%7B%20label%3A%20%27%u0410%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%27%2C%20value%3A%20%27FindBar.Highlight%27%2C%20func%3A%20toggleAttribute%2C%20cek%3A%27%27%7D%2C%0A%20%20%7B%20label%3A%20%27%u0410%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%20%u0432%20%u0441%u0441%u044B%u043B%u043A%u0430%u0445%27%2C%20value%3A%20%27FindBar.Highlight.Link%27%2C%20func%3A%20Highlight%2C%20cek%3A%27%27%7D%2C%0A%20%20%7B%20label%3A%20%27%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%27%2C%20value%3A%20%27add%27%2C%20func%3A%20toggleHighlightValue%20%7D%2C%0A%20%20%7B%20label%3A%20%27%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%27%2C%20value%3A%20%27clear%27%2C%20func%3A%20toggleHighlightValue%20%7D%2C%0A%20%20%7B%20label%3A%20%27%u0418%u0437%u043C%u0435%u043D%u0438%u0442%u044C%20%u0446%u0432%u0435%u0442%3A%20%7C%23ef0fff%7C%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%27%2C%20value%3A%20%27ui.textHighlightBackground%27%2C%20change%3A%27%27%7D%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0AjQuery%28function%28%29%7B%0A%0AjQuery.fn.getTitle%20%3D%20function%28%29%20%7B%20//%20Copy%20the%20title%20of%20every%20IMG%20tag%20and%20add%20it%20to%20its%20parent%20A%20so%20that%20fancybox%20can%20show%20titles%0A%20%20%20%20var%20arr%20%3D%20jQuery%28%22a.fancybox%22%29%3B%0A%20%20%20%20jQuery.each%28arr%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20title%20%3D%20jQuery%28this%29.children%28%22img%22%29.attr%28%22title%22%29%3B%0A%20%20%20%20%20%20%20%20jQuery%28this%29.attr%28%27title%27%2Ctitle%29%3B%0A%20%20%20%20%7D%29%0A%7D%0A%0A//%20Supported%20file%20extensions%0Avar%20thumbnails%20%3D%20jQuery%28%22a%3Ahas%28img%29%22%29.not%28%22.nolightbox%22%29.filter%28%20function%28%29%20%7B%20return%20/%5C.%28jpe%3Fg%7Cpng%7Cgif%7Cbmp%29%24/i.test%28jQuery%28this%29.attr%28%27href%27%29%29%20%7D%29%3B%0A%0Athumbnails.addClass%28%22fancybox%22%29.attr%28%22rel%22%2C%22fancybox%22%29.getTitle%28%29%3B%0AjQuery%28%22a.fancybox%22%29.fancybox%28%7B%0A%20%20%20%20%27cyclic%27%3A%20true%2C%0A%20%20%20%20%27autoScale%27%3A%20true%2C%0A%20%20%20%20%27padding%27%3A%2010%2C%0A%20%20%20%20%27opacity%27%3A%20true%2C%0A%20%20%20%20%27speedIn%27%3A%20500%2C%0A%20%20%20%20%27speedOut%27%3A%20500%2C%0A%20%20%20%20%27changeSpeed%27%3A%20300%2C%0A%20%20%20%20%27overlayShow%27%3A%20true%2C%0A%20%20%20%20%27overlayOpacity%27%3A%20%220.3%22%2C%0A%20%20%20%20%27overlayColor%27%3A%20%22%23666666%22%2C%0A%20%20%20%20%27titleShow%27%3A%20true%2C%0A%20%20%20%20%27titlePosition%27%3A%20%27inside%27%2C%0A%20%20%20%20%27enableEscapeButton%27%3A%20true%2C%0A%20%20%20%20%27showCloseButton%27%3A%20true%2C%0A%20%20%20%20%27showNavArrows%27%3A%20true%2C%0A%20%20%20%20%27hideOnOverlayClick%27%3A%20true%2C%0A%20%20%20%20%27hideOnContentClick%27%3A%20false%2C%0A%20%20%20%20%27width%27%3A%20560%2C%0A%20%20%20%20%27height%27%3A%20340%2C%0A%20%20%20%20%27transitionIn%27%3A%20%22elastic%22%2C%0A%20%20%20%20%27transitionOut%27%3A%20%22elastic%22%2C%0A%20%20%20%20%27centerOnScroll%27%3A%20true%0A%7D%29%3B%0A%0A%0A%7D%29%0A%3C/script%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
bunda1 пишет

Или вот так, названия пунктов в коде меню а сами скрипты в вкладке Справка:

спасиб! работает идеально! =) завтра первым же делом проверю на работе. Но проблем не должно возникнуть.
много секций(меню) навряд ли у кого будет.

bunda1
Очень хороша твоя кнопка VT ( Firefox10+ )
Но хочется поведения панели как в all-in-one_sidebar, т.е. чтоб панель пряталась вместе с содержимым нажатой кнопки на панели, например с закладками. А то приходиться вручную закрывать. Возможно ли так сделать? :/

rubel
Не я автор кнопки, а Dumby
Ты хочешь что бы VT панель автоматически пряталась месте с открытым боковым панелью, я правильно понял?

bunda1
Скорее имеется ввиду,что бы закрывалось вместе с тем ,что пооткрывалось через кнопки,находящиеся на панели.

VORON
А что может открыться через кнопки на панели, может меню у кнопок?

bunda1 пишет

через кнопки на панели, может меню у кнопок?

На вскидку(боковые) - закладки, журнал - есть в комплекте лисы. Возможно у автора и свои фичи типа дополнения и загрузки в боковой.
А так мне наоборот не нравится эта Идея. Тоже пользователь кнопки и скрываю её.

bunda1 пишет

VORON  А что может открыться через кнопки на панели, может меню у кнопок?

addons,extensions,settings,password manager и ещё куча всего остального может быть открыто из VT :)

VORON пишет

и ещё куча всего остального может быть открыто из VT

ясн - готовься писать правила =)

bunda1
Я на эту панель перенёс кнопки: Закладки, Журнал, Scrapbook и т.д.
Подвожу курсор влево, открывается VT, нажимаю, например,  кнопку Закладки, открываются Закладки, перемещаю курсор на страницу,VT прячется, а Закладки остались открытыми, занимая место на странице. Приходится их вручную закрывать.
Вот и хочется чтоб они прятались вместе с VT.

okkamas_knife
А ты как всегда полон идей :)

okkamas_knife
Не суди так строго, не так легко начинающему сделать кнопку которая делает что то больше чем просто открывает адрес. Сам помню как это. Я уже некоторые кнопки делаю автоматом не задумываясь. Правда последнее время пришел к выводу что наклепал столько кнопок что все время уходит на их поддержку, а для новых времени нет.

В кнопке Compact Menu( Firefox 4 + ) не работают опции Недавно закрытые вкладки и Недавно закрытые окна: не отображаются закрытые окна и вкладки.
79c79e47fd05e48e1af794c89b8bb414.jpeg

oopsididagainster пишет

В кнопке Compact Menu( Firefox 4 + ) не работают опции Недавно закрытые вкладки и Недавно закрытые окна: не отображаются закрытые окна и вкладки.

:/ А если так

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECompact%20Menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBEAAAEAIACsBAAAFgAAACgAAAAQAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMSAAcROg8hOGEvQV1hL0JdOQ4iOBIABxH7+/uBqKioqv7+/oAAAAAAAAAAAAAAAAAAAAAAAAAAAREABhB6PEx23HZ32+uLe/7rfGv/63tr/+uKev7vv7/tp52g10BAQP6vr6+z////fwAAAAAAAAAAAAAAAR0CEB3AaHK/629j/+FbVP/bUU7/10xK/9ZLSv/sp6X/26mm/0BAQP9AQED/QEBA/9jY2KH///9/AAAAAA8ABQ+6X22+1UpK/8Y2P/+8KDX/tB0v/6sZKf+uGCz/1pae/0BAQP9AQED/QEBA/0BAQP9AQED+8fHxkQAAAAJ0M0hzxz1G/7AYLv+lDCX/ng0b/5APD/+FFgL/1Zid/3BfYf9AQED/QEBA/0BAQP9AQED/QEBA/25ubtgPAAUPt0dc2KULJf+pFCb/tygu/7w1L/+FGAH/nSsW/8OSjf+gf3//qIKB/9aTlf/Vi5P/0YSR/9yosuzw7/CHMAobMLw2Sf60Iyz/xD41/9NSPv/cYUT/0188/+VwSf/IWzj/WhID/0kFAP9zGhT/yEM4/7grL/+9Okn+Nw0fNFYoOVLAOT3/zEg6/9xhRP/qdUv/64RR/+uNVf/rk1f/65NX/9t1Q/9mGQD/YhcE/9NeP//RTz3/xEA//1wsPVlWKDhR01dI/+BnRv/rf0//65JX/+ugXP/rqV7/661g/+utYf/McDH/gS4C/4UyD//CXjX/5G5I/9hdSf9dLD5YMAoaMOp+Zf7rgE//65dZ/+upX//rtGP/671n/+vBaP/rslz/rk4K/51CBf/rjUf/64RI/+uBTf/rhGf+NQweNA4ABg7Tdm3X65NY/+uqX//rumX/68Rq/+vMbf/r0G//68pn/+u+X//cgTD/67hi/+uuYf/rmlr/2Hxv2REABhAAAAACdTlIceudYP/rrV7/66xW/+vMbf/r03D/69Zw/+vVcP/r1HD/68tr/9x+Pv/rkUz/66xo/3Y7SXMAAAACAAAAAA8ABQ+2Z2O70WIX/+uEIf/rvVb/68JY/+vPbf/rsUn/68FX/+uVRf+dNBL/zGw0/8h7dL0PAAUPAAAAAAAAAAAAAAABHAEPHL5qWrzrr0r/69CA/+vQgf/r3qv/696r/+vNgP/rrnb/rEgo/6VXW70dAg8cAAAAAQAAAAAAAAAAAAAAAAAAAAEPAAUPdztFceiUcNjrz47+69yw/+vUmf/ryIT+03pe2XIzRHMPAAUPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPAAUPMgscMlcpOlNYKTlUMwscMg8ABQ8AAAACAAAAAAAAAAAAAAAAAAAAAP//rEHwA6xBwAGsQYAArEGAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEGAAaxBgAGsQcADrEHwD6xB%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0421%u0442%u0438%u043B%u044C%20%u0443%u0434%u0430%u043B%u044F%u0435%u0442%20%u041F%u0430%u043D%u0435%u043B%u044C%20%u043C%u0435%u043D%u044E%20%u0438%20%u043A%u043D%u043E%u043F%u043A%u0443%20Firefox%20..............%0Aconst%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%20%20%0Avar%20css%20%3D%20%27%5C%0A%23toolbar-menubar%20%7B%20-moz-appearance%3A%20none%20%21important%3B%20display%20%3A%20none%20%21important%3B%20%7D%5C%0A%23titlebar-content%20%23appmenu-button%20%7B%20display%3A%20none%20%21important%3B%20%7D%5C%0A%23TabsToolbar%20hbox.titlebar-placeholder%5Btype%3D%22appmenu-button%22%5D%20%7B%5C%0Adisplay%3A%20none%20%21important%3B%5C%0A%7D%5C%0A%27%3B%0A%0Avar%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%29%3B%0Asss.loadAndRegisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0Athis.onDestroy%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20if%20%28%20sss.sheetRegistered%28uri%2C%20sss.AGENT_SHEET%29%20%29%20sss.unregisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bconst%20ids%20%3D%20%5B%0A%09%22file-menu%22%2C%0A%09%22edit-menu%22%2C%0A%09%22view-menu%22%2C%0A%09%22bookmarksMenu%22%2C%0A%09%22history-menu%22%2C%0A%09%22tools-menu%22%2C%0A%09%22helpMenu%22%0A%5D%3B%0Aconst%20id%20%3D%20%22Compact-Menu-menupopup%22%3B%0Avar%20popup%20%3D%20document.getElementById%28id%29%3B%0Aif%20%28%21popup%29%20%7B%0A%09popup%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%09const%20attrs%20%3D%20%7B%0A%09%09id%3A%20id%2C%0A%09%09position%3A%20%22after_start%22%2C%0A%09%09oncontextmenu%3A%20%22event.preventDefault%28%29%22%2C%0A%09%09oncommand%3A%20%22event.stopPropagation%28%29%22%2C%0A%09%7D%3B%0A%09for%20%28var%20attr%20in%20attrs%29%20popup.setAttribute%28attr%2C%20attrs%5Battr%5D%29%3B%0A%0A%09ids.forEach%28function%28id%29%20%7B%0A%09%09var%20clonedMenu%20%3D%20document.getElementById%28id%29.cloneNode%28true%29%3B%0A%09%09clonedMenu.hidden%20%3D%20false%3B%0A%09%09popup.appendChild%28clonedMenu%29%3B%0A%09%7D%29%3B%0A%09if%20%28ids.indexOf%28%22history-menu%22%29%20%21%3D%20-1%29%20%7B%0A%09%09%5B%22%22%2C%20%22Window%22%5D.forEach%28function%28str%29%20%7B%0A%09%09%09var%20node%20%3D%20popup.getElementsByAttribute%28%22id%22%2C%20%22historyUndo%22%20+%20str%20+%20%22Popup%22%29%5B0%5D%3B%0A%09%09%09var%20attr%20%3D%20node.getAttribute%28%22onpopupshowing%22%29%3B%0A%09%09%09node.setAttribute%28%22onpopupshowing%22%2C%20%22this.parentNode.parentNode.parentNode%22%20+%20attr.substring%2839%29%29%3B%0A%09%09%7D%29%3B%0A%09%7D%0A%7D%0Apopup.openPopup%28this%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Dumby
А насчёт кнопки VT возможно ли сделать, как я просил выше?

Dumby пишет
oopsididagainster пишет

В кнопке Compact Menu( Firefox 4 + ) не работают опции Недавно закрытые вкладки и Недавно закрытые окна: не отображаются закрытые окна и вкладки.

:/ А если так

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECompact%20Menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBEAAAEAIACsBAAAFgAAACgAAAAQAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMSAAcROg8hOGEvQV1hL0JdOQ4iOBIABxH7+/uBqKioqv7+/oAAAAAAAAAAAAAAAAAAAAAAAAAAAREABhB6PEx23HZ32+uLe/7rfGv/63tr/+uKev7vv7/tp52g10BAQP6vr6+z////fwAAAAAAAAAAAAAAAR0CEB3AaHK/629j/+FbVP/bUU7/10xK/9ZLSv/sp6X/26mm/0BAQP9AQED/QEBA/9jY2KH///9/AAAAAA8ABQ+6X22+1UpK/8Y2P/+8KDX/tB0v/6sZKf+uGCz/1pae/0BAQP9AQED/QEBA/0BAQP9AQED+8fHxkQAAAAJ0M0hzxz1G/7AYLv+lDCX/ng0b/5APD/+FFgL/1Zid/3BfYf9AQED/QEBA/0BAQP9AQED/QEBA/25ubtgPAAUPt0dc2KULJf+pFCb/tygu/7w1L/+FGAH/nSsW/8OSjf+gf3//qIKB/9aTlf/Vi5P/0YSR/9yosuzw7/CHMAobMLw2Sf60Iyz/xD41/9NSPv/cYUT/0188/+VwSf/IWzj/WhID/0kFAP9zGhT/yEM4/7grL/+9Okn+Nw0fNFYoOVLAOT3/zEg6/9xhRP/qdUv/64RR/+uNVf/rk1f/65NX/9t1Q/9mGQD/YhcE/9NeP//RTz3/xEA//1wsPVlWKDhR01dI/+BnRv/rf0//65JX/+ugXP/rqV7/661g/+utYf/McDH/gS4C/4UyD//CXjX/5G5I/9hdSf9dLD5YMAoaMOp+Zf7rgE//65dZ/+upX//rtGP/671n/+vBaP/rslz/rk4K/51CBf/rjUf/64RI/+uBTf/rhGf+NQweNA4ABg7Tdm3X65NY/+uqX//rumX/68Rq/+vMbf/r0G//68pn/+u+X//cgTD/67hi/+uuYf/rmlr/2Hxv2REABhAAAAACdTlIceudYP/rrV7/66xW/+vMbf/r03D/69Zw/+vVcP/r1HD/68tr/9x+Pv/rkUz/66xo/3Y7SXMAAAACAAAAAA8ABQ+2Z2O70WIX/+uEIf/rvVb/68JY/+vPbf/rsUn/68FX/+uVRf+dNBL/zGw0/8h7dL0PAAUPAAAAAAAAAAAAAAABHAEPHL5qWrzrr0r/69CA/+vQgf/r3qv/696r/+vNgP/rrnb/rEgo/6VXW70dAg8cAAAAAQAAAAAAAAAAAAAAAAAAAAEPAAUPdztFceiUcNjrz47+69yw/+vUmf/ryIT+03pe2XIzRHMPAAUPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPAAUPMgscMlcpOlNYKTlUMwscMg8ABQ8AAAACAAAAAAAAAAAAAAAAAAAAAP//rEHwA6xBwAGsQYAArEGAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEGAAaxBgAGsQcADrEHwD6xB%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0421%u0442%u0438%u043B%u044C%20%u0443%u0434%u0430%u043B%u044F%u0435%u0442%20%u041F%u0430%u043D%u0435%u043B%u044C%20%u043C%u0435%u043D%u044E%20%u0438%20%u043A%u043D%u043E%u043F%u043A%u0443%20Firefox%20..............%0Aconst%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%20%20%0Avar%20css%20%3D%20%27%5C%0A%23toolbar-menubar%20%7B%20-moz-appearance%3A%20none%20%21important%3B%20display%20%3A%20none%20%21important%3B%20%7D%5C%0A%23titlebar-content%20%23appmenu-button%20%7B%20display%3A%20none%20%21important%3B%20%7D%5C%0A%23TabsToolbar%20hbox.titlebar-placeholder%5Btype%3D%22appmenu-button%22%5D%20%7B%5C%0Adisplay%3A%20none%20%21important%3B%5C%0A%7D%5C%0A%27%3B%0A%0Avar%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%29%3B%0Asss.loadAndRegisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0Athis.onDestroy%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20if%20%28%20sss.sheetRegistered%28uri%2C%20sss.AGENT_SHEET%29%20%29%20sss.unregisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bconst%20ids%20%3D%20%5B%0A%09%22file-menu%22%2C%0A%09%22edit-menu%22%2C%0A%09%22view-menu%22%2C%0A%09%22bookmarksMenu%22%2C%0A%09%22history-menu%22%2C%0A%09%22tools-menu%22%2C%0A%09%22helpMenu%22%0A%5D%3B%0Aconst%20id%20%3D%20%22Compact-Menu-menupopup%22%3B%0Avar%20popup%20%3D%20document.getElementById%28id%29%3B%0Aif%20%28%21popup%29%20%7B%0A%09popup%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%09const%20attrs%20%3D%20%7B%0A%09%09id%3A%20id%2C%0A%09%09position%3A%20%22after_start%22%2C%0A%09%09oncontextmenu%3A%20%22event.preventDefault%28%29%22%2C%0A%09%09oncommand%3A%20%22event.stopPropagation%28%29%22%2C%0A%09%7D%3B%0A%09for%20%28var%20attr%20in%20attrs%29%20popup.setAttribute%28attr%2C%20attrs%5Battr%5D%29%3B%0A%0A%09ids.forEach%28function%28id%29%20%7B%0A%09%09var%20clonedMenu%20%3D%20document.getElementById%28id%29.cloneNode%28true%29%3B%0A%09%09clonedMenu.hidden%20%3D%20false%3B%0A%09%09popup.appendChild%28clonedMenu%29%3B%0A%09%7D%29%3B%0A%09if%20%28ids.indexOf%28%22history-menu%22%29%20%21%3D%20-1%29%20%7B%0A%09%09%5B%22%22%2C%20%22Window%22%5D.forEach%28function%28str%29%20%7B%0A%09%09%09var%20node%20%3D%20popup.getElementsByAttribute%28%22id%22%2C%20%22historyUndo%22%20+%20str%20+%20%22Popup%22%29%5B0%5D%3B%0A%09%09%09var%20attr%20%3D%20node.getAttribute%28%22onpopupshowing%22%29%3B%0A%09%09%09node.setAttribute%28%22onpopupshowing%22%2C%20%22this.parentNode.parentNode.parentNode%22%20+%20attr.substring%2839%29%29%3B%0A%09%09%7D%29%3B%0A%09%7D%0A%7D%0Apopup.openPopup%28this%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Так работает.
Спасибо :)

rubel пишет

А насчёт кнопки VT возможно ли сделать, как я просил выше?

Попробовать то можно, только не понял что.
Нужно закрывать sidebar, если он открыт с VT ?
Если да, то закрывать в какой момент времени, или, при каком положении мыши ?
И что делать, если sidebar уже был открыт, всё равно закрывать, или ещё как ?

Dumby
Мне хотелось бы так:
Нужно закрывать sidebar, если он открыт с VT, закрывать когда курсор мыши убрал с  sidebar'a на страницу,
если sidebar уже был открыт, всё равно закрывать.Такое поведение боковой панели сделано в Maxthon'e.
Спасибо.

rubel

Попробуй добавить это в самый конец кода

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

Выделить код

Код:

function n(id) document.getElementById(id);
const page = n("content"), box = n("sidebar-box"), sidebar = n("sidebar");
var tvtc = 0;
function onSBL(e) {
    var time = Date.now();
    if (time - tvtc > 800) return;
    addEventListener("mouseover", function onMO() {
        removeEventListener("mouseover", onMO, false, page);
        if (box.hidden) return;
        var id = box.getAttribute("sidebarcommand") || "viewBookmarksSidebar";
        n(id).setAttribute("checked", true);
        toggleSidebar(id);
    }, false, page);
}
function onVTC(e) {
    var time = Date.now();
    for (var node = e.target; node; node = node.parentNode) {
        if (node == toolbar) {
            tvtc = time;
            break;
        }
    }
}
const data = [
    ["DOMContentLoaded", onSBL, false, sidebar],
    ["click", onVTC, false, window],
    ["command", onVTC, false, window]
];
function ael(add) {
    data.forEach(function(args) {
        (add ? addEventListener : removeEventListener).apply(this, args);
    });
}
ael(true);
addDestructor(function() { ael(false) });

Dumby

Попробуй добавить это в самый конец кода

Прекрасно всё получилось, именно так, как мне и хотелось. Огромное спасибо!
Вы мастер своего дела. :)

Dumby
А можно чуть увеличить время скрытия  sidebar'a ?

okkamas_knife пишет

ща ради интереса выдав это за головоломку послал код знакомой которая в програмировании ни в зуб ногой

Эх эх.... расшифрую
const showDelay = 250; - отвечает за появление, но не скрытие.

А стоит лишь убрать мышку все тут же исчезнет:

Выделить код

Код:

if (!toolbar.hasAttribute("autohide")) {
    browser.addEventListener("mousemove", collapser, false);
}
else toolbar.setAttribute("autohide", "true");

lock();

Редактирование функции ни к чему не приводит видимому:

Выделить код

Код:

var tvtc = 10000;
function onSBL(e) {
    var time = Date.now();
    if (time - tvtc > 8000000) return;

Как узнать какая команда отвечает за опцию Настроить ?
2bd709810203e976c56b22977e583ed7.jpeg
Инспектором не получается подобраться.
Хотя может у кого-то есть кнопка открывающая настройки интерфейса ? :)

Вот эта настроить и есть настройки интерфейса :usch:

14-04-2013 12:54:32

Ещё так можно
kiss_51kb.1365929501.png

и так №11

okkamas_knife пишет

получил вполне логичный ответ - Наверно циферку 800? она там одна.

Это как раз я попробовал в первую очередь и как и у feas ничего не меняется.
Поэтому и прошу автора.

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

feas пишет

можнои так №11

То что нужно!
Спасибо :)

rubel пишет

А можно чуть увеличить время скрытия  sidebar'a ?

Можно попробовать вместо той добавки эту.
Время скрытия в первой строчке.

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

Выделить код

Код:

const delay = 1000;

function n(id) document.getElementById(id);
const page = n("content"), box = n("sidebar-box"), sidebar = n("sidebar");
var tvtc, timeout;

function listenMO(node, listen) {
    var func = node == box ? onBMO : onPMO;
    (listen ? addEventListener : removeEventListener)
    .apply(this, ["mouseover", func, false, node]);
}
function onPMO() {
    listenMO(page, false);
    timeout = setTimeout(hideSB, delay);
    listenMO(box, true);
}
function onBMO() {
    listenMO(box, false);
    clearTimeout(timeout);
    listenMO(page, true);
}
function hideSB() {
    listenMO(box, false);
    if (box.hidden) return;
    var id = box.getAttribute("sidebarcommand") || "viewBookmarksSidebar";
    n(id).setAttribute("checked", true);
    toggleSidebar(id);
}
function onSBL() {
    var time = Date.now();
    listenMO(page, false);
    if (time - tvtc < 800) listenMO(page, true);
}
function onVTC(e) {
    var time = Date.now();
    for (var node = e.target; node; node = node.parentNode) {
        if (node != toolbar) continue;
        tvtc = time;
        break;
    }
}
function ael(add) {
    [    ["DOMContentLoaded", onSBL, false, sidebar],
        ["click", onVTC, false, window],
        ["command", onVTC, false, window]
    ].forEach(function(args) {
        (add ? addEventListener : removeEventListener).apply(this, args);
    });
}
ael(true);
addDestructor(function() { ael(false) });

okkamas_knife пишет

задержку которую он делает

Хорошо подшутил над знакомой - спросил о том, чего нет :)

Dumby

Время скрытия в первой строчке.

Отлично! Я поставил const delay = 400. Теперь очень хорошо. Спасибо ещё раз.

bunda1
Поставил кнопку Context Search(Firefox 4+)
Но она вообще не работает никак. Вроде строка в контекстном меню появляется но без надписи и список поисковиков не появляется.
img5f.gif

Починить можно?

rubel
Попробуй в коде заменить все    contextMenuSearchText    на    contextMenuSearch

Dumby пишет

Попробуй в коде заменить все    contextMenuSearchText    на    contextMenuSearch

заработало, чтоб остальные не мучились:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EContext%20Search%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-1%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//Context%20Search......................................%0A%0Aif%20%28window.contextSearcher%29%20%7B%0A%20%20window.contextSearcher.destroy%28%29%3B%0A%20%20delete%20window.contextSearcher%3B%0A%7D%0A%0Awindow.contextSearcher%20%3D%20%7B%0A%20%20NEW_TAB%3A%20true%2C%0A%0A%20%20_regexp%3A%20%7B%0A%20%20%20%20hiragana%3A%20%22%5B%5C%5Cu3040-%5C%5Cu309F%5D%22%2C%0A%20%20%20%20katakana%3A%20%22%5B%5C%5Cu30A0-%5C%5Cu30FF%5D%22%2C%0A%20%20%20%20kanji%20%20%20%3A%20%22%5B%5C%5Cu4E00-%5C%5Cu9FA0%5D%22%2C%0A%20%20%20%20//suuji%20%20%20%3A%20%22%5B0-9_./%2C%25-%5D%22%2C%0A%20%20%20%20eisu_han%3A%20%22%5Ba-zA-Z0-9_-%5D%22%2C%0A%20%20%20%20eisu_zen%3A%20%22%5B%5C%5CuFF41-%5C%5CuFF5A%5C%5CuFF21-%5C%5CuFF3A%5C%5CuFF10-%5C%5CuFF19%5D%22%2C%0A%20%20%20%20hankaku%20%3A%20%22%5B%5C%5CuFF00-%5C%5CuFFEF%5D%22%2C%0A%20%20%7D%2C%0A%0A%20%20get%20startReg%28%29%20%7B%0A%20%20%20%20let%20reg%20%3D%20%7B%7D%3B%0A%20%20%20%20for%28let%20n%20in%20this._regexp%29%20%7B%0A%20%20%20%20%20%20reg%5Bn%5D%20%3D%20new%20RegExp%28%27%5E%27%20+%20this._regexp%5Bn%5D%20+%20%27+%27%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20delete%20this.startReg%3B%0A%20%20%20%20return%20this.startReg%20%3D%20reg%3B%0A%20%20%7D%2C%0A%20%20get%20endReg%28%29%20%7B%0A%20%20%20%20let%20reg%20%3D%20%7B%7D%3B%0A%20%20%20%20for%28let%20n%20in%20this._regexp%29%20%7B%0A%20%20%20%20%20%20reg%5Bn%5D%20%3D%20new%20RegExp%28this._regexp%5Bn%5D%20+%20%27+%24%27%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20delete%20this.endReg%3B%0A%20%20%20%20return%20this.endReg%20%3D%20reg%3B%0A%20%20%7D%2C%0A%20%20searchText%3A%20%27%27%2C%0A%20%20searchEngines%3A%20%5B%5D%2C%0A%20%20init%3A%20function%28%29%7B%0A%20%20%20%20this.searchService%20%3D%20Cc%5B%22@mozilla.org/browser/search-service%3B1%22%5D.getService%28Ci.nsIBrowserSearchService%29%3B%0A%20%20%20%20this.context%20%3D%20document.getElementById%28%27contentAreaContextMenu%27%29%3B%0A%20%20%20%20var%20searchselect%20%3D%20document.getElementById%28%27context-searchselect%27%29%3B%0A%20%20%20%20searchselect.style.display%20%3D%20%27none%27%3B%0A%0A%20%20%20%20this.menu%20%3D%20this.context.insertBefore%28document.createElement%28%27splitmenu%27%29%2C%20searchselect%29%3B%0A%20%20%20%20this.menu.setAttribute%28%27id%27%2C%20%27context-searcher%27%29%3B%0A%20%20%20%20this.menu.setAttribute%28%27accesskey%27%2C%20gNavigatorBundle.getString%28%22contextMenuSearch.accesskey%22%29%29%3B%0A%20%20%20%20this.menu.setAttribute%28%27oncommand%27%2C%20%27contextSearcher.command%28event%29%3B%27%29%3B%0A%20%20%20%20this.menu.setAttribute%28%27onclick%27%2C%20%27checkForMiddleClick%28this%2C%20event%29%3B%27%29%3B%0A%20%20%20%20this.menu.setAttribute%28%27iconic%27%2C%20%27true%27%29%3B%0A%0A%20%20%20%20this.popup%20%3D%20this.menu.appendChild%28%20document.createElement%28%27menupopup%27%29%20%29%3B%0A%0A%20%20%20%20//%20splitmenu%0A%20%20%20%20this.dummy%20%3D%20this.context.insertBefore%28document.createElement%28%27menuitem%27%29%2C%20searchselect%29%3B%0A%20%20%20%20this.dummy.setAttribute%28%27id%27%2C%20%27context-searcher-dummy%27%29%3B%0A%20%20%20%20this.dummy.setAttribute%28%27command%27%2C%20%27context-searcher%27%29%3B%0A%20%20%20%20this.dummy.setAttribute%28%27accesskey%27%2C%20gNavigatorBundle.getString%28%22contextMenuSearch.accesskey%22%29%29%3B%0A%20%20%20%20this.dummy.collapsed%20%3D%20true%3B%0A%0A%20%20%20%20this.context.addEventListener%28%27popupshowing%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20this.menu.addEventListener%28%27DOMMouseScroll%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20gBrowser.mPanelContainer.addEventListener%28%27click%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20window.addEventListener%28%27unload%27%2C%20this%2C%20false%29%3B%0A%0A%20%20%20this.menu._menuDelay%20%3D%20300%3B%0A%20%20%7D%2C%0A%0A%20%20uninit%3A%20function%28%29%20%7B%0A%20%20%20%20this.context.removeEventListener%28%27popupshowing%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20this.menu.removeEventListener%28%27DOMMouseScroll%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20gBrowser.mPanelContainer.removeEventListener%28%27click%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20window.removeEventListener%28%27unload%27%2C%20this%2C%20false%29%3B%0A%20%20%7D%2C%0A%0A%20%20destroy%3A%20function%28%29%7B%0A%20%20%20%20this.uninit%28%29%3B%0A%20%20%20%20document.getElementById%28%27context-searchselect%27%29.style.removeProperty%28%27display%27%29%3B%0A%20%20%20%20var%20m%20%3D%20document.getElementById%28%27context-searcher%27%29%3B%0A%20%20%20%20if%20%28m%29%0A%20%20%20%20%20%20m.parentNode.removeChild%28m%29%3B%0A%20%20%20%20m%20%3D%20document.getElementById%28%27context-searcher-dummy%27%29%3B%0A%20%20%20%20if%20%28m%29%0A%20%20%20%20%20%20m.parentNode.removeChild%28m%29%3B%0A%20%20%7D%2C%0A%0A%20%20handleEvent%3A%20function%28event%29%20%7B%0A%20%20%20%20if%20%28this%5Bevent.type%5D%29%0A%20%20%20%20%20%20this%5Bevent.type%5D%28event%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20unload%3A%20function%28e%29%7B%0A%20%20%20%20this.uninit%28%29%3B%0A%20%20%7D%2C%0A%0A%20%20DOMMouseScroll%3A%20function%28e%29%20%7B%0A%20%20%20%20this.searchEngines%20%3D%20this.searchService.getVisibleEngines%28%7B%7D%29%3B%0A%20%20%20%20if%20%28%21this.searchEngines%20%7C%7C%20this.searchEngines.length%20%3D%3D%200%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%0A%20%20%20%20var%20index%20%3D%20this.searchEngines.indexOf%28this.searchService.currentEngine%29%3B%0A%20%20%20//var%20newEngine%20%3D%20e.detail%20%3E%200%3F%0A%20%20%20//this.searchEngines%5Bindex+1%5D%20%7C%7C%20this.searchEngines%5B0%5D%3A%0A%20%20%20//this.searchEngines%5Bindex-1%5D%20%7C%7C%20this.searchEngines%5Bthis.searchEngines.length%20-1%5D%3B%0A%20%20%20%20var%20newEngine%20%3D%20e.detail%20%3E%200%3F%20this.searchEngines%5Bindex+1%5D%20%3A%20this.searchEngines%5Bindex-1%5D%3B%0A%20%20%20%20if%20%28%21newEngine%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.searchService.currentEngine%20%3D%20newEngine%3B%0A%20%20%20%20this.setMenuitem%28%29%3B%0A%20%20%7D%2C%0A%0A%20%20command%3A%20function%28e%29%7B%0A%20%20%20%20var%20target%20%3D%20e.target%3B%0A%20%20%20%20var%20engine%20%3D%20e.target.engine%20%7C%7C%20this.menu.engine%3B%0A%0A%20%20%20%20var%20submission%20%3D%20engine.getSubmission%28this.searchText%2C%20null%29%3B%0A%20%20%20%20if%20%28%21submission%29%0A%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20if%20%28%21this.NEW_TAB%20%7C%7C%20content.location.href%20%3D%3D%3D%20%27about%3Ablank%27%29%20%7B%0A%20%20%20%20%20%20loadURI%28submission.uri.spec%2C%20null%2C%20submission.postData%2C%20false%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28submission.uri.spec%2C%20%7B%0A%20%20%20%20%20%20%20%20postData%3A%20submission.postData%2C%0A%20%20%20%20%20%20%20%20ownerTab%3A%20gBrowser.mCurrentTab%2C%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20click%3A%20function%28event%29%20%7B%0A%20%20%20%20if%20%28event.button%20%3D%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20this._clickNode%20%3D%20event.rangeParent%3B%0A%20%20%20%20%20%20this._clickOffset%20%3D%20event.rangeOffset%3B%0A%20%20%20%20%20%20this._clientX%20%3D%20event.clientX%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20this._clickNode%20%3D%20null%3B%0A%20%20%20%20%20%20this._clickOffset%20%3D%200%3B%0A%20%20%20%20%20%20this._clientX%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20setMenuitem%3A%20function%28%29%20%7B%0A%20%20%20%20var%20currentEngine%20%3D%20this.searchService.currentEngine%3B%0A%20%20%20%20var%20l%20%3D%20this.searchText.length%20%3E%2016%3F%20this.searchText.substr%280%2C%2016%29%20+%20%27...%27%20%3A%20this.searchText%3B%0A%20%20%20%20this.menu.engine%20%3D%20currentEngine%3B%0A%20%20%20%20this.menu.setAttribute%28%27label%27%2C%20gNavigatorBundle.getFormattedString%28%22contextMenuSearch%22%2C%20%5BcurrentEngine.name%2C%20l%5D%29%29%3B%0A%20%20%20%20if%20%28currentEngine.iconURI%29%0A%20%20%20%20%20%20this.menu.style.listStyleImage%20%3D%20%27url%28%22%27%20+%20currentEngine.iconURI.spec%20+%20%27%22%29%27%3B%0A%20%20%20%20else%20%0A%20%20%20%20%20%20this.menu.style.removeProperty%28%27list-style-image%27%29%3B%0A%20%20%7D%2C%0A%0A%20%20popupshowing%3A%20function%28e%29%7B%0A%20%20%20%20if%20%28e.target%20%21%3D%20this.context%29%20return%3B%0A%0A%20%20%20%20this.searchText%20%3D%20gContextMenu.isTextSelected%3F%20this.getBrowserSelection%28%29%3A%20%27%27%20%7C%7C%20%0A%20%20%20%20%20%20gContextMenu.onLink%3F%20gContextMenu.linkText%28%29%3A%20%27%27%20%7C%7C%20%0A%20%20%20%20%20%20gContextMenu.onTextInput%3F%20this.getTextInputSelection%28%29%20%3A%20%27%27%20%7C%7C%0A%20%20%20%20%20%20this.getCursorPositionText%28%29%3B%0A%0A%20%20%20%20if%20%28%21this.searchText%20%7C%7C%20%21/%5CS/.test%28this.searchText%29%29%20%7B%0A%20%20%20%20%20%20this.menu.hidden%20%3D%20true%3B%0A%20%20%20%20%20%20this.dummy.hidden%20%3D%20true%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28this.searchText.length%20%3E%20256%29%0A%20%20%20%20%20%20this.searchText%20%3D%20this.searchText.substr%280%2C%20256%29%3B%0A%20%20%20%20this.menu.hidden%20%3D%20false%3B%0A%20%20%20%20this.dummy.hidden%20%3D%20false%3B%0A%20%20%20%20%0A%20%20%20%20if%20%28%21this.popup.hasChildNodes%28%29%20%7C%7C%20e.ctrlKey%29%0A%20%20%20%20%20%20this.createMenuitem%28%29%3B%0A%20%20%20%20%0A%20%20%20%20this.setMenuitem%28%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20createMenuitem%3A%20function%28%29%7B%0A%20%20%20%20this.searchEngines%20%3D%20this.searchService.getVisibleEngines%28%7B%7D%29%3B%0A%20%20%20%20if%20%28%21this.searchEngines%20%7C%7C%20this.searchEngines.length%20%3D%3D%200%29%0A%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20var%20f%3B%0A%20%20%20%20while%20%28f%20%3D%20this.popup.firstChild%29%20%7B%0A%20%20%20%20%20%20this.popup.removeChild%28f%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20this.menu.engine%20%3D%20this.searchService.currentEngine%3B%0A%20%20%20%20if%20%28this.menu.engine.iconURI%29%0A%20%20%20%20%20%20this.menu.style.listStyleImage%20%3D%20%27url%28%22%27%20+%20this.menu.engine.iconURI.spec%20+%20%27%22%29%27%3B%0A%20%20%20%20else%20%0A%20%20%20%20%20%20this.menu.style.removeProperty%28%27list-style-image%27%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20s%20%3D%20this.searchEngines%2C%20l%20%3D%20s.length%3B%20i%20%3C%20l%3B%20i++%29%20%7B%0A%20%20%20%20%20%20var%20engine%20%3D%20s%5Bi%5D%3B%0A%20%20%20%20%20%20var%20m%20%3D%20document.createElement%28%27menuitem%27%29%3B%0A%20%20%20%20%20%20m.setAttribute%28%27label%27%2C%20engine.name%29%3B%0A%20%20%20%20%20%20if%20%28engine.iconURI%29%20%7B%0A%20%20%20%20%20%20%20%20m.setAttribute%28%27src%27%2C%20engine.iconURI.spec%29%3B%0A%20%20%20%20%20%20%20%20m.setAttribute%28%27class%27%2C%20%27menuitem-iconic%27%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20m.setAttribute%28%27oncommand%27%2C%20%27contextSearcher.command%28event%29%3B%27%29%3B%0A%20%20%20%20%20%20m.setAttribute%28%27onclick%27%2C%20%27checkForMiddleClick%28this%2C%20event%29%3B%27%29%3B%0A%20%20%20%20%20%20m.engine%20%3D%20engine%3B%0A%20%20%20%20%20%20this.popup.appendChild%28m%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%20%20%0A%20%20getBrowserSelection%3A%20function%20%28%29%20%7B%0A%20%20%20%20var%20win%20%3D%20document.commandDispatcher.focusedWindow%3B%0A%20%20%20%20var%20sel%20%3D%20win.getSelection%28%29%3B%0A%20%20%20%20var%20str%20%3D%20%27%27%3B%0A%20%20%20%20if%20%28sel.isCollapsed%29%0A%20%20%20%20%20%20return%20str%3B%0A%0A%20%20%20%20for%28var%20i%20%3D%200%2C%20l%20%3D%20sel.rangeCount%3B%20i%20%3C%20l%3B%20i++%29%20%7B%0A%20%20%20%20%20%20str%20+%3D%20sel.getRangeAt%28i%29%20+%20%27%20%27%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20str.replace%28/%5E%5Cs*%7C%5Cs*%24/g%2C%20%27%27%29.replace%28/%5Cs+/g%2C%20%27%20%27%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20getTextInputSelection%3A%20function%20%28%29%20%7B%0A%20%20%20%20var%20elem%20%3D%20document.commandDispatcher.focusedElement%3B%0A%20%20%20%20var%20str%20%3D%20elem.value.slice%28elem.selectionStart%2C%20elem.selectionEnd%29%3B%0A%20%20%20%20return%20str.replace%28/%5E%5Cs*%7C%5Cs*%24/g%2C%20%27%27%29.replace%28/%5Cs+/g%2C%20%27%20%27%29%3B%0A%20%20%7D%2C%0A%0A%20%20getCursorPositionText%3A%20function%28%29%20%7B%0A%20%20%20%20var%20str%20%3D%20%22%22%3B%0A%20%20%20%20var%20node%20%3D%20this._clickNode%3B%0A%20%20%20%20if%20%28%21node%20%7C%7C%20node.nodeType%20%21%3D%3D%20Node.TEXT_NODE%29%0A%20%20%20%20%20%20return%20str%3B%0A%0A%20%20%20%20var%20offset%20%3D%20this._clickOffset%3B%0A%20%20%20%20var%20text%20%3D%20node.nodeValue%3B%0A%20%20%20%20if%20%28%21text%29%0A%20%20%20%20%20%20return%20str%3B%0A%0A%20%20%20%20var%20range%20%3D%20node.ownerDocument.createRange%28%29%3B%0A%20%20%20%20range.setStart%28node%2C%20offset%29%3B%0A%20%20%20%20var%20rect%20%3D%20range.getBoundingClientRect%28%29%3B%0A%20%20%20%20range.detach%28%29%3B%0A%0A%20%20%20%20if%20%28rect.left%20%3E%3D%20this._clientX%29%0A%20%20%20%20%20%20offset--%3B%0A%0A%20%20%20%20var%20current%20%3D%20text%5Boffset%5D%3B%0A%20%20%20%20var%20type%3B%0A%20%20%20%20for%20%28let%20n%20in%20this._regexp%29%20%7B%0A%20%20%20%20%20%20if%20%28this.endReg%5Bn%5D.test%28current%29%29%20%7B%0A%20%20%20%20%20%20%20%20type%20%3D%20n%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28%21type%29%0A%20%20%20%20%20%20return%20str%3B%0A%0A%20%20%20%20var%20s%20%3D%20this.endReg%5Btype%5D.exec%28%20text.substr%280%2C%20offset%29%20%29%3B%0A%20%20%20%20if%20%28s%29%20str%20+%3D%20s%3B%0A%20%20%20%20s%20%3D%20this.startReg%5Btype%5D.exec%28%20text.substr%28offset%29%20%29%0A%20%20%20%20if%20%28s%29%20str%20+%3D%20s%3B%0A%0A%20%20%20%20if%20%28str.length%20%3D%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%3D%20%22kanji%22%29%20%7B%0A%20%20%20%20%20%20%20%20s%20%3D%20this.startReg%5B%22hiragana%22%5D.exec%28%20text.substr%28offset+1%29%20%29%3B%0A%20%20%20%20%20%20%20%20if%20%28s%29%20str%20+%3D%20s%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20return%20str%3B%0A%20%20%7D%2C%0A%0A%20%20log%3A%20function%28%29%20%7B%0A%20%20%20%20Application.console.log%28%22%5BcontextSearcher%5D%20%22%20+%20Array.slice%28arguments%29%29%3B%0A%20%20%7D%0A%7D%0A%0Awindow.contextSearcher.init%28%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

feas
Вобще, ранее уже кто-то исправлял эту кнопку (или совет был аналогичный), но пусть будет, раз людям надо :)

Dumby

Попробуй в коде заменить все    contextMenuSearchText    на    contextMenuSearch

Так и сделал, теперь прекрасно работает. Положил Код инициализации в кнопку Cookie Manager, в ней было пусто во вкладке Инициализация, не стал ставить отдельную кнопку feas'а.
Спасибо. :)

А можно соорудить такой код?

В адресную строку вставляется мой текст, за которым следует текущий урл. Ну и нажимается Энтер.

rbfyec пишет

В адресную строку вставляется мой текст, за которым следует текущий урл. Ну и нажимается Энтер.

Выделить код

Код:

gURLBar.value = "мой текст" + content.document.location;
gURLBar.focus();

var evt = document. createEvent ("KeyEvents");
evt.initKeyEvent("keypress", true, true, null, false, false, false, false, evt. DOM_VK_RETURN, 0 );
if ( document.activeElement.nodeName == "browser" )
     gBrowser.contentDocument.activeElement.dispatchEvent(evt);
else
     document. activeElement. dispatchEvent (evt);

bunda1, это именно то, что я хотел. Спасибо!

okkamas_knife, спасибо за ссылки, буду стараться разобраться :)

okkamas_knife пишет

bunda1
ну ты накрутил!!
там нужно то всего одну строчку

Выделить код

Код:

loadURI ("мой текст"+gURLBar.value)

А вот не работает этот код. Я получаю сообщение:

Формат адреса неверен

URL недействителен и не может быть загружен.

Адреса веб-сайтов обычно записываются в формате http://www.example.com/
Убедитесь, что вы используете в качестве разделителя прямую косую черту (т.е. /).

Можно как-то написать такой код, чтобы на определённом сайте, точнее на

скрытый текст
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.


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

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

okkamas_knife
Спасибо огромное, я тупанул, посмотрел фаер багом, а он как-то странно тег порезал, кроме ссылки первой картинки не видно больше ничего :dumb:

okkamas_knife пишет

rbfyec а вам для каких целей то? и что вы добавляете впереди?если вам для поиска используя кейворды то вместо кейворда пишите полный адрес запроса например если g - поиск в гугле то вместо loadURI ("g "+gURLBar.value)пишемloadURI ("http://www.google.com/search?q="+gURLBar.value)

Да, именно кейворды я и собирался подставлять :)
Ваш вариант с полным адресом работает. Но не со всеми ресурсами, с некоторыми даёт сбой.
А код, который предложил bunda1 работает с любыми сайтами. Безотказно, как часы!

В любом случае, спасибо большое за помощь!

Прошу сильно не пинать, пишу на яве вообще первый раз, может что-то упустил, не могу врубится, почему кнопка срабатывает через раз?.. :/

Может кто, что посоветует?

скрытый текст
проверить можно, например, тут:
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.

Выделить код

Код:

/*CODE*/
var doc = content.document.body.innerHTML ;

gClipboard.clear() ;

// ---------------------------------------
var razdelit = '"fullimg":["' ;               // Сносим первую часть страницы, по "fullimg":["
var array_of_strings = doc.split(razdelit) ;
cut_string = array_of_strings[1] ;

doc = cut_string ;
// ---------------------------------------
var razdelit = '",]' ;                        // Сносим вторую часть страницы, начиная от ",] 
var array_of_strings = doc.split(razdelit) ;
cut_string = array_of_strings[0] ;

doc = cut_string ;
// ---------------------------------------
var i ;

var ending_str="" ;

var razdelit = '","' ; // Описываем разделители

var array_of_strings = doc.split(razdelit) ; // описываем массив ссылок разделённых razdelit


                                             // собирам окончательную строку из элементов массива
                                             // в конце каждой ссылки добавляем перенос строки -'\n'
for (i=0; i < array_of_strings.length; i++) {

    ending_str = ending_str + array_of_strings[i] + '\n' ;
    
} ;

gClipboard.write(ending_str) ;

alert("Ссылки скопированны в буфер обмена.");

okkamas_knife пишет

проставь алерты на каждом этапе для контроля переменных

Бред какой-то, напихал алертов на каждое действие, кнопка стала работать идеально... O_<"


Добавлено 18 апреля 2013 г. в 12:30

В общем фиг знает почему, но нормально работает такой вот код:

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

Выделить код

Код:

/*CODE*/
var doc = content.document.body.innerHTML ;

gClipboard.clear() ;

// ---------------------------------------
var razdelit = '"fullimg":["' ;               // Сносим первую часть страницы, по "fullimg":["
var array_of_strings = doc.split(razdelit) ;
var cut_string = array_of_strings[1] ;

var doc = cut_string ;

// ---------------------------------------
var razdelit = '",]' ;                        // Сносим вторую часть страницы, начиная от ",] 
var array_of_strings = doc.split(razdelit) ;
var cut_string = array_of_strings[0] ;

var doc = cut_string ;

// ---------------------------------------
var i ;

var ending_str="" ;

var razdelit = '","' ; // Описываем разделители


var array_of_strings = doc.split(razdelit) ; // описываем массив ссылок разделённых razdelit

alert("Ссылки скопированы в буфер обмена.");

                                             // собирам окончательную строку из элементов массива
                                             // в конце каждой ссылки добавляем перенос строки -'\n'
for (i=0; i < array_of_strings.length; i++) {

    ending_str = ending_str + array_of_strings[i] + '\n' ;
    
} ;

gClipboard.write(ending_str) ;


// alert("Ссылки скопированны в буфер обмена.");

http://forum.mozilla-russia.org/viewtopic.php?pid=446701#p446701
DXUi5Dua.jpg
на русский не хочет переводить, в чем может быть дело?

Zaycoff пишет

Прошу сильно не пинать

И меня тоже

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

Выделить код

Код:

/*CODE*/
var links = content.wrappedJSObject.data.fullimg.join("\r\n");
gClipboard.write(links);
alert("Ссылки скопированны в буфер обмена.\nВот они:\n" + links);


P.S. Если вопрос был про редирект, то может в Инициализацию
скрытый текст

Выделить код

Код:

const du = Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
function vk(e) {
    var doc = e.target;
    if (doc.location.host != "vk.com") return;
    var br = du.getParentForNode(doc, true);
    var wn = br.webNavigation;
    wn.allowMetaRedirects = false;
    addEventListener("load", function onLoad() {
        removeEventListener("load", onLoad, true, br);
        wn.allowMetaRedirects = true;
    }, true, br);
}
addEventListener("DOMContentLoaded", vk, false, gBrowser);

Kiril__777 пишет

на русский не хочет переводить, в чем может быть дело?

intl.accept_languages;ru, en-US, en так? Больше причин не знаю, УМВР.

adidharma пишет

intl.accept_languages;ru, en-US, en

что-то я такого вообще не нахожу

Dumby
Ваа!! Как просто... спасибо огромное! :music:

И за вконтакт отдельная благодарность - очень полезная штука, если нужно только почитать его, а разрешать скрипты и логиниться не хочется =)

okkamas_knife
Проверил код кнопки на ESR 10.0.9 и 17.0.5 - глючит точно так же, ладно, фиг с ним, главное хоть так работает :rolleyes:

Kiril__777 пишет

что-то я такого вообще не нахожу

скрытый текст
А, ну да, ступил я, наверно. :dumb: У меня FF английский, с русифкатором, поэтому этот параметр есть. Просто, помнится у меня все кнопки для перевода начали глючить, причина оказалась, что после установки русика добавилось intl.accept_languages;ru, ru-RU, en-US, en
Как убрал ru-RU - стало всё нормально.

p.s. Данный параметр относится к этой настройке:
thumb_9481641_0.png

adidharma
вот так работает, спасибо за подсказку.

скрытый текст
где можно прочитать об этом ru-ru и где хранится эта настройка в профиле?
intl.accept_languages

Zaycoff пишет

И за вконтакт отдельная благодарность - очень полезная штука, если нужно только почитать его, а разрешать скрипты и логиниться не хочется =)

Это где такое?

voqabuhe пишет

Это где такое?

Dumby пишет

P.S. Если вопрос был про редирект, то может в Инициализацию

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

Выделить код

Код:

const du = Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
function vk(e) {
    var doc = e.target;
    if (doc.location.host != "vk.com") return;
    var br = du.getParentForNode(doc, true);
    var wn = br.webNavigation;
    wn.allowMetaRedirects = false;
    addEventListener("load", function onLoad() {
        removeEventListener("load", onLoad, true, br);
        wn.allowMetaRedirects = true;
    }, true, br);
}
addEventListener("DOMContentLoaded", vk, false, gBrowser);

Если это код положить в инициализацию новой кнопки, то при посещении вконтакта можно будет не включать скрипты и куки, часть функционала конечно отвалится, но посты и всякое такое читать будет можно, а мне больше и не нужно, а то дают ссылку на статью во вконтате, а ему ещё и скрипты с куками подавай... бизобразие какой-то :music:

Как бы одну кнопку поправить, чтобы работала в [firefox] 21 и выше. Convert E4X не помогает. :(
Кнопка - Extensions Options Menu (открывает Дополнения и содержит меню со списком расширений, для быстрого доступа к настройкам, где её брал, уже не помню):

скрытый текст
код кнопки

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EExtensions%20Options%20Menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU4NzIwMkI5QkNFNDExRTBCOEIwQzU3QzQyMDBGNDk2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjU4NzIwMkJBQkNFNDExRTBCOEIwQzU3QzQyMDBGNDk2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTg3MjAyQjdCQ0U0MTFFMEI4QjBDNTdDNDIwMEY0OTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NTg3MjAyQjhCQ0U0MTFFMEI4QjBDNTdDNDIwMEY0OTYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4v/lPcAAACe0lEQVR42nRTW0tUURQ++3IuHmecdCJzLDRqisaKoR4zlMDKKLEoiR4qIiLwB/QS/YN6CYSgiCBCaKDAIqJI6GKQGFEqhjUQqQk5w5hnZjq3vVtrPMY46YaPb6+111pn3Q6RUioVhwMMgApwAX8AnrLawQBloH03bzU0b935bN2GLbPIKKO+wu4faEU8MvD4aasvaVO4rn4KGWXUr5YADVIOAeoQfTeuTyeTyc+mGc4io7z0FtjxZV+ENEJN8R0px/YSCiWCq3qhKhSeU3Uz79qF6qK1sNZzbVMRkmo6H/8+OXoC/KzyhmlC4bGaaPQrIdQjlArGuU0p94luOoxpBSkE9EDwgjUfA3sdUAQIbCGWIBnXFjjXclzX51W9KguyBYGKyJphZnQz9Msww7M63DOZbG3Hoa7D4BcGMAxgd3a0fRgbfj7Qub91xvddGoxvOQhxmKpa7Qe7r4xNTF6LJ3bfxnGjsXf+7On7wKnei2ee+K6NZTkrgXMj50kWqo7UffF80oi7gsb83IVLPd1HjxiDr960QbPcwOG/Q6hCd21P5D5+Gq1PtGxLY2Y4hdrGTS0vmapZKtd+G6HINNf0/EoB7KIVnRgZTPU/eBg/dfLYMKjeYgZUrzKnjerIFKXMI4y7vutwIX1OCfMoVx1CiI8BoDycwBA4DwFnlqagEMbype6r2oLiufzq5d6f4+9fvEOWrqOhL/ZKSFHafsBcwKVNlItXqF4I2bA+ynqOdz0CuR8ZZdSX5r5oJytX2Y5vbs5DfWscu1iTTn+r39t+IHnn7j0NGWXU4zvaoX3lKjPgfYBYoMNfdwTwA7ARsKds/2cAr4OSSuevAAMAy+gvpYr6B6sAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.label%20%3D%20%22Extensions%22%3B%0Athis.tooltipText%20%3D%20this.label%3B%0A%0A/*%20*****%20BEGIN%20LICENSE%20BLOCK%20*****%0A%20*%20Version%3A%20MPL%201.1%0A%20*%0A%20*%20The%20contents%20of%20this%20file%20are%20subject%20to%20the%20Mozilla%20Public%20License%20Version%0A%20*%201.1%20%28the%20%22License%22%29%3B%20you%20may%20not%20use%20this%20file%20except%20in%20compliance%20with%0A%20*%20the%20License.%20You%20may%20obtain%20a%20copy%20of%20the%20License%20at%0A%20*%20http%3A//www.mozilla.org/MPL/%0A%20*%0A%20*%20Software%20distributed%20under%20the%20License%20is%20distributed%20on%20an%20%22AS%20IS%22%20basis%2C%0A%20*%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND%2C%20either%20express%20or%20implied.%20See%20the%20License%0A%20*%20for%20the%20specific%20language%20governing%20rights%20and%20limitations%20under%20the%0A%20*%20License.%0A%20*%0A%20*%20Original%20code%20is%20Extensions%20Options%20Menu%20for%20Custom%20Buttons%0A%20*%0A%20*%20The%20Initial%20Developer%20of%20the%20Original%20Code%20is%20LouCypher.%0A%20*%20Portions%20created%20by%20the%20Initial%20Developer%20are%20Copyright%20%28C%29%202011%0A%20*%20the%20Initial%20Developer.%20All%20Rights%20Reserved.%0A%20*%0A%20*%20Contributor%28s%29%3A%0A%20*%20%20LouCypher%20%3Cloucypher@mozillaca.com%3E%0A%20*%0A%20*%20*****%20END%20LICENSE%20BLOCK%20*****%20*/%0A%0Afunction%20%24%28aId%29%20%7B%0A%20%20return%20document.getElementById%28aId%29%3B%0A%7D%0A%0Afunction%20%24xml%28aXML%29%20%7B%0A%20%20return%20cbu.makeXML%28aXML%29%3B%0A%7D%0A%0Afunction%20sort%28aArray%29%20%7B%0A%20%20aArray.sort%28function%28a%2C%20b%29%20%7B%0A%20%20%20%20a%20%3D%20a.name.toLowerCase%28%29%3B%0A%20%20%20%20b%20%3D%20b.name.toLowerCase%28%29%3B%0A%20%20%20%20if%20%28a%20%3C%20b%29%20return%20-1%3B%0A%20%20%20%20if%20%28a%20%3E%20b%29%20return%201%3B%0A%20%20%20%20return%200%3B%0A%20%20%7D%29%0A%7D%0A%0Athis.openDialog%20%3D%20function%28aURL%29%20%7B%0A%20%20openDialog%28aURL%2C%20%22%22%2C%20%22chrome%2C%20dialog%2C%20close%2C%20titlebar%2C%20toolbar%2C%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22scrollbars%2C%20minimizable%2C%20centerscreen%22%29%3B%0A%7D%0A%0Athis.setStatus%20%3D%20function%28aString%29%20%7B%0A%20%20document.getElementById%28%22statusbar-display%22%29.label%20%3D%20aString%3B%0A%7D%0A%0Athis.onclick%20%3D%20function%20inspectExtensions%28aEvent%29%20%7B%0A%20%20if%20%28%28typeof%20inspectObject%20%21%3D%20%22function%22%29%20%7C%7C%0A%20%20%20%20%20%20%28aEvent.button%20%21%3D%201%29%29%20return%3B%0A%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20var%20extensions%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aAddons.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20if%20%28aAddons%5Bi%5D.type%20%3D%3D%20%22extension%22%29%20%7B%0A%20%20%20%20%20%20%20%20extensions.push%28aAddons%5Bi%5D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20sort%28extensions%29%3B%0A%20%20%20%20inspectObject%28extensions%29%3B%0A%20%20%7D%29%0A%7D%0A%0Athis.addonsMgr%20%3D%20function%28aPopup%2C%20aCallback%29%20%7B%0A%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20var%20extensions%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aAddons.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20aAddons%5Bi%5D.toString%20%3D%20function%28%29%20%7B%20return%20this.name%3B%20%7D%0A%20%20%20%20%20%20if%20%28%28aAddons%5Bi%5D.type%20%3D%3D%20%22extension%22%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28aAddons%5Bi%5D.optionsURL%20%21%3D%20null%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20aAddons%5Bi%5D.isActive%29%20%7B%0A%20%20%20%20%20%20%20%20extensions.push%28aAddons%5Bi%5D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20sort%28extensions%29%3B%0A%20%20%20%20aCallback%28aPopup%2C%20extensions%29%3B%0A%20%20%7D%29%0A%7D%0A%0Afunction%20getExtensionObject%28aId%2C%20aCallback%29%20%7B%0A%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aAddons.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20if%20%28aAddons%5Bi%5D.id%20%3D%3D%20aId%29%20%7B%0A%20%20%20%20%20%20%20%20aCallback%28aAddons%5Bi%5D%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%29%0A%7D%0A%0Afunction%20addItem%28aNode%2C%20aId%2C%20aLabel%2C%20aURL%2C%20aIcon%2C%20aHomePage%2C%20aDesc%29%20%7B%0A%20%20aNode.appendChild%28%24xml%28%3Cmenuitem%20xmlns%3D%7Bxulns%7D%20class%3D%22menuitem-iconic%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20GUID%3D%7BaId%7D%20label%3D%7BaLabel%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20image%3D%7BaIcon%7D%20homepage%3D%7BaHomePage%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20statustext%3D%7BaURL%7D%20tooltiptext%3D%7BaDesc%7D/%3E%29%29%3B%0A%7D%0A%0Avar%20popup%20%3D%20%24xml%28%3Cmenupopup%20xmlns%3D%7Bxulns%7D%20context%3D%22cb-extensions-menu%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%22event.stopPropagation%28%29%3B%20this.parentNode.openDialog%28event.target.statusText%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%22this.parentNode.setStatus%28event.target.statusText%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%22this.parentNode.setStatus%28%27%27%29%3B%22/%3E%29%3B%0A%0Athis.populate%20%3D%20function%28aPopup%2C%20aExtensions%29%20%7B%0A%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aExtensions.length%3B%20i++%29%20%7B%0A%20%20%20%20let%20ext%20%3D%20aExtensions%5Bi%5D%3B%0A%20%20%20%20addItem%28aPopup%2C%20ext.id%2C%20ext.name%20+%20%22%20%22%20+%20ext.version%2C%20ext.optionsURL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28ext.iconURL%20%3F%20ext.iconURL%20%3A%20%22chrome%3A//mozapps/skin/extensions/extensionGeneric-16.png%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28ext.homepageURL%20%3F%20ext.homepageURL%20%3A%20ext.reviewURL.replace%28/%5C/reviews/%2C%20%22%22%29.toString%28%29%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ext.description%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.addonsMgr%28popup%2C%20this.populate%29%3B%0A%0Athis.appendChild%28popup%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%0A%0A//---------------------------------%0A%0Athis.copyId%20%3D%20function%28aId%29%20%7B%0A%20%20Cc%5B%22@mozilla.org/widget/clipboardhelper%3B1%22%5D.%0A%20%20getService%28Ci.nsIClipboardHelper%29.copyString%28aId%29%3B%0A%7D%0A%0Athis.goHome%20%3D%20function%28aURL%29%20%7B%0A%20%20gBrowser.loadOneTab%28aURL%29%3B%0A%7D%0A%0Athis.inspect%20%3D%20function%28aId%29%20%7B%0A%20%20getExtensionObject%28aId%2C%20inspectObject%29%3B%0A%7D%0A%0Athis.explore%20%3D%20function%28aId%29%20%7B%0A%20%20var%20dirService%20%3D%20Cc%5B%22@mozilla.org/file/directory_service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIProperties%29%3B%0A%20%20var%20dir%20%3D%20dirService.get%28%22ProfD%22%2C%20Ci.nsIFile%29%3B%0A%20%20dir.append%28%22extensions%22%29%3B%0A%20%20dir.append%28aId%29%3B%0A%20%20if%20%28%21dir.exists%28%29%29%20%7B%0A%20%20%20%20alert%28%22Directory%20%22%20+%20dir.path%20+%20%22%20doesn%27t%20exist%21%22%29%3B%0A%20%20%20%20return%3B%0A%20%20%20%20//dir.append%28%22.xpi%22%29%3B%0A%20%20%20%20//Application.console.log%28dir.path%29%3B%0A%20%20%7D%0A%20%20var%20localFileInterface%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsILocalFile%29%3B%0A%20%20localFileInterface.initWithPath%28dir.path%29%3B%0A%20%20var%20iDirectory%20%3D%20localFileInterface%3B%0A%20%20try%20%7B%0A%20%20%20%20iDirectory.reveal%28%29%3B%0A%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20var%20uri%20%3D%20Cc%5B%22@mozilla.org/network/io-service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIIOService%29.newFileURI%28iDirectory%29%3B%0A%20%20%20%20var%20protocolSvc%20%3D%20Cc%5B%22@mozilla.org/uriloader/external-protocol-service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIExternalProtocolService%29%3B%0A%20%20%20%20protocolSvc.loadUrl%28uri%29%3B%0A%20%20%7D%0A%7D%0A%0Aif%20%28%24%28%22cb-extensions-menu%22%29%29%20%7B%0A%20%20%24%28%22cb-extensions-menu%22%29.parentNode.removeChild%28%24%28%22cb-extensions-menu%22%29%29%3B%0A%7D%0A%0Athis.checkForDOMI%20%3D%20function%28aEvent%29%20%7B%0A%20%20if%20%28typeof%20inspectObject%20%21%3D%20%22function%22%29%20%7B%0A%20%20%20%20aEvent.target.getElementsByTagName%28%22menuitem%22%29%5B2%5D.hidden%20%3D%20true%3B%0A%20%20%7D%0A%7D%0A%0Avar%20popupset%20%3D%20document.getElementById%28%22mainPopupSet%22%29%3B%0Avar%20context%20%3D%20popupset.appendChild%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24xml%28%3Cmenupopup%20xmlns%3D%7Bxulns%7D%20id%3D%22cb-extensions-menu%22%20onclick%3D%22event.stopPropagation%28%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onpopupshowing%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.checkForDOMI%28event%29%3B%22%7D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20label%3D%22Visit%20Home%20Page%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28document.popupNode.getAttribute%28%27homepage%27%29%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28%27%27%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.goHome%28document.popupNode.getAttribute%28%27homepage%27%29%29%3B%22%7D/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20label%3D%22Copy%20GUID%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28%27%27%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.copyId%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20label%3D%22Inspect%20Extension%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28%27%27%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.inspect%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20label%3D%22Browse%20Install%20Directory%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28%27%27%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.explore%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/menupopup%3E%29%29%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20url%20%3D%20%22chrome%3A//mozapps/content/extensions/extensions.xul%22%3B%0A%0Aif%20%28gBrowser.mCurrentTab.linkedBrowser.currentURI.spec%20%3D%3D%20%22about%3Ablank%22%29%20%7B%0A%20%20loadURI%28url%29%3B%0A%20%20return%3B%0A%7D%0A%0Avar%20tabs%20%3D%20gBrowser.mTabs%3B%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20tabs.length%3B%20i++%29%20%7B%0A%20%20if%20%28tabs%5Bi%5D.linkedBrowser.currentURI.spec%20%3D%3D%20url%29%20%7B%0A%20%20%20%20gBrowser.selectedTab%20%3D%20tabs%5Bi%5D%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%7D%0A%0AgBrowser.loadOneTab%28url%2C%20null%2C%20null%2C%20null%2C%20false%29%3B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

код

Выделить код

Код:

var url = "chrome://mozapps/content/extensions/extensions.xul";

if (gBrowser.mCurrentTab.linkedBrowser.currentURI.spec == "about:blank") {
  loadURI(url);
  return;
}

var tabs = gBrowser.mTabs;
for (var i = 0; i < tabs.length; i++) {
  if (tabs[i].linkedBrowser.currentURI.spec == url) {
    gBrowser.selectedTab = tabs[i];
    return;
  }
}

gBrowser.loadOneTab(url, null, null, null, false);

инициализация

Выделить код

Код:

this.label = "Extensions";
this.tooltipText = this.label;

/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * Original code is Extensions Options Menu for Custom Buttons
 *
 * The Initial Developer of the Original Code is LouCypher.
 * Portions created by the Initial Developer are Copyright (C) 2011
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *  LouCypher <loucypher@mozillaca.com>
 *
 * ***** END LICENSE BLOCK ***** */

function $(aId) {
  return document.getElementById(aId);
}

function $xml(aXML) {
  return cbu.makeXML(aXML);
}

function sort(aArray) {
  aArray.sort(function(a, b) {
    a = a.name.toLowerCase();
    b = b.name.toLowerCase();
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
  })
}

this.openDialog = function(aURL) {
  openDialog(aURL, "", "chrome, dialog, close, titlebar, toolbar," +
                       "scrollbars, minimizable, centerscreen");
}

this.setStatus = function(aString) {
  document.getElementById("statusbar-display").label = aString;
}

this.onclick = function inspectExtensions(aEvent) {
  if ((typeof inspectObject != "function") ||
      (aEvent.button != 1)) return;
  AddonManager.getAllAddons(function(aAddons) {
    var extensions = [];
    for (var i = 0; i < aAddons.length; i++) {
      if (aAddons[i].type == "extension") {
        extensions.push(aAddons[i]);
      }
    }
    sort(extensions);
    inspectObject(extensions);
  })
}

this.addonsMgr = function(aPopup, aCallback) {
  AddonManager.getAllAddons(function(aAddons) {
    var extensions = [];
    for (var i = 0; i < aAddons.length; i++) {
      aAddons[i].toString = function() { return this.name; }
      if ((aAddons[i].type == "extension") &&
          (aAddons[i].optionsURL != null) &&
          aAddons[i].isActive) {
        extensions.push(aAddons[i]);
      }
    }
    sort(extensions);
    aCallback(aPopup, extensions);
  })
}

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

function addItem(aNode, aId, aLabel, aURL, aIcon, aHomePage, aDesc) {
  aNode.appendChild($xml(<menuitem xmlns={xulns} class="menuitem-iconic"
                           GUID={aId} label={aLabel}
                           image={aIcon} homepage={aHomePage}
                           statustext={aURL} tooltiptext={aDesc}/>));
}

var popup = $xml(<menupopup xmlns={xulns} context="cb-extensions-menu"
                  oncommand="event.stopPropagation(); this.parentNode.openDialog(event.target.statusText);"
                  onmouseover="this.parentNode.setStatus(event.target.statusText);"
                  onmouseout="this.parentNode.setStatus('');"/>);

this.populate = function(aPopup, aExtensions) {
  for (var i = 0; i < aExtensions.length; i++) {
    let ext = aExtensions[i];
    addItem(aPopup, ext.id, ext.name + " " + ext.version, ext.optionsURL,
                    (ext.iconURL ? ext.iconURL : "chrome://mozapps/skin/extensions/extensionGeneric-16.png"),
                    (ext.homepageURL ? ext.homepageURL : ext.reviewURL.replace(/\/reviews/, "").toString()),
                    ext.description);
  }
}

this.addonsMgr(popup, this.populate);

this.appendChild(popup);
this.type = "menu-button";

//---------------------------------

this.copyId = function(aId) {
  Cc["@mozilla.org/widget/clipboardhelper;1"].
  getService(Ci.nsIClipboardHelper).copyString(aId);
}

this.goHome = function(aURL) {
  gBrowser.loadOneTab(aURL);
}

this.inspect = function(aId) {
  getExtensionObject(aId, inspectObject);
}

this.explore = function(aId) {
  var dirService = Cc["@mozilla.org/file/directory_service;1"].
                   getService(Ci.nsIProperties);
  var dir = dirService.get("ProfD", Ci.nsIFile);
  dir.append("extensions");
  dir.append(aId);
  if (!dir.exists()) {
    alert("Directory " + dir.path + " doesn't exist!");
    return;
    //dir.append(".xpi");
    //Application.console.log(dir.path);
  }
  var localFileInterface = Cc["@mozilla.org/file/local;1"].
                           createInstance(Ci.nsILocalFile);
  localFileInterface.initWithPath(dir.path);
  var iDirectory = localFileInterface;
  try {
    iDirectory.reveal();
  } catch(ex) {
    var uri = Cc["@mozilla.org/network/io-service;1"].
              getService(Ci.nsIIOService).newFileURI(iDirectory);
    var protocolSvc = Cc["@mozilla.org/uriloader/external-protocol-service;1"].
                      getService(Ci.nsIExternalProtocolService);
    protocolSvc.loadUrl(uri);
  }
}

if ($("cb-extensions-menu")) {
  $("cb-extensions-menu").parentNode.removeChild($("cb-extensions-menu"));
}

this.checkForDOMI = function(aEvent) {
  if (typeof inspectObject != "function") {
    aEvent.target.getElementsByTagName("menuitem")[2].hidden = true;
  }
}

var popupset = document.getElementById("mainPopupSet");
var context = popupset.appendChild(
                $xml(<menupopup xmlns={xulns} id="cb-extensions-menu" onclick="event.stopPropagation();"
                                onpopupshowing={"document.getElementById('" + this.id + "').checkForDOMI(event);"}>
                      <menuitem label="Visit Home Page"
                                onmouseover={"document.getElementById('" + this.id + "').setStatus(document.popupNode.getAttribute('homepage'));"}
                                onmouseout={"document.getElementById('" + this.id + "').setStatus('');"}
                                oncommand={"document.getElementById('" + this.id + "').goHome(document.popupNode.getAttribute('homepage'));"}/>
                      <menuitem label="Copy GUID"
                                onmouseover={"document.getElementById('" + this.id + "').setStatus(document.popupNode.getAttribute('GUID'));"}
                                onmouseout={"document.getElementById('" + this.id + "').setStatus('');"}
                                oncommand={"document.getElementById('" + this.id + "').copyId(document.popupNode.getAttribute('GUID'));"}/>
                      <menuitem label="Inspect Extension"
                                onmouseover={"document.getElementById('" + this.id + "').setStatus(document.popupNode.getAttribute('GUID'));"}
                                onmouseout={"document.getElementById('" + this.id + "').setStatus('');"}
                                oncommand={"document.getElementById('" + this.id + "').inspect(document.popupNode.getAttribute('GUID'));"}/>
                      <menuitem label="Browse Install Directory"
                                onmouseover={"document.getElementById('" + this.id + "').setStatus(document.popupNode.getAttribute('GUID'));"}
                                onmouseout={"document.getElementById('" + this.id + "').setStatus('');"}
                                oncommand={"document.getElementById('" + this.id + "').explore(document.popupNode.getAttribute('GUID'));"}/>
                     </menupopup>));

adidharma пишет

где её брал, уже не помню

LouCypher <loucypher@mozillaca.com>

https://loucypher.googlecode.com/svn/custombuttons/xml/
=> https://loucypher.googlecode.com/svn/cu … 20Menu.xml
По виду должна работать. :)

Infocatcher пишет

По виду должна работать. :)

Спасибо за ссылку, но чёто всё-равно работать не хочет. :sick: Раньше совсем меню не работало и кнопка "бледная" была, а теперь выдаёт такую фигню:
[firefox] 21 thumb_4358399_1.png

[nightly] 23 thumb_4356884_0.png

C ABP конфликтует, штоли? :sick:

Да, отключил Adblock - всё нормально стало. С ABP такая ошибка:
2933161_0.png

На 20-й версии тоже такую же ошибку выдаёт, а та кнопка, что я выше привёл, нормально работает. :sick:
:whiteflag:

adidharma
Заменить

Выделить код

Код:

function addItem(aNode, aId, aLabel, aURL, aIcon, aHomePage, aDesc) {
  aNode.appendChild($xml('<menuitem xmlns="' + xulns + '" '
                       + 'class="menuitem-iconic" GUID="' + aId + '" '
                       + 'label="' + aLabel + '" image="' + aIcon + '" '
                       + 'homepage="' + htmlEntities(aHomePage) + '" '
                       + 'statustext="' + aURL + '" '
                       + 'tooltiptext="' + aDesc + '"/>'));
}

на

Выделить код

Код:

function addItem(aNode, aId, aLabel, aURL, aIcon, aHomePage, aDesc) {
  aNode.appendChild($xml('<menuitem xmlns="' + xulns + '" '
                       + 'class="menuitem-iconic" GUID="' + htmlEntities(aId) + '" '
                       + 'label="' + htmlEntities(aLabel) + '" image="' + htmlEntities(aIcon) + '" '
                       + 'homepage="' + htmlEntities(aHomePage) + '" '
                       + 'statustext="' + htmlEntities(aURL) + '" '
                       + 'tooltiptext="' + htmlEntities(aDesc) + '"/>'));
}

Infocatcher
:beer:

для фф 20 есть кнопка BBCode? та что имеется уже не работает :(

Kiril__777 пишет

для фф 20 есть кнопка BBCode? та что имеется уже не работает :(

№6924

voqabuhe работает, спасибо

А как бы сделать, чтобы можно было использовать такую конструкцию

Выделить код

Код:

(function(){var url=document.location.href;window.open('http://my_search.com/?q=' + encodeURIComponent(url))})()

только вместо адреса подставлять содержимое буфера обмена?

okkamas_knife пишет

Чайник
в сниппетах есть код получающий содержимое буфера обмена в переменную
далее
window.open('http://my_search.com/?q=' + enco
заменяем на window.open(blabla + enco
где blabla содержимое буфера обмена.

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

okkamas_knife пишет

пост про работу с текстом там найдёте нужный кусок кода

okkamas_knife, потихоньку пробую вникнуть.
Сейчас я столкнулся с трудностью - не знаю как сделать то что мне нужно. А нужно вот что.

Есть код

Выделить код

Код:

gBrowser.selectedTab = gBrowser.addTab("http://my_url");
function upimg() {
loadURI ("javascript:my_bookmarklet)");
}
setTimeout(upimg, 1000);
var input = content.document.getElementsByName("name")[0];
input.focus();


Получается, всё что идёт после setTimeout не работает. Почему?

Чайник пишет

Получается, всё что идёт после setTimeout не работает. Почему?

При отладке кода полезно смотреть в консоль ошибок:

Метка времени: 23.04.2013 18:06:03
Ошибка: TypeError: input is undefined
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button27@code
Строка: 7

Метка времени: 23.04.2013 18:06:04
Ошибка: SyntaxError: missing ; before statement
Источник: javascript:my_bookmarklet)
Строка 1, символ 14
Исходный код:
my_bookmarklet)

Нет, в консоли ошибок у меня ничего нет :)
Это я ошибся здесь, при написании поста - случайно поставил скобку.

okkamas_knife пишет

если я правильно понял что именно вы хотите.т.е. вы открываете страницу,ждете секунду,запускаете букмарклет, и потом хотите сфокусироваться на нужном элементе, так?

Вы абсолютно правильно поняли! :)

okkamas_knife пишет

надо  либо запихнуть в функцию вызываемую по таймауту

Не получается, нужно чтобы между срабатыванием букмарклета и фокусировкой был небольшой интервал, иначе не работает.

okkamas_knife пишет

если не будет нормально работать то создать второй в котором указать не секунду а две

Тоже не выходит, срабатывает только первый таймер. В том числе и тот код, что вы предложили.
Я погуглил по "два таймера на одной странице" - встречаются советы типа этого http://forum.vingrad.ru/forum/s/14619da … 8783.html#
Но я не знаю как потом прописать эти переменные, просто timer1 и timer2 ?

Я сделал с листенером:

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

Выделить код

Код:

var newTabBrowser = gBrowser.getBrowserForTab(gBrowser.selectedTab = gBrowser.addTab("http://pixator.ru/"));
newTabBrowser.addEventListener("load", function () {loadURI ("javascript:my_bookmarklet");
}, true);
function focus() {
var input = content.document.getElementsByName("id")[0];
input.focus();
//Тут идут ещё пара команд и вроде всё работает
}
window.setTimeout(focus, 2000);


Только у меня не работало, пока я не подставил window перед setTimeout. В каких случаях надо добавлять window?

okkamas_knife пишет

...возможно у вас ваш букмарклет пакостит?

Точно! В этом, как оказалось, и было всё дело.

Спасибо огромное за помощь! :)

В списке готовых кнопок нашёл только одну кнопку "Tabs Counter", но она не подходит мне. Мне нужно, чтобы сразу показывало число вкладок и только. Желательно, чтобы в этом месте

всем привет :rock:

есть такая удобная кнопка Stf - №76. Сохраняет выделенный текст или весь текст на странице как txt файл.
Можно ли как-то подправить код этой кнопки, чтобы после сохранения текста в файл, этот самый txt-файл сразу же автоматически открывался во внешнем текстовом редакторе, который у меня по умолчанию открывает текстовые  файлы.
Мне это очень нужно, чтобы можно было сразу подправить текст.

еще я нашла кнопку Text To Editor - №165, которая умеет так делать, но в отличии от Stf в этой кнопке есть 2 больших неудобства
1) txt-файл создается в папке custombuttons в папке профиля
2) файл имеет постоянное имя TextToEditor.txt

В общем мне очень нужна ваша помощь, чтобы немного подправить кнопку Stf.

diliana

Eщё вариант

скрытый текст
Заменить

Выделить код

Код:

saveURL("data:text/plain," + encodeURIComponent( content.location.href + ("\r\n\r\n" + getSelect() )), fileTitle + ".txt", null, false, false, null, content.document);

на

Выделить код

Код:

var text = convertFromUnicode("UTF-8", content.location + "\r\n\r\n" + getSelect());
    const filePicker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
    filePicker.appendFilters(filePicker.filterText);
    filePicker.defaultExtension = "txt";
    filePicker.defaultString = fileTitle + ".txt";
    filePicker.init(window, "Сохранить как", filePicker.modeSave);
    if (filePicker.show() != filePicker.returnCancel) {
        const foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
        foStream.init(filePicker.file, -1, 0777, 0);
        foStream.write(text, text.length);
        foStream.close();
        filePicker.file.launch();
    }

Dumby это то, что было нужно! просто супер! :rock: спасибо большое-пребольшое!!! :heart:

Тут предложение и запрос по кнопке Текстовые смайлы(Firefox3.6-5.0)
Кнопка работает до 20-й версии включительно, на 21-й отвалилась и восстановить её (с помощью Convert E4X) не выходит :(.
Предложение - поправить имя кнопки и заголовок сообщения - Текстовые смайлы(Firefox3.6-20.0.1), запрос - сделать, чтобы работала на версии 21 и выше. :angel:

adidharma
Поправить имя кнопки и заголовок сообщения может только автор сообщения который тут давно не появлялся. А кнопки я исправлю.

bunda1 пишет

А кнопки я исправлю.

Было бы прекрасно. :beer:
А то я её уже выпилил из своих сборок [firefox] 21 и выше, но до сих пор не могу привыкнуть к отсутствию этой кнопки. :(

okkamas_knife
Хорошо, так и сделаю. Но хотелось чтобы в Готовые кнопки для Custom Buttons был порядок.

okkamas_knife пишет

а зачем править? создай новое сообщение с кнопкой и указанием где работает,если конечно есть желание.

Я о том же думал - тогда новую кнопку сделать и выложить, отдельным постом.

11-05-2013 12:17:29

bunda1 пишет

Но хотелось чтобы в Готовые кнопки для Custom Buttons был порядок, без не работающих кнопок.

Это, наверно, к модераторам/администраторам надо обратиться?

adidharma пишет

Это, наверно, к модераторам/администраторам надо обратиться?

Сложно это, я не возьмусь.

bunda1 пишет

Сложно это, я не возьмусь.

Ну тогда просто отдельным постом выложить. :) :beer:
Как, например http://forum.mozilla-russia.org/viewtop … 82#p607682

Хорошо, примерно через час.

Чуть отвернулся - уже, наверно, не актуально, а выбросить жалко.

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0422%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0435%20%u0441%u043C%u0430%u0439%u043B%u044B%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADExLzA1LzA33bqJ2wAAAi9JREFUeJyVk8tLVHEUxz+/e2dGzWlCp2wxQykyiwQlw0JbhFJBEIEugqB90L5NLnr9A+3b1KZcxeiuxYTUoskQLc1ZJGXYSBk+ynnPvfecFlPqnaDHd3P48X2cc35wjKriw8KRHkzotmL3KXZc1UO9ShatTCOVm4HeT3O75cYXkDmaxNjDVJfB2wT1fhI2YsK4JoqqM95wbHnEH5C91kju2SLuWpzqR/4EhyiuNGVzbjzRNpAuWwBspcb+xQwQZB2bfDxsvR+rTZDpOw7yiuLMX827UXD2oyon7FtXWx/grHQiRR5OJrh+vx+Ano4Nn6GeMwgitFtqNXXhbQLwaDKxU8MnfQH1XMCq4IrpslQ19uu3Lw8t1uqFA9A84Auo54xRRCRm3Le9apdnd5TNA7Xu+RdQSPsXr+M2cnswzlx3NlDNxMDjf6Bq2MyHViy8fEZMeJtIzcaZSHf8ZphId3A32bP9rroWtnEzASE4KiZ6NqTfawGvY8wvRUm9SdB9OAvA/FIrH75E6O6sQuQcbD2hWDaIeKNGVanMHEpaWhwOsk6hHODe0/OkphzfBGf6G7hyqZ1me4XC58dUHRlvGZQRo6psTJ9ubNJ3izb5eMj6BqaBr84Qq4XaKgejQdqiQSgtUFx7TqlUyq6ua6LropZ9x1Scakuq6nDIyhOwKpjAXrAjqBqcSp5CIQd44y2DUndMu1B8ua9bhDsi2ueJxlUEY9ysQaYt492InJL53fofa8ocVmP9V6MAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bconst%20data%20%3D%20%5B%0A%09%22%u042D%u043C%u043E%u0446%u0438%u044F%22%2C%0A%09%5B%0A%09%09%22%u0443%u043B%u044B%u0431%u043A%u0430%22%2C%20%22%3A-%29%22%2C%0A%09%09%22%u0433%u0440%u0443%u0441%u0442%u044C%22%2C%20%22%3A-%28%22%2C%0A%09%09%22%u0437%u0430%u0434%u0443%u043C%u0447%u0438%u0432%u043E%u0441%u0442%u044C%22%2C%20%22%3A-%7C%22%2C%0A%09%09%22%u0441%u043C%u0435%u0445%22%2C%20%22%3A-D%22%2C%0A%09%09%22%u0441%u043C%u0435%u0445%20%u0441%20%u0437%u0430%u0436%u043C%u0443%u0440%u0435%u043D%u043D%u044B%u043C%u0438%20%u0433%u043B%u0430%u0437%u0430%u043C%u0438%22%2C%20%22X-D%22%2C%0A%09%09%22%u0441%u0438%u043B%u044C%u043D%u043E%u0435%20%u043E%u0433%u043E%u0440%u0447%u0435%u043D%u0438%u0435%22%2C%20%22%3A-C%22%2C%0A%09%09%22%u043D%u0435%u0434%u043E%u0432%u043E%u043B%u044C%u0441%u0442%u0432%u043E/%u043E%u0437%u0430%u0434%u0430%u0447%u0435%u043D%u043D%u043E%u0441%u0442%u044C%22%2C%20%22%3A-/%22%2C%0A%09%09%22%u043D%u0435%u0434%u043E%u0432%u043E%u043B%u044C%u0441%u0442%u0432%u043E/%u043E%u0437%u0430%u0434%u0430%u0447%u0435%u043D%u043D%u043E%u0441%u0442%u044C%22%2C%20%22%3A-%5C%5C%22%2C%0A%09%09%22%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%22%3A-0%22%2C%0A%09%09%22%u0441%u0438%u043B%u044C%u043D%u043E%u0435%20%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%228-O%22%2C%0A%09%09%22%u0441%u0438%u043B%u044C%u043D%u043E%u0435%20%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%22%3D-O%22%2C%0A%09%09%22%u0441%u0438%u043B%u044C%u043D%u043E%u0435%20%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%22%3A-%5B%20%5D%22%2C%0A%09%09%22%u0441%u043C%u0443%u0449%u0435%u043D%u0438%u0435%22%2C%20%22%3A-%5B%22%2C%0A%09%09%22%u0441%u0431%u0438%u0442%20%u0441%20%u0442%u043E%u043B%u043A%u0443%22%2C%20%22%250%22%2C%0A%09%09%22%u0437%u043B%u043E%u0440%u0430%u0434%u043D%u044B%u0439%20%20%u0441%u043C%u0435%u0445%22%2C%20%22%3E%3A-D%22%2C%0A%09%09%22%u043A%u043E%u0432%u0430%u0440%u043D%u0430%u044F%20%20%u0443%u043B%u044B%u0431%u043A%u0430%22%2C%20%22%7D%3A-%3E%22%2C%0A%09%09%22%u043A%u043E%u0432%u0430%u0440%u043D%u0430%u044F%20%20%u0443%u043B%u044B%u0431%u043A%u0430%22%2C%20%22%5D%3A-%3E%22%2C%0A%09%09%22%u0441%u0438%u043B%u044C%u043D%u044B%u0439%20%u0441%u043C%u0435%u0445%28%u0434%u043E%20%u0441%u043B%u0451%u0437%29%22%2C%20%22%3A%27-%29%22%2C%0A%09%09%22%u0441%u0438%u043B%u044C%u043D%u044B%u0439%20%u0441%u043C%u0435%u0445%28%u0434%u043E%20%u0441%u043B%u0451%u0437%29%22%2C%20%22%3A%27-D%22%2C%0A%09%09%22%u0441%u0438%u043B%u044C%u043D%u0430%u044F%20%u0437%u043B%u043E%u0441%u0442%u044C%22%2C%20%22D-%3A%22%2C%0A%09%09%22%AB%u0435%u0434%u0435%u0442%20%u043A%u0440%u044B%u0448%u0430%BB%22%2C%20%22/%3A-%28%22%2C%0A%09%09%22%AB%u0435%u0434%u0435%u0442%20%u043A%u0440%u044B%u0448%u0430%BB%22%2C%20%22/%3A-%5D%22%0A%09%5D%2C%0A%09%22%u0414%u0435%u0439%u0441%u0442%u0432%u0438%u0435%22%2C%0A%09%5B%0A%09%09%22%u043F%u043E%u0434%u043C%u0438%u0433%u0438%u0432%u0430%u0442%u044C%22%2C%20%22%3B-%29%22%2C%0A%09%09%22%u0446%u0435%u043B%u043E%u0432%u0430%u0442%u044C%22%2C%20%22%3A-*%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22%3A_%28%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22%3A%7E%28%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22%3A%27%28%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22%3A*%28%22%2C%0A%09%09%22%u0441%u0442%u0440%u0430%u0441%u0442%u043D%u044B%u0439%20%u043F%u043E%u0446%u0435%u043B%u0443%u0439%22%2C%20%22%3A-%7B%7D%22%2C%0A%09%09%22%u043A%u0440%u0438%u0447%u0430%u0442%u044C%22%2C%20%22%3A-@%22%2C%0A%09%09%22%u0440%u043E%u0442%20%u043D%u0430%20%u0437%u0430%u043C%u043A%u0435%22%2C%20%22%3A-X%22%2C%0A%09%09%22%u043E%u0442%u0432%u0440%u0430%u0449%u0435%u043D%u0438%u0435%22%2C%20%22%3A-%21%22%2C%0A%09%09%22%u043F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u044F%u0437%u044B%u043A%22%2C%20%22%3A-P%22%2C%0A%09%09%22%u043F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u044F%u0437%u044B%u043A%22%2C%20%22%3A-p%22%2C%0A%09%09%22%u0433%u0440%u043E%u043C%u043A%u0438%u0439%20%u0441%u043C%u0435%u0445%22%2C%20%22%3Alol%3A%22%0A%09%5D%2C%0A%09%22%u041F%u0435%u0440%u0441%u043E%u043D%u0430%u0436%22%2C%0A%09%5B%0A%09%09%22%u0447%u0435%u043B%u043E%u0432%u0435%u043A%20%u0432%20%u043E%u0447%u043A%u0430%u0445%22%2C%20%228-%29%22%2C%0A%09%09%22%u0447%u0435%u043B%u043E%u0432%u0435%u043A%20%u0432%20%u043E%u0447%u043A%u0430%u0445%22%2C%20%22B-%29%22%2C%0A%09%09%22%u0430%u043D%u0433%u0435%u043B%22%2C%20%22O%3A-%29%22%2C%0A%09%09%22%u0441%u0443%u043C%u0430%u0441%u0448%u0435%u0434%u0448%u0438%u0439%22%2C%20%22%25%29%22%2C%0A%09%09%22%3A*%29%u043F%u044C%u044F%u043D%u044B%u0439%22%2C%20%22%22%2C%0A%09%09%22%u041C%u0435%u0434%u0432%u0435%u0434/%AB%u041F%u0440%u0435%u0432%u0435%u0434%21%22%2C%20%22/b/%22%2C%0A%09%09%22%u041C%u0435%u0434%u0432%u0435%u0434/%AB%u041F%u0440%u0435%u0432%u0435%u0434%21%BB%22%2C%20%22%5C%5Co/%22%2C%0A%09%09%22%u041C%u0435%u0434%u0432%u0435%u0434/%AB%u041F%u0440%u0435%u0432%u0435%u0434%21%BB%22%2C%20%22%u0413%u0433Y%22%2C%0A%09%09%22%u041A%u0442%u0443%u043B%u0445%u0443%22%2C%20%22%7B%3A%u20AC%22%2C%0A%09%09%22%u041A%u0442%u0443%u043B%u0445%u0443%22%2C%20%22%3AE%22%2C%0A%09%09%22%u041A%u0442%u0443%u043B%u0445%u0443%22%2C%20%22%28%3B%2C%3B%29%22%2C%0A%09%09%22%u043A%u043B%u043E%u0443%u043D%22%2C%20%22*%3AO%29%22%2C%0A%09%09%22%u043E%u0441%u043A%u0430%u043B%u0435%u043D%u043D%u044B%u0439%20%20%u0432%u0430%u043C%u043F%u0438%u0440%22%2C%20%22%3A-E%22%2C%0A%09%09%22%u0432%u0430%u043C%u043F%u0438%u0440%20%u0431%u0435%u0437%20%u043A%u043B%u044B%u043A%u0430%22%2C%20%22%3A-F%22%2C%0A%09%09%22%u043C%u0443%u0442%u0430%u043D%u0442/%u043F%u0440%u0438%u0448%u0435%u043B%u0435%u0446%22%2C%20%22%3A%3A-%29%22%2C%0A%09%09%22%u0440%u043E%u0431%u043E%u0442%22%2C%20%22%5B%3A%5D%22%2C%0A%09%09%22%u0432%u043E%u043B%u0448%u0435%u0431%u043D%u0438%u043A%22%2C%20%22-%3D%3C%3A-%29%22%2C%0A%09%09%22%u043A%u0438%u0442%u0430%u0435%u0446%22%2C%20%22%2C%u2019-/%22%2C%0A%09%09%22%u043A%u0438%u0442%u0430%u0435%u0446%22%2C%20%22%3C%7C-%29%22%2C%0A%09%09%22%u0446%u0438%u043A%u043B%u043E%u043F%22%2C%20%22%u043E-%29%22%2C%0A%09%09%22%u0446%u0438%u043A%u043B%u043E%u043F%22%2C%20%22O-%29%22%2C%0A%09%09%22%u0447%u0435%u0440%u0435%u043F%22%2C%20%22%3A-%5D%5B%22%2C%0A%09%09%22%u043A%u0443%u0440%u044F%u0449%u0438%u0439%20%u0442%u0440%u0443%u0431%u043A%u0443%22%2C%20%22%3A-%3F%22%2C%0A%09%09%22%u043E%u043B%u0435%u043D%u044C%22%2C%20%22%u042D%3A-%29%22%2C%0A%09%09%22%u0441%u0435%u0440%u0434%u0446%u0435%22%2C%20%22%3C3%22%2C%0A%09%09%22%u0440%u043E%u0437%u0430%22%2C%20%22@%7D-%3E--%22%2C%0A%09%09%22%u043A%u043E%u0437%u0430%20%28%u0436%u0435%u0441%u0442%29%22%2C%20%22%5C%5Cm/%22%2C%0A%09%09%22%u043A%u043E%u0437%u0430%20%28%u0436%u0435%u0441%u0442%29%22%2C%20%22%5C%5Cm/_%22%2C%0A%09%09%22%u0431%u0430%u044F%u043D%22%2C%20%22%5B%3A%7C%7C%7C%3A%5D%22%2C%0A%09%09%22%u0431%u0430%u044F%u043D%22%2C%20%22%5B%3A%5D/%5C%5C/%5C%5C/%5C%5C%5B%3A%5D%22%2C%0A%09%09%22%u0431%u0430%u044F%u043D%22%2C%20%22%5B%3A%5D%7C%7C%7C%5B%3A%5D%22%2C%0A%09%09%22%u0437%u0430%u0434%u043D%u0438%u0446%u0430%22%2C%20%22%28_%21_%29%22%2C%0A%09%09%22%u0437%u0430%u0434%u043D%u0438%u0446%u0430%22%2C%20%22%28%29%28%29%22%0A%09%5D%0A%5D%3B%0Afunction%20appendNode%28nodeName%2C%20parent%2C%20attrs%29%20%7B%0A%09var%20node%20%3D%20document.createElement%28nodeName%29%3B%0A%09for%20%28var%20attr%20in%20attrs%29%20node.setAttribute%28attr%2C%20attrs%5Battr%5D%29%3B%0A%09parent.appendChild%28node%29%3B%0A%09return%20node%3B%0A%7D%0Athis.insertText%20%3D%20function%28text%29%20%7B%0A%09const%20command%20%3D%20%22cmd_insertText%22%3B%0A%09var%20controller%20%3D%20document.commandDispatcher.getControllerForCommand%28command%29%3B%0A%09if%20%28%21controller%20%7C%7C%20%21controller.isCommandEnabled%28command%29%29%20return%3B%0A%09var%20params%20%3D%20Cc%5B%22@mozilla.org/embedcomp/command-params%3B1%22%5D.createInstance%28Ci.nsICommandParams%29%3B%0A%09params.setStringValue%28%22state_data%22%2C%20text%29%3B%0A%20%20%20%20%20%20%20%20controller.QueryInterface%28Ci.nsICommandController%29.doCommandWithParams%28command%2C%20params%29%3B%0A%7D%3B%0Avar%20popup%20%3D%20appendNode%28%22menupopup%22%2C%20this%2C%20%7B%0A%09position%3A%20%22after_start%22%2C%0A%09oncommand%3A%20%22event.stopPropagation%28%29%3B%20this.parentNode.insertText%28event.target.value%29%22%2C%0A%09oncontextmenu%3A%20%22event.preventDefault%28%29%22%0A%7D%29%3B%0Afor%20%28var%20i%20%3D%200%2C%20l%20%3D%20data.length%3B%20i%20%3C%20l%3B%20i%20+%3D%202%29%20%7B%0A%09var%20menu%20%3D%20appendNode%28%22menu%22%2C%20popup%2C%20%7B%20label%3A%20data%5Bi%5D%20%7D%29%3B%0A%09var%20menupopup%20%3D%20appendNode%28%22menupopup%22%2C%20menu%2C%20%7B%7D%20%29%3B%0A%09var%20items%20%3D%20data%5Bi%20+%201%5D%3B%0A%09for%20%28var%20j%20%3D%200%2C%20s%20%3D%20items.length%3B%20j%20%3C%20s%3B%20j%20+%3D%202%29%20%7B%0A%09%09appendNode%28%22menuitem%22%2C%20menupopup%2C%20%7B%0A%09%09%09label%3A%20items%5Bj%20+%201%5D%20+%20%22%20%22%20+%20items%5Bj%5D%2C%0A%09%09%09value%3A%20items%5Bj%20+%201%5D%0A%09%09%7D%29%3B%0A%09%7D%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.lastChild.openPopup%28this%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0422%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0435%20%u0441%u043C%u0430%u0439%u043B%u044B%20%28%u0410%u0437%u0438%u044F%29%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADExLzA1LzA33bqJ2wAAAi9JREFUeJyVk8tLVHEUxz+/e2dGzWlCp2wxQykyiwQlw0JbhFJBEIEugqB90L5NLnr9A+3b1KZcxeiuxYTUoskQLc1ZJGXYSBk+ynnPvfecFlPqnaDHd3P48X2cc35wjKriw8KRHkzotmL3KXZc1UO9ShatTCOVm4HeT3O75cYXkDmaxNjDVJfB2wT1fhI2YsK4JoqqM95wbHnEH5C91kju2SLuWpzqR/4EhyiuNGVzbjzRNpAuWwBspcb+xQwQZB2bfDxsvR+rTZDpOw7yiuLMX827UXD2oyon7FtXWx/grHQiRR5OJrh+vx+Ano4Nn6GeMwgitFtqNXXhbQLwaDKxU8MnfQH1XMCq4IrpslQ19uu3Lw8t1uqFA9A84Auo54xRRCRm3Le9apdnd5TNA7Xu+RdQSPsXr+M2cnswzlx3NlDNxMDjf6Bq2MyHViy8fEZMeJtIzcaZSHf8ZphId3A32bP9rroWtnEzASE4KiZ6NqTfawGvY8wvRUm9SdB9OAvA/FIrH75E6O6sQuQcbD2hWDaIeKNGVanMHEpaWhwOsk6hHODe0/OkphzfBGf6G7hyqZ1me4XC58dUHRlvGZQRo6psTJ9ubNJ3izb5eMj6BqaBr84Qq4XaKgejQdqiQSgtUFx7TqlUyq6ua6LropZ9x1Scakuq6nDIyhOwKpjAXrAjqBqcSp5CIQd44y2DUndMu1B8ua9bhDsi2ueJxlUEY9ysQaYt492InJL53fofa8ocVmP9V6MAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bconst%20data%20%3D%20%5B%0A%09%22%u042D%u043C%u043E%u0446%u0438%u044F%22%2C%0A%09%5B%0A%09%09%22%u0443%u043B%u044B%u0431%u043A%u0430%22%2C%20%22%28n_n%29%22%2C%0A%09%09%22%u0440%u0430%u0434%u043E%u0441%u0442%u044C%22%2C%20%22%28%5E_%5E%29%22%2C%0A%09%09%22%u0433%u0440%u0443%u0441%u0442%u044C%22%2C%20%22%28%3C_%3E%29%22%2C%0A%09%09%22%u0433%u0440%u0443%u0441%u0442%u044C%22%2C%20%22%28v_v%29%22%2C%0A%09%09%22%u0443%u043B%u044B%u0431%u043A%u0430%20%u0447%u0435%u0440%u0435%u0437%20%u0441%u0438%u043B%u0443%22%2C%20%22%28%5E%20%5E%29%22%2C%0A%09%09%22%u0437%u043B%u043E%u0441%u0442%u044C/%u043A%u0430%u0442%u0435%u0433%u043E%u0440%u0438%u0447%u043D%u043E%u0441%u0442%u044C%22%2C%20%22%28%3E_%3C%29%22%2C%0A%09%09%22%u0441%u043A%u0435%u043F%u0442%u0438%u0447%u043D%u043E%u0441%u0442%u044C%22%2C%20%22%28%3E_%3E%29%22%2C%0A%09%09%22%u0441%u043A%u0435%u043F%u0442%u0438%u0447%u043D%u043E%u0441%u0442%u044C%22%2C%20%22%28%3C_%3C%29%22%2C%0A%09%09%22%u0441%u043A%u043E%u043D%u0444%u0443%u0436%u0435%u043D%u043D%u043E%u0441%u0442%u044C%22%2C%20%22%28-_-%A8%29%22%2C%0A%09%09%22%u0441%u043C%u0443%u0449%u0451%u043D%u043D%u043E%u0441%u0442%u044C%22%2C%20%22%5E_%5E%A8%22%2C%0A%09%09%22%u0441%u043C%u0443%u0449%u0435%u043D%u043D%u043E%u0441%u0442%u044C%20%u0441%20%u043F%u043E%u043A%u0440%u0430%u0441%u043D%u0435%u043D%u0438%u0435%u043C%22%2C%20%22*%5E_%5E*%22%2C%0A%09%09%22%u044F%u0440%u043E%u0441%u0442%u044C%22%2C%20%22%28-_-%23%29%22%2C%0A%09%09%22%u044F%u0440%u043E%u0441%u0442%u044C%22%2C%20%22%28-_-%A4%29%22%2C%0A%09%09%22%u044F%u0440%u043E%u0441%u0442%u044C%22%2C%20%22%28-_-+%29%22%2C%0A%09%09%22%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%22%28o_o%29%22%2C%0A%09%09%22%u0441%u0438%u043B%u044C%u043D%u043E%u0435%20%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%22%280_0%29%22%2C%0A%09%09%22%u043E%u0447%u0435%u043D%u044C%20%u0441%u0438%u043B%u044C%u043D%u043E%u0435%20%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%22%28O_o%29%22%2C%0A%09%09%22%u043E%u0447%u0435%u043D%u044C%20%u0441%u0438%u043B%u044C%u043D%u043E%u0435%20%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%22%28o_O%29%22%2C%0A%09%09%22%u043D%u0435%u043F%u0440%u0438%u044F%u0442%u043D%u043E%u0435%20%u0443%u0434%u0438%u0432%u043B%u0435%u043D%u0438%u0435%22%2C%20%22%28V_v%29%22%2C%0A%09%09%22%u043E%u0431%u0430%u043B%u0434%u0435%u043D%u0438%u0435%22%2C%20%22%28@_@%29%22%2C%0A%09%09%22%u0443%u0441%u0442%u0430%u043B%u043E%u0441%u0442%u044C%20%u0433%u043B%u0430%u0437%22%2C%20%22%28%25_%25%29%22%2C%0A%09%09%22%u0434%u0435%u043F%u0440%u0435%u0441%u0441%u0438%u044F%22%2C%20%22%28u_u%29%22%2C%0A%09%09%22%u0447%u0435%u0440%u0442%21%22%2C%20%22%28%3Ex%3C%21%29%22%2C%0A%09%09%22%u0440%u0435%u0432%u043D%u0438%u0432%u044B%u0439%22%2C%20%228%28%3E_%3C%298%22%2C%0A%09%09%22%u043A%u043E%u0441%u043E%u0439%20%u0432%u0437%u0433%u043B%u044F%u0434%2C%20%u043D%u0435%u0434%u043E%u0432%u0435%u0440%u0438%u0435%22%2C%20%22%28%3E%3E%29%22%2C%0A%09%09%22%u043D%u0435%u0440%u0432%u043D%u044B%u0439%20%u0442%u0438%u043A%22%2C%20%22%280_%3C%29%22%2C%0A%09%09%22%u0444%u0430%u043D%u0430%u0442%u0435%u043D%u0438%u0435%22%2C%20%22%28*_*%29%22%2C%0A%09%09%22%u0444%u043B%u0435%u0433%u043C%u0430%u0442%u0438%u0447%u043D%u043E%u0441%u0442%u044C/%AB%u043C%u0434%u0430-%u0430-%u0430%u2026%BB%22%2C%20%22-__-%22%2C%0A%09%09%22%u043D%u0435%20%u0441%u043F%u0430%u043B%20%u0432%u0441%u044E%20%u043D%u043E%u0447%u044C%22%2C%20%22%289_9%29%22%2C%0A%09%09%22%u0441%u043E%u043D%u043D%u044B%u0439%20%u0438%u043B%u0438%20%AB%u0434%u043E%u0441%u0442%u0430%u043B%u0438%u2026%BB%22%2C%20%22%3D__%3D%22%2C%0A%09%09%22Zzz.%u0441%u043F%u044F%u0449%u0438%u0439%22%2C%20%22%28-.-%29Zzz.%22%2C%0A%09%09%22Zzz.%u0441%u043F%u044F%u0449%u0438%u0439%22%2C%20%22%28-_-%29Zzz.%22%2C%0A%09%09%22%u0431%u043E%u043B%u0435%u0437%u043D%u0435%u043D%u043D%u043E%u0441%u0442%u044C%22%2C%20%22%28-_-%3B%29%22%2C%0A%09%09%22%u0442%u0440%u0443%u043F%22%2C%20%22%28%u0425_%u0445%29%22%2C%0A%09%09%22%u0442%u0440%u0443%u043F%22%2C%20%22%28+_+%29%22%2C%0A%09%09%22%u0442%u0440%u0443%u043F%22%2C%20%22%28%u0445_%u0445%29%22%0A%09%5D%2C%0A%09%22%u0414%u0435%u0439%u0441%u0442%u0432%u0438%u0435%22%2C%0A%09%5B%0A%09%09%22%u043F%u043E%u0434%u043C%u0438%u0433%u0438%u0432%u0430%u0442%u044C%22%2C%20%22%28%5E_%7E%29%22%2C%0A%09%09%22%u043F%u043E%u0434%u043C%u0438%u0433%u0438%u0432%u0430%u0442%u044C%22%2C%20%22%28%5E_-%29%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22%28%3B_%3B%29%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22%28T_T%29%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22%28TT.TT%29%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22%28ToT%29%22%2C%0A%09%09%22%u043F%u043B%u0430%u043A%u0430%u0442%u044C%22%2C%20%22Q__Q%22%2C%0A%09%09%22%u0440%u0443%u043A%u043E%u043F%u043E%u0436%u0430%u0442%u0438%u0435%22%2C%20%22%3DX%3D%22%2C%0A%09%09%22%u043B%u044E%u0431%u043E%u0432%u044C%22%2C%20%22%5E%7D%7B%5E%22%2C%0A%09%09%22%u043F%u043E%u0446%u0435%u043B%u0443%u0439%22%2C%20%22%28%5E3%5E%29%22%0A%09%5D%2C%0A%09%22%u041F%u0435%u0440%u0441%u043E%u043D%u0430%u0436%22%2C%0A%09%5B%0A%09%09%22%u043A%u043E%u0448%u043A%u0430%28%u043D%u044F%29%22%2C%20%22%28%3D%5E.%5E%3D%29%22%2C%0A%09%09%22%u043A%u043E%u0448%u043A%u0430%28%u043D%u044F%29%22%2C%20%22%3D%5E_%5E%3D%22%2C%0A%09%09%22%u0441%u043E%u0432%u0430%22%2C%20%22%28O%2Co%29%22%2C%0A%09%09%22%u0441%u0432%u0438%u043D%u044C%u044F%22%2C%20%22%5E..%5E%22%2C%0A%09%09%22%u044D%u043C%u043E-%u043A%u0438%u0434%22%2C%20%22///_%u0422%22%2C%0A%09%09%22%u044D%u043C%u043E-%u043A%u0438%u0434%22%2C%20%22T_%5C%5C%5C%5C%5C%5C%22%2C%0A%09%09%22%u044D%u043C%u043E-%u043A%u0438%u0434%22%2C%20%22///_%5E%22%2C%0A%09%09%22%u044D%u043C%u043E-%u043A%u0438%u0434%22%2C%20%22%5E_%5C%5C%5C%5C%5C%5C%22%2C%0A%09%09%22%u041C%u0435%u0434%u0432%u0435%u0434/%AB%u041F%u0440%u0435%u0432%u0435%u0434%21%BB%22%2C%20%22%28%A8%5C%5C%28%u043E_%u041E%29/%A8%29%22%2C%0A%09%09%22%u041A%u0442%u0443%u043B%u0445%u0443%22%2C%20%22%28jIj%29%22%2C%0A%09%09%22%u041A%u0442%u0443%u043B%u0445%u0443%22%2C%20%22%28%3B%2C%3B%29%22%2C%0A%09%09%22%u041A%u0442%u0443%u043B%u0445%u0443%22%2C%20%22%28o%2C.%2CO%29%22%2C%0A%09%09%22%u041A%u0442%u0443%u043B%u0445%u0443%22%2C%20%22Y%28O%2C%2C%2C%2CO%29Y%22%2C%0A%09%09%22%u0436%u0438%u0432%u043E%u0439%20%u0441%u0440%u0435%u0434%u0438%20%u0437%u043E%u043C%u0431%u0438%22%2C%20%22%28x%28x_%28x_x%28%u041E_%u043E%29x_x%29_x%29x%29%22%2C%0A%09%09%22%u043F%u0440%u043E%u0441%u043D%u0443%u043B%u0441%u044F%20%u0432%20%u043C%u0435%u0442%u0440%u043E%22%2C%20%22%28-%28-_%28-_-%28%u041E_%u043E%29-_-%29_-%29-%29%22%2C%0A%09%09%22%u043E%u0432%u0435%u043D%2C%20%u0431%u0430%u0440%u0430%u0448%u043A%u0430%22%2C%20%22@-_-@%22%0A%09%5D%0A%5D%3B%0Afunction%20appendNode%28nodeName%2C%20parent%2C%20attrs%29%20%7B%0A%09var%20node%20%3D%20document.createElement%28nodeName%29%3B%0A%09for%20%28var%20attr%20in%20attrs%29%20node.setAttribute%28attr%2C%20attrs%5Battr%5D%29%3B%0A%09parent.appendChild%28node%29%3B%0A%09return%20node%3B%0A%7D%0Athis.insertText%20%3D%20function%28text%29%20%7B%0A%09const%20command%20%3D%20%22cmd_insertText%22%3B%0A%09var%20controller%20%3D%20document.commandDispatcher.getControllerForCommand%28command%29%3B%0A%09if%20%28%21controller%20%7C%7C%20%21controller.isCommandEnabled%28command%29%29%20return%3B%0A%09var%20params%20%3D%20Cc%5B%22@mozilla.org/embedcomp/command-params%3B1%22%5D.createInstance%28Ci.nsICommandParams%29%3B%0A%09params.setStringValue%28%22state_data%22%2C%20text%29%3B%0A%20%20%20%20%20%20%20%20controller.QueryInterface%28Ci.nsICommandController%29.doCommandWithParams%28command%2C%20params%29%3B%0A%7D%3B%0Avar%20popup%20%3D%20appendNode%28%22menupopup%22%2C%20this%2C%20%7B%0A%09position%3A%20%22after_start%22%2C%0A%09oncommand%3A%20%22event.stopPropagation%28%29%3B%20this.parentNode.insertText%28event.target.value%29%22%2C%0A%09oncontextmenu%3A%20%22event.preventDefault%28%29%22%0A%7D%29%3B%0Afor%20%28var%20i%20%3D%200%2C%20l%20%3D%20data.length%3B%20i%20%3C%20l%3B%20i%20+%3D%202%29%20%7B%0A%09var%20menu%20%3D%20appendNode%28%22menu%22%2C%20popup%2C%20%7B%20label%3A%20data%5Bi%5D%20%7D%29%3B%0A%09var%20menupopup%20%3D%20appendNode%28%22menupopup%22%2C%20menu%2C%20%7B%7D%20%29%3B%0A%09var%20items%20%3D%20data%5Bi%20+%201%5D%3B%0A%09for%20%28var%20j%20%3D%200%2C%20s%20%3D%20items.length%3B%20j%20%3C%20s%3B%20j%20+%3D%202%29%20%7B%0A%09%09appendNode%28%22menuitem%22%2C%20menupopup%2C%20%7B%0A%09%09%09label%3A%20items%5Bj%20+%201%5D%20+%20%22%20%22%20+%20items%5Bj%5D%2C%0A%09%09%09value%3A%20items%5Bj%20+%201%5D%0A%09%09%7D%29%3B%0A%09%7D%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.lastChild.openPopup%28this%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

okkamas_knife
Дак ты же сам мне код давал. Поставил во вкладку «Код»
this.lastChild.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
и, вроде и на двойке заработало...

Упс, виноват, не все обратные слэши заэкранировал.
bunda1, поправь в своих тоже.

Dumby пишет

Упс, виноват, не все обратные слэши заэкранировал.
bunda1, поправь в своих тоже.

Не понял, где поправить.

11-05-2013 15:44:46
А понял, сейчас проверю.

11-05-2013 15:58:33
Исправил Текстовые смайлы 2 и Текстовые смайлы(Азия) 2

Всем доброго времени суток!

Нужна помощь с кнопками. После обновления Firefox до версии 21 перестали работать вот эти кнопки:

Они отвалились на самом деле ещё раньше, но тогда помогло включение параметра javascript.options.xml.chrome. Он и сейчас включён, но это больше не помогает.
Можно что-то сделать, чтобы они снова заработали?

MySh пишет

Вставка символа;

№186

MySh пишет

Add-on's (Дополнения) (Firefox 4);
FFolders (Папки Firefox);
Page Encoding (Firefox 13+)
Можно что-то сделать, чтобы они снова заработали?

№76

Add-on's (Дополнения) (Firefox 4);

Тут можно другую кнопку заюзать: №162 и №164

MySh пишет

Нужна помощь с кнопками. После обновления Firefox до версии 21 перестали работать вот эти кнопки:FFolders (Папки Firefox);[*]

Open Firefox folders and files( Firefox 11 + )

Pony_Smile_Pack

Вставка символа;

№186

Спасибо, уже лучше, чем совсем ничего, но всё же не совсем то. Та кнопка позволяла выбрать один символ из выпадающего меню, и он появлялся на ней же, после чего его можно было вставлять много раз, не открывая выпадающего меню; с этой же кнопкой так не получается. К тому же у той кнопки меню не закрывалось, пока не щёлкнешь где-нибудь вне его (возможно, потому, что у меня установлено расширение Stay-Open Menu), а у этой оно всё равно закрывается.

okkamas_knife

Из SpiderMonkey удалена поддержка E4X

Это я уже понял. А как её вернуть? Может быть, есть какое-нибудь расширение для этого?

adidharma

№76

А вот это я не очень понял. По ссылке открывается GitHub, а в нём какие-то файлы. И что мне с ними делать? Это надо самому расширение собирать, что ли?

Тут можно другую кнопку заюзать: №162 и №164

К сожалению, нормально не хочет работать. То есть, вроде работает, но в выпадающем меню какой-то ужас творится (какие-то сущности XML). Видимо, тоже уже не работает.

bunda1

Open Firefox folders and files( Firefox 11 + )

И эта, к сожалению, работать не хочет. :(

MySh пишет

А вот это я не очень понял. По ссылке открывается GitHub, а в нём какие-то файлы. И что мне с ними делать? Это надо самому расширение собирать, что ли?

Там нужно перейти по ссылке http://infocatcher.github.io/Custom_But … rtE4X.html и установить кнопку, тыцнул по "install" (если есть NoScript и/или Redirect Remover, то в первом надо разр. скрипты, а второе отключить). Потом вытащить установленную кнопку и кликая сначала на ней, а потом на требующей конвертации, сконвертировать (будет открыта вкладка с исправленным кодом инициализации). Page Encoding (Firefox 13+) и Вставка символа сконвертились без проблем.

MySh пишет

К сожалению, нормально не хочет работать. То есть, вроде работает, но в выпадающем меню какой-то ужас творится (какие-то сущности XML). Видимо, тоже уже не работает.

В этом посте же написано, как исправить: №164

adidharma

Там нужно перейти по ссылке http://infocatcher.github.io/Custom_But … rtE4X.html и установить кнопку, тыцнул по "install" (если есть NoScript и/или Redirect Remover, то в первом надо разр. скрипты, а второе отключить). Потом вытащить установленную кнопку и кликая сначала на ней, а потом на требующей конвертации, сконвертировать (будет открыта вкладка с исправленным кодом инициализации). Page Encoding (Firefox 13+) и Вставка символа сконвертились без проблем.

Спасибо, буду разбираться.

В этом посте же написано, как исправить: №164

Ещё раз спасибо, исправил, вроде работает.

MySh пишет

bunda1

Open Firefox folders and files( Firefox 11 + )

И эта, к сожалению, работать не хочет. :(

Я сейчас проверил и кнопка работает даже на Nightly :/

bunda1
Кстати о [nightly]. В кнопке Копировать информацию о вкладках( Firefox 3.6 + ) пункт Копировать адрес работает только на активной вкладке. Поправьте, плиз.

voqabuhe пишет

bunda1
Кстати о [nightly]. В кнопке Копировать информацию о вкладках( Firefox 3.6 + ) пункт Копировать адрес работает только на активной вкладке. Поправьте, плиз.

Обнови кнопку, эта ошибка исправлена.

bunda1 пишет

Обнови кнопку, эта ошибка исправлена.

А, спасибо, проморгал обновление.

bunda1

Я сейчас проверил и кнопка работает даже на Nightly :/

Я вспомнил, почему оно не хочет работать — это из-за того, что у меня Linux, да ещё с KDE. Для моей системы Anton сделал специальную версию, которая у меня и стояла. Как бы то ни было, кнопка помогла, всё заработало как нужно. Посмотрим, надолго ли.

MySh
Ну тогда хорошо.

bunda1
К сожалению, не совсем.

Хотелось бы, чтобы в этой кнопке в выпадающем меню отключённые расширения тоже показывались (только в более бледном виде). Можно ли такое сделать? Тогда будет полная замена старой версии.

Какой командой можно закрыть toolbar-context-menu?
Или ещё лучше, как запретить его открывание?

Чайник пишет

Или ещё лучше, как запретить его открывание?

Выделить код

Код:

addEventListener("popupshowing", function(e) e.preventDefault(), false, document.getElementById("toolbar-context-menu"));

Dumby
Что-то не работает оно у меня. Вот мой код:

Выделить код

Код:

// ------  Очистка searchbar по правому клику на иконке лупы

var sbar = document.getElementById("searchbar");
var butt  = document.getAnonymousElementByAttribute(sbar, "anonid", "search-go-button");


butt.setAttribute("onclick", "event.stopPropagation(); clear(event);");
clear = function (event) {

// ------  Добавлен EventListener 
addEventListener("popupshowing", function(e) e.preventDefault(), false, document.getElementById("toolbar-context-menu"));
// -------------------------------------  

if ( event.button == 2 )
   {
     sbar.value=""
    } else {
sbar.handleSearchCommand(event).doCommand();

   }
}

Кликаю по лупе и контекстное меню выскакивает как и без листенера.

Чайник
А если так

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

Выделить код

Код:

// ------  Очистка searchbar по правому клику на иконке лупы

var sbar = document.getElementById("searchbar");
var butt  = document.getAnonymousElementByAttribute(sbar, "anonid", "search-go-button");

var attr = '\
    if (event.button == 2) { event.preventDefault(); this.parentNode.parentNode.value = ""; }\
    else handleSearchCommand(event);';

butt.setAttribute("onclick", attr);

Dumby пишет:

Чайник
А если так

Просто блеск!!
Thanks! :D

Подскажите пожалуйста код, чтобы сворачивать браузер сочетанием Shift + F1.

vom

Выделить код

Код:

addEventListener("keypress", function(e) { if (e.keyCode == e.DOM_VK_F1 && e.shiftKey) minimize() }, false);

Dumby, okkamas_knife
Спасибо большое,

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

vom пишет

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

Свернуть можно если фокус на баузере но развернуть наверно нет.

bunda1
Понятно, для этого нужен плагин переназначения клавиш в самой лисе, видимо.

okkamas_knife
Да, я это понимаю, имелось ввиду нужен плагин, который переназначит сочетание в самой системе. Впрочем переназначать есть чем, но у лисы должен быть единый параметр окна hide/show, а не только minimize.

Насчёт кнопок в UX:

feas пишет

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

adidharma пишет

Если это насчёт CB, то большинство кнопок всё-равно работать не будет. :(

тут случайно обнаружил - если перетащить неработающие кнопки с панели навигации (не работают только те кнопки, у которых код в Инициализации, точнее код из Инициализации не работает, а из секции "Код" работает) на панель закладок, а потом назад, то они начинают работать. Однако после перезапуска UX опять перестают работать. :( Возможно ли это это как-то пофиксить, может кнопку какую сделать можно для этого? :sick: :blush:

Можно сделать, чтобы кнопка вызывала на searchbar-e то контекстное меню, что открывается у выделенного текста на странице?
Ну и конечно, чтоб пункты меню работали.

Ferguss114 пишет

Можно сделать, чтобы кнопка вызывала на searchbar-e то контекстное меню, что открывается у выделенного текста на странице?
Ну и конечно, чтоб пункты меню работали.

Разве там нет таково меню:
thumbecb.jpg

adidharma пишет

Возможно ли это это как-то пофиксить

У меня так сработало

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

Выделить код

Код:

var sel = '#nav-bar-customizationtarget > toolbarbutton[id^="custombuttons-button"]:not([initialized])';
Array.forEach(document.querySelectorAll(sel), btn => { try { btn.init() } catch(ex) {} });

Dumby
О чём речь, что делает этот код :(

bunda1 пишет

О чём речь, что делает этот код

Дело было так

скрытый текст
Забрал этот :usch: UX.
А там - похоже, что кнопки, вытащенные на #nav-bar,
не хотят инициализироваться сами.

Ну а код, будучи положен в Инициализацию кнопки,
которой больше повезло с расположением,
инициализирует их принудительно, надеюсь...

Dumby
Спасибо, теперь понятно

Dumby пишет

У меня так сработало

Спасибо, это работает. :beer:

02-06-2013 20:41:43

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

Dumby пишет

этот :usch: UX

Там, кстати, и установка кнопок на панель дополнений делается весьма костыльным методом - кнопки устанавливаются и их расположение настраивается в обычной Nightly, после чего папка custombuttons и файл localstore.rdf копируются в профиль UX.

Ferguss114 пишет

Сейчас вот сообразил, что этот пункт Searсh с выпадающими поисковиками создан расширением, но может можно как-то реализовать то, о чём я написал?

Я продублировал это пункт меню в контекстном меню панели поиска и обнаружил что он не работает :(

Выделить код

Код:

addEventListener("popupshowing", function(e) {

   var popup = e.originalTarget;

   var cloneSearchSelect = document.getElementById("context-searchselect").cloneNode(true);
   popup.appendChild( cloneSearchSelect );     
          
}, false, document.getElementById("searchbar") );

bunda1 пишет:

Я продублировал это пункт меню в контекстном меню панели поиска и обнаружил что он не работает

Жаль... :(

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

Выделить код

Код:

var  n = prompt('Введите число:', '');

а на выходе оно выдаёт число ровно в 10 раз большее чем введено (т.е. вместо 5 выдаёт 50)... пытаюсь его поделить на 10, раз уж его так колбасит, на выходе получаю в 10 раз меньший результат, т.е 0.5 Умножаю его ещё раз на 10 и получаю нужный, в итоге работает такой вот код:

Выделить код

Код:

var  n = prompt('Введите число:', '');
n = (n/10)*10;

Только у меня так или так и задумано? :/

okkamas_knife
О, спасибо огромное, не знал, привык как в бейсике, что он сам определяет тип данных =)

У меня установлено расширение Greasefire (поиск скриптов для открытой страницы на Userscripts.org), но в последнее время расширение работает из рук вон плохо. И вот я подумал, а нельзя-ли для этой цели использовать сделать кнопку?

Mishania пишет

У меня установлено расширение Greasefire (поиск скриптов для открытой страницы на Userscripts.org), но в последнее время расширение работает из рук вон плохо. И вот я подумал, а нельзя-ли для этой цели использовать сделать кнопку?

Добавить поиск по  Userscripts.org с помощью Add to Search Bar :: Дополнения Firefox

Pony_Smile_Pack
Я так и делаю. Но я нажать кнопку, или скопировать\вставить и нажать кнопку - две большие разницы.

okkamas_knife
Простите, вы не можете помочь, или не хотите?

Mishania
Вот честно, две минуты поиска в гугле:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESearch%20for%20Userscripts.org%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKwSURBVHjabJNJTBNRGID/mc5MQYVWVNCGTbEtNZGDBj1ogolEMR5UJA2LBmMoIokxERIj8ehJjx6MYIQoJgq4JIa6gEARkKJFTa2iFFtKWwp2oeDCzNQ+31DQCc5L/nmT/P/3749ACAFBECBxiEPFFds0Ws399DRVhtX2udc97ig0PmgOLBkIbOwjAR8uMRRdvXF7pqv/NfrqnEAOlxsdLas6j3Wk2AEpCRcbKvLydrdu1WUr0lXrITEhAZKUSkhQKvKwXiY2ppbDRzCcv29P/ZZsDaSqUkCJYVJGwKMnHTDlmWgTZ/CvjkW4sKTScP1WC+oZsKAxpwv5gyEUnAkj2xc70p88Y8Y2a8VBxT0gispOGa413UVDb23IMe6OwaEw+jTqQKMOF3pptqBSw7k74hLEPaDUOu0VmpFDV58ZCJIAkiDB5fUBz0eApmjQqbOgrqa69HhVbZO4jKUfmiBJBctysHJFPPiDYbA7J4DjeJDLaWAYGVAyErIy0uDs6RPH9OXVtULWYgfEmN3emJK8BlYrEsHl8cEvloX4ODnEyRlgKGZhV1iOhcz0VNixM7dOCCp2EBkeMF3u6DaNqDasg1U4CzlFxxSRKMyz8xjmsPAQwNmRsc2jxGPkR0esHp7n9RBFrYbyUi1DUzh1GujFG0UBQrNz8P7DR3j+9NklqTEK3VVkbNLkVNZc9AwNW5Hb60PT/gCamg6gEbsT3XvYjvIP6i9gu2ShhOWb+BvLD13O9o3azWrVdy4K3wKhv5HfWW1Q39BY19nechPbzQrVwX9bhU+iIqnyQMF+mPvJQr/FCsHwDJgG30ADhl8Y2wQ4jIUVkpdaZRnPcd6AfxomJ32AIhEwdvaC8XG7JLwwvmXPmVFn52Tu2lvQjN9Crn3M6bWY+6otr3oGpWCB/SPAAJaJRguGUxB0AAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Aurl%3DgetBrowser%28%29.currentURI.spec%3B%0Adomen%20%3D%20url.split%28/%5C/+/g%29%5B1%5D%3B%0AgetBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%20%28%22https%3A//userscripts.org/scripts/search%3Fq%3D%22%20+%20domen%20+%22%26submit%3DSearch%22%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Выделить код

Код:

url=getBrowser().currentURI.spec;
domen = url.split(/\/+/g)[1];
getBrowser (). selectedTab = getBrowser (). addTab ("https://userscripts.org/scripts/search?q=" + domen +"&submit=Search");

Есть ли кнопка, которая открывает окошко с сохранёнными паролями именно для того сайта, на котором она была нажата?

1fesFFFF пишет

Есть ли кнопка, которая открывает окошко с сохранёнными паролями именно для того сайта, на котором она была нажата?

Если нет и если правильно понял, то может новую, и во вкладку Код

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

Выделить код

Код:

var str = "";
var loc = content.location;
if (!loc.protocol.indexOf("http")) str = loc.host;
var win = Services.wm.getMostRecentWindow("Toolkit:PasswordManager");
if (win) win.setFilter(str), win.focus();
else openDialog(
    "chrome://passwordmgr/content/passwordManager.xul",
    "_blank",
    "resizable,dialog=no,centerscreen",
    { filterString: str }
);

Dumby
Спасибо, то что нужно! :D

Подскажите пожалуйста, как изменить сохранение изображений с двойного на одинарный клик ПКМ в этой кнопке Autocopy+3? И можно ли сделать выделение слова по одинарному ЛКМ, а абзаца по двойному?

Loom пишет

Подскажите пожалуйста, как изменить сохранение изображений с двойного на одинарный клик ПКМ в этой кнопке Autocopy+3?

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EAutocopy+3%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20Autocopy+3%20%u043E%u0442%2005.08.2013.%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20cbu.setPrefs%28%22Autocopy%22%2C%20%21cbu.getPrefs%28%22Autocopy%22%29%20%29%3B%20%0A%20%20%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20menuPopup.showPopup%28%20this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%7D%3B%20%0A%0A%0A%0A//%20%u041F%u0440%u043E%u0432%u0435%u0440%u0438%u0442%u044C%20%u043D%u0430%u043B%u0438%u0447%u0438%u0435%20%u0441%u0442%u0440%u043E%u043A%20%u0432%20%27about%3Aconfig%27%20%u0438%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u0435%u0441%u043B%u0438%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20................................%0Aif%20%28%20%21cbu.isPref%28%22Autocopy.saveWithDoubleClick%22%29%20%29%20%7B%0A%20%20%20%20%20%5B%22Autocopy%22%2C%20%22Autocopy.reset%22%2C%20%22Autocopy.selectingTextBlink%22%2C%20%22Autocopy.selectWithDoubleClick%22%2C%0A%20%20%20%20%20%20%22Autocopy.copyWithDoubleClick%22%2C%20%22Autocopy.saveWithDoubleClick%22%5D.forEach%28function%28pref%29%20%7B%20cbu.setPrefs%28%20pref%2C%20false%20%29%20%7D%29%3B%0A%7D%3B%0A%0A%0A%20%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20................................%0Avar%20menuPopup%20%3D%20document.getElementById%28%22mainPopupSet%22%29.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%0A//%20%u043C%u0430%u0441%u0441%u0438%u0432%20%u0441%20%u0434%u0430%u043D%u043D%u044B%u043C%u0438%20%u0434%u043B%u044F%20%u0441%u043E%u0437%u0434%u0430%u043D%u0438%u0435%20%u043C%u0435%u043D%u044E%20....%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0430%u0432%u0442%u043E%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%u043F%u0440%u0438%20%u0432%u044B%u0445%u043E%u0434%u0435%20%u0438%u0437%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%27%2C%20value%3A%20%27Autocopy.reset%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043C%u0438%u0433%u0430%u0435%u0442%20%u043F%u0440%u0438%20%u0430%u0432%u0442%u043E%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0438%27%2C%20value%3A%20%27Autocopy.selectingTextBlink%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0414%u0432%u043E%u0439%u043D%u043E%u0439%20%u043F%u0440%u0430%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%27%2C%20value%3A%20%27Autocopy.copyWithDoubleClick%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0414%u0432%u043E%u0439%u043D%u043E%u0439%20%u043B%u0435%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u0432%u044B%u0434%u0435%u043B%u044F%u0435%u0442%20%u0432%u0441%u0435%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0445%20%u043F%u043E%u043B%u044F%u0445%27%2C%20value%3A%20%27Autocopy.selectWithDoubleClick%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u041F%u0440%u0430%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u0441%u043E%u0445%u0440%u0430%u043D%u044F%u0435%u0442%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%27%2C%20value%3A%20%27Autocopy.saveWithDoubleClick%27%20%7D%2C%20%0A%20%20%20%20%7B%20label%3A%20%27%u0421%u0440%u0435%u0434%u043D%u0438%u043C%20%u043A%u043B%u0438%u043A%u043E%u043C%20%u0432%u0441%u0442%u0430%u0432%u043B%u044F%u0442%u044A%20%u0442%u0435%u043A%u0441%u0442%20%u0441%20%u0437%u0430%u043C%u0435%u043D%u043E%u0439%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%27%2C%20value%3A%20%27middlemouse.paste%27%20%7D%0A%5D%3B%0A%0A//%20%u0446%u0438%u043A%u043B%20%u043F%u043E%20%u043E%u0447%u0435%u0440%u0435%u0434%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0438%u0437%20%u043C%u0430%u0441%u0441%u0438%u0432%u0430%20%u043D%u0443%u0436%u043D%u044B%u0435%20%u0430%u0442%u0440%u0438%u0431%u0443%u0442%u044B%20%u043A%20%u043F%u0443%u043D%u043A%u0442%u0430%u043C%20%u043C%u0435%u043D%u044E%20....%20%20%0Aarray.forEach%28function%28%20m%20%29%20%7B%0A%20%20%20%20if%20%28%20%22separator%22%20in%20m%20%29%20%7B%20menuPopup.appendChild%28%20document.createElement%28%22menuseparator%22%29%20%29%3B%20return%20%7D%3B%0A%20%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20mItem.setAttribute%28%22label%22%2C%20m.label%29%3B%0A%20%20%20%20mItem.setAttribute%28%27type%27%2C%20%27checkbox%27%29%3B%0A%20%20%20%20mItem.setAttribute%28%27checked%27%2C%20custombuttons.getPrefs%28%20m.value%20%29%20%29%3B%0A%20%20%20%20mItem.setAttribute%28%27onclick%27%2C%20%27custombuttons.setPrefs%28%22%27%20+%20m.value%20+%20%27%22%2C%20%21custombuttons.getPrefs%28%22%27%20+%20m.value%20+%20%27%22%29%29%27%29%3B%20%20%0A%20%20%20%20menuPopup.appendChild%28%20mItem%20%29%3B%0A%7D%29%3B%0AaddDestructor%28function%28%29%20%7B%20menuPopup.parentNode.removeChild%28%20menuPopup%20%29%20%7D%29%3B%20//%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0434%u0443%u0431%u043B%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%u043C%u0435%u043D%u044E%20%0A%0A//%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u043C%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20....%0AmenuPopup.appendChild%28%20document.createElement%28%22menuseparator%22%29%20%29%3B%0Avar%20cbContextPopup%20%3D%20document.getElementById%28%22custombuttons-contextpopup%22%29%3B%0Avar%20clone%20%3D%20cbContextPopup.cloneNode%28true%29%3B%0Aclone.setAttribute%28%22onpopupshowing%22%2C%20%22document.popupNode%20%3D%20document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29%22%29%3B%0Avar%20menu%20%3D%20document.createElement%28%22menu%22%29%3B%0Amenu.setAttribute%28%22label%22%2C%20%22%u041C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%22%29%3B%0Amenu.appendChild%28%20clone%20%29%3B%0AmenuPopup.appendChild%28%20menu%20%29%3B%0A%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u043D%u0430%u0441%u0442%u0440%u043E%u0435%u043A%20%u0432%20%27about%3Aconfig%27%20................................%0Avar%20button%20%3D%20this%2C%20s%20%3D%20%22Autocopy%22%3B%0Afunction%20toggleImage%28%29%20%7B%20%20%0A%20%20%20%20button.image%20%3D%20cbu.getPrefs%28s%29%0A%20%20%20%20%3F%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%0A%20%20%20%20%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%3B%0A%7D%3B%20%20%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28%20s%2C%20toggleImage%2C%20false%20%29%3B%0AaddDestructor%28function%28%29%20%7B%20gPrefService.removeObserver%28%20s%2C%20toggleImage%2C%20false%20%29%20%7D%29%3B%20%20%0A%0A%0A%0A//%20%u0412%u044B%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043F%u0440%u0438%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0438%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20................................%0Avar%20turnOffButton%20%3D%20%7B%0A%20%20%20%20observe%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20if%20%28%20cbu.getPrefs%28%22Autocopy.reset%22%29%20%26%26%20data%20%3D%3D%20%22shutdown%22%20%29%20cbu.setPrefs%28%22Autocopy%22%2C%20false%20%29%3B%20%20%0A%20%20%20%20%7D%0A%7D%3B%0AServices.obs.addObserver%28%20turnOffButton%2C%20%22quit-application%22%2C%20false%29%3B%0A%0A%0A%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u0438%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%2C%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20................................%0Afunction%20autocopy%28e%29%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20return%3B%0A%0A%20%20%20if%20%28%20/input%7Cpassword%7Ctextarea%7Ctextbox%7Csearchbar%7Cfindbar/.test%28%20e.target.localName.toLowerCase%28%29%20%29%20%29%20return%3B%0A%20%20%20%0A%20%20%20if%20%28%20e.type%20%3D%3D%20%27mousedown%27%20%29%20var%20lastSelection%20%3D%20getBrowserSelection%28%29%3B%0A%20%20%20%0A%20%20%20if%20%28%20e.type%20%21%3D%3D%20%27mouseup%27%20%29%20return%3B%20%0A%20%20%20%0A%20%20%20var%20selection%20%3D%20getBrowserSelection%28%29%3B%0A%20%20%20if%20%28%20cbu.getPrefs%28%22Autocopy%22%29%20%26%26%20selection%20%26%26%20selection%20%21%3D%3D%20lastSelection%20%29%20%7B%0A%20%20%20%20%20%20%20%20goDoCommand%28%27cmd_copy%27%29%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043C%u0438%u0433%u0430%u0435%u0442%20....%0A%20%20%20%20%20%20%20%20if%20%28%20%21cbu.getPrefs%28%22Autocopy.selectingTextBlink%22%29%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20document.activeElement.blur%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20window.content.focus%28%29%20%7D%2C%20300%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0AaddEventListener%28%22mouseup%22%2C%20autocopy%2C%20false%2C%20gBrowser%20%29%3B%0AaddEventListener%28%22mousedown%22%2C%20autocopy%2C%20false%2C%20gBrowser%20%29%3B%0A%0A%0A%0A//%20C%u0440%u0435%u0434%u043D%u0435%u0439%20%u043A%u043D%u043E%u043F%u043A%u043E%u0439%20%u043C%u044B%u0448%u0438%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0435%20%u043F%u043E%u043B%u044F%20%u0441%20%u0437%u0430%u043C%u0435%u043D%u043E%u0439%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20................................%0Afunction%20middleMousePaste%28e%29%20%7B%20%0A%20%20%20%20if%20%28%20e.button%20%3D%3D%201%20%26%26%20cbu.getPrefs%28%27middlemouse.paste%27%29%20%29%20%7B%0A%0A%20%20%20%20%20%20%20%20%20if%20%28%20/input%7Cpassword%7Ctextarea%7Ctextbox%7Csearchbar%7Cfindbar%7Ccbeditor/.test%28%20e.target.localName.toLowerCase%28%29%20%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20document.commandDispatcher.getControllerForCommand%28%22cmd_paste%22%29%20%29%20%7B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20cmd%20%3D%20%22cmd_insertText%22%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20commandDispatcher%20%3D%20%28%20this.document%20%7C%7C%20document%20%29.commandDispatcher%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20controller%20%3D%20commandDispatcher.getControllerForCommand%28cmd%29%3B%0A%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20controller%20%26%26%20controller.isCommandEnabled%28cmd%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20controller%20%3D%20controller.QueryInterface%28Components.interfaces.nsICommandController%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20params%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/command-params%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsICommandParams%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20params.setStringValue%28%22state_data%22%2C%20gClipboard.read%28%29%20%29%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20controller.doCommandWithParams%28cmd%2C%20params%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0AaddEventListener%28%22click%22%2C%20middleMousePaste%2C%20true%2C%20document.documentElement%20%29%3B%0A%0A%0A%0A//%20%u0414%u043E%u043F%u043E%u043B%u043D%u0438%u0442%u0435%u043B%u044C%u043D%u044B%u0435%20%u0432%u043E%u0437%u043C%u043E%u0436%u043D%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0437%u043D%u0430%u0447%u043A%u0430%20%u0438%u0434%u0435%u043D%u0442%u0438%u0444%u0438%u043A%u0430%u0446%u0438%u0438%20%u0441%u0430%u0439%u0442%u0430%20%u0432%20%u0441%u0442%u0440%u043E%u043A%u0435%20%u0430%u0434%u0440%u0435%u0441%u0430%20................................%0AaddEventListener%28%22click%22%2C%20function%28e%29%20%7B%20%0A%20%20%20e.preventDefault%28%29%3B%0A%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%0A%20%20%20//%20%u041B%u041A%u041C%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u0438%u043D%u0444%u043E%u0440%u043C%u0430%u0446%u0438%u044E%20%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%u0432%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%27%u0420%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u0438%u044F%27%20....%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20%7B%0A%20%20%20%20%20%20%20%20var%20doc%20%3D%20content.document%3B%0A%20%20%20%20%20%20%20%20BrowserPageInfo%28%20doc%2C%20%28%20%28doc.location.protocol%29.slice%280%2C4%29%20%3D%3D%20%22http%22%29%20%3F%20%22permTab%22%20%3A%20%22generalTab%22%20%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20//%20%u041F%u041A%u041C%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u0430%u0434%u0440%u0435%u0441%20....%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%29%20%7B%20%0A%20%20%20%20%20%20%20%20gClipboard.write%28%20content.location%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20//%20%u0437%u043D%u0430%u0447%u043E%u043A%20%u0438%u0434%u0435%u043D%u0442%u0438%u0444%u0438%u043A%u0430%u0446%u0438%u0438%20%u0441%u0430%u0439%u0442%u0430%20%u043C%u0438%u0433%u0430%u0435%u0442%20%u043A%u0440%u0430%u0441%u043D%u044B%u043C%20....%0A%20%20%20%20%20%20%20%20document.getElementById%28%22identity-box%22%29.setAttribute%28%22style%22%2C%20%22background%3A%20red%3B%22%29%3B%0A%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20document.getElementById%28%22identity-box%22%29.removeAttribute%28%22style%22%29%20%7D%2C%20500%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%2C%20true%2C%20document.getElementById%28%22identity-box%22%29%20%29%3B%0A%0A%20%20%20%0A%20%20%20%0A//%20%u0414%u043E%u043F%u043E%u043B%u043D%u0438%u0442%u0435%u043B%u044C%u043D%u044B%u0435%20%u0432%u043E%u0437%u043C%u043E%u0436%u043D%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u043A%u043B%u0438%u043A%u0430%20%u043C%u044B%u0448%u0438%2C%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20................................%0Afunction%20handleDblClick%28e%29%20%7B%0A%0A%20%20var%20node%20%3D%20e.target%3B%0A%20%20var%20editor%20%3D%20node.editor%3B%0A%20%20%0A%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0445%20%u043F%u043E%u043B%u044F%u0445%20....%0A%20%20if%20%28%20e.button%20%3D%3D%200%20%26%26%20custombuttons.getPrefs%28%22Autocopy.selectWithDoubleClick%22%29%20%29%20%7B%20%20%20%20%0A%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20if%20%28%20/input%7Ctextbox%7Ctextarea/.test%28%20node.localName%20%29%20%29%20%21editor%20%3F%20node.select%28%29%20%3A%20editor.selectAll%28%29%3B%0A%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%0A%20%20//%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20....%0A%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20cbu.getPrefs%28%22Autocopy.copyWithDoubleClick%22%29%20%29%20%7B%0A%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%21editor%20%3F%20goDoCommand%28%22cmd_copy%22%29%20%3A%20editor.copy%28%29%3B%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20try%20%7B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20var%20box%20%3D%20%28%20node.textbox%20%7C%7C%20node%20%29.inputField.parentNode%3B%0A%20%20%20%20%20%20%20%20%20%20%20var%20popup%20%3D%20box.ownerDocument.getAnonymousElementByAttribute%28%20box%2C%20%22anonid%22%2C%20%22input-box-contextmenu%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20popup.hidePopup%28%29%2C%2050%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20catch%28e%29%20%7B%20document.getElementById%28%22contentAreaContextMenu%22%29.hidePopup%28%29%20%7D%3B%20%0A%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%0A%7D%3B%0AaddEventListener%28%22dblclick%22%2C%20handleDblClick%2C%20false%2C%20gBrowser%20%29%3B%0A%0A%0A%0A//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20....%20%20%20%20%0AaddEventListener%28%22click%22%2C%20function%28e%29%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20cbu.getPrefs%28%22Autocopy.saveWithDoubleClick%22%29%20%26%26%20e.target.localName%20%3D%3D%20%27img%27%29%20%7B%0A%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20saveImageURL%28%20gContextMenu.imageURL%2C%200%2C%200%2C%200%2C%201%2C%20null%2C%20content.document%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20document.getElementById%28%22contentAreaContextMenu%22%29.hidePopup%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%2C%2020%29%3B%0A%20%20%20%20%20%20%20%20%7D%20%20%0A%7D%2C%20false%2C%20gBrowser%20%29%3B%0A%0A%0A%0A//%20%u041D%u0430%u0431%u043B%u044E%u0434%u0430%u0442%u0435%u043B%u044C%20%u0441%u043B%u0435%u0434%u0438%u0442%20%u0437%u0430%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0435%u043C%20%u043E%u043A%u043E%u043D%20%u0430%u0434%u0440%u0435%u0441%u0430%20%u043A%u043E%u0442%u043E%u0440%u044B%u0445%20%u0443%u043A%u0430%u0437%u0430%u043D%u043D%u044B%20%u0432%20%u043A%u043E%u0434%u0435%20%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0438%u043C%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u0438%20................................%0Avar%20observer%20%3D%20%7B%20%20%0A%20%20%20%20%20%20%20observe%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%20handleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20%20%20%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20%20%20var%20href%20%3D%20doc.location.href%3B%20%0A%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20//%20%u0437%u0430%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%27%u0418%u043D%u0444%u043E%u0440%u043C%u0430%u0446%u0438%u044E%20%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%27%20%u0438%u043B%u0438%20%27%u0411%u0438%u0431%u043B%u0438%u043E%u0442%u0435%u043A%u0443%27%20%u0434%u0432%u043E%u0439%u043D%u044B%u043C%20%u043A%u043B%u0438%u043A%u043E%u043C%20%u043D%u0430%20%u043D%u0435%u0439%20....%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20/pageInfo.xul%7Cplaces.xul/.test%28%20href%20%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.addEventListener%28%22dblclick%22%2C%20function%20close%28%29%20%7B%20this.close%28%29%20%7D%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.addEventListener%28%22unload%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28e.type%2C%20arguments.callee%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22dblclick%22%2C%20close%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20false%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20//%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0442%u044C%20%u0438%20%u0443%u0434%u0430%u043B%u044F%u0442%u044C%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u0438%20%u043A%u043B%u0438%u043A%u0430%20%u0434%u043B%u044F%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%u0430%20Custom%20Buttons%20....%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20href.substring%280%2C%2041%29%20%3D%3D%20%22chrome%3A//custombuttons/content/editor.xul%22%20%29%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.addEventListener%28%22click%22%2C%20middleMousePaste%2C%20true%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.addEventListener%28%22dblclick%22%2C%20handleDblClick%2C%20false%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.addEventListener%28%22unload%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28e.type%2C%20arguments.callee%2C%20false%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22click%22%2C%20middleMousePaste%2C%20true%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22dblclick%22%2C%20handleDblClick%2C%20false%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%0A%7D%3B%0AServices.obs.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0AaddDestructor%28function%28%29%20%7B%20Services.obs.removeObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%20%7D%29%3B%20%0A%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.tooltipText%20%3D%20%22Autocopy%20%5Cn%u041B%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u043E%u0435%20%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%5Cn%u041F%3A%20%u041C%u0435%u043D%u044E%20+%20CB%20%u043C%u0435%u043D%u044E%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

04-09-2013 21:18:51

Loom пишет

И можно ли сделать выделение слова по одинарному ЛКМ, а абзаца по двойному?

Я не знаю как :/

bunda1
Спасибо большое за кнопку, а с одним кликом вообще отлично стало. :)

bunda1 пишет

Я не знаю как :/

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

А не знаете ли, можно сделать кнопку для зумирования изображений колесиком? Т.е. открываешь в отдельной вкладке ссылку *.png, *.jpeg, *.gif, и как бы зажимается Ctrl. Вариант с зажатием ПКМ в FireGestures не подходит, там жесты, к которым слишком привык за множество лет.

Loom пишет

А не знаете ли, можно сделать кнопку для зумирования изображений колесиком? Т.е. открываешь в отдельной вкладке ссылку *.png, *.jpeg, *.gif, и как бы зажимается Ctrl. Вариант с зажатием ПКМ в FireGestures не подходит, там жесты, к которым слишком привык за множество лет.

Завтра попробую сделать.

В кнопке Compact Menu( Firefox 4 + ) не работает пункт меню Новая приватная вкладка
87sXgHxR.jpg
И меню Adblock Plus
3nWWRroS.jpg

rgdru
Может попробуй удалить старую и поставь эту

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECompact%20Menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBEAAAEAIACsBAAAFgAAACgAAAAQAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMSAAcROg8hOGEvQV1hL0JdOQ4iOBIABxH7+/uBqKioqv7+/oAAAAAAAAAAAAAAAAAAAAAAAAAAAREABhB6PEx23HZ32+uLe/7rfGv/63tr/+uKev7vv7/tp52g10BAQP6vr6+z////fwAAAAAAAAAAAAAAAR0CEB3AaHK/629j/+FbVP/bUU7/10xK/9ZLSv/sp6X/26mm/0BAQP9AQED/QEBA/9jY2KH///9/AAAAAA8ABQ+6X22+1UpK/8Y2P/+8KDX/tB0v/6sZKf+uGCz/1pae/0BAQP9AQED/QEBA/0BAQP9AQED+8fHxkQAAAAJ0M0hzxz1G/7AYLv+lDCX/ng0b/5APD/+FFgL/1Zid/3BfYf9AQED/QEBA/0BAQP9AQED/QEBA/25ubtgPAAUPt0dc2KULJf+pFCb/tygu/7w1L/+FGAH/nSsW/8OSjf+gf3//qIKB/9aTlf/Vi5P/0YSR/9yosuzw7/CHMAobMLw2Sf60Iyz/xD41/9NSPv/cYUT/0188/+VwSf/IWzj/WhID/0kFAP9zGhT/yEM4/7grL/+9Okn+Nw0fNFYoOVLAOT3/zEg6/9xhRP/qdUv/64RR/+uNVf/rk1f/65NX/9t1Q/9mGQD/YhcE/9NeP//RTz3/xEA//1wsPVlWKDhR01dI/+BnRv/rf0//65JX/+ugXP/rqV7/661g/+utYf/McDH/gS4C/4UyD//CXjX/5G5I/9hdSf9dLD5YMAoaMOp+Zf7rgE//65dZ/+upX//rtGP/671n/+vBaP/rslz/rk4K/51CBf/rjUf/64RI/+uBTf/rhGf+NQweNA4ABg7Tdm3X65NY/+uqX//rumX/68Rq/+vMbf/r0G//68pn/+u+X//cgTD/67hi/+uuYf/rmlr/2Hxv2REABhAAAAACdTlIceudYP/rrV7/66xW/+vMbf/r03D/69Zw/+vVcP/r1HD/68tr/9x+Pv/rkUz/66xo/3Y7SXMAAAACAAAAAA8ABQ+2Z2O70WIX/+uEIf/rvVb/68JY/+vPbf/rsUn/68FX/+uVRf+dNBL/zGw0/8h7dL0PAAUPAAAAAAAAAAAAAAABHAEPHL5qWrzrr0r/69CA/+vQgf/r3qv/696r/+vNgP/rrnb/rEgo/6VXW70dAg8cAAAAAQAAAAAAAAAAAAAAAAAAAAEPAAUPdztFceiUcNjrz47+69yw/+vUmf/ryIT+03pe2XIzRHMPAAUPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPAAUPMgscMlcpOlNYKTlUMwscMg8ABQ8AAAACAAAAAAAAAAAAAAAAAAAAAP//rEHwA6xBwAGsQYAArEGAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEGAAaxBgAGsQcADrEHwD6xB%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bconst%0A%09nodes%20%3D%20%5B%0A%09%09%22file-menu%22%2C%0A%09%09%22edit-menu%22%2C%0A%09%09%22view-menu%22%2C%0A%09%09%22bookmarksMenu%22%2C%0A%09%09%22history-menu%22%2C%0A%09%09%22tools-menu%22%2C%0A%09%09%22helpMenu%22%0A%0A%09%5D.map%28function%28id%29%20document.getElementById%28id%29%29%2C%0A%09menubar%20%3D%20true%2C%0A%09parent%20%3D%20nodes%5B0%5D.parentNode%2C%0A%09popup%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%2C%0A%09popupAttrs%20%3D%20%7B%0A%09%09id%3A%20%22Compact-Menu-menupopup%22%2C%0A%09%09position%3A%20%22after_start%22%2C%0A%09%09context%3A%20%22toolbar-context-menu%22%20//%20%22%22%0A%09%7D%2C%0A%09cssURI%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28%27%5C%0A%09%09%23appmenu-button%2C%20.titlebar-placeholder%5Btype%3D%22appmenu-button%22%5D%25menubar%25%20%7B%5Cn%5C%0A%09%09%09display%3A%20none%20%21important%3B%5Cn%5C%0A%09%09%7D%5C%0A%09%27.replace%28/%5E%28%5Ct%5Ct%29/gm%2C%20%22%22%29.replace%28%22%25menubar%25%22%2C%20menubar%20%3F%20%22%22%20%3A%20%22%2C%20%23toolbar-menubar%22%29%29%29%2C%0A%09sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%2C%0A%09sheetType%20%3D%20sss.USER_SHEET%3B%0A%09%0Afor%20%28var%20attr%20in%20popupAttrs%29%20popup.setAttribute%28attr%2C%20popupAttrs%5Battr%5D%29%3B%0Anodes.forEach%28function%28node%29%20popup.appendChild%28node%29%29%3B%0AaddDestructor%28function%28%29%20nodes.forEach%28function%28node%29%20parent.appendChild%28node%29%29%29%3B%0Aif%20%28menubar%20%26%26%20%21parent.childNodes.length%29%20%7B%0A%09const%20dummy%20%3D%20parent.appendChild%28document.createElement%28%22menu%22%29%29%3B%0A%09addDestructor%28function%28%29%20parent.removeChild%28dummy%29%29%3B%0A%7D%0Asss.loadAndRegisterSheet%28cssURI%2C%20sheetType%29%3B%0AaddDestructor%28function%28%29%20sss.unregisterSheet%28cssURI%2C%20sheetType%29%29%3B%0A%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%09if%20%28%21e.button%20%26%26%20e.target%20%3D%3D%20this%29%20popup.openPopup%28this%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%20%28%21event.target%29%20this.click%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Dumby
Спасибо,теперь всё работает так как и должно быть.

У меня в кнопке выполняется команда textarea.select()
И если в textarea много текста, т. е. есть полоса вертикальной прокрутки, то она прокручивается в самый конец.
Я вместо select() могу сделать эмуляцию нажатия Ctrl + А, тогда само не прокручивается, но интересно знать, эта прокрутка в конец при select() - она и должна быть?

Или это дело только у меня?

Чайник пишет

У меня в кнопке выполняется команда textarea.select()
И если в textarea много текста, о она прокручивается в самый конец.
... интересно знать, эта прокрутка в конец при select() - она и должна быть?
Или это дело только у меня?

Я тоже такое наблюдаю, может добавь за;
textarea.select();
setTimeout(function() { goDoCommand('cmd_scrollTop') }, 50);

Наверно из-за этого

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

Выделить код

Код:

data:image/png;base64,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


Ещё вот так не прокручивает
скрытый текст

Выделить код

Код:

textarea.QueryInterface(Ci.nsIDOMNSEditableElement).editor.selectAll();
textarea.focus();

bunda1 и Dumby
Спасибо  ;)

Уважаемые программисты, нельзя ли соорудить кнопку (точнее, две: "вперед" и "назад"), имитирующую работу вот этого расширения?

Vladimir_S
Если расширение не работает из-за nsIHistoryEntry,
то попроси кого-нибудь перепаковать без него.

А пока, для проверки, можешь попробовать положить в начало Инициализации
какой-нибудь кнопки эту цитату, может расширение начнёт работать

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

Выделить код

Код:

RewindForwardService.getHistoryEntryAt = function (aIndex) 
{
    var entry  = gBrowser.sessionHistory.getEntryAtIndex(aIndex, false);
    var info = { URI : null, referrerURI : null };
    if (entry) {
        entry = entry/*.QueryInterface(Components.interfaces.nsIHistoryEntry)*/
                    .QueryInterface(Components.interfaces.nsISHEntry);
        if (entry.URI)
            info.URI = entry.URI;
        if (entry.referrerURI)
            info.referrerURI = entry.referrerURI;
    }
    return info;
}

Dumby пишет

Vladimir_S
Если расширение не работает из-за nsIHistoryEntry,
то попроси кого-нибудь перепаковать без него.

А пёс его знает из-за чего! Отвалилось в Авроре (26.0а2). До этого пару раз обращался к Hydrolizer'у, он мне это расширение правил, а вот сейчас, похоже, ушел человек совсем.

Dumby пишет

А пока, для проверки, можешь попробовать положить в начало Инициализации
какой-нибудь кнопки эту цитату, может расширение начнёт работать

А с этого места, если не трудно, помедленнее, поподробнее и попошаговее.

Vladimir_S пишет

А с этого места, если не трудно, помедленнее, поподробнее и попошаговее.

1) установить рашсирение CB
2) ПКМ по настройке панели - добавить новую кнопку
3) вставляешь код во вкладку инициализация (желателно дать кнопке какое-то имя для отличия) - сохраняешь
4) в настройках интерфейса вытаскиваешь эту новую кнопку в любое место на панели. (лично я сую в панель меню, которое у меня скрыто)

feas, благодарю.

feas пишет

1) установить рашсирение CB

Имеется.

feas пишет

2) ПКМ по настройке панели - добавить новую кнопку
3) вставляешь код во вкладку инициализация (желателно дать кнопке какое-то имя для отличия) - сохраняешь
4) в настройках интерфейса вытаскиваешь эту новую кнопку в любое место на панели. (лично я сую в панель меню, которое у меня скрыто)

Вечером  на домашнем компе попробую. Спасибо.

Да, только вот что: самО СВ-то под Аврору и выше допилили? Помнится, когда Аврора вышла, так оно отвалилось.

Vladimir_S пишет

Да, только вот что: самО СВ-то под Аврору и выше допилили? Помнится, когда Аврора вышла, так оно отвалилось.

Custom Buttons 0.0.5.7pre1
http://downloads.mozdev.org/custombutto … 130923.xpi

Dumby, feas, wolwerine, друзья, коллеги - огромнейшее вам спасибо! Всё получилось, любимый аддон вновь заработал, СВ тоже, опять я дома на Аврору перешел, как привык - класс! Осталось только с менеджером загрузок разобраться - предпочитаю старый, ну да ладно, буду к новому привыкать, либо расширение на досуге поищу: ведь не один я, поди, такой реторгад.

feas пишет

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

Ну а у меня скрыта панель закладок, куда кнопку и всунул.
Вот если бы кто-нибудь еще с этим помог:

Dumby пишет

Если расширение не работает из-за nsIHistoryEntry, то попроси кого-нибудь перепаковать без него.

- ну да не обязательно, и так сойдёт.

Vladimir_S пишет

Осталось только с менеджером загрузок разобраться - предпочитаю старый

№11753 :D

feas пишет
Vladimir_S пишет

Осталось только с менеджером загрузок разобраться - предпочитаю старый

№11753 :D

Да ну - так даже не интересно! :blush: Я-то собирался на выходных неторопясь поковыряться - а тут на тебе! :):):)
P.S. И ведь видел же эту владову находку, думал взять на заметку, но поскольку по вышеописанным причинам перспектива слезания с 25.0 в обозримом будущем не просматривалась - забыл.
А вообще - всё прекрасно-чудесно. Спасибо!

bunda1, что на что нужно поменять в вашей кнопке Save, чтобы файл сохранялся не на рабочий стол и каждый день новый, а дописывался уже имеющийся и находящийся на постоянке в определенном мной месте.
Я говорю о п. Сохранить выделенный текст в файл, в контекстном меню.
Спасибо.

ps Дабы отказаться от Save Text to File

okkamas_knife пишет

вроде так

Работает, только что-то с кодировкой, кирилица корябушками (

okkamas_knife пишет

а открываешь чем?
сам файл в UTF-8
как вариант решения проблемы

файл создан в UTF-8
открываю в Notepad++
с htm тоже всё бито

Uxapb пишет

bunda1, что на что нужно поменять в вашей кнопке Save, чтобы файл сохранялся не на рабочий стол и каждый день новый, а дописывался уже имеющийся и находящийся на постоянке в определенном мной месте.
Я говорю о п. Сохранить выделенный текст в файл, в контекстном меню.
Спасибо.

ps Дабы отказаться от Save Text to File

Есть другая кнопка которая делает то что ты просишь, Stf+:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EStf+%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAWgAAAFoAAABaAAAAWgAAAFoAAABaAAAAWgAAAFoAAABaAAAAWgAAAFoAAABaAAAAWgAAAFsAAABYAAAAFwAAAACISi/ml2RK9ZdjSfWUYEX1jlpA9ZdjSfWXY0r1l2NL9ZdjS/WXY0v1l2NL9ZdjS/WXY0v1lWFI9J5mSvljMR7lAAAAPgIBAQDBhmP/6cOL/+Kxcf/Fo3L/kHdV/7GNXf/esHL/3q5t/9ysbP/drWz/3a1t/92tbf/erm7/3bBz/vLKlP+FUTrtAAAAPwMCAgC4f1791qtt/tOkZv7e1Mn+jIiE/lZMPv6djHX+4860/uvWu/7p1Ln+6tS4/uvVuv7nz7L+yphV/eK1fv9/TTjsAAAAPwMCAgC5gF//3LR6/9ixff//////29nU/5CRlP9SU1X/paGd//Xr4P//8OP/+uzc//zs2v/57uH/0aRm/ue+iv+ATTftAAAAPwMCAgC5gF//4LiC/9myfv///v3/8eXW/9LPy/+Li4z/RkI7/5OIef/l077/9N/I//Texv/36dn/06Zs/urBkP9/TDbtAAAAPwMCAgC5gGD/5sab/9u1hP////7/+vPp//Pp3f/Iwbr/foCE/0VERP+Lg3r/4NG///rm0P/369v/1Klx/uvFlv9/TDXtAAAAPwMCAgC7gmP/7dS1/926jf/+/Pv/9uzg//jt4P/06dv/u7m3/5l2QP90ShH/fXVv/+DPvP/57d3/1ax0/u7JnP9/SzTtAAAAPwMCAgC8hWj/8Nu//967j////////////////v//////9vTz/9+8gP/GgRL/ckwc/4eBff/n3tH/2bB5/u/Opf9/TDbtAAAAPwMCAgC9hmr/9OPM/9qzgv/p07T/6tO2/+rTtf/p0rT/7de7/97GqP/SoVH/x4IT/2xMJP+Admr/zKRw/vXUrf9/TTjtAAAAPwMCAgC+iW7/9ufT/+rRtP/lyKX/5Mim/+THpv/kx6T/4sWh/+rLp/+9pIf/vZJP/8WCGf9iPhH/fW9c/unNrP+CTzrtAAAAPwMCAgC/inD/+OrX//Ddyv/559X//OrV//ro0//659L/+ufS//zo0v/m1cL/lod4/7iPT//Ihx//Y0ck/pSLg/95STPtAAAAPwICAgC/i3L/+Ova//fk0P/Ct6v/o52W/6uknP+qo5v/q6Sc/6qjm/+1raT/rqij/2ZhX/+wj1n/w4EZ/m1QLv89JB/zAAAASgEBAQDAjnb9+O3e//rn1P+jnpn/lZib/6eoqf+rrK7/srK0/7y9vv+0trj/oaGi/6Cho/9eXF7/w59n/8qFF/9KKgP9AAAAhQIBAAW+h2z/+PLk/P/15fusqKP+oaKi/7Kysf+3trb/vby8/8nJyf+3t7f/cnFx/6Wlpf+fmpL+dXVx+66UYfyuhUP/Ligj1QAAAFqBPSKJ2KWK//PNt/+klo78oKKk+7Cvr/u1tLX7vLu7+8jIyPu3t7b7dHNz+52ho/vHrJz+y6WP/51vX/61jVvuxo0s/z0nCsERBgMDKw8ERh4AAEFjWFS9sLKz/62srfyzs7T/urm5/8HCwv/AwMD/sbGx/cDDw/9GNC7SKgsAaSgNAkMwKSQtq4VIsks0EmcBAQACAQEBAgAAAAAjIyNKOjo6fjU1NXM2NjZ1NjY2dTY2NnU3Nzd1Ozs7czw8PH0UFBQ4AAAAAAEBAQEAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.leftclick%20%3D%20function%28%29%20%7B%20%20//%20%u041B%u041A%u041C%20%0A%20%20%20%20%20if%20%28%20pathToFile%28%29%20%29%20saveSelectionToTxt%28%29%3B%0A%7D%3B%0A%0Athis.leftDclick%20%3D%20function%28%29%20%7B%20%20//%20%u0434%u0432%u043E%u0439%u043D%u043E%u0439%20%u041B%u041A%u041C%20%0A%20%20%20%20%20saveSelectionToTxt%28%29%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%20%27gQuot%28event%2C%20this%29%27%29%3B%0Athis.setAttribute%28%27ondblclick%27%2C%20%27gQuot%28event%2C%20this%29%27%29%3B%0A%0A%0A%0A/*%20%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u043B%u0438%20%u0432%u0435%u0441%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%u043A%u0430%u043A%20txt%20%u0444%u0430%u0439%u043B%20................................*/%0Afunction%20saveSelectionToTxt%28%29%20%7B%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0438%u0442%u044C%20%u0432%u0441%u0451%20%u0435%u0441%u043B%u0438%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0435%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%20....%0A%20%20%20%20%20var%20all%20%3D%20%21getSelect%28%29%3B%0A%20%20%20%20%20if%20%28%20all%20%29%20document.getElementById%28%22cmd_selectAll%22%29.doCommand%28%29%3B%20%0A%0A%20%20%20%20%20var%20sel%20%3D%20getSelect%28%29%3B%0A%20%20%20%20%20if%20%28%20%21sel%20%29%20return%3B%20%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u043F%u0435%u0440%u0435%u043A%u043E%u0434%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20UTF-8%20....%0A%20%20%20%20%20var%20converter%20%3D%20Components.classes%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIScriptableUnicodeConverter%29%3B%0A%20%20%20%20%20converter.charset%20%3D%20%22utf-8%22%20%3B%0A%20%20%20%20%20var%20text%20%3D%20converter.ConvertFromUnicode%28%20sel%20%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20//%20%u043F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043F%u0440%u0435%u0434%u044B%u0434%u0443%u0449%u0438%u0439%20%u043F%u0443%u0442%u044C%20%u0434%u043B%u044F%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u044F%20%u0438%u0437%20%27about%3Aconfig%27%20%u0438%u043B%u0438%20%u0434%u0438%u0441%u043A%20C%3A%20....%0A%20%20%20%20%20var%20pathToFile%20%3D%20Application.prefs.getValue%28%22CB.Stf.pathToSave%22%2C%200%29%0A%20%20%20%20%20var%20pathToFile%20%3D%20%28%20pathToFile%20%3D%3D%200%20%29%20%3F%20%28%20%22C%3A%5C%5C%22%20+%20getDocTitle%28%29%20%29%20%3A%20pathToFile%3B%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20var%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20%20%20file.initWithPath%28%20pathToFile%20+%20%22.txt%22%20%29%3B%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0434%u043B%u044F%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u044F%20%u043A%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u044E%u0449%u0435%u043C%u0443%20%u0438%u0437%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0432%u0440%u0435%u043C%u0435%u043D%u0438%20%u0438%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20....%0A%20%20%20%20%20var%20line%20%3D%20%22%20%20......................................................%22%0A%20%20%20%20%20var%20text%20%3D%20file.exists%28%29%3F%20%28%20%22%5Cn%22%20+%20%22%5Cn%22%20+%20%22%5Cn%22%20+%20getTime%28%29%20+%20line%20+%20%22%5Cn%22%20+%20text%20%29%3A%20text%3B%0A%0A%20%20%20%20%20//%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u0442%u0435%u0441%u0442%u043E%u0432%u044B%u0439%20%u0444%u0430%u0439%u043B%20%u0435%u0441%u043B%u0438%20%u043E%u043D%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20%u0438%u043D%u0430%u0447%u0435%20%u0434%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u0444%u0430%u0439%u043B%20....%0A%20%20%20%20%20var%20foStream%20%3D%20Components.classes%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIFileOutputStream%29%3B%0A%20%20%20%20%20%28%20%21file.exists%28%29%20%29%3F%20foStream.init%28file%2C%200x02%7C0x08%7C0x20%2C%200666%2C%200%29%3A%20foStream.init%28file%2C%200x02%20%7C%200x10%2C%200664%2C%200%29%3B%0A%20%20%20%20%20foStream.write%28text%2C%20text.length%29%3B%0A%20%20%20%20%20foStream.close%28%29%3B%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0430%u044F%20%u043F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20....%0A%20%20%20%20%20var%20alertSlide%20%3D%20Cc%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D.getService%28Components.interfaces.nsIWindowWatcher%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.openWindow%28null%2C%20%22chrome%3A//global/content/alerts/alert.xul%22%2C%20%22_blank%22%2C%20%22chrome%2Ctitlebar%3Dno%2Cpopup%3Dyes%22%2C%20null%29%3B%0A%20%20%20%20%20alertSlide.arguments%20%3D%20%5Bself.image%2C%20self.label%2C%20%22%u0422%u0435%u043A%u0441%u0442%20%u0431%u044B%u043B%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%22%2C%20null%2C%20false%2C%20%22%22%5D%3B%0A%20%20%20%20%20alertSlide.setTimeout%28function%28%29%20%7B%20alertSlide.close%28%29%20%7D%2C%201500%29%3B%0A%0A%20%20%20%20%20if%20%28%20all%20%29%20goDoCommand%28%22cmd_selectNone%22%29%3B%20%0A%7D%3B%0A%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u043A%u0430%20%u043F%u0443%u0442%u0438%20%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044F%20%u0434%u043B%u044F%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u0433%u043E%20%u0444%u0430%u0439%u043B%u0430%2C%20%u0438%u043D%u0430%u0447%u0435%20%u043E%u0442%u0434%u0430%u0441%u0442%20%27false%27%20................................%0Afunction%20pathToFile%28%29%20%7B%0A%0A%20%20%20%20%20//%20%u043F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043F%u0440%u0435%u0434%u044B%u0434%u0443%u0449%u0438%u0439%20%u043F%u0443%u0442%u044C%20%u0434%u043B%u044F%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u044F%20%u0438%u0437%20%27about%3Aconfig%27%20%u0438%u043B%u0438%20%u0434%u0438%u0441%u043A%20C%3A%20....%0A%20%20%20%20%20var%20pathToFile%20%3D%20Application.prefs.getValue%28%22CB.Stf.pathToSave%22%2C%200%29%3B%0A%20%20%20%20%20var%20pathToFile%20%3D%20%28%20pathToFile%20%3D%3D%200%20%29%3F%20%22C%3A%5C%5C%22%3A%20pathToFile%3B%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u0444%u0430%u0439%u043B%u0430%20%u0438%u0437%20%u0437%u0430%u0433%u043E%u043B%u043E%u0432%u043A%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0432%u0440%u0435%u043C%u0435%u043D%u0438%20....%0A%20%20%20%20%20var%20fileTitle%20%3D%20getDocTitle%28%29%20+%20%27%20%20%27%20+%20getTime%28%29%3B%0A%0A%20%20%20%20%20//%20%u0434%u0438%u0430%u043B%u043E%u0433%20%u0441%u043E%u0437%u0434%u0430%u043D%u0438%u044F%20%u0438%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043A%u0438%20%u043F%u0443%u0442%u0438%20....%0A%20%20%20%20%20var%20fp%20%3D%20Cc%5B%22@mozilla.org/filepicker%3B1%22%5D.createInstance%28Components.interfaces.nsIFilePicker%29%3B%0A%20%20%20%20%20var%20dir%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20%20%20fp.init%28window%2C%20%22%u0423%u043A%u0430%u0436%u0438%u0442%u0435%20%u043F%u0443%u0442%u044C%20%u043A%20%u0444%u0430%u0439%u043B%u0443%20%u0438%20%u0435%u0433%u043E%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%21%22%2C%20fp.modeSave%29%3B%0A%20%20%20%20%20fp.appendFilters%28%20fp.filterText%20%29%3B%0A%20%20%20%20%20fp.defaultString%20%3D%20fileTitle%3B%0A%20%20%20%20%20dir.initWithPath%28%20pathToFile%20%29%3B%0A%20%20%20%20%20fp.displayDirectory%20%3D%20dir%3B%0A%20%20%20%20%20%0A%20%20%20%20%20if%20%28%20fp.show%28%29%20%3D%3D%20fp.returnCancel%20%29%20return%20false%3B%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0437%u0430%u043F%u0438%u0441%u0430%u0442%u044C%20%u043F%u0443%u0442%u044C%20%u043A%20%u0444%u0430%u0439%u043B%u0443%20%u0432%20%27about%3Aconfig%27%20....%0A%20%20%20%20%20Application.prefs.setValue%28%22CB.Stf.pathToSave%22%2C%20fp.file.path%20%29%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20return%20true%3B%0A%7D%3B%0A%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0435%u0435%20%u0432%u0440%u0435%u043C%u044F%20................................%0Afunction%20getTime%28%29%20%7B%0A%20%20%20%20%20var%20now%20%3D%20new%20Date%28%29%3B%0A%20%20%20%20%20return%20now.toLocaleFormat%28%22%25H%3A%25M%3A%25S%22%29%3B%0A%7D%3B%0A%0A%0A%0A/*%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0437%u0430%u0433%u043E%u043B%u043E%u0432%u043E%u043A%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%u043B%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u0434%u043E%u043C%u0435%u043D%u0430%20%u0435%u0441%u043B%u0438%20%u0437%u0430%u0433%u043E%u043B%u043E%u0432%u043A%u0430%20%u0443%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u043D%u0435%u0442%0A%20%20%20%u0438%u043B%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043F%u0440%u043E%u0442%u043E%u043A%u043E%u043B%u0430%20%u0435%u0441%u043B%u0438%20%u0434%u043E%u043C%u0435%u043D%u0430%20%u043D%u0435%u0442%20................................*/%0Afunction%20getDocTitle%28%29%20%7B%0A%20%20%20%20var%20protocol%20%3D%20content.document.location.protocol%3B%0A%20%20%20%20if%20%28protocol%20%3D%3D%20%22chrome%3A%22%29%20return%20%22chrome%22%3B%0A%20%20%20%20if%20%28protocol%20%3D%3D%20%22data%3A%22%29%20return%20%22data%22%3B%0A%20%20%20%20var%20docTitle%20%3D%20content.document.title%20%7C%7C%20content.document.domain%20%7C%7C%20gBrowser.mCurrentTab.label%3B%0A%20%20%20%20//%20%u0437%u0430%u043C%u0435%u043D%u0438%u0442%u044C%20%u043D%u0435%u0434%u043E%u043F%u0443%u0441%u0442%u0438%u043C%u044B%u0435%20%u0441%u0438%u043C%u0432%u043E%u043B%u044B%20%u0438%20%u0443%u0434%u0430%u043B%u0438%u0442%u044C%20%u043B%u0438%u0448%u043D%u0438%u0435%20%u043F%u0440%u043E%u0431%u0435%u043B%u044B%20....%20%0A%20%20%20%20var%20docTitle%20%3D%20docTitle.replace%28/%5B%5C%5C%5C/%3C%3E%3F*%7C%22%5D+/g%2C%20%22%20%22%29%0A%20%20%20%20%09%09%09%20%20%20.replace%28/%3A/g%2C%20%22%u05C3%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace%28/%5Cs%5Cs+/g%2C%20%22%20%22%29%3B%20%0A%20%20%20%20return%20docTitle%3B%0A%7D%3B%0A%0A%0A%0A/*%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%u043B%u0438%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u0433%u043E%20%u043F%u043E%u043B%u044F%2C%0A%20%20%20%u0435%u0441%u043B%u0438%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0435%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%20%20%u0444%u0443%u043D%u043A%u0446%u0438%u044F%20%u043E%u0442%u0434%u0430%u0441%u0442%20%27false%27%20................................*/%0Afunction%20getSelect%28%29%20%7B%0A%20%20%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20....%0A%20%20%20%20var%20selection%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29%3B%0A%20%20%20%20var%20anchor%20%3D%20%28selection.anchorNode%20%21%3D%3D%20null%29%3F%20selection.anchorNode%3A%20false%3B%0A%0A%20%20%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%27PRE%27%20....%0A%20%20%20%20if%20%28%20anchor%20%26%26%20anchor.parentNode.tagName%20%3D%3D%20%27PRE%27%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20var%20node%20%3D%20selection.focusNode%3B%0A%20%20%20%20%20%20%20%20%20var%20startPos%20%3D%20selection.anchorOffset%3B%0A%20%20%20%20%20%20%20%20%20var%20endPos%20%3D%20selection.focusOffset%3B%0A%20%20%20%20%20%20%20%20%20var%20selection%20%3D%20node.data.substring%28startPos%2C%20endPos%29%3B%20%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u0433%u043E%20%u043F%u043E%u043B%u044F%20....%0A%20%20%20%20if%20%28%20selection.toString%28%29.length%20%3D%3D%200%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%20%20%20%20%20%20%20%20%20if%20%28%20theBox%20%26%26%20%28theBox.type%20%3D%3D%20%22text%22%20%7C%7C%20theBox.type%20%3D%3D%20%22textarea%22%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%20%20%20%20%20%20var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%20%20%20%20%20%20var%20selection%20%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20//%20%u0438%u0441%u043F%u0440%u0430%u0432%u043B%u044F%u0435%u043C%20%u043F%u0440%u043E%u0431%u043B%u0435%u043C%u0443%20%u0441%20%u043F%u0435%u0440%u0435%u043D%u043E%u0441%u043E%u043C%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u043D%u043E%u0432%u0443%u044E%20%u0441%u0442%u0440%u043E%u043A%u0443%20%u0432%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u043C%20win%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0435%20....%0A%20%20%20%20if%20%28%20selection.toString%28%29.length%20%21%3D%3D%200%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20var%20selection%20%3D%20selection.toString%28%29%3B%0A%20%20%20%20%20%20%20%20%20var%20selection%20%3D%20selection.replace%28/%5Cu000A/g%2C%20%22%5Cu000D%5Cu000A%22%29%3B%0A%20%20%20%20%20%20%20%20%20var%20selection%20%3D%20selection.replace%28/%5Cu000D%5Cu000D%5Cu000A/g%2C%20%22%5Cu000D%5Cu000A%22%29%3B%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20return%20%28%20selection%20%3D%3D%20%27%27%29%3F%20false%3A%20selection%3B%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.tooltipText%20%3D%20%22Stf%22%20+%22%5Cn%22+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%u041B%3A%20%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u043B%u0438%20%u0432%u0435%u0441%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%u043A%u0430%u043A%20txt%20%u0444%u0430%u0439%u043B%22%20+%22%5Cn%22+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%u0414%u041B%3A%20%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u043B%u0438%20%u0432%u0435%u0441%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u043D%u0430%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u0435%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Л: Сохранить выделенный текст или весь текст на странице как txt файл
ДЛ: Сохранить выделенный текст или весь текст на странице без запроса на сохранение в последний созданный файл

bunda1 пишет

Есть другая кнопка которая делает то что ты просишь, Stf+:

Да, спасибо, почти то, что нужно, но есть некоторые минусы для меня: это еще одна кнопка плюсом к Save, отсутствие пункта в контекстном меню, текст вставляется без титла и урла, целевой файл не прописан жестко под даблклик, из всплывающего окна не открыть файл.
Методом научного тыка пытался сделать из двух этих кнопок одну, пытался отредактировать sft+ ... плачевный результат )
Может быть подскажите, что дописать в Save, чтоб появилась возможность из контекстного меню сохранять выделенный текст в файл (прописанный в коде) с указанием титла и урла после разделителя. Или вариант Sft+, где по одиночному - в новый файл с выбором места, а по двойному - дописывает в имеющийся файл + их открытие из информ. окна. Как вам проще.
Спасибо.

Uxapb пишет

● отказаться от Save Text to File
● чтобы файл сохранялся не на рабочий стол и каждый день новый, а дописывался уже имеющийся и находящийся на постоянке в определенном мной месте.

stf :: Add-ons for Firefox
6211711eae05a314dde4d29e0dd8aebd.png

Uxapb пишет

Save Text to File

Pony_Smile_Pack пишет

stf :: Add-ons for Firefox

Функционал схож. Но хотелось отказаться от аддона в пользу кнопки. Тем более, что разделение по вариантам сохранения при различных кликах юзабельнее.

Uxapb пишет

Методом научного тыка пытался сделать из двух этих кнопок одну, пытался отредактировать sft+ ... плачевный результат )
Может быть подскажите, что дописать в Save, чтоб появилась возможность из контекстного меню сохранять выделенный текст в файл (прописанный в коде) с указанием титла и урла после разделителя.

Ну тогда поменяй:

Выделить код

Код:

// путь к файлу и название файла....
     var file = directoryService.get("Desk", Components.interfaces.nsIFile); 
     file.append("Save - " + (new Date()).toLocaleFormat("%d.%m.%Y") + ".txt");

на:

Выделить код

Код:

// путь к файлу и название файла....
     var pathToFile = "C:\\qwerty";
     file.initWithPath( pathToFile + ".txt" );

1) В 25 [firefox] у меня не работает кнопка, которая открывает поиск текста на странице (Ctrl + F), вот её код:

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

Выделить код

Код:

var findToolbar = document.getElementById("FindToolbar");
if (typeof gFindBar == "object") { //Bon Echo 2.0a3
    if(findToolbar.hidden) {
        gFindBar.onFindCommand();;
        this.checked=true;
    } else {
        gFindBar.close();
        this.checked=false;
    } // End if (findToolbar.hidden)
} 
else {
    if(findToolbar.hidden){
        onFindCmd();
    } else {
        closeFindBar();
    } // End if (findToolbar.hidden)
} // End if (typeof gFindBar == "object")


Можете поправить её?

И ещё:
2) Как вернуть "старый" стиль этого поиска, т.е. в 25 [firefox] чтобы строка поиска была такая же, как в 24, 23 ... ?
3) Вот этот скрипт может ещё почините?

bunda1 пишет

Ну тогда поменяй:
......
на:
......

Спасибо большое, именно так и хотел.
Еще вопрос, а можно как-то снять ограничение на кол-во символов в заголовке страницы ?

Uxapb пишет

Еще вопрос, а можно как-то снять ограничение на кол-во символов в заголовке страницы ?

Если я правильно понял:
function getDocTitle() {
     var protocol = content.location.protocol;
     if ( ["about:", "chrome:", "jar:", "data:"].indexOf( protocol ) !== -1 ) return false; 
          var docTitle = content.document.title || content.document.domain || gBrowser.mCurrentTab.label;       
          // заменить недопустимые символы и удалить лишние пробелы
          var docTitle = docTitle.replace(/[:.\\\/<>?*|"]+/g, " ")
          var docTitle = docTitle.replace(/\s\s+/g, " ");

          return docTitle.substring(0, 50);
};

bunda1 пишет

Если я правильно понял:
return docTitle.substring(0, 50);

Да, именно это значение.  Еще раз спасибо, что не оставили без внимания мои маленькие прихоти. :)

1fesFFFF пишет

1) В 25 [firefox] у меня не работает кнопка, которая открывает поиск текста на странице (Ctrl + F), вот её код:

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

Выделить код

Код:

var findToolbar = document.getElementById("FindToolbar");
if (typeof gFindBar == "object") { //Bon Echo 2.0a3
    if(findToolbar.hidden) {
        gFindBar.onFindCommand();;
        this.checked=true;
    } else {
        gFindBar.close();
        this.checked=false;
    } // End if (findToolbar.hidden)
} 
else {
    if(findToolbar.hidden){
        onFindCmd();
    } else {
        closeFindBar();
    } // End if (findToolbar.hidden)
} // End if (typeof gFindBar == "object")


Можете поправить её?

Там старого findbar'а больше нет. Теперь для каждого таба свой.
Переключалка такая-же (вкладка Код)

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

Выделить код

Код:

gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();


Checked-индикация, если нужна,
то можешь попробовать вариант (вкладка Инициализация)
скрытый текст

Выделить код

Код:

const
    observer = new MutationObserver(check),
    optChildList = { childList: true },
    optAttributeHidden = { attributes: true, attributeFilter: ["hidden"] };

function check(mut) {
    const
        childList = mut && mut[0].type == "childList",
        findbar = 
            childList
            && mut[0].addedNodes.length
            && mut[0].addedNodes[0].nodeName == "findbar";

    if (childList && !findbar) return;
    childList && findbar && obs(true);
    self.checked = !gFindBar.hidden;
}
function obs(noCheck) {
    const
        tab = gBrowser.selectedTab,
        findbar = tab._findBar,
        node = findbar || tab.linkedBrowser.parentNode.parentNode,
        options = findbar ? optAttributeHidden : optChildList;

    observer.disconnect();
    observer.observe(node, options);
    if (noCheck != true) findbar ? check() : self.checked = false;
}
obs();
addEventListener("TabSelect", obs, false, gBrowser.tabContainer);
addDestructor(function() observer.disconnect());

Dumby
Спасибо

Кнопка запуска внешнего приложения

Выделить код

Код:

startProcess("C:\\Program Files (x86)\\SMPlayer\\smplayer.exe",["%u"]);

function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("Файл не найден", path); 
};

А как передать в аргументе текущий адрес страницы? Я пробовал %u, но не работает. Я хочу, чтобы на ютубе я нажал на кнопку и открылся SMPlayer с текущей страницей, например

Выделить код

Код:

C:\Program Files (x86)\SMPlayer\smplayer.exe http://www.youtube.com/watch?v=QJO3ROT-A4E

Dеnis

var url=getBrowser().currentURI.spec;
var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
file.initWithPath("C:\\Program Files\\VideoLAN\\VLC\\vlc.exe");
var process  = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
var args = [window.content.location.href];
process.init( file );
process.run( false, args, args.length );

есть рабочая кнопка для отключения плагинов? Вот я попробовал Toggle Java(Firefox) по ссылке https://forum.mozilla-russia.org/viewtopic.php?pid=573843#p573843 - НЕРАБОТАЕТ

by-psi-x пишет

есть рабочая кнопка для отключения плагинов? Вот я попробовал Toggle Java(Firefox) по ссылке https://forum.mozilla-russia.org/viewtopic.php?pid=573843#p573843 - НЕРАБОТАЕТ

Firefox 26 Бета | Форум Mozilla Россия

Все плагины, за исключением последних версий Flash, по умолчанию настроены на "Запуск по щелчку мышью"

bunda1
А можно в кнопке Переключить JavaScript изменить иконку? Цветом не слишком заметно состояние. Можно ли на отключенной организовать маленький красный крестик или просто как зачеркнутую крест-накрест изображать?

Все плагины, за исключением последних версий Flash, по умолчанию настроены на "Запуск по щелчку мышью"

т.е. кнопка отключения/включения плагинов больше работать не будет? Можно удалять?

dedmazai1870 пишет

bunda1
А можно в кнопке Переключить JavaScript изменить иконку? Цветом не слишком заметно состояние. Можно ли на отключенной организовать маленький красный крестик или просто как зачеркнутую крест-накрест изображать?

А какую нужно?

dedmazai1870 пишет

А можно в кнопке Переключить JavaScript изменить иконку? Цветом не слишком заметно состояние.

предлагай =) http://www.iconsearch.ru/

okkamas_knife
Да но сейчас код в кнопке максимально минимален и красив, то есть идеальный.

06-11-2013 00:17:33
Можно легко переделать для переключения любой настройки - поменять иконку, название кнопки и настройку.

feas пишет

предлагай

JavaScript включён
JavaScript выключен
Это примерно, можно и другие. Честно утащил отсюда со 2-ой и 3-ей страницы.

dedmazai1870
Зачем огород то городить, вставьте более яркую иконку и будет прекрасно видно состояние кнопки, включены скрипты или нет, куда уж наглядней.
34f3ddf78574t.jpg 75d8899cdb08t.jpg

villa7
Я бы не городил огород, если Вы или кто-то другой объяснили мне, как такую иконку сделать или добавить пару своих изображений в эту кнопку. Одно изображение я понимаю как, а 2 не умею.
UPD. Если это одно изображение, то опять же какой формат: 32x16 или 16x32? Зачем мне экспериментировать, если ответ у Вас в подписи? :)

dedmazai1870
Качаете любую понравившуюся иконку, подходящую по размерам или в Paint.NET измените размер, цвет, какой нужно. ПКМ по кнопке Редактировать и вставляете иконку.
dc31d0476d09t.jpg

Как меня ломало писать длинный пост!:) Видимо, без этого не обойтись.
Как вставить/заменить иконку в кнопке я знаю, Paint.NET использую давно, IcoFX Portable тоже знаю, но не пользуюсь, потому как есть друг, который нарисует лучше меня. :)
Мне непонятно другое: каким образом иконка меняет свой цвет? Может это указано в коде кнопки? Но я там ничего не понимаю. Вот я и подумал, что может быть там прописано две иконки, которые выбираются в зависимости от события?
Как пример, использую дополнение Speed Dial. Захотелось мне изменить в нём иконку таба и значок: mdaf.jpg на свои. DOM Inspector подсказал, но значок оказался таким: 4p5o.png (32x64), поэтому взял "домик" 35v7.png (16x16) и просто клонировал xzr8.png
Отсюда и возникли вопросы, которые выделил bold'ом. Если бы умел делать обратную конвертацию из base64 в png смог бы сам посмотреть иконку, но я этого не умею.

P.S. А в Speed Dial теперь так (гифка примерно 30 сек.).
rqo.gif

P.S. Сейчас нашёл Online Base64 Image Encoder/Decoder. Вижу, иконка одна. Вопросы остаются: как она меняет свой цвет в кнопке?

okkamas_knife
Спасибо. Смотрел код, по названию "toggleImage" так и предполагал и в силу своей глупости и "серости" пытался изменить greyscale на greenscale, но кнопка не позеленела, а вообще с панели пропала. :D Значит, оставляю всё как есть, т.к. код самостоятельно изменить не смогу. Или попробую по совету villa7 заменить с более ярким цветом, чтобы отличия были виднее.
Всем участникам спасибо за помощь и объяснения.

dedmazai1870 пишет
feas пишет

предлагай

JavaScript включён
JavaScript выключен
Это примерно, можно и другие.

Замени в кнопке:

Выделить код

Код:

function toggleImage() {   
   self.style.filter = pref.value ? '' : 'url("chrome://mozapps/skin/extensions/extensions.svg#greyscale")';   
};

на:

Выделить код

Код:

function toggleImage() { 
   var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
   icon.src = pref.value
   ? 'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAACQWzEUkFsxhJBbMaOQWzG2kFsxyZBbMdqQWzHrkFsx+pVhOf+GckP/TodG/zqIQP8+fDX4VHEyYf///wD///8AlF8zaLiQbf/WuqP/38az/+fUw//u39P/9eri//v07/+hyab/aLJ4/4PHk/9+wJf/gMSR/1ajY/orgDKG////AJlkNonHpIX////////////////////////+/P/a6Nj/crqC/4/Qnf8/plz/9PT0/0+5ev+Ky5v/V6Vl9yqAMjmeaTlXnmk59rSFWf/ZpXv/2J5v/9ebav/YlmP/dqdw/4nPlv9zx4P/RK9g//Hx8f/y8vL/Trl6/4DFkv8vhTjPpG88FKRvPKvVroz//fDl//fHov/3z63/+dW1/2yxfv+X16H/fMuI/2K/fv/z8/P/8fHx//X19f9OqmX/Nok/9v///wCqdUAot4ZW//7+/f/63sL/+ty///nbwP+HvI7/qd6z/47SmP9sunz/+fn5//b29v9ivoX/hsuV/zyOR8////8AsXtDHrmGUv/+/Pn/+dy///jbv//43MD/29O1/6HTrv+95cP/dryB//////+Lxpf/mdak/2i0ePdBkk45////ALeCRwm5hUv//vv3//ncwf/43L//+Ny///jbwP+yyqP/p9Wx/7vkw/+t1LL/p92x/32+iP9Qnl+G////AP///wD///8AvYhL+fz28P/538f/+dy9//rcv//628H/+t3D/9zVtf+IvZD/b7SC/4C8j/+rlFr/vYhLD////wD///8A////AMSOTtr159j/+uXS//navP/527z/+tu///rdwf/63cH/+d3E//vhyP///fv/yJRX/8SOThL///8A////AP///wDKlFK78NnB//vt4f/52sD/+dzC//nexf/64Mf/+uLK//rizf/65dD///79/8uPWv/KlFLxypRSRf///wD///8A0JpVpO3Qsv//9vD/+uHK//vjzP/749D/++bT//vp1f/86dj//Orb/////f/SnXH/7tnB/9CaVeX///8A////ANWfWJLryqX///37//3p1f/969j//erb//3t3//98OL//fHk//zw5P//////4KBw///7+f/fuIf/////AP///wDapFuE68aa///////87+L//fDn//3x6//99e7//fjx//369////Pr///////779//02sD/2qRb6v///wD///8A3qhdberAjP///////////////////////fn0//vz6v/469n/+ObT//Xfxv/py6b/3qhd7d6oXV3///8A////AOKsXzbirF/G6ryB/+i3d//msm3/5LBo/+KsX/DirF/j4qxfz+KsX8zirF+74qxfqOKsX0virF8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==' 
   : 'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAACQWzEUkFsxhJBbMaOQWzG2kFsxyZBbMdqQWzHrkFsx+pVhOf+aaUH/ZGaG/xhNrv8FQrv/B0a16QNFuHr///8AlF8zaLiQbf/WuqP/38az/+fUw//u39P/9eri//v07//9+vb/jKrg/yhmyf8hd+b/BXnq/wFk3f8ETb38A0W4eplkNonHpIX////////////////////////+/P/++/f//vfx/x9Yv/9jnfT/GH///wB2+P8Adu7/A2jh/wNFueSeaTlXnmk59rSFWf/ZpXv/2J5v/9ebav/YlmP/1pJd/9SPWf8FQrz/rs3+/////////////////xh/7/8EQrz+pG88FKRvPKvVroz//fDl//fHov/3z63/+dW1//javf/43sL/JFm7/4219v9Nkv//EXf//yGG//9Aiuv/A0S53v///wCqdUAot4ZW//7+/f/63sL/+ty///nbwP/528D/+d3B/5Odwv89ddH/jbX3/7jW/v9yqPX/LWvL/ARDum3///8AsXtDHrmGUv/+/Pn/+dy///jbv//43MD/+dvC//ncwf/53cL/kp7D/ypfwv8FQ7z/FUut/ANFuXj///8A////ALeCRwm5hUv//vv3//ncwf/43L//+Ny///jbwP/53cD/+d3A//ndw//74sv//Pn1/7eCR/u3gkcB////AP///wD///8AvYhL+fz28P/538f/+dy9//rcv//628H/+t3D//rdwv/53cT/++DJ///8+v/BjVP/vYhLD////wD///8A////AMSOTtr159j/+uXS//navP/527z/+tu///rdwf/63cH/+d3E//vhyP///fv/yJRX/8SOThL///8A////AP///wDKlFK78NnB//vt4f/52sD/+dzC//nexf/64Mf/+uLK//rizf/65dD///79/8uPWv/KlFLxypRSRf///wD///8A0JpVpO3Qsv//9vD/+uHK//vjzP/749D/++bT//vp1f/86dj//Orb/////f/SnXH/7tnB/9CaVeX///8A////ANWfWJLryqX///37//3p1f/969j//erb//3t3//98OL//fHk//zw5P//////4KBw///7+f/fuIf/////AP///wDapFuE68aa///////87+L//fDn//3x6//99e7//fjx//369////Pr///////779//02sD/2qRb6v///wD///8A3qhdberAjP///////////////////////fn0//vz6v/469n/+ObT//Xfxv/py6b/3qhd7d6oXV3///8A////AOKsXzbirF/G6ryB/+i3d//msm3/5LBo/+KsX/DirF/j4qxfz+KsX8zirF+74qxfqOKsX0virF8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==';
};

okkamas_knife
bunda1
Большое спасибо!

Чёто в новой ночнушке с австралисом кнопки с панели навигации не пашут. Уже возникал этот вопрос: №231, тогда помогло решение от Dumby:

Выделить код

Код:

var sel = '#nav-bar-customizationtarget > toolbarbutton[id^="custombuttons-button"]:not([initialized])';
Array.forEach(document.querySelectorAll(sel), btn => { try { btn.init() } catch(ex) {} });

но теперь не помогает. :sick: Можно пофиксить? А то обидно, почти всё что нужно восстановил, и панель дополнений тоже есть :), а с этим незадача.

p.s. Некоторые кнопки с меню (Открыть в нижней панели и Extensions Options Menu) и с других панелей не работают. Пока австралис не приземлили - работали (и в UX 24 работают).а нет, тут ложная тревога, заработали после перезапуска. :)

upd. Вопрос решён. Ступил, не разглядел с утра, что #nav-bar-customizationtarget теперь #nav-bar-customization-target :dumb:
Поменял это в коде, теперь всё нормально.

Пользуюсь букмарклетом Upload To

скрытый текст
javascript:(function(){var%20c='ujs_max_upload',w=window,d=(w.document.body%20instanceof%20HTMLFrameSetElement%3Fw.frames[0]:w).document,e=d.getElementById(c);if(e){e.del();return};e=d.createElement('div');e.id=c;e.setAttribute('style','display:none;position:fixed;right:0;bottom:0;width:auto;height:auto;border:1px%20solid%20%23555;padding:10px;text-align:left;z-index:99999;background-color:%23EEE;background:-o-skin(%5Cx22Window%20Skin%5Cx22);');e.add=function(lnk,frm){var%20d=this.ownerDocument,a=d.createElement('a');a.href=lnk.href;a.target='_blank';a.setAttribute('style','padding:0;margin:0;border:none;text-decoration:none;color:%2300C;font:14px%20Times%20New%20Roman;');a.appendChild(d.createTextNode(lnk.text));this.appendChild(a);var%20f=d.createElement('form');f.action=lnk.action;f.method='post';f.enctype='multipart/form-data';f.target='_blank';f.setAttribute('style','display:block;margin:5px;');var%20t=d.createElement('input');t.type='file';t.name=lnk.name;t.setAttribute('style','width:auto;height:auto;padding:1px;margin:0;border-color:%23AAA;font:12px%20Arial;');t.onchange=function(){this.nextSibling.disabled=!this.value};f.appendChild(t);var%20s=d.createElement('input');s.type='submit';s.value='Upload';s.disabled=true;s.setAttribute('style','width:auto;height:auto;padding:1px%204px;margin:0%200%200%202px;color:buttontext;font:12px%20Arial;');f.appendChild(s);if(frm)for(var%20name%20in%20frm){var%20h=d.createElement('input');h.type='hidden';h.name=name;h.value=frm[name];f.appendChild(h)};this.appendChild(f)};e.vis=function(v){this.style.display=v%3F'block':'none';return%20this.offsetHeight*this.offsetWidth};e.del=function(){this.vis(false);this.parentNode.removeChild(this)};var%20b=d.createElement('div');b.title='Close';b.setAttribute('style','display:block;float:right;height:18px;width:18px;padding:0;margin:-5px;border:none;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAZElEQVR42mNgGNyAGQixsVGU/AdCXjCbHczmxKaMFywlAlWiw6DAwIZNmQhYGqJEDWoqFiAGVmKKTwk73CRJ/Ep0GIyhbsPpO4hbIG4TwKaMk0EZ7hYBBk1cvmNDEmbDrmSwAADE8h10+qICXwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=");background:-o-skin(%5Cx22Caption%20Close%20Button%20Skin%5Cx22);cursor:pointer');b.onclick=function(){this.parentNode.del()};e.appendChild(b);e.add({href:'http://www.imageshack.us',text:'Imageshack.us',action:'http://post.imageshack.us/',name:'fileupload'},{MAX_FILE_SIZE:'1048576',key:'07AHPRSUb540e13d31461ec4d69d5fc122bd5ab7'});e.add({href:'http://www.radikal.cc',text:'%D0%A0%D0%B0%D0%B4%D0%B8%D0%BA%D0%B0%D0%BB-%D0%A4%D0%BE%D1%82%D0%BE',action:'http://www.radikal.cc/action.aspx',name:'F'},{upload:'yes',VM:'180'});e.add({href:'http://fastpic.ru',text:'FastPic.ru',action:'http://fastpic.ru/uploadmulti',name:'file[]'},{uploading:'1'});e.add({href:'http://multi-up.com',text:'Multi-up.com',action:'http://multi-up.com/up.php',name:'upload'});e.add({href:'http://zalil.ru',text:'Zalil.ru',action:'http://zalil.ru/upload/',name:'file'});e.add({href:'http://rghost.ru/',text:'Rghost.ru',action:'http://kaon.rghost.ru/files',name:'file'},{'data-max-file-size':'52428800'});d.documentElement.appendChild(e);e.vis(true)})();

Пытался сделать из него кнопку по принципу loadURI("") - не работает. Подскажите что нужно изменить. (В программирование я не 0, а -1, чем проще тем лучше.)

adidharma пишет

и панель дополнений тоже есть :) .

  А подробнее можно? 
Всё увидел №12067 :)

Mishania пишет

Пользуюсь букмарклетом Upload To

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

Пытался сделать из него кнопку по принципу loadURI("") - не работает. Подскажите что нужно изменить. (В программирование я не 0, а -1, чем проще тем лучше.)

Mishania,
1) Присвойте своему букмарклету keyword
2) Положите в кнопку в секцию инициализации этот код:

Выделить код

Код:

this.onclick=function(e) {
if (e.button==0) {
    var url = PlacesUtils.getURLAndPostDataForKeyword(' вставить свой keyword ')[0];
    loadURI(url);
    } 
}

Чайник
Про инициализацию я знаю, а keyword это как?

Mishania пишет

Чайник
Про инициализацию я знаю, а keyword это как?

Keyword - это краткое имя. Вот это
e090403bccacd83f37dff62311419f44.png

Выбрать краткое имя можно любое и вписать его в скобки в коде.

Чайник
Спасибо!

Что-то у меня на 24.0 совсем не работает кнопка Переключаться на новые вкладки/Открывать новые вкладке в фоне.(Firefox)
Новые вкладки открываются всегда активными, не в фоне. Хотя значок кнопки меняет свой вид при смене режима.

rubel пишет

Что-то у меня на 24.0 совсем не работает кнопка Переключаться на новые вкладки/Открывать новые вкладке в фоне.(Firefox)
Новые вкладки открываются всегда активными, не в фоне. Хотя значок кнопки меняет свой вид при смене режима.

Это есть в настройках.
87dab2dd2e6451785641953945ead476.png

Pony_Smile_Pack пишет

Это есть в настройках.

У меня эта птичка не стоит. Проверил и на 17.0 с одним расщирением-open_link_in_new_tab , тоже не работает, может какие настройки нужны. Хочется чтоб все ссылки открывались в фоне в новых вкладках.

Нужна кнопка или скрипт, который автоматически при запуске браузера или открытии любого сайта сбрасывает масштаб страницы на стандартные 100%.

1fesFFFF
В about:config browser.zoom.siteSpecific - fasl попробуйте.

1fesFFFF пишет

Нужна кнопка или скрипт, который автоматически при запуске браузера или открытии любого сайта сбрасывает масштаб страницы на стандартные 100%.

Изменить масштаб

всем привет, а есть ли кнопочки на подобее тех которые имеются в MRTechToolkit{6.0.4.9000}, список тем и расширением(клик и открываются настройки расширения). или выключение всех расширений. вообщем все которые имеются в MRTechToolkit.
спасибо.

mahtanoronra
Extension List
Toggle Restartless Add-ons

15-12-2013 20:55:50
Add-ons Manager

15-12-2013 20:56:18
Extensions Options Menu

15-12-2013 20:56:38
Extension List Generator

15-12-2013 20:57:08
Check for Addons Updates

15-12-2013 20:59:05
Custom Buttons • View topic - View Page Extension

15-12-2013 21:02:05
10-11-2013 20:53:17

15-12-2013 21:02:47
Custom Buttons • View topic - Extensions Options Menu

15-12-2013 21:06:48
Lightweight Theme Switcher

bunda1
1 имеется
спасибо а в Toggle Restartless Add-ons можно сразу все выключать разом?и почему то там не все расширения имеются в списке( Extensions Options Menu тоже список всего из 6 расширений) :)

mahtanoronra пишет

bunda1
1 имеется
спасибо а в Toggle Restartless Add-ons можно сразу все выключать разом?

Сразу нельзя и наверно кнопка показывает только Restartless расширения.

Я пользуюсь кнопкой Открывать всё в новых вкладках.
Но пункт контекстного меню адресной строки "Вставить и перейти" открывает адрес из буфера в текущей вкладке. А хотелось бы в новой.

Может можно что добавить в код кнопки?
Или "Вставить и перейти" + какая-то клавиша чтоб открывала новую вкладку.


И насчёт кнопки Proxy. Мне не нужен полностью её функционал, а нужна та часть, которая позволяет установить адрес/порт прокси из выделенного текста. Какой кусок кода нужно взять?

rbfyec пишет

И насчёт кнопки Proxy. Мне не нужен полностью её функционал, а нужна та часть, которая позволяет установить адрес/порт прокси из выделенного текста. Какой кусок кода нужно взять?

Выделить код

Код:

// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ................................
(function func() {
  var contextMenu = document.getElementById("contentAreaContextMenu");  
  
  // создать новый пункт меню
  var menuitem = document.createElement("menuitem");      
  menuitem.setAttribute("label", "Добавить прокси"); 
  menuitem.setAttribute("class", "menuitem-iconic");
  menuitem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAYOQAAWJ2kADh1fAAAEKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAEEJBE4ULQ+fZ38ea/H/muhuv8gW3ztAxclewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLNlO7PH+n/3Sgu/281eP9zuHr/mWZuP4XXon/ABAeZwAAAAAAAAAAAQEBAQAAAAAZGBoTKScsLyYkKjErJSgnIC8/XgZQgP9BcZb8b5q3/oiux/+qx9r/a5Ow+zFtlv8PRWrGAAACAAEBAQMHBwcbAAAAD2BeYn769/3/4eDm/Onh5v+DnrX/A0t9/j1vlv+FqMH/lrfN/7rS4f9+pL3+M26X/xJYhu0DEiMdAAAAAAEBAQEAAAABBgUGEaSiprbPzNP239fb/4OcsP4aXYr/RHOZ/5Gwx//T5e//mrjO/3KYtv40apP/D0x77AUTIhwhHyMmeXV7mXt4fqJ3dHmce3d+n6eirODMx8r/o6q3/kN4nf92m7n/vtPj/9Hg7P/C1OL/eJq1+jtulv8bSnC7AAEGAF1aYH7//////f39/P//////////////////////////lbHC/3ilvf/K4Oz/2OXv/7nN3f6FqcP/VIiv/AseMT8AAAAAXFtef+LY5/+AT534fU2d+4VXovyKXaf+jGGp/5BlrP+GWKT/ZmGc/4Cduf+ivtD+k7HH/1t/neUTJjhFAAAAAAEBAQJfXmB/3tHl/14giPxcIYr/Zy+S/244mP9yPZv/cj6c/3M9nP9wNpf/YDSP/1k0ivu7tdP/YmNmiAAAAAAEBAQGAAAAAF9eYIDg1Ob/cDqV/HE9mv9/TaT/hler/4tdr/+NXrD/iFms/4JTqP9+SqP/cjqW+9zJ4/9ubW6JAAAAAAMDBAQAAAAAX15ggODU5v94RZz8e0mi/4pcrv+Vabf/nXO9/6J5wf+jfMH/oXq//513u/+NY6z718bh/2pqa4gAAAAABAMEBAAAAABfXWCA4NTm/4VWpfyPY7L/onvA/7GPzP+8ndT/waTY/8Cj1/+6nNL/tZfO/6F9uvvYx+L/ampriAAAAAAEAwQEAAAAAF9eYH/e0uX/n3u5/LKTzP/Bpdf/zrbh/9jC6f/bxuv/2cTp/9O+5P/Qu+H/uJ3L+9jI4f9qaWuHAAAAAAQDBAQAAAAAX15gf97S5P+gfbf5sZPH/LqdzfzCqNT8ybHZ/My12vzKs9n8xq/W/Mav1fywksL418fh/2tqbIkAAAAABAMEBAAAAABZVlt3+fX8/+DU5vzj1un/5tvt/+ne7//r4PH/6t7w/+fb7f/k2Ov/4dPn/9nM4Pv79v//ZGFnfwAAAAADAwQEAAAAABcVGRpZVlt6YF9hgWBgYoBhYWKAYmFigGJiY4BiYmOAYmFigGFhYoBgYGGAX15ggF1aX4AbGR0eAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=");
  addEventListener("command", function(e) { addNewProxy() }, false, menuitem );
  
  // устанавливаем где показывать пункт меню 
  addEventListener("popupshowing", function() {
     menuitem.hidden = !gContextMenu.isContentSelected;
  }, false, contextMenu );
  addDestructor(function() { contextMenu.removeChild( menuitem ) });
  contextMenu.appendChild( menuitem ); // как последний пункт меню
  
  
  // добавление прокси
  function addNewProxy( sel, i ) {  
     var selection = document.commandDispatcher.focusedWindow.getSelection().toString();
     var sel = ( sel == undefined ) ? selection : sel.toString();
     sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
     sel = sel.replace(/\s+/g,":"); // заменить пробелы внутри строки
     
     // если порт ...
     if ( sel.length < 5 && isFinite(sel) ) {  
          sel = sel.replace(/:/g, "");
          sel = +sel;  // порт как число
          var lab = 'порт';
          var pref = 'network.proxy.http_port';
          }
     
     // если адрес ...
     if ( sel.length > 4 && !/:/.test(sel) && sel.split(".").length == 4 ) {  
          var lab = 'адрес';
          var pref = 'network.proxy.http';
          }     
     
     // если адрес и порт ...    
     if ( sel.length > 4 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4 ) {
          var lab = 'адрес и порт';
          var array = sel.split(":");  
          array.forEach(function(sel, i) { addNewProxy( sel, i ) });          
          }     
     
     Application.prefs.setValue( pref, sel ); // переключить настройки прокси     

     if ( lab == undefined || i !== undefined || i == 0 ) return;
     
     // всплывающая подсказка рядом с выделенным текстом ...     
     function showTooltip() {
        var tooltip = gBrowser.appendChild( document.createElement("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.createElement("image") );
        image.setAttribute("src", self.image );
   
        var label = tooltip.appendChild( document.createElement("label") );
        label.setAttribute("value", "Установлен " + lab + " прокси: " + sel );
    
        var focused = document.commandDispatcher.focusedWindow;
        var selection = focused.getSelection().getRangeAt(0).getBoundingClientRect();
        var posX = focused.mozInnerScreenX + selection.left;
        var posY = focused.mozInnerScreenY + selection.bottom - 5;   

        tooltip.showPopup( gBrowser, posX, posY );
        setTimeout(function() { gBrowser.removeChild( tooltip ) }, 2000 );
     };
     showTooltip();    
  };
   
})();
rbfyec пишет

Я пользуюсь кнопкой Открывать всё в новых вкладках.
Но пункт контекстного меню адресной строки "Вставить и перейти" открывает адрес из буфера в текущей вкладке. А хотелось бы в новой.
Может можно что добавить в код кнопки?

Добавить:

Выделить код

Код:

addEventListener("popupshowing", function(e) {
   var menupopup = e.originalTarget;
   var pasteAndGo = menupopup.getElementsByAttribute("anonid", "paste-and-go")[0];
   pasteAndGo.setAttribute("oncommand", "event.preventDefault(); gURLBar.select(); goDoCommand('cmd_paste'); gURLBar.handleCommand(event);")
}, false, document.getElementById("urlbar") );
bunda1 пишет

Добавить:

Выделить код

Код:

addEventListener("popupshowing", function(e) {
   var menupopup = e.originalTarget;
   var pasteAndGo = menupopup.getElementsByAttribute("anonid", "paste-and-go")[0];
   pasteAndGo.setAttribute("oncommand", "event.preventDefault(); gURLBar.select(); goDoCommand('cmd_paste'); gURLBar.handleCommand(event);")
}, false, document.getElementById("urlbar") );

Это я добавил, оно работает, благодарю.

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

В консоли ошибок нет.

rbfyec пишет

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

В консоли ошибок нет.

rbfyec
Я проверил и всё работает и кнопка не должна сама исчезать при перезапуске браузера.
Тут что то не понятное или ты что то не делаешь.

bunda1
Да, сейчас кнопка работает. А почему вчера не работало - понять не могу.
Спасибо!! :music:

А как сделать, чтоб кнопка меняла иконку от состояния прокси, неважно включаю я прокси хоткеем, кнопкой или жестом?

rbfyec пишет

А как сделать, чтоб кнопка меняла иконку от состояния прокси, неважно включаю я прокси хоткеем, кнопкой или жестом?

Выделить код

Код:

// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ................................
var  s = "network.proxy.type";
function toggleImage() {
    var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
    icon.src = ( cbu.getPrefs(s) == 0 )
    ? self.image
    : '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=';
};  
toggleImage();
gPrefService.addObserver( s, toggleImage, false );
addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) });

Иконка есть! :)


А вот одна вещь у меня не получается.

Допустим прописан у меня в настройках какой-то прокси. Потом я через контекстное меню (или в диалоге) меняю адрес/порт.
А через время я хочу вернуться (нажатием кнопки) на тот, первый прокси. Его изначальные настройки я записываю в переменные

Выделить код

Код:

addr = Application.prefs.getValue("network.proxy.http", 0); 
prt = Application.prefs.getValue("network.proxy.http_port", 0)

И хочу использовать их  для возврата на первый прокси. Но когда я меняю через контекстное меню адрес/порт -  addr и prt   перезаписываются.
Я менял место объявления эти переменных, всё равно не получается, не могу сохранить первоначальные значения, хоть бери в блокнот записывай. (Область видимости?)

Хочу уточнить: первый прокси - это не какойто фиксированный адрес, а просто тот, который был ДО изменения настроек.

rbfyec
Не много непонятно но кажется ты хочешь менять прокси через меню и потом нажатием кнопки возвращать первоначальное значение. Самое простое решение, в код кнопки:

Выделить код

Код:

Application.prefs.setValue('network.proxy.http', '119.82.240.185' );                 
Application.prefs.setValue('network.proxy.http_port', 8080 );

Порт и адрес ставь свой.

bunda1 пишет

Не много непонятно но кажется ты хочешь менять прокси через меню и потом нажатием кнопки возвращать первоначальное значение

Выделить код

Код:

Application.prefs.setValue('network.proxy.http', '119.82.240.185' );                 
Application.prefs.setValue('network.proxy.http_port', 8080 );

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

То что предлагает okkamas_knife вроде подходит, но...
Я создал в about:config параметры custombuttons.button.proxy.proxybakup (строка) и custombuttons.button.proxy.portbakup (целое). В сниппетах есть код

Выделить код

Код:

//установить значение параметра в about:config (средствами CB)
var n="browser.download.dir";//параметр
var z="C:\Documents and Settings\Администратор\Рабочий стол";//значение, для булевых ставим 0-false 1-true
custombuttons.setPrefs(n,z);

И вот в коде кнопки я нашёл место, где добавляется прокси и написал

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

Выделить код

Код:

// добавление прокси
  function addNewProxy( sel, i ) {  
     var selection = document.commandDispatcher.focusedWindow.getSelection().toString();
     var sel = ( sel == undefined ) ? selection : sel.toString();
     sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
     sel = sel.replace(/\s+/g,":"); // заменить пробелы внутри строки
     
     // если порт ...
     if ( sel.length < 5 && isFinite(sel) ) {  
          sel = sel.replace(/:/g, "");
          sel = +sel;  // порт как число
          var lab = 'порт';
          var pref = 'network.proxy.http_port';
          }
     
     // если адрес ...
     if ( sel.length > 4 && !/:/.test(sel) && sel.split(".").length == 4 ) {  
          var lab = 'адрес';
          var pref = 'network.proxy.http';
          }     
    
     // если адрес и порт ...    
     if ( sel.length > 4 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4 ) {
          var lab = 'адрес и порт';
          var array = sel.split(":");  
          array.forEach(function(sel, i) { addNewProxy( sel, i ) });          
          }     
     
      Application.prefs.setValue( pref, sel ); // переключить настройки прокси
 
      
 //****************   Это я добавил   *************************************  
  
       proxybakup =  custombuttons.setPrefs("custombuttons.button.proxy.proxybakup", pref); 
       portbakup = custombuttons.setPrefs("custombuttons.button.proxy.portbakup", sel);


Это не работает. В консоли

Ошибка: NS_ERROR_UNEXPECTED: Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIPrefBranch.setCharPref]
Источник: chrome://custombuttons/content/overlay.js
Строка: 914

Надо заменить:

Выделить код

Код:

addEventListener("command", function(e) { addNewProxy() }, false, menuitem );

на:

Выделить код

Код:

addEventListener("command", function(e) {
     // сохранить старые настройки прокси ....
     Application.prefs.setValue('CB.button.proxy.portbakup', cbu.getPrefs("network.proxy.http_port") );
     Application.prefs.setValue('CB.button.proxy.proxybakup', cbu.getPrefs("network.proxy.http") );   
  
     addNewProxy();
}, false, menuitem );

Я напутал в коде, потому и не выходило :dumb:

bunda1 пишет

Надо заменить:
..............

на:
.............

Вот это получилось то самое что я и хотел!
bunda1,
ПОЛНЫЙ РЕСПЕКТ! :rock:

А просто интересно, это вообще-то возможно: присвоить переменной значение какого-то параметра about:config  и сохранить эту переменную неизменной когда этот параметр меняется?

rbfyec пишет

А просто интересно, это вообще-то возможно: присвоить переменной значение - адрес прокси и сохранить эту переменную неизменной когда адрес меняется?

Можно конечно но только до закрытия браузера и наверно :/ до настройки панелей или редактирования кнопки.

rbfyec
В prefs.js всё сохраняется, создавайте себе там что и сколько угодно.

bunda1
Здравствуйте. При переходе на 26 [firefox] перестал работать скрипт conqueryModoki4.uc.xul.
Версия с  github тоже не работает.

Вот ссылки на мой скрипт:

скрытый текст
http://multi-up.com/934591
или
http://files.mail.ru/79D0D2B0E8C149D38E06CD91105C46EA

Можете его починить?

Данный скрипт - это Context Search. Преимущество его для меня в том, что он идёт отдельной строкой в контекстном меню и после поиска через него, не меняет поисковик из строки поиска.

Как сделать listener чтобы он следил за появлением окна с определённым адресом (или с определённым заголовком) и тогда выполнится действие?

toxa пишет

Как сделать listener чтобы он следил за появлением окна с определённым адресом (или с определённым заголовком) и тогда выполнится действие?

Вот пример:

Выделить код

Код:

// Обработчик следит за переключением табов и запускают нужные коды и функции ................................
addEventListener("TabAttrModified", function(e) { 
   
   var tab = e.target;
   var uri = tab.linkedBrowser.currentURI.spec; 
   var doc = tab.linkedBrowser.contentDocument;            

   if ( tab.hasAttribute('read') ) setTimeout(function() {  { tab.removeAttribute('unread') } }, 0)
   
   // автоматически меняем название таба для таба "Bookmarks tab" ....
   if ( uri == "chrome://browser/content/bookmarks/bookmarksPanel.xul") doc.title = "Закладки";

   // автоматически очистить адресную строку для 'Bookmarks tab' ....
   if ( gBrowser.currentURI.spec == "chrome://browser/content/bookmarks/bookmarksPanel.xul") {
        gURLBar.value = "";
        gURLBar.focus();
        };
         
   // стоп, если открыть другие вкладки в фоновом режиме ....
   if ( uri !== gBrowser.currentURI.spec ) return; 
        
   // показываем иконки сайтов в адресной строке ....
   gProxyFavIcon.src = ( gBrowser.mCurrentTab.image == '' ) ? "chrome://global/skin/icons/Portrait.png" : gBrowser.mCurrentTab.image;
     
}, true, gBrowser.tabContainer );

Что-то не могу понять как мне приспособить этот код...
listener срабатывает если меняется адрес у таба. Но мне надо отследить появление окна

Выделить код

Код:

open('http://ya.ru', '', 'width=300, height=300')

Что я должен написать в коде?

Упс, я невнимательно прочитал. Ну тогда не знаю, а что ты хочешь добится.

22-12-2013 22:24:55
Можно получить окно вот так но данном случае код отдаёт не правильный адрес:

Выделить код

Код:

// Наблюдатель следит за открытием окон
var observer = {  
       observe: function(subject, topic, data) {
          subject.addEventListener("load", this, false);
          },
      
       handleEvent: function(e) {
          var doc = e.target;
          var win = doc.defaultView;
          var href = doc.location.href.slice(0,60);
          win.removeEventListener("load", this, false);
          
          ...............
        
       }
};
Services.obs.addObserver( observer, "domwindowopened", false);
addDestructor(function() { Services.obs.removeObserver(observer, "domwindowopened", false) });
bunda1 пишет

Упс, я невнимательно прочитал. Ну тогда не знаю, а что ты хочешь добится.

Добиться я хочу вот чего: мне нужно приделать обработчик онклик к кнопке, расположенной в этом окошке. Но не через html атрибут онклик, а через свойство my_button.onclick

Вот я и хочу чтобы какой-то наблюдатель, как только откроется моё окошко, запустил код 

Выделить код

Код:

my_button.onclick=function(){....}
okkamas_knife пишет

toxa
мне кажется тот код(первый что дал бунда1) только для табов.
попробуй пример отсюда

Я там ничего не понял :(

Ты хочешь кнопкой открыть окошко и там что то сделать, так?

bunda1
Если не сложно, обновите пожалуйста Autocopy+3, чтобы она не копировала текст из Find Bar-а и спасибо большое за кнопки. :)

А нет ли случайно CB открывающей Find Bar во всех вкладках, как раньше?

Teu пишет

А нет ли случайно CB открывающей Find Bar во всех вкладках, как раньше?

[CB]Toggle Find+3

voqabuhe
Спасибо, супер вещь, как всегда от bunda1. :)

Для 26 [firefox] можете исправить кнопку?

1) Открывает боковую панель с загрузками.

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

Выделить код

Код:

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

     // действие при клике ЛКМ ....
     if ( e.button == 0 ) {
          document.getElementById('sidebar-box').getAttribute('sidebarcommand') ? toggleSidebar() : openWebPanel("Downloads", downTabUrl );         
          };
          
     // действие при клике СКМ ....    
     if ( e.button == 1 ) { 
          var windows = Components. classes ['@mozilla.org/appshell/window-mediator;1'].getService(Components. interfaces. nsIWindowMediator).getEnumerator (null);
          while( windows. hasMoreElements() ) {
                 var win = windows.getNext ();
                 if ( win.document.documentURI == "chrome://mozapps/content/downloads/downloads.xul") {    
                      win.close();
                      return;
                      }
                 };
          BrowserDownloadsUI();
          };
     
     // действие при клике ПКМ ....    
     if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
          e.preventDefault();  
          downloadManagerInTab( true );
          }
};



// Объявляем переменные для этой вкладки ...................................................................
var downTabUrl = 'chrome://mozapps/content/downloads/downloads.xul';

// иконки для вкладки загрузок ....
const trueDownloadsImg = "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAIAAAMACyIAEGyoLtVqpyrVDSIADwAAAgABAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIAAgAAAgALHwAPZaAmwsXxnv+t63n/XpwbwAcUAA0AAAIAAQIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwADAAACAAwgAA9loyXFv+2W/7/wl/yg52b8n+Nj/1OJG8EBCAAMAAACAAECAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAIAAAIADCEADmSiI8Sx4oX/suWH+7HmhP+T3FX/i9dK+5LZUv9RhxnAAQkADAAAAgABAgACAAAAAAAAAAAAAAAAAQIAAgAAAgANIQANY6Eiw6nbfP+l23f7p913/6fed/+I0kj/gs5A/37KPvuL0Ev/UIYYvwIJAAsAAAIAAQIAAgAAAAABAQABAAABAAsgAA1gnh/BoNJy/5vSa/qe1W3/odhx/5/Ybv+Cy0H/fsg8/3zFOv92vjX6g8VD/0yCFL0BCAALAAABAAABAAEAAAEACRUAEmqmKcyn2Hr/n9Ry/Z3Tbv+Yz2b/mtJp/5nRZv99xDz/ecI3/3e/Nv97wT7/e78//YvKT/9Xjhy/BAwACQAAAQAAAAEAFCkAL2CUKdxhkTDXXI4o1m+mN/KWzGb/ksth/pLLX/93vTn/croz/nm9Pf9noizyVoog1lqNJtlbkx/TDyAAHwAAAQAAAAAAAAAAAAAAAAACAwEEAAAAAD5oFqeXz2X/icFY+4rDWP9ytjX/bLEu+3/CQv8+ZxSnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAEAAQEBAQEDBAMEAAAAAEFqFqeSyV7/g7pR+4S8Uf9usDP/aKsr+3u9Pv9AaRSnAAAAAAMEAgQBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeNxVj/fbRK+3+2Sv9rqzD/ZaYo+3m5PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeJwlT/eLBF+3qyRv9qqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeHwFD/da5B+3exQv9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeEv03/cqw8+3WvPv9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeCvkn/cKs4+3OuO/9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAD9oE6d+vET/bKky+2+sNf9oqCv/Y6Mm+3e3Ov8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFaeDv0v/cKw5+3OvPP9vqzX/aqcx+3+8RP9AaRSnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAEAAAAADlkCox1szT/a6Yv+W2oMPxspy78aqQt+XSyMv85ZAqMAAAAAAECAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
const falseDownloadsImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACmElEQVR42oyU3UtUQRiHn9k9c47Ho+4uhrkthmUfkHeB91GJ1paiJl0EQZd9U3f+E1EX0b8QEUQX0ScZWd0E3VhBrWJFuZuEqyLsOTtnznSxx9rSzPdq5p13nhl+729GTBXL/BUJwAFcwAZEnDdAFagAARDVb7JYHQ6QBTKsHWWgGAPXBblAZu/ubTdUQ6YnKWslWoVIv/z6zYeZ08DCRkA2QPOW7T2dXTuwLAsMhDrk03Shp77mfyABkE6laGluRgiBACJjSKXSf9T8D1RbsBJIy0IIgcGQMAYrKfhn/b9BFtKWv1sWGZKJ5LqgJNAQiyyB1hpI4ti/pYiiCEvKlWlrbIcwFt23YkgH4NWf4DV5OI4DQmCMwWiN53n1FsnF42Xgq5gqljPA9u7OjjvupmxHUypF++Z2duzsIp3O1DQyhkhr5svzFAoFSsUSy0uL6KW5z29nZkeAaSt2a/Xy2Nit8RevLmS3bJUtqRSNXiOOLX+BwlCTTmfY091NLpujNPtF5fvP3IxdrizAB2bPnjt/r21zm3g6PnHe3tQqGxwHy5KIhMBEBoTCMQalAsJqJTh18sS1oeFjD32liysaaWDRV3pydPQ4rtMQPh6fuNjouo7luiREgshEGBPhhyHzc9+DwXz/1YGh4fu+0u+ARUCvtD8EFnylJ/MDg5G0ZfT42cSlnN3peF4TRkWoasCPuWLl6OH+a4fyRx4ENUg5vsgfPgqBcqD0u96+wwYET5+/vNjWnnONiSh9+1rJ9x28cqC3/1Gg9Pt6yFqG1EC5Gur3vX2HsG2pbt+5exYDI0OD1/ftP/ikGq6GAIg1/iNik6Ydmdzl2nI3QKWqPgRKf4xfvt7oE9HAQqD0ZKB0Ic75sYv1Wht+DgB8pQ6678CoOAAAAABJRU5ErkJggg==";



/* Открывать загрузки в табе или переместить вкладку загрузок рядом с текущей вкладкой 
   если загрузи уже открыты и закрыть все лишние вкладки загрузок  ..........................................*/
function downloadManagerInTab( foregroundTab ) {          
  
     setTimeout(function() { closeDownloadManager() }, 0); // закрыть стандартный менеджер загрузок     
     
     // закрыть все вкладки загрузок кроме первой ....
     var downTab = null;
     Array.slice( gBrowser.tabs ).forEach(function(tab) {
           if ( tab.linkedBrowser.currentURI.spec !== downTabUrl ) return;
           !downTab ? downTab = tab : gBrowser.removeTab(tab);
     })
   
     // переместить или открыть вкладку загрузок рядом с текущей вкладкой ....
     var selTab = gBrowser.selectedTab;
     if ( downTab !== selTab ) {
          if ( downTab && gBrowser.visibleTabs.indexOf( downTab ) == -1 )
               TabView.moveTabTo( downTab, TabView._window.GroupItems._activeGroupItem.id );
          downTab = downTab || gBrowser.addTab( downTabUrl );
          var pos = selTab._tPos + ( downTab._tPos > selTab._tPos );
          gBrowser.moveTabTo( downTab, pos );
          gBrowser.selectedTab = downTab;        
          } 
};



// Автоматически меняем иконку для таба "Загрузки" .........................................................
addEventListener("TabAttrModified", function(e) { 
     if ( e.target.linkedBrowser.currentURI.spec == downTabUrl ) {
          var tabIndex = gBrowser.getBrowserIndexForDocument( e.target.linkedBrowser.contentDocument );
          var tab = gBrowser.mTabContainer.childNodes[tabIndex];
          LOG(tab.label)
          tab.image = ( tab.label == "Загрузки" )? falseDownloadsImg: trueDownloadsImg;
          }      
}, true, gBrowser.tabContainer);



// Отслеживать все команды связные с загрузкой и запускать нужные функции и команды  ........
function getCommand(e) {
     var command = e.target.getAttribute("oncommand");
     if ( command == "performCommand('cmd_removeFromList');" || command == 'clearDownloadList();') {
          if ( content.document.location == downTabUrl) document.getElementById("Browser:Reload").doCommand();
          if ( document.getElementById('sidebar-box').getAttribute('sidebarcommand') ) openWebPanel("Downloads", downTabUrl );                
          }
};     
addEventListener("command", getCommand, true, window);



// Исправляем ошибки .......................................................................................
function setFakeArguments(e) {
     if ( e.target.location.href == 'chrome://mozapps/content/downloads/downloads.xul' ) {
     var win = e.target.defaultView;
     win = win.wrappedJSObject || win;
     win.arguments = [];
     }
};
addEventListener("TabClose", setFakeArguments, true, gBrowser);
addEventListener("DOMContentLoaded", setFakeArguments, true, gBrowser);
addEventListener("DOMContentLoaded", setFakeArguments, true, document.getElementById('sidebar-box'));




// Закрыть стандартный менеджер загрузок ....................................................................
function closeDownloadManager() {
     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
     var dm = wm.getMostRecentWindow("Download:Manager");
     if ( dm ) dm.close();  
};


        
// Подсказка для кнопки .....................................................................................
this.tooltipText = "L: Download Manager in the Sidebar\nM: Download Manager \nR: Download Manager in the Tab\nCtrl+R: CB menu ";


16b1287fb84450ca1731be369209e6b8.jpeg

2) Нужна кнопка, которая откроет окно загрузок (Ctrl+J).

1fesFFFF пишет

Для 26 [firefox] можете исправить кнопку?
1) Открывает боковую панель с загрузками.

А что с ней не так, вроде работает :/

1fesFFFF пишет

2) Нужна кнопка, которая откроет окно загрузок (Ctrl+J).

Создай кнопку с кодом:

Выделить код

Код:

var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
var dm = wm.getMostRecentWindow("Download:Manager");
if ( dm ) dm.focus();    
else       
     BrowserDownloadsUI();

Создай кнопку с кодом:

Спасибо!

А что с ней не так, вроде работает

На 26 [firefox] в ней не отображаются загрузки, т.е. она пустая. А в окне загрузок - отображаются.

1fesFFFF пишет

Для 26 [firefox] можете исправить кнопку?

А если так:

Выделить код

Код:

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

     // действие при клике ЛКМ ....
     if ( e.button == 0 ) {
          document.getElementById('sidebar-box').getAttribute('sidebarcommand') ? toggleSidebar() : openWebPanel("Downloads", downTabUrl );         
          };
          
     // действие при клике СКМ ....    
     if ( e.button == 1 ) { 
          var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
          var dm = wm.getMostRecentWindow("Download:Manager");
          if ( dm ) dm.focus();    
          else       
               BrowserDownloadsUI();
          };
     
     // действие при клике ПКМ ....    
     if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
          e.preventDefault();  
          downloadManagerInTab( true );
          }
};



// Объявляем переменные для этой вкладки ...................................................................
var downTabUrl = 'about:downloads';

// иконки для вкладки загрузок ....
const trueDownloadsImg = "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAIAAAMACyIAEGyoLtVqpyrVDSIADwAAAgABAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIAAgAAAgALHwAPZaAmwsXxnv+t63n/XpwbwAcUAA0AAAIAAQIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwADAAACAAwgAA9loyXFv+2W/7/wl/yg52b8n+Nj/1OJG8EBCAAMAAACAAECAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAIAAAIADCEADmSiI8Sx4oX/suWH+7HmhP+T3FX/i9dK+5LZUv9RhxnAAQkADAAAAgABAgACAAAAAAAAAAAAAAAAAQIAAgAAAgANIQANY6Eiw6nbfP+l23f7p913/6fed/+I0kj/gs5A/37KPvuL0Ev/UIYYvwIJAAsAAAIAAQIAAgAAAAABAQABAAABAAsgAA1gnh/BoNJy/5vSa/qe1W3/odhx/5/Ybv+Cy0H/fsg8/3zFOv92vjX6g8VD/0yCFL0BCAALAAABAAABAAEAAAEACRUAEmqmKcyn2Hr/n9Ry/Z3Tbv+Yz2b/mtJp/5nRZv99xDz/ecI3/3e/Nv97wT7/e78//YvKT/9Xjhy/BAwACQAAAQAAAAEAFCkAL2CUKdxhkTDXXI4o1m+mN/KWzGb/ksth/pLLX/93vTn/croz/nm9Pf9noizyVoog1lqNJtlbkx/TDyAAHwAAAQAAAAAAAAAAAAAAAAACAwEEAAAAAD5oFqeXz2X/icFY+4rDWP9ytjX/bLEu+3/CQv8+ZxSnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAEAAQEBAQEDBAMEAAAAAEFqFqeSyV7/g7pR+4S8Uf9usDP/aKsr+3u9Pv9AaRSnAAAAAAMEAgQBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeNxVj/fbRK+3+2Sv9rqzD/ZaYo+3m5PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeJwlT/eLBF+3qyRv9qqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeHwFD/da5B+3exQv9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeEv03/cqw8+3WvPv9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeCvkn/cKs4+3OuO/9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAD9oE6d+vET/bKky+2+sNf9oqCv/Y6Mm+3e3Ov8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFaeDv0v/cKw5+3OvPP9vqzX/aqcx+3+8RP9AaRSnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAEAAAAADlkCox1szT/a6Yv+W2oMPxspy78aqQt+XSyMv85ZAqMAAAAAAECAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
const falseDownloadsImg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACmElEQVR42oyU3UtUQRiHn9k9c47Ho+4uhrkthmUfkHeB91GJ1paiJl0EQZd9U3f+E1EX0b8QEUQX0ScZWd0E3VhBrWJFuZuEqyLsOTtnznSxx9rSzPdq5p13nhl+729GTBXL/BUJwAFcwAZEnDdAFagAARDVb7JYHQ6QBTKsHWWgGAPXBblAZu/ubTdUQ6YnKWslWoVIv/z6zYeZ08DCRkA2QPOW7T2dXTuwLAsMhDrk03Shp77mfyABkE6laGluRgiBACJjSKXSf9T8D1RbsBJIy0IIgcGQMAYrKfhn/b9BFtKWv1sWGZKJ5LqgJNAQiyyB1hpI4ti/pYiiCEvKlWlrbIcwFt23YkgH4NWf4DV5OI4DQmCMwWiN53n1FsnF42Xgq5gqljPA9u7OjjvupmxHUypF++Z2duzsIp3O1DQyhkhr5svzFAoFSsUSy0uL6KW5z29nZkeAaSt2a/Xy2Nit8RevLmS3bJUtqRSNXiOOLX+BwlCTTmfY091NLpujNPtF5fvP3IxdrizAB2bPnjt/r21zm3g6PnHe3tQqGxwHy5KIhMBEBoTCMQalAsJqJTh18sS1oeFjD32liysaaWDRV3pydPQ4rtMQPh6fuNjouo7luiREgshEGBPhhyHzc9+DwXz/1YGh4fu+0u+ARUCvtD8EFnylJ/MDg5G0ZfT42cSlnN3peF4TRkWoasCPuWLl6OH+a4fyRx4ENUg5vsgfPgqBcqD0u96+wwYET5+/vNjWnnONiSh9+1rJ9x28cqC3/1Gg9Pt6yFqG1EC5Gur3vX2HsG2pbt+5exYDI0OD1/ftP/ikGq6GAIg1/iNik6Ydmdzl2nI3QKWqPgRKf4xfvt7oE9HAQqD0ZKB0Ic75sYv1Wht+DgB8pQ6678CoOAAAAABJRU5ErkJggg==";



/* Открывать загрузки в табе или переместить вкладку загрузок рядом с текущей вкладкой 
   если загрузи уже открыты и закрыть все лишние вкладки загрузок  ..........................................*/
function downloadManagerInTab( foregroundTab ) {          
  
     setTimeout(function() { closeDownloadManager() }, 0); // закрыть стандартный менеджер загрузок     
     
     // закрыть все вкладки загрузок кроме первой ....
     var downTab = null;
     Array.slice( gBrowser.tabs ).forEach(function(tab) {
           if ( tab.linkedBrowser.currentURI.spec !== downTabUrl ) return;
           !downTab ? downTab = tab : gBrowser.removeTab(tab);
     })
   
     // переместить или открыть вкладку загрузок рядом с текущей вкладкой ....
     var selTab = gBrowser.selectedTab;
     if ( downTab !== selTab ) {
          if ( downTab && gBrowser.visibleTabs.indexOf( downTab ) == -1 )
               TabView.moveTabTo( downTab, TabView._window.GroupItems._activeGroupItem.id );
          downTab = downTab || gBrowser.addTab( downTabUrl );
          var pos = selTab._tPos + ( downTab._tPos > selTab._tPos );
          gBrowser.moveTabTo( downTab, pos );
          gBrowser.selectedTab = downTab;        
          } 
};



// Автоматически меняем иконку для таба "Загрузки" .........................................................
addEventListener("TabAttrModified", function(e) { 
     if ( e.target.linkedBrowser.currentURI.spec == downTabUrl ) {
          var tabIndex = gBrowser.getBrowserIndexForDocument( e.target.linkedBrowser.contentDocument );
          var tab = gBrowser.mTabContainer.childNodes[tabIndex];
          LOG(tab.label)
          tab.image = ( tab.label == "Загрузки" )? falseDownloadsImg: trueDownloadsImg;
          }      
}, true, gBrowser.tabContainer);



// Отслеживать все команды связные с загрузкой и запускать нужные функции и команды  ........
function getCommand(e) {
     var command = e.target.getAttribute("oncommand");
     if ( command == "performCommand('cmd_removeFromList');" || command == 'clearDownloadList();') {
          if ( content.document.location == downTabUrl) document.getElementById("Browser:Reload").doCommand();
          if ( document.getElementById('sidebar-box').getAttribute('sidebarcommand') ) openWebPanel("Downloads", downTabUrl );                
          }
};     
addEventListener("command", getCommand, true, window);



// Закрыть стандартный менеджер загрузок ....................................................................
function closeDownloadManager() {
     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
     var dm = wm.getMostRecentWindow("Download:Manager");
     if ( dm ) dm.close();  
};


        
// Подсказка для кнопки .....................................................................................
this.tooltipText = "L: Download Manager in the Sidebar\nM: Download Manager \nR: Download Manager in the Tab\nCtrl+R: CB menu ";

bunda1
Спасибо! Работает.

Всех с Праздником! Вот какой вопрос у меня. Делал умный человек мне кнопку для поиска скриптов на сайте userscripts.org

скрытый текст
/*CODE*/
url=getBrowser().currentURI.spec;
domen = url.split(/\/+/g)[1];
getBrowser ().  selectedTab = getBrowser (). addTab ("https://userscripts.org/scripts/search?q=" + domen +"&submit=Search");

Хочу для своих нужд переделать, только чтоб брался не весь адрес, а часть после последнего слеша.
скрытый текст
http://www.хххххххх.хх/хххх/вот эта часть

Что-то пытался поменять, но проще спросить. Спасибо.

Mishania пишет

Хочу для своих нужд переделать, только чтоб брался не весь адрес, а часть после последнего слеша.

http://www.хххххххх.хх/хххх/вот эта часть

Не совсем понятно сформулировано - что нужно?
Задать в поиск на сайте userscripts.org адрес страницы, на которой сейчас находишься?

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

Выделить код

Код:

url = content.document.location.href;
adr=(url.substring(url.indexOf('/')+2));
getBrowser().selectedTab = getBrowser().addTab("https://userscripts.org/scripts/search?q=" + adr +"&submit=Search");

Чайник
Нужно чтоб http://www.хххххххх.хх/хххх/вот эта часть - копировалась и подставлялась в строку поиска "http://www.хххххххх.хх/хххх/search?q= вот сюда"

скрытый текст
название сайта не важно, важно именно последний блок адреса и чтоб открывалось в новой фоновой вкладке.

А как сделать, чтобы в кнопке Proxy( Firefox 10 + ) от 11.12.2013 можно было создать прокси из выделения и в текстовых полях?
Я пробовал здесь

Выделить код

Код:

// устанавливаем где показывать пункт меню 
  addEventListener("popupshowing", function() {
     menuitem.hidden = !cbu.getPrefs("Proxy.inContextMenu") || !gContextMenu.isContentSelected;
  }, false, contextMenu );

закомментировать  || !gContextMenu.isContentSelected но тогда пункт "Добавить прокси" висит в меню постоянно. Оно и понятно.

Не сильно это мешает, но может можно сделать все это менее топорным способом?

Замени:

Выделить код

Код:

!gContextMenu.isContentSelected;

на:

Выделить код

Код:

!gContextMenu.isTextSelected;

Спасибо, bunda1!
:)

Я хочу подсчитать (просто для иллюстрации) количество слов Members на этой странице
Запускаю код

Выделить код

Код:

goDoCommand('cmd_selectAll');
goDoCommand('cmd_copy'); 
goDoCommand('cmd_selectNone');

text = readFromClipboard(); // должен получиться весь текст страницы;
x = text.length - text.replace(/Members/g, '').length // сравниваю текст страницы до и после удаления всех вхождений Members
 
alert(x)

Я сравниваю свой результат со счётчиком совпадений кнопки Find
Почему мой код работает некорректно?

toxa
alert(x/"Members".length)

Infocatcher пишет

alert(x/"Members".length)

Ну да, это если искать слово, то конечно.
Но ведь и при поиске одиночного символа мой код и кнопка Find дают разный результат.

toxa
Видимо, дело в том, что при копировании еще (как минимум) alt-текст изображений попадает.

Столкнулся с багом дублирования кода. Версия 0.0.5.7 [seamonkey] 2.23
1) Установить http://forum.mozilla-russia.org/viewtopic.php?id=52666 или http://forum.mozilla-russia.org/viewtopic.php?id=56625
2) Перезапустить [seamonkey].
3) Поведение кнопок меняется по сравнению с обычным, во 2-м случае при левом клике открываются 2 вкладки (должна одна) в 1-м http://ipic.su/img/img7/fs/kiss_26kb.1390930556.jpg.

Список расширений
Mozilla SeaMonkey 2.23 (build 20131210201652)
User Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:26.0) Gecko/20100101 SeaMonkey/2.23

*** Расширения ( Включено: 18, Отключено: 0, Всего: 18 )
Adblock Plus 2.4.1
Add Search Engines for SeaMonkey 0.1.0
BarTab Lite 1.2
ChatZilla 0.9.90.1
Custom Buttons 0.0.5.7
DOM Inspector 2.0.15pre
DownloadHelper 4.9.21
FoxyProxy Standard 4.2.3
Greasemonkey 1.13.0.1rc2pre
JavaScript Debugger 0.9.89
Lightning 2.8b1
NewsFox 1.0.8.4.4
NoScript 2.6.8.12
Plain Text Links 1.0.1
SeatabCat 1.0
Stylish 1.3.2.1
WOT 20120910
X-notifier 3.3.10

*** Внешний вид ( Включено: 1, Отключено: 2, Всего: 3 )
SeaMonkey Default Theme 2.23 [ выключен ]
SeaMonkey Modern 2.23 [ выключен ]
Walnut for SeaMonkey 2.0.22

*** Словари ( Включено: 0, Отключено: 0, Всего: 0 )

*** Языки ( Включено: 0, Отключено: 0, Всего: 0 )

*** Плагины ( Включено: 5, Отключено: 0, Всего: 5 )
NVIDIA 3D VISION 7.17.13.3165
NVIDIA 3D Vision 7.17.13.3165
Shockwave Flash 12.0.0.43
SumatraPDF Browser Plugin 2.4.0.0
VLC Web Plugin 2.1.0.0

*** Стили ( Включено: 3, Отключено: 0, Всего: 3 )
Seamonkey unified-reload-stop-button
австоскрытие названия вкладки
Скрытие дропмаркера

*** User Scripts ( Включено: 0, Отключено: 0, Всего: 0 )

*** Кнопки ( Включено: 22, Отключено: 0, Всего: 22 )
About:
Chrome-заголовок Скрыть\показать с запоминанием состояния,плюс выставление размеров окна и возможность перемещения
Context Search
Open Firefox folders and files
Quote+
Save+
Split window vertical
Translate
Undo Close Tab
URLCorrector
Zoom Enlarge for SM
Zoom Reduce for SM
[CB]Attributes Inspector (для разработчиков) 
Автоматически очистить панель поиска после запуска поиска
Добавить новый пункт "Перезапуск" в главном меню
Закрыть Окно\Firefox (ЛКМ\СКМ)
На весь экран/восстановить
Открывать закладки левым кликом в новой вкладке не закрывая меню закладок(Firefox 10 +)
Свернуть окно
Список расширений
Текстовые смайлы
Уменьшить яркость сайта

feas
Это не баг . Просто эти кнопки не предназначены для работы в [seamonkey].Вместо этой http://forum.mozilla-russia.org/viewtopic.php?id=52666 установи эту
http://forum.mozilla-russia.org/viewtop … 02#p636502 отлично работает и в [seamonkey] Ну а эту http://forum.mozilla-russia.org/viewtopic.php?id=56625 обращайся к автору З.Ы. У меня тож есть проблемные кнопки тоже буду обращаться с просьбами к авторам.

lokiju пишет

Это не баг . Просто эти кнопки не предназначены для работы в [seamonkey].Вместо этой http://forum.mozilla-russia.org/viewtopic.php?id=52666 установи эту

ммм Ясно - благодарю.

feas

во 2-м случае при левом клике открываются 2 вкладки (должна одна)

Есть такая проблема. Но по средней кнопке мыши работает вроде нормально.

Тут ещё, как я понимаю, может от системы зависеть. Возможно, поможет изменение параметров middlemouse.contentLoadURL и middlemouse.paste.

feas пишет

Столкнулся с багом дублирования кода. Версия 0.0.5.7 [seamonkey] 2.23

Кажется это баг Custom Buttons 0.0.5.7pre3, вот тут 24-01-2014 22:24:59 почитай под спойлером что пишет Dumby про это. Надо жаловатся автору Custom Buttons.

bunda1 пишет
feas пишет

Столкнулся с багом дублирования кода. Версия 0.0.5.7 [seamonkey] 2.23

Кажется это баг Custom Buttons 0.0.5.7pre3, вот тут 24-01-2014 22:24:59 почитай под спойлером что пишет Dumby про это. Надо жаловатся автору Custom Buttons.

Если глючат все кнопки , то да баг СВ, а если глючат некоторые

lokiju пишет

feas
Это не баг . Просто эти кнопки не предназначены для работы в [seamonkey].Вместо этой http://forum.mozilla-russia.org/viewtopic.php?id=52666 установи эту
http://forum.mozilla-russia.org/viewtop … 02#p636502 отлично работает и в [seamonkey] Ну а эту http://forum.mozilla-russia.org/viewtopic.php?id=56625 обращайся к автору З.Ы. У меня тож есть проблемные кнопки тоже буду обращаться с просьбами к авторам.

http://forum.mozilla-russia.org/viewtop … 02#p636502

Выделить код

Код:

if (document.getElementById(this.nodeIds.searchMenu))
                return;

добавлен из-за [seamonkey] и если его закоментировать и перезапустить SM то появятся два пункта меню.
Это воспроизводится только при первом запуске SM.
CB v0.0.5.7, SM v2.23

SendInfo пишет

Если глючат все кнопки

Глючит много кнопок, практически все в инициализации.

2k1dmg пишет

добавлен из-за [seamonkey] и если его закоментировать

Кстати в кнопке http://forum.mozilla-russia.org/viewtopic.php?id=51861 он есть =) Буду крутить что ещё запуститься.

Мда не выходит. :|
Такая же проблема (возникают только при перезапуске [seamonkey]) в:
[CB]Открывать закладки левым кликом в новой вкладке не закрывая меню - при ЛКМ 2 вкладки
[CB]Memory Monitor 2 индикатора.
[CB]Копировать ссылку как(BBCode) 2 пункта.
[CB]Показывать количество табов в адресной строке 2 индикатора.

feas пишет

Глючит много кнопок, практически все в инициализации.

У меня из 35-ти кнопок глючат точно на [seamonkey] 2: "Открывать ссылки в новой вкладке длинным кликом, от 19.12.2013" ,"Копировать информацию вкладки" и "Link Tooltips"(она и на [firefox] точно также подглючивает). Если первую из перечисленных bunda1 не поправит - установлю Right Links , а вот эти "Копировать информацию вкладки","Link Tooltips" заменить нечем :(
Еще заметил такое :если перед [seamonkey] запускался [firefox] и не было перезагрузки компьютера - кнопки и расширения могут работать странно - может это только у меня.

feas пишет

Мда не выходит. :|
Такая же проблема (возникают только при перезапуске [seamonkey]) в:
[CB]Открывать закладки левым кликом в новой вкладке не закрывая меню - при ЛКМ 2 вкладки
[CB]Memory Monitor 2 индикатора.
[CB]Копировать ссылку как(BBCode) 2 пункта.
[CB]Показывать количество табов в адресной строке 2 индикатора.

Можно все эти коды + мой Context Search закинуть в одну кнопку в начале которой поставить:

Выделить код

Код:

if ( self.hasAttribute("stop") ) return; 
self.setAttribute("stop", "true");

И все дела.

lokiju пишет

У меня из 35-ти кнопок глючат точно на [seamonkey] 2: "Открывать ссылки в новой вкладке длинным кликом, от 19.12.2013" ,"Копировать информацию вкладки" и "Link Tooltips"(она и на [firefox] точно также подглючивает).

Такой же совет.

bunda1 пишет
Выделить код

Код:

if ( self.hasAttribute("stop") ) return; 
self.setAttribute("stop", "true");

Спасибо.

lokiju пишет

а вот эти "Копировать информацию вкладки"

Если речь об этой, то может попробуй

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

Выделить код

Код:

//const root = n("tabContextMenu");
    const root = document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");

Dumby нет. Эта на [seamonkey] вообще не работала.

Эта

Выделить код

Код:

/*Initialization Code*/
//seamonkey
if ( self.hasAttribute("stop") ) return; 
self.setAttribute("stop", "true");
//Копировать информацию вкладки
(function() {
    var htmlEscape = function(s) {
        s = s.replace(/&/g, "&amp;");
        s = s.replace(/>/g, "&gt;");
        s = s.replace(/</g, "&lt;");
        s = s.replace(/"/g, "&quot;");
        return s;
    };
    var copyTabInfo = function (aAsHTML) {
        var tab = document.popupNode;
        var title = tab.label;
        var url = gBrowser.getBrowserForTab(tab).contentWindow.location.href;
        var txt = aAsHTML ?
                  '<a href="' + htmlEscape(url) + '">' + htmlEscape(title) + '</a>' :
                  title + "\n" + url;
        Cc["@mozilla.org/widget/clipboardhelper;1"]
        .getService(Ci.nsIClipboardHelper)
        .copyString(txt);
    };
    var copyTabBBC = function (aAsBBC) {
        var tab = document.popupNode;
        var title = tab.label;
        var url = gBrowser.getBrowserForTab(tab).contentWindow.location.href;
        var txt = aAsBBC ?
                  '[url=' + htmlEscape(url) + ']' + htmlEscape(title) + '[/url]' :
                  title + "\n" + url;
        Cc["@mozilla.org/widget/clipboardhelper;1"]
        .getService(Ci.nsIClipboardHelper)
        .copyString(txt);
    };
    var menuitem1 = document.createElement("menuitem");
    menuitem1.setAttribute("label", "Копировать название + URL");
    menuitem1.addEventListener("command", function() { copyTabInfo(false); }, false);
    var menuitem2 = document.createElement("menuitem");
    menuitem2.setAttribute("label", "Копировать название + URL (HTML)");
    menuitem2.addEventListener("command", function() { copyTabInfo(true); }, false);
    var menuitem3 = document.createElement("menuitem");
    menuitem3.setAttribute("label", "Копировать название + URL (BBCode)");
    menuitem3.addEventListener("command", function() { copyTabBBC(true); }, false);
    setTimeout(function() {
        gBrowser.mStrip.childNodes[1].appendChild(document.createElement("menuseparator"));
        gBrowser.mStrip.childNodes[1].appendChild(menuitem1);
        gBrowser.mStrip.childNodes[1].appendChild(menuitem2);
        gBrowser.mStrip.childNodes[1].appendChild(menuitem3);
    }, 0);
})();


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

Выделить код

Код:

if ( self.hasAttribute("stop") ) return; 
self.setAttribute("stop", "true");

Спасибо =) Покоя не давала интуиция что они все явно взаимосвязаны, и не сложно решалась like "Restart Firefox"

bunda1, поправь пожалуйста Find (№112)

05-02-2014 16:33:48
для 27 [firefox]

Pony_Smile_Pack пишет

bunda1, поправь пожалуйста Find (№112)

Пытаюсь !

Pony_Smile_Pack пишет

bunda1, поправь пожалуйста Find (№112)
[firefox]

Вот Dumby исправил для FF27:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EFind%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%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%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20....................%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%0A%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u0421%u041A%u041C%20....%0A%20%20%20%20if%20%28e.button%20%3D%3D%201%29%20%7B%20gShowPopup%28this%29%3B%20return%3B%20%7D%0A%0A%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041B%u041A%u041C%20%u0438%u043B%u0438%20%u041F%u041A%u041C%20....%0A%20%20%20%20var%20str%20%3D%20getSelect%28%29%3B%0A%20%20%20%20if%20%28%21str%29%20return%3B%0A%20%20%20%20var%20fastFind%20%3D%20gBrowser.finder._fastFind%3B%0A%0A%20%20%20%20fastFind.find%28str%2C%20false%29%20%3D%3D%20fastFind.FIND_FOUND%0A%20%20%20%20%3F%20fastFind.findAgain%28e.button%2C%20false%29%0A%20%20%20%20%3A%20disableIcon%28%29%3B%0A%20%20%20%20%0A%20%20%20%20//%20%u0411%u043B%u043E%u043A%u0438%u0440%u0443%u0435%u043C%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041F%u041A%u041C%20%u0431%u0435%u0437%20%u043C%u043E%u0434%u0438%u0444%u0438%u043A%u0430%u0442%u043E%u0440%u043E%u0432%20....................%0A%20%20%20%20if%20%28e.button%20%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28e.ctrlKey%20%7C%7C%20e.shiftKey%20%7C%7C%20e.altKey%20%7C%7C%20e.metaKey%29%20return%3B%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%7D%0A%7D%3B%0Athis.ondblclick%20%3D%20function%28e%29%20e.button%20%21%3D%202%3B%0A%0A%0A//%20%u0412%u0440%u0435%u043C%u0435%u043D%u043D%u043E%20%u043E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20....................%20%20%0Afunction%20disableIcon%28%29%20%7B%0A%20%20%20self.style.filter%20%3D%20%27url%28%22chrome%3A//mozapps/skin/extensions/extensions.svg%23greyscale%22%29%27%3B%0A%20%20%20setTimeout%28function%28%29%20%7B%20self.style.filter%20%3D%20%27%27%20%7D%2C%20600%29%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%u043B%u0438%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%2C%20%u0435%u0441%u043B%u0438%20%u043D%u0435%u0442%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u043F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%27false%27%20................................%0Afunction%20getSelect%28%29%20%7B%0A%20%20%20var%20sel%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29.toString%28%29%3B%20//%20%u0438%u0437%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%0A%20%20%20if%20%28%20sel%20%3D%3D%20%27%27%20%29%20%7B%20%20%20%20%0A%20%20%20%20%20%20%20%20var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%20%20%20%20%20%20%20%20if%20%28%20theBox%20%26%26%20%28theBox.type%20%3D%3D%20%22text%22%20%7C%7C%20theBox.type%20%3D%3D%20%22textarea%22%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%20%20%20%20%20var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%20%20%20%20%20var%20sel%20%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20%0A%20%20if%20%28%20sel%20%3D%3D%20%27%27%20%29%20var%20sel%20%3D%20gClipboard.read%28%29%3B%20//%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%0A%20%20if%20%28%20sel%20%3D%3D%20%27%27%20%29%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.showAlertNotification%28%20self.image%2C%20self.label%2C%20%22%u0412%u044B%u0434%u0435%u043B%u0438%u0442%u0435%20%u0438%u043B%u0438%20%u0441%u043A%u043E%u043F%u0438%u0440%u0443%u0439%u0442%u0435%20%u0442%u0435%u043A%u0441%u0442%21%22%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%20%29%3B%0A%20%20%0A%20%20return%20%28%20sel%20%3D%3D%20%27%27%20%29%20%3F%20false%20%3A%20sel.toString%28%29.replace%28/%5E%5Cs+%7C%5Cs+%24/g%2C%22%22%29%3B%20//%20%u0443%u0431%u0438%u0440%u0430%u0435%u043C%20%u043F%u0440%u043E%u0431%u0435%u043B%u044B%20%u0441%20%u043A%u043E%u043D%u0446%u043E%u0432%20%u0442%u0435%u043A%u0441%u0442%u0430%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20....................%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u0418%u0441%u043A%u0430%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%u0430/%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u0434%u0430%u043B%u0435%u0435%20%5Cn%u0421%3A%20CB%20%u041C%u0435%u043D%u044E%20%5Cn%u041F%3A%20%u0418%u0441%u043A%u0430%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%u0430/%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043D%u0430%u0437%u0430%u0434%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%0A%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
bunda1 пишет
Pony_Smile_Pack пишет

bunda1, поправь пожалуйста Find (№112)
[firefox]

Вот Dumby исправил для FF27

Спасибо.

Pony_Smile_Pack
Рано благодаришь! Я похоже сломал кнопку, вот так правильно:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EFind%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAExMAAAEAIAAYBgAAFgAAACgAAAATAAAAJgAAAAEAIAAAAAAA8AUAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAAAAAdUOucBYUD/AF09/QBcPP8BYkD/AF8//wBePf8AWTn/AE0y/wBLMf8AWTn/AWNC/wBbO/0BXj3/B1E45wAAAAAAAAACAAAAAAVZO9sCek3/AX5O/wB+T/8Afk//An9P/wB9TP8PhFf/No1r/yZqUf8AUDL/A3BF/wGBUP8AfU7/AH5O/wN6Tf8FWTvbAAAAAAhWPOcBgVH9AIpU/wSKVf8BiVT/AIlU/wSLV/8Ag0z/N6F3/9Xw5P+Wsaj/AEot/wN1S/8BiFX/AIlU/wCJVP8AilT/AH1P/QdTOucBaET/CIxY/giRWv8JkFn/CI9Z/wiPWf8MkV3/AIhR/0Cpgv/y//r/qb63/wBQMP8He07/BoxX/wiPWf8Ij1n/CJFa/wiMVv4CZUP/AWhF/QmVXf8Hml7/CJde/wmcYP8JmV//Dptj/wCUWP9GrYP/8f74/6zDuv8AWjX/CYJR/waWXP8ImV//CJdf/wmaYP8Ill3/AGlE/QNtRv8InF7/CKFk/wifYP8JoGP/Cp9j/wudZP8Ag0f/MpNp/9vw5/+cu67/AE4o/wtzSP8Lilf/CZlf/wueX/8JoGH/CJxe/wNuRv8GcEj/DaJi/w2oZ/8NpWT/D6dm/wejY/8LlV3/PZl1/5zEtP/5+/j/xtvS/z2GaP8LaUP/BW5E/weJVP8IoGH/C6hl/w2iYv8GcEj/BXNL/wyqZv8OsGn/D65o/w6uaf8ap2z/gcWn/9vn4P/L5dn/ruDK/87r3v/Y6OD/fbSc/xh0S/8IdEb/B5he/xKtaP8Mqmb/BXNK/wd3Sv8QsGv/DrZs/xC0bf8BrWP/f86r/9jn4P+OyK//OLN//ym6fP9FxIz/m+LC/9vy6P97s5n/AGc4/wmKU/8Qrmb/D7Fr/wd3Sv8JfEz/Fblx/yfDfv8rwoD/QsSK/9n16f+jxrf/IpRj/xevbv8nxH//HL11/zPCg/+07NP/1+ng/zSJY/8djFz/Ird1/xi4cv8JfEz/CX5P/yvFgP9F05L/Q9CQ/4vgt//V7uP/ZKKF/zGaaf9PypP/T9OV/1HRlf9BzY3/feCx/9fu4/92rJX/MJRo/0LHi/8tw3//CH5P/xKBVP9C0JD/S9qa/0DVkv+L5bv/xunY/12egP8ojV//Qb2E/0fUk/9L2Jb/QdGN/3Xbq//H5dj/dq6U/y+ea/9L05T/Qc+P/xKCVP8giV3/RtaU/0zfm/9E25X/fOWz/+H67v+AuZ//J4ZY/zedbP9Hw4v/Rc+R/znAgv+K1bH/2enh/2ivj/87uYH/TNyZ/0bWlf8giVz/IYxf/0vblv9Q5Zz/T+Ka/1Xjn//S++f/yeXY/1+qhv8vi13/LJVk/zelcv9ktY3/x9/T/8nl1/9Ht4L/S9WV/0/knf9L25b/IYte/yCLXv1N4Zr/Ueuh/1HooP9H6Zv/g+68/9v67P/R7OH/iMOp/2OoiP+Etp7/0OLZ/9fw5P931Kn/Q9WP/1Hmnv9S7aL/TeGa/yCLXv0lkmT/T+ed/lTyo/9T76D/Vu+l/1Dvof968bf/w/fc/+n98//v//j/7P/1/8D22/9x5a7/S+Ob/1Tuo/9T76L/VfKm/0/onP4kkWL/K35b51Hfmv1Y+Kb/WPel/1j3pP9a9qf/VfWl/1v2p/9m96z/afat/2b3rP9c9qj/Vvel/1n4pv9Y96T/V/em/1f4pv9Q3pn9K35b5wAAAABAnXPbUuef/1T0ov9X9aH/VvSh/1X0o/9X9aL/VvWi/1X0ov9V9KL/VfSj/1b0o/9V9KL/VfSi/1T0o/9S5p7/PZZu2wAAAAAAAgICAAAAAD2NaudFr4H/Q6x8/UStfP9ErXz/RK18/0StfP9ErXz/RK18/0StfP9ErXz/RK18/0Ose/1Eq33/Popr5wAAAAAAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20....................%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%0A%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u0421%u041A%u041C%20....%0A%20%20%20%20if%20%28e.button%20%3D%3D%201%29%20%7B%20gShowPopup%28this%29%3B%20return%3B%20%7D%0A%0A%20%20%20%20//%20%u0411%u043B%u043E%u043A%u0438%u0440%u0443%u0435%u043C%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041F%u041A%u041C%20%u0431%u0435%u0437%20%u043C%u043E%u0434%u0438%u0444%u0438%u043A%u0430%u0442%u043E%u0440%u043E%u0432%20....................%0A%20%20%20%20if%20%28e.button%20%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28e.ctrlKey%20%7C%7C%20e.shiftKey%20%7C%7C%20e.altKey%20%7C%7C%20e.metaKey%29%20return%3B%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041B%u041A%u041C%20%u0438%u043B%u0438%20%u041F%u041A%u041C%20....%0A%20%20%20%20var%20str%20%3D%20getSelect%28%29%3B%0A%20%20%20%20if%20%28%21str%29%20return%3B%0A%20%20%20%20var%20fastFind%20%3D%20gBrowser.finder._fastFind%3B%0A%0A%20%20%20%20fastFind.find%28str%2C%20false%29%20%3D%3D%20fastFind.FIND_FOUND%0A%20%20%20%20%3F%20fastFind.findAgain%28e.button%2C%20false%29%0A%20%20%20%20%3A%20disableIcon%28%29%3B%0A%7D%3B%0Athis.ondblclick%20%3D%20function%28e%29%20e.button%20%21%3D%202%3B%0A%0A%0A//%20%u0412%u0440%u0435%u043C%u0435%u043D%u043D%u043E%20%u043E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20....................%20%20%0Afunction%20disableIcon%28%29%20%7B%0A%20%20%20self.style.filter%20%3D%20%27url%28%22chrome%3A//mozapps/skin/extensions/extensions.svg%23greyscale%22%29%27%3B%0A%20%20%20setTimeout%28function%28%29%20%7B%20self.style.filter%20%3D%20%27%27%20%7D%2C%20600%29%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%u043B%u0438%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%2C%20%u0435%u0441%u043B%u0438%20%u043D%u0435%u0442%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u043F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%27false%27%20................................%0Afunction%20getSelect%28%29%20%7B%0A%20%20%20var%20sel%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29.toString%28%29%3B%20//%20%u0438%u0437%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%0A%20%20%20if%20%28%20sel%20%3D%3D%20%27%27%20%29%20%7B%20%20%20%20%0A%20%20%20%20%20%20%20%20var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%20%20%20%20%20%20%20%20if%20%28%20theBox%20%26%26%20%28theBox.type%20%3D%3D%20%22text%22%20%7C%7C%20theBox.type%20%3D%3D%20%22textarea%22%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%20%20%20%20%20var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%20%20%20%20%20var%20sel%20%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20%0A%20%20if%20%28%20sel%20%3D%3D%20%27%27%20%29%20var%20sel%20%3D%20gClipboard.read%28%29%3B%20//%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%0A%20%20if%20%28%20sel%20%3D%3D%20%27%27%20%29%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.showAlertNotification%28%20self.image%2C%20self.label%2C%20%22%u0412%u044B%u0434%u0435%u043B%u0438%u0442%u0435%20%u0438%u043B%u0438%20%u0441%u043A%u043E%u043F%u0438%u0440%u0443%u0439%u0442%u0435%20%u0442%u0435%u043A%u0441%u0442%21%22%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%20%29%3B%0A%20%20%0A%20%20return%20%28%20sel%20%3D%3D%20%27%27%20%29%20%3F%20false%20%3A%20sel.toString%28%29.replace%28/%5E%5Cs+%7C%5Cs+%24/g%2C%22%22%29%3B%20//%20%u0443%u0431%u0438%u0440%u0430%u0435%u043C%20%u043F%u0440%u043E%u0431%u0435%u043B%u044B%20%u0441%20%u043A%u043E%u043D%u0446%u043E%u0432%20%u0442%u0435%u043A%u0441%u0442%u0430%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20....................%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u0418%u0441%u043A%u0430%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%u0430/%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u0434%u0430%u043B%u0435%u0435%20%5Cn%u0421%3A%20CB%20%u041C%u0435%u043D%u044E%20%5Cn%u041F%3A%20%u0418%u0441%u043A%u0430%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%u0430/%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043D%u0430%u0437%u0430%u0434%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%0A%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
bunda1 пишет

Pony_Smile_Pack
Рано благодаришь! Я похоже сломал кнопку, вот так правильно:

Спасибо.

Можно сделать кнопку "Обновить все вкладки"
В идеале, хорошо бы было при нажатии ЛКМ обновлялась текущая кнопка, а при нажатии ПКМ (или СКМ, без разницы) обновлялись все вкладки

middim пишет

Можно сделать кнопку "Обновить все вкладки"
В идеале, хорошо бы было при нажатии ЛКМ обновлялась текущая кнопка, а при нажатии ПКМ (или СКМ, без разницы) обновлялись все вкладки

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAEAwMACQUDAwAAAAI4HQwAwWgyMrNpPLC0Xh3Ttl4S0LdhFNC2YRXTslgar7QxAzIzCAAAAAABAQgDAAMDAgAAAgEBAQAAAAA/IhAfnVIseLhjLM3DdRPqzoMJ8tiQD/LenCby3Z878tONNOrBZRrNmUEUdzsXCx4AAAAAAgEAAX9oWARhQzEanVEhktl3H/TKewf+3I8A/+GVAP/lnQH/6qsa//C6P//1w0z/6bdL/umPM/SeSRCQUysAGWRFAgTss5IA2YpjfMJwLvfIghr/1o0L9tKCB/3OiCD+zZM8/s+dT/7Wp17+5LZk/fbGWfbquEn/1Icl9sRgA3u5XwAAunxjMLhvSMbRijD/36lM9s2XY//CfUz/xZ6V/8u8wv/Pw8f/zbzC/82uov/hs2n/+ctd9u26Tf+5ZBzGmSkCL8uagbDJhkTp3JUc/+i9Yv3dzrz/2s7N/+He3//k5uX/4+Hd/+Pf2f/i3NX/3cSr/+3Fav31xEX/1pEt6bVgFK/DgjvY0ZNE8+apQf/txHj+7ebc/+/y9//s7Oz/5dbM/+G8f//frUP/3a1f/920fv/ntlL+87wp/9+eGPPAcQTXx4Aj09meTfPptWP/7cmM/vXt4P/9//7//f///+7Zw//mvoP/6sWF/+vLn//v2Lv/6bx7/uqqH//elwDzxngB09GNKtPep2Dz6r58/+vHjf7r0br/6tC6/+zQsP/fsX7/37qe//Pu9P/9/v///////+zHqP7lpDn/3pkO8s2CD9Dcn0nY4axs8+rBhf/sx43+5L+d/9y0lP/Xp2//051s/9++rf/18fH////////////v0K7+57Jq/+GjPPLRhQjQ6cCVsOOqZunnt3P/79Cf/fLYtf/58e3/9vDy//fz8//9/Pz////+//78+f///v3/8+DC/uu/gf/hozry1JAA0uPAlzDfqWnG5bR2/+3Lmvbuzpz/9eHG//z27v///////v37//nu3//y27n/89u6//HZuvzosFT/36A29N2+leH+/+oA/9+jfOupTvfdqmH/7c2e9vDTpP3y2a3+8ty2/vHZsv7u0KD+7MqR/u3MnPvluXn52JlD/+W/jtf///9wkpeHBHdqUhrHlESS/8dl9OKxcv7pu3z/68OT/+zHmf/sxZL/68OM/+i7fP/hqVH/8qdB7//qrtjd4dp0hoB+CgMCAQEAAAAAUkQtH8uiYXjnr2LN5K9t6uWyYPLms1jy5a9T8eWwXPPms3Py67Ne5a58O4u6pIs1hIWCDgAAAAAEBAQACwkHAwAAAAFJPSoA/dSZNOi/hrDdnxbU2pMA0tiRAM/blw/W6rt40f/sz4xMSEMeAAAAAAgIBwQEBAQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...............................................%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20BrowserReload%28%29%3B%20//%20%u041B%u041A%u041C%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20gShowPopup%28this%29%3B%20//%20%u0421%u041A%u041C%20%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20//%20%u041F%u041A%u041C%0A%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20gBrowser.reloadAllTabs%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0443%u044E%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%20%5Cn%u0421%3A%20CB%20%u041C%u0435%u043D%u044E%20%5Cn%u041F%3A%20%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%22%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Всем привет!Я новичёк прошу сильно не ругаться,хочу узнать есть-ли расширение типа Tab_Position_Customizer_RU_2.5 как в Chome,надо,чтоб вкладка открывалась  последняя,а при закрытии фокусировалась из которой была открыта,кроме Tab Mix Plus.Спасибо.

vit0149 пишет

Всем привет!Я новичёк прошу сильно не ругаться,хочу узнать есть-ли расширение типа Tab_Position_Customizer_RU_2.5

В этой теме просят сделать или исправить Сustom Buttons кнопки а не расширения.

https://forum.mozilla-russia.org/viewto … 19#p649119
А есть у нас способ вернуть кнопку закладок в адресную? видимо расширение этого не может.

feas пишет

А есть у нас способ вернуть кнопку закладок в адресную? видимо расширение этого не может.

Что за кнопка закладок, id у неё какой?

etoins srldu пишет

Что за кнопка закладок, id у неё какой?

звездочку.

Престала работать кнопка в FF29 https://forum.mozilla-russia.org/viewto … 70#p626370
Прошу поправить, если возможно.

bunda1, почините плз под 29 [CB]Искать страницу в кэше Google или на Archive.org
Спасибо.

Кнопки, помещенные в новое меню Firefox 29, не инициализируются, пока не откроешь это меню. Кто-нибудь в курсе, это чинится?

Uxapb пишет

bunda1, почините плз под 29 [CB]Искать страницу в кэше Google или на Archive.org
Спасибо.

Куда ты хочешь переместить подменю Искать страницу?

etoins srldu пишет

Куда ты хочешь переместить подменю Искать страницу?

В Инструменты, в самый низ.
А в идеале бы отдельную кнопку с выпадающим меню по клику.

Uxapb пишет

В Инструменты, в самый низ.

Выделить код

Код:

// Добавить новый пункт "Искать страницу" в меню kнопки ................................
(function () { 
   var img = "data:image/x-icon;base64,AAABAAEAEhAAAAEAGADoAwAAFgAAACgAAAASAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx9vm0y9y40OC50OG40OG40OG40OG40OG40OG40d68z+yuz8a34qYAAAAAAAAAAAAAAAAEkQAAANLl9Dya11Oo2Eqg0kyh00uh0kqg0kyf0kqgzkqYzz2MrRexIxfFA6PhpQAAAAAAAAAAAASRAAAA1Of4Sq3rXKLUYqjeYajeY6vgZq7kYqrcYaHYSoasI7wsMPMqLu8yHdUdrOCqAAAAAAAABJEAAADU5/dGp+VireB4xfx2xPpyvvNprt5ss+pgpcsmwjct8iYz7DU17DM58zcl2SSu464AAAAEkQAAANTo+Eio5mOr33XA93bE+WWs3HOu0V6jyS6+PWvwXHPvdUDuQDfuNWryaXXwdDLOM7DnsQSRAAAA1Oj4RqfmZK3gesj8dsX4d8f5e8n7arncPbNzKKNMZdtiX/dfR/FDl/KWWMNYe9R7v+u/BJEAAADW5/hFqOZ0uuKc3PiU1/aU2PaV1/SU1fGZxv9aop1a21d2+3Vg9WSW8peA04EAAAAAAAAEkQAAANTm9kuv63TD8Gy46W+76m666m+762286W+z5ziVh2fYXLr7ran2npXolm/ObgAAAAAAAASRAAAA1Ob3SaznWqPSXanZXanZXqvaYa3eYKzbXqbZUKW0R8JpPbZzRbp4a81oo+CjAAAAAAAABJEAAADV5/hGqOVmteOA1f990v980fx0xe91zfl/2f9/1/+d3Pxgt/Jsvv8AAAAAAAAAAAAAAAAEkQAAANTn90eq5WW14nzS/X3U/2q34XazzHvG73bP/XnS/ZLb9F225Wq+8QAAAAAAAAAAAAAAAASRAAAA0+f3SKrlZbfletX/edH/d9D9gtv+gdn/etT/edf/lN36W7foa772AAAAAAAAAAAAAAAABJEAAADW6PhEqOd/wOCk5PqX2/ea3viY3PeY3faZ3/ia3/ig2/Rctelsv/cAAAAAAAAAAAAAAAAEkQAAAM/k9kuv6nnE63O/7XPA7XPA7nTA7XXA7XO/7XTA7HK+7GnC8Ge79QAAAAAAAAAAAAAAAASRAAAA3u34ccDvoOb8n+P7oOT8oOT8oOT8oOT8oeT8n+T8pOf9jdn5jMn1AAAAAAAAAAAAAAAABJEAAAAAAADB4vtRtvRbv/dZvvZZvvZavvdavvZavvZcwPZXvfZ3w/YAAAAAAAAAAAAAAAAAAAAEkYADwEGAAcBBgADAQYAAQEGAAABBgAAAQYAAwEGAAMBBgADAQYADwEGAA8BBgAPAQYADwEGAA8BBgAPAQcAHwEE=";
   var menu = document.createElement("menu");
   menu.setAttribute("label", "Искать страницу");
   menu.setAttribute("class", "menu-iconic");
   menu.setAttribute("image", img );
   menu.onmouseout = function() { menu.removeAttribute('_moz-menuactive') }; 

   var array = [
       ["в кэше Google", function() gBrowser.selectedTab = gBrowser.addTab('http://www.google.com/search?q=cache:' + content.location) ],
       ["на Archive.org", function() gBrowser.selectedTab = gBrowser.addTab('http://web.archive.org/web/' + content.location) ],
       //["separator"],
               ];
   var menuPopup = document.createElement("menupopup");
   menuPopup.onmouseover = function() { menu.setAttribute('_moz-menuactive', 'true') };
   array.forEach(function( m ) {
        if ( m[0] == "separator" ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
        var menuItem = document.createElement("menuitem");
        menuItem.setAttribute("label", m[0] );
        menuItem.addEventListener("command", m[1] );
        menuPopup.appendChild( menuItem );
   });
   menu.appendChild( menuPopup );

   var toolsMenu = document.getElementById("menu_ToolsPopup");
   toolsMenu.appendChild( menu );
   addDestructor(function() toolsMenu.removeChild( menu ) );
})();

02-05-2014 22:08:38

okkamas_knife пишет

лучше добавь в контекстное меню вкладки эти пункты

Тоже можно.

etoins srldu пишет
Uxapb пишет

В Инструменты, в самый низ.

Выделить код

Код:

// Добавить новый пункт "Искать страницу" в меню kнопки ................................
(function () { 
   var img = "data:image/x-icon;base64,AAABAAEAEhAAAAEAGADoAwAAFgAAACgAAAASAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx9vm0y9y40OC50OG40OG40OG40OG40OG40OG40d68z+yuz8a34qYAAAAAAAAAAAAAAAAEkQAAANLl9Dya11Oo2Eqg0kyh00uh0kqg0kyf0kqgzkqYzz2MrRexIxfFA6PhpQAAAAAAAAAAAASRAAAA1Of4Sq3rXKLUYqjeYajeY6vgZq7kYqrcYaHYSoasI7wsMPMqLu8yHdUdrOCqAAAAAAAABJEAAADU5/dGp+VireB4xfx2xPpyvvNprt5ss+pgpcsmwjct8iYz7DU17DM58zcl2SSu464AAAAEkQAAANTo+Eio5mOr33XA93bE+WWs3HOu0V6jyS6+PWvwXHPvdUDuQDfuNWryaXXwdDLOM7DnsQSRAAAA1Oj4RqfmZK3gesj8dsX4d8f5e8n7arncPbNzKKNMZdtiX/dfR/FDl/KWWMNYe9R7v+u/BJEAAADW5/hFqOZ0uuKc3PiU1/aU2PaV1/SU1fGZxv9aop1a21d2+3Vg9WSW8peA04EAAAAAAAAEkQAAANTm9kuv63TD8Gy46W+76m666m+762286W+z5ziVh2fYXLr7ran2npXolm/ObgAAAAAAAASRAAAA1Ob3SaznWqPSXanZXanZXqvaYa3eYKzbXqbZUKW0R8JpPbZzRbp4a81oo+CjAAAAAAAABJEAAADV5/hGqOVmteOA1f990v980fx0xe91zfl/2f9/1/+d3Pxgt/Jsvv8AAAAAAAAAAAAAAAAEkQAAANTn90eq5WW14nzS/X3U/2q34XazzHvG73bP/XnS/ZLb9F225Wq+8QAAAAAAAAAAAAAAAASRAAAA0+f3SKrlZbfletX/edH/d9D9gtv+gdn/etT/edf/lN36W7foa772AAAAAAAAAAAAAAAABJEAAADW6PhEqOd/wOCk5PqX2/ea3viY3PeY3faZ3/ia3/ig2/Rctelsv/cAAAAAAAAAAAAAAAAEkQAAAM/k9kuv6nnE63O/7XPA7XPA7nTA7XXA7XO/7XTA7HK+7GnC8Ge79QAAAAAAAAAAAAAAAASRAAAA3u34ccDvoOb8n+P7oOT8oOT8oOT8oOT8oeT8n+T8pOf9jdn5jMn1AAAAAAAAAAAAAAAABJEAAAAAAADB4vtRtvRbv/dZvvZZvvZavvdavvZavvZcwPZXvfZ3w/YAAAAAAAAAAAAAAAAAAAAEkYADwEGAAcBBgADAQYAAQEGAAABBgAAAQYAAwEGAAMBBgADAQYADwEGAA8BBgAPAQYADwEGAA8BBgAPAQcAHwEE=";
   var menu = document.createElement("menu");
   menu.setAttribute("label", "Искать страницу");
   menu.setAttribute("class", "menu-iconic");
   menu.setAttribute("image", img );
   menu.onmouseout = function() { menu.removeAttribute('_moz-menuactive') }; 

   var array = [
       ["в кэше Google", function() gBrowser.selectedTab = gBrowser.addTab('http://www.google.com/search?q=cache:' + content.location) ],
       ["на Archive.org", function() gBrowser.selectedTab = gBrowser.addTab('http://web.archive.org/web/' + content.location) ],
       //["separator"],
               ];
   var menuPopup = document.createElement("menupopup");
   menuPopup.onmouseover = function() { menu.setAttribute('_moz-menuactive', 'true') };
   array.forEach(function( m ) {
        if ( m[0] == "separator" ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
        var menuItem = document.createElement("menuitem");
        menuItem.setAttribute("label", m[0] );
        menuItem.addEventListener("command", m[1] );
        menuPopup.appendChild( menuItem );
   });
   menu.appendChild( menuPopup );

   var toolsMenu = document.getElementById("menu_ToolsPopup");
   toolsMenu.appendChild( menu );
   addDestructor(function() toolsMenu.removeChild( menu ) );
})();

02-05-2014 22:08:38

okkamas_knife пишет

лучше добавь в контекстное меню вкладки эти пункты

Тоже можно.

Я поставил подменю в таб контекст меню (вместо menu_ToolsPopup поставил tabContextMenu) - работает.
Есть один момент: поиск всегда делается для активной вкладки независимо от того на какую вкладку делаешь правый клик.
Может надо заменить content.location или gURLBar.value на что-нибудь другое?

rgdru пишет

Престала работать кнопка в FF29 https://forum.mozilla-russia.org/viewto … 70#p626370

У меня не перестала :/.

MDM пишет

Кнопки, помещенные в новое меню Firefox 29, не инициализируются, пока не откроешь это меню. Кто-нибудь в курсе, это чинится?

№30.
А ещё не инициализируются кнопки, когда попадают в #widget-overflow-list.
Ещё, после клонирования или удаления кнопки, изменение не регистрируется
в CustomizableUIInternal и browser.uiCustomization.state,
что, иногда, приводит к небольшим недоразумениям.
Вот, пробую так

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

Выделить код

Код:

(function() {
    if (gBrowser.currentURI.spec == "about:customizing") return;

    var observer = {};
    observer.observe = function(subject, topic, data) {

        var id = data.split(":")[1];
        if (topic.endsWith("cloneButton")) {
            var {area, position} = CustomizableUI.getPlacementOfWidget(id);
            CustomizableUI.addWidgetToArea(subject.id, area, position + 1);
        }
        else CustomizableUI.removeWidgetFromArea(id);
    }
    const topicRemove = custombuttons.notificationPrefix + "removeButton";
    const topicClone = custombuttons.notificationPrefix + "cloneButton";
    Services.obs.addObserver(observer, topicRemove, false);
    Services.obs.addObserver(observer, topicClone , false);
    addDestructor(function() {
        Services.obs.removeObserver(observer, topicRemove);
        Services.obs.removeObserver(observer, topicClone);
    });

    var panel = document.getElementById("PanelUI-popup");
    if (!panel.hidden) return;

    for(var toolbar of document.getElementsByTagName("toolbar")) {
        if (!toolbar.hasOwnProperty("overflowable")) continue;

        var func = toolbar.overflowable.onOverflow;
        toolbar.overflowable.onOverflow = function() {
            func.apply(this, arguments);

            this._list._localName = this._list.localName;
            this._list.__defineGetter__("localName", function()
                arguments.callee.caller == custombutton.buttonConstructor ? "toolbar" : this._localName
            );
            setTimeout(function(overflowable) {
                overflowable._panel.hidden = false;
                overflowable.onOverflow = func;
            }, 0, this);
        }
    }

    var btn = document.getElementById("PanelUI-menu-button");
    panel.addEventListener("popupshown", function hideMenu(e) {
        this.removeEventListener(e.type, hideMenu, false);
        btn.click(); // Hides menu
        setTimeout(function() panel.collapsed = false, 0);
    }, false);
    panel.collapsed = true;
    btn.click(); // Opens menu

})();

difabor пишет

Может надо заменить content.location или gURLBar.value на что-нибудь другое?

Попробуй на TabContextMenu.contextTab.linkedBrowser.currentURI.spec

Dumby
2a198d36afd47c34ce552a7a4ba48e0d.jpeg
А у меня вот так.

Dumby пишет

Попробуй на TabContextMenu.contextTab.linkedBrowser.currentURI.spec

Спасибо огромное! Работает как надо!!!

Dumby пишет
MDM пишет

Кнопки, помещенные в новое меню Firefox 29, не инициализируются, пока не откроешь это меню. Кто-нибудь в курсе, это чинится?

№30.

Спасибо. Работает и ладно. :)

rgdru пишет

А у меня вот так.

Попробуй замену. Рестарт.

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECompact%20Menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBEAAAEAIACsBAAAFgAAACgAAAAQAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMSAAcROg8hOGEvQV1hL0JdOQ4iOBIABxH7+/uBqKioqv7+/oAAAAAAAAAAAAAAAAAAAAAAAAAAAREABhB6PEx23HZ32+uLe/7rfGv/63tr/+uKev7vv7/tp52g10BAQP6vr6+z////fwAAAAAAAAAAAAAAAR0CEB3AaHK/629j/+FbVP/bUU7/10xK/9ZLSv/sp6X/26mm/0BAQP9AQED/QEBA/9jY2KH///9/AAAAAA8ABQ+6X22+1UpK/8Y2P/+8KDX/tB0v/6sZKf+uGCz/1pae/0BAQP9AQED/QEBA/0BAQP9AQED+8fHxkQAAAAJ0M0hzxz1G/7AYLv+lDCX/ng0b/5APD/+FFgL/1Zid/3BfYf9AQED/QEBA/0BAQP9AQED/QEBA/25ubtgPAAUPt0dc2KULJf+pFCb/tygu/7w1L/+FGAH/nSsW/8OSjf+gf3//qIKB/9aTlf/Vi5P/0YSR/9yosuzw7/CHMAobMLw2Sf60Iyz/xD41/9NSPv/cYUT/0188/+VwSf/IWzj/WhID/0kFAP9zGhT/yEM4/7grL/+9Okn+Nw0fNFYoOVLAOT3/zEg6/9xhRP/qdUv/64RR/+uNVf/rk1f/65NX/9t1Q/9mGQD/YhcE/9NeP//RTz3/xEA//1wsPVlWKDhR01dI/+BnRv/rf0//65JX/+ugXP/rqV7/661g/+utYf/McDH/gS4C/4UyD//CXjX/5G5I/9hdSf9dLD5YMAoaMOp+Zf7rgE//65dZ/+upX//rtGP/671n/+vBaP/rslz/rk4K/51CBf/rjUf/64RI/+uBTf/rhGf+NQweNA4ABg7Tdm3X65NY/+uqX//rumX/68Rq/+vMbf/r0G//68pn/+u+X//cgTD/67hi/+uuYf/rmlr/2Hxv2REABhAAAAACdTlIceudYP/rrV7/66xW/+vMbf/r03D/69Zw/+vVcP/r1HD/68tr/9x+Pv/rkUz/66xo/3Y7SXMAAAACAAAAAA8ABQ+2Z2O70WIX/+uEIf/rvVb/68JY/+vPbf/rsUn/68FX/+uVRf+dNBL/zGw0/8h7dL0PAAUPAAAAAAAAAAAAAAABHAEPHL5qWrzrr0r/69CA/+vQgf/r3qv/696r/+vNgP/rrnb/rEgo/6VXW70dAg8cAAAAAQAAAAAAAAAAAAAAAAAAAAEPAAUPdztFceiUcNjrz47+69yw/+vUmf/ryIT+03pe2XIzRHMPAAUPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPAAUPMgscMlcpOlNYKTlUMwscMg8ABQ8AAAACAAAAAAAAAAAAAAAAAAAAAP//rEHwA6xBwAGsQYAArEGAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEGAAaxBgAGsQcADrEHwD6xB%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28gBrowser.currentURI.spec%20%3D%3D%20%22about%3Acustomizing%22%29%20return%3B%0A%0Avar%20mmb%20%3D%20document.getElementById%28%22main-menubar%22%29%3B%0Ammb.collapsed%20%3D%20true%3B%0AaddDestructor%28%28%29%20%3D%3E%20mmb.collapsed%20%3D%20false%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%20%28event.target%20%26%26%20event.target%20%21%3D%20this%29%20return%3B%0Aif%20%28%21event.target%20%26%26%20this.lastChild%20%26%26%20this.lastChild.state%20%3D%3D%20%22open%22%29%20%7B%0A%09this.lastChild.hidePopup%28%29%3B%20return%3B%0A%7D%0Avar%20ids%20%3D%20%5B%0A%09%22file-menu%22%2C%0A%09%22edit-menu%22%2C%0A%09%22view-menu%22%2C%0A%09%22bookmarksMenu%22%2C%0A%09%22history-menu%22%2C%0A%09%22tools-menu%22%2C%0A%09%22helpMenu%22%0A%5D%3B%0Avar%20menus%20%3D%20ids.map%28id%20%3D%3E%20document.getElementById%28id%29%29%3B%0Avar%20menubar%20%3D%20menus%5B0%5D.parentNode%3B%0Avar%20order%20%3D%20Array.slice%28menubar.childNodes%29%3B%0A%0Afunction%20appendMenus%28parent%29%20%7B%0A%09var%20nodes%20%3D%20parent%20%3D%3D%20menubar%20%3F%20order%20%3A%20menus%3B%0A%09for%28var%20node%20of%20nodes%29%20parent.appendChild%28node%29%3B%0A%09if%20%28ids.indexOf%28%22bookmarksMenu%22%29%20%3D%3D%20-1%29%20return%3B%0A%09for%28var%20menu%20of%20parent.getElementsByTagName%28%22menu%22%29%29%20%7B%0A%09%09if%20%28%21menu._placesView%29%20continue%3B%0A%09%09menu._placesView.uninit%28%29%3B%0A%09%09delete%20menu._placesView%3B%0A%09%7D%0A%7D%0Athis.textContent%20%3D%20%22%22%3B%0Avar%20popup%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Apopup.position%20%3D%20%22after_start%22%3B%0Apopup.id%20%3D%20%22cb-compact-menu-menupopup%22%3B%0Apopup.setAttribute%28%22context%22%2C%20%22toolbar-context-menu%22%29%3B%0Apopup.__defineGetter__%28%22parentNode%22%2C%20%28%29%20%3D%3E%20null%29%3B%0A%0Apopup.addEventListener%28%22popuphidden%22%2C%20function%20onPH%28e%29%20%7B%0A%09if%20%28e.originalTarget%20%21%3D%20this%29%20return%3B%0A%09popup.removeEventListener%28%22popuphidden%22%2C%20onPH%2C%20false%29%3B%0A%09appendMenus%28menubar%29%3B%0A%7D%2C%20false%29%3B%0A%0AappendMenus%28popup%29%3B%0Apopup.openPopup%28this%29%3B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Dumby
Сейчас все нормально.Спасибо!
e91336099be8b051036bdca8d886bb3f.jpeg

есть ли у нас способ объеденить эти 2 кнопки в одну?
https://forum.mozilla-russia.org/viewto … 90#p416590

okkamas_knife пишет

а поконкретнее?
что именно нужно то?

идея состоит в скрытии кнопок вперед/назад и обновить/остановить и создании их аналогов

и есть у нас пример кнопки со сменой изображения, (невозможность перехода)?

Выделить код

Код:

var url="javascript:history.go(-1)";
loadURI (url);

Поправьте если можно Relative tabs, а то он перестал корректно работать

okkamas_knife пишет

мог бы и сам поправить раз уж сидишь на новых версиях.
там делов то было картинку поменять да исправить код убрав e4x патчем от Infocatcher что в заглавном посте готовых.

спасибо, а то на форуме такая вырвиглазная вещь встретилась =) http://custombuttons.sourceforge.net/fo … f=4&t=1242

Pony_Smile_Pack пишет

Поправьте если можно Relative tabs, а то он перестал корректно работать

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 08.04.2014. ................................ 
addEventListener("TabOpen", function(e) {
   var newTab = e.target;
   var lab = newTab.label; 
   var tabpos = gBrowser.selectedTab._tPos;
   var newTabLab = gBrowser.mStringBundle.getString("tabs.emptyTabTitle");  

   if ( tabpos == 0 && lab == newTabLab ) return;      // если восстановление сессии 
   if ( new Error().stack.indexOf("openContainer") !== -1 ) return;   // если открыть всё во вкладках из папки закладок  
   
   lab == newTabLab
   ? setTimeout(function() gBrowser.moveTabTo( e.target, tabpos + 1 ), 50) // если восстановление вкладки
   : gBrowser.moveTabTo( e.target, tabpos + 1 );
   
   // автоматически закрывать "custombutton" вкладку
   if ( lab.startsWith("custombutton://%") ) setTimeout(function() gBrowser.removeTab( newTab ), 0);

}, false, gBrowser.tabContainer );

Спасибо, bunda1.

подскажите как работать с  группами вкладок в FF 29.0.1 ? ссылку на документацию бы :)
хочу сделать чтоб по нажатию появлялось список групп вкладок и можно было быстро переключиться.
--
так пока нагуглил расширение

Попробовал открывать новую пустую вкладку и вроде без проблем. А как ты открываешь пустую вкладку?

[поправочка, я тут жаловался на Relative tabs, но это я её просто положил в панель-кнопку]

19-05-2014 22:45:57
сейчас вроде всё хорошо
ещё раз спасибо

:)

Поправьте плз кнопочку Make bookmark button. Не вставляется автоматом иконка страницы и после перезагрузки кнопка-страница исчезает. Если присвоить свою иконку, то остается.
Спасибо.

Uxapb пишет

Поправьте плз кнопочку Make bookmark button. Не вставляется автоматом иконка страницы и после перезагрузки кнопка-страница исчезает. Если присвоить свою иконку, то остается.
Спасибо.

Создать кнопку ярлык для сайта

bunda1 пишет

Создать кнопку ярлык для сайта

Разместил кнопку на Панеле Закладок, нащелкал кнопок. Иконки присваиваются, но после перезагрузки кнопки пропадают с панели.
Они должны оставаться на панели только на сессию или это баг ? Из браузера кнопки не пропадают и их можно потом опять вернуть на панель. После возврата прописываются на постоянку.

Uxapb пишет

но после перезагрузки кнопки пропадают с панели.

Скорее всего, поможет
Fix for "Clone button" feature on Firefox 29+ (Australis)

02-06-2014 16:25:52
И есть официальная тестовая версия:
http://custombuttons.sourceforge.net/fo … 9285#p9285
=> https://sourceforge.net/projects/custombuttons/files/

custombuttons-0.0.5.8pre.xpi решило проблемку. Спасибо.

bunda1
В 31-й перестала работать Memory Monitor - двоится значение.
А если ещё стоит Показывать количество открытых табов в адресной строке+, то значение количества табов "прилипает" к значению Memory Monitor. Или к значку dropdown history в адресной строке.
Если можно сделать и не затруднит, поправь, пожалуйста.

На FF31 у меня всё порядке, но попробуй добавить:

Выделить код

Код:

if ( document.getElementById('memoryDisplay') ) return;

в коде Memory Monitor перед:

Выделить код

Код:

// Создать в адресной строке счётчик памяти ....
var memoryDisplay = document.createElement("statusbarpanel");

Также можно в коде Memory Monitor в строке:

Выделить код

Код:

memoryDisplay.style.cssText = "-moz-appearance: none; border: 0; min-width: 5.5em; text-align: right;"; // Css стиль для счётчика

или в коде Показывать количество открытых табов в адресной строке+ под строками:

Выделить код

Код:

// Стиль для счётчика и меню ....
var uri = makeURI('data:text/css,'+ encodeURIComponent('\

добавить нужний тебе отступ margin

На дефолтном профиле действительно всё нормально.
Но с приложениями и стилями...

Выделить код

Код:

if ( document.getElementById('memoryDisplay') ) return;

Это код помог.
С Margin я разберусь, но вот посмотри: если выводятся обе кнопки, то это расширение их "разрывает".
Хотя это не важно, просто для информации. Спасибо.

xrun1 пишет

С Margin я разберусь, но вот посмотри: если выводятся обе кнопки, то это расширение их "разрывает".
Хотя это не важно, просто для информации. Спасибо.

Спасибо, я это учту. Кстати RSS иконку в адресную строку можно передвинуть Сustom Buttons кодом.
И похоже что у тебя стоят два Memory Monitor.

bunda1 пишет

И похоже что у тебя стоят два Memory Monitor.

Если удаляю код из кнопки - значение в адресной строке исчезает. Но перепроверил все кнопки на всякий случай. Memory Monitor точно один.
Иногда бывает одно значение, потом вдруг раз - появилось второе. Закономерности не выявил. Это не только у меня, кстати.

Кстати RSS иконку в адресную строку можно передвинуть Сustom Buttons кодом.

Это для меня слишком сложно и стандартная скучная серая. ))
P.S. Сейчас работает правильно и без изменения кода. Закономерности не видно...

xrun1
А версия Сustom Buttons какая.

bunda1
0.0.5.8
После того, как написал предыдущий пост опять задвоилось. С изменением нормально.

А я не знал что есть 0.0.5.8, а сам Сustom Buttons почему то не обновляется. А глюк Memory Monitor не понятный, но я добавлю if ( document.getElementById('memoryDisplay') ) return;  в Memory Monitor
Спасибо за информацию

bunda1 пишет

А я не знал что есть 0.0.5.8, а сам Сustom Buttons почему то не обновляется.

Как оказалось уже и custombuttons-0.0.5.9pre1-20140622 есть №13222

Всем привет, помогите с кнопкой, пожалуйста (
Есть дополнение Update Scanner.
хочется в один клик проверять сайты на изменения.
8184559d447c0b3e169651e03db88cd7.png
нужна кнопка, при нажатии которой выполняется функция кнопки "Сканировать"
Спасибо.

ps
пытался Атрибут инспектором, но что то не получается (

firepox пишет

нужна кнопка, при нажатии которой выполняется функция кнопки "Сканировать"

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

Выделить код

Код:

var sidebar = document.getElementById("sidebar");
function scan() {
    sidebar.contentWindow.USc_updatescan.scanButtonClick();
}
toggleSidebar("viewUpdateScanSidebar", true);
if(
    sidebar.getAttribute("src") == "chrome://updatescan/content/updatescan.xul"
    && sidebar.contentDocument.readyState == "complete"
) {
    scan();
}
else {
    sidebar.addEventListener("load", function onLoad(e) {
        sidebar.removeEventListener(e.type, onLoad, true);
        scan()
    }, true);
}

Infocatcher
Огромное спасибо!
Все работает.

а возможно сделать, что  бы при повторном клике боковая панель закрывалась?

okkamas_knife
спасибо, но вообще ничего не происходит при нажатии на кнопку.
ладно, спасибо большое всем за помощь.
успехов!

firepox пишет

а возможно сделать, что  бы при повторном клике боковая панель закрывалась?

Только надо иметь в виду, что преждевременное закрытие прервет проверку.

Выделить код

Код:

var sidebar = document.getElementById("sidebar");
if(
    sidebar.boxObject.width
    && sidebar.getAttribute("src") == "chrome://updatescan/content/updatescan.xul"
) {
    toggleSidebar();
}
else {
    toggleSidebar("viewUpdateScanSidebar", true);
    var scan = function() {
        sidebar.contentWindow.USc_updatescan.scanButtonClick();
    };
    if(
        sidebar.getAttribute("src") == "chrome://updatescan/content/updatescan.xul"
        && !sidebar.webProgress.isLoadingDocument
    ) {
        scan();
    }
    else {
        sidebar.addEventListener("load", function onLoad(e) {
            sidebar.removeEventListener(e.type, onLoad, true);
            scan();
        }, true);
    }
}

В предыдущем коде «sidebar.contentDocument.readyState == "complete"» тоже лучше заменить на «!sidebar.webProgress.isLoadingDocument».

okkamas_knife пишет

попробуй строчку
var sidebar = document.getElementById("sidebar");
перенести в самое начало кода

Не, там проблема в том, что в Firefox у кнопки закрытия нет идентификатора.
И если не ставить никаких расширений, то используется hidden, а не collapsed.
Так что проверка на вычисленную ширину (sidebar.boxObject.width) более универсальная.

Infocatcher
Спасибо! то что надо, супер!
okkamas_knife
и Вам спасибо!

okkamas_knife пишет

я то наивный думал что хоть с сайдбаром у них одинаково..

Не-а, там как раз полно отличий, из-за этого даже некий xSidebar есть:
http://xsidebar.mozdev.org/
https://addons.mozilla.org/seamonkey/addon/xsidebar/
http://forums.mozillazine.org/viewtopic … 8&t=568392

Если возможно,
добавить возможность авто-закрытия боковой панели:
если нет изменений - панель закрывается.
если есть, то не закрывается.

было бы еще лучше )

firepox пишет

добавить возможность авто-закрытия боковой панели:
если нет изменений - панель закрывается.
если есть, то не закрывается.

Все-таки есть там код для проверки без боковой панели.

Выделить код

Код:

// See chrome://updatescan/content/autoscan.js and chrome://updatescan/content/updatescan.js
// Like USc_autoscan._check(), but check all items like USc_updatescan.scanButtonClick()
var me = USc_autoscan;
me.scan = new USc_scanner();
me.numChanges = 0;
if(me.scan.addItems(USc_places.getRootFolderId(), false /*autoScan*/) > 0) {
    me.scan.start(
        me._scanChanged,
        function onFinished() {
            me._scanFinished();
            if(me.numChanges) {
                toggleSidebar("viewUpdateScanSidebar", true);
            }
            else {
                var str = document.getElementById("updatescanStrings");
                window.openDialog(
                    "chrome://updatescan/content/alert.xul",
                    "alert:alert",
                    "chrome,dialog=yes,titlebar=no,popup=yes",
                    str.getString("statusNoChanges")
                );
            }
        },
        me._scanProgress,
        me._encodingChanged
    );
}

Infocatcher
Класс!
Спасибо!

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

30-07-2014 21:07:50
извините, сам понял как сделать.

помогите плиз! как сделать чтоб при запуске лисы у иконки была картинка (1) а после переключения (2)?

Где то видел кнопку для запаролевания firefox-не могу найти.Ткните плиз.

okkamas_knife
Да,оно-благодарю!

Можно ли сделать кнопку, которая по длинному левому клику на вкладку в таббаре делала бы перезагрузку (reload, refresh) этой вкладки, а по короткому, как обычно - делала бы эту вкладку активной (как сейчас)?

difabor пишет

Можно ли сделать кнопку, которая по длинному левому клику на вкладку в таббаре делала бы перезагрузку (reload, refresh) этой вкладки, а по короткому, как обычно - делала бы эту вкладку активной (как сейчас)?

Выделить код

Код:

(function f() { 
   const tabbrowser = gBrowser.mTabContainer;
   
   addEventListener("click", function(e) {
      if ( e.button || e.target.nodeName !== "tab" || (Date.now() - f.mouseDownTime) < 600 ) return;
           BrowserReload();
   }, true, tabbrowser );
   
   addEventListener("mousedown", function() f.mouseDownTime = Date.now(), true, tabbrowser ); 
})();

или:

Выделить код

Код:

function tabLongPress(e) {
  if ( e.button || e.target.nodeName !== "tab" ) return;
       
  if ( e.type == "mousedown" ) 
       tabLongPress.time = Date.now(), e.stopPropagation();       
  else
       Date.now() - tabLongPress.time > 600 ? gBrowser.reloadTab(e.target) : gBrowser.selectedTab = e.target;
}; 
["click", "mousedown"].forEach(function(type) addEventListener(type, tabLongPress, true, gBrowser.mTabContainer ));

а можно :( ?
у меня сейчас вот такой код работает

Выделить код

Код:

//Активизировать вкладку наведением курсора......................
var tab_hover={
   event:null,
   tid:null,

   onLoad: function() {
      gBrowser.tabContainer.addEventListener("mouseout", tab_hover.onMouseOut, false);
      gBrowser.tabContainer.addEventListener("mouseover", tab_hover.onMouseOver, false);
   },
   onUnload: function() {
      gBrowser.tabContainer.removeEventListener("mouseover", tab_hover.onMouseOver, false);
      gBrowser.tabContainer.removeEventListener("mouseout", tab_hover.onMouseOut, false);
   },

   onMouseOver: function(event) {
      tab_hover.event=event.target;
      tab_hover.tid=setTimeout( function(){ gBrowser.selectedTab=tab_hover.event;   } , 450);
   },
   onMouseOut: function() {
      clearTimeout(tab_hover.tid);
   }
};
if (!this.tab_hoverRun) tab_hover.onLoad();
this.tab_hoverRun = true;

можно в него добавить код по короткому левому клику на вкладку в таббаре делала бы перезагрузку (reload, refresh) этой вкладки? спс заранее :blush:

sonyas75 пишет

можно в него добавить код по короткому левому клику на вкладку в таббаре делала бы перезагрузку (reload, refresh) этой вкладки? спс заранее :blush:

Добавлять не надо, будет работать вместе с твоим кодом:

Выделить код

Код:

addEventListener("click", function(e) {
   if ( e.button == 0 && e.target.nodeName == "tab" ) BrowserReload();
}, true, gBrowser.mTabContainer );

Кстати, советую заменить твой код на:

Выделить код

Код:

// Активизировать вкладку наведением курсора, если 'Панель меню' закрыт ................................
(function () { 
   var menubar = document.getElementById('toolbar-menubar');
         
   addEventListener("mouseover", function(e) {
      if ( menubar.getAttribute("autohide") == 'true' && menubar.getAttribute("inactive") ) {
           gBrowser.selectedTab = e.target;
           e.target.setAttribute('read', 'true');
           }                  
   }, false, gBrowser.tabContainer ); 
   
})();

о! премного благодарен :)

И от меня - огромнейшее спасибо!!!

Уважаемый bunda1,
  мне очень нравится Ваше открытие вкладки по наведению курсора - очень удобно.
Единственное,что меня смущало, это то, что когда неаккуратно убираешь курсор с вкладки и "цепляешь" им другую вкладку, то делаешь её активной.
Я своими кривыми ручками внёс маленькое изменение:

Выделить код

Код:

// Активизировать вкладку наведением курсора, если 'Панель меню' закрыт ................................ 
(function () { 
   var menubar = document.getElementById('toolbar-menubar'), dateout = Date.now();
   
   addEventListener("mouseout", function(e) {dateout = Date.now(); }, true, gBrowser.tabContainer ); 
   
   addEventListener("mouseover", function(e) {
      if ( menubar.getAttribute("autohide") == 'true' && menubar.getAttribute("inactive") && (Date.now() - dateout > 500 ) ) {
           gBrowser.selectedTab = e.target;
           e.target.setAttribute('read', 'true');
           }                  
   }, false, gBrowser.tabContainer );
   addEventListener("click", function(e) {
       if ( e.button == 0 && e.target.nodeName == "tab" ) BrowserReload();
   }, true, gBrowser.mTabContainer ); 
   
})();

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

difabor
Хорошо придумано.

Подскажите, а с помощью CB можно сделать имитацию нажатий клавивиатуры, чтобы не запускать vbscript:

Выделить код

Код:

Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "{F1}"

Кнопочка Clear Cache / Delete flash cookie после обновления до FF32 больше не работает, можно её как-то исправить?

Zaycoff пишет

Кнопочка Clear Cache / Delete flash cookie после обновления до FF32 больше не работает, можно её как-то исправить?

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EClear%20Cache%20/%20Delete%20flash%20cookies%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAExEAAAEAIAB4BQAAFgAAACgAAAATAAAAIgAAAAEAIAAAAAAAUAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAQEBCxMTEyElJSU/KywrWC4sLWUzMzNrPDs8a0NEQ2MsLCxKDg0PKgABAA8AAAAAAgICAAAAAAAAAAAAAAAAAQAAAAIZGhoHQ0NDUGJiYqZxcXHVcXFx6XNzc/STlJT2t7e2+NDP0Pjb3dz11tbY67GwsNtsbWy0JyYnYQICAg8CAgICAAAAAgICAgUAAAAAJykpJ5CRkM64t7f/q6ut/7m5uf/Lx8b/19bW/9nY2P7a2dz+4d/g/+rq6P/r7Or/1NTU/3V1ddkKCwo+AQEBAQEBAQQCAgIDAAABARMTEhdubmy/rq6w/snIyfbj4+H94uXn/d/l7f3W2+X9xc3R/a20u/2oqKr9paWi96Wmpf5ubW3NFRMTNgAAAA4BAQEJAQIBAQICAgUAAQUBhY6UpuDi5f7b2Nj609ng/rfB1v+ssc3/wcja/6qyx/99hqL/iZOr/rW4vfrZ2Nf+io2VuQQHDiICAgETAQEBBgIDBAIDAgEDAQoSAau8wq3/////4Oft+tzm7v7d4On/q6zJ/0tLoP9cXKb/tbXM/9Hb5v7f5/H6/////7K6wrYBDRkNAwEABQICAQECAwQCAQIBAggNEQest7+4+v7+/8rY6Pnf5u7++/r6/6OmzP9kZa//aGmu/8rN4//7+vv/3Obr+Pn9/f+/wsK7ChIWDAIBAQECAwMDAwQEBAEBAQINFhgPprXAvPb////K1OT5vcDX/6SlzP+Bg7z/5ebu/7S11P9+gbv/l5jE/7G60fj1/P7/w8TIwBYYIRcAAQEBBAQEBAQEBQQCAAAAESIsGbTGzMH5////5u70+dTW6P+Dg7//gIC//8PD3f+gocr/OTyf/3J0t/+/xd349P7//73EzsYgIy8hAAAAAAQEBAQEBAUEAAAAABoiLSLAyszH+f///9/q9vj0+Pz/2Nfp/7e32P+9vtz/ubvX/25vtP+/weD/5/D1+Pb////AytHLJSw3KwAAAAAEBAUFBAQFBQAAAAAgKzQrvsvOyvb+/v/I2e/42ef3//L19v/p6Ov//vv7//Hy8v/Jydv/1ODu/97r9Pj9/v//zdHY0C44RjgAAAAABAUFBQQFBQUAAAAAKzpJN8TV2dD4/v7/1Oj++NDq///Q6P7/4PH//+Pw/v/U5fb/xt3z/8Tc9f/X5/f4//7//9PX29c3QktFAAAAAAUFBQUEBQUFAAAAADE5Rj7G09rT8Pr7/8PV6fi60eX/q8ff/63G4P+uxt//s8vl/7PN6//F2fD/0N/r+Pr8/P/W3+TaP09aSwAAAAAFBQUFBAUFBQAAAAA4PUhRqrW/3bK6wP57gIn2cXeD/nh+gv2Rlpf9rrKz/crNz/3c4eT94uft/tDU2/bX2dr+tL3F4kJNWl0AAAAABAUGBgMDAwYAAAAAX15jfq+vsvqjpqb/mJ2f/qmyt/+vvMP+u8nT/8jT3f/R3Ob/2OTs/97l7P/N0dX+wsLE/62usP5WV1uLAAAAAAIDBAUDAwMEAAAAAEdGRkqJiYi6mZma57CztO/Q1tr20tni98PL1vettb/3maGs94uSnfeIjpL3iY2M8ZycnOmZmJfDTUtMVgAAAAACAgIDAAAAAAAAAAAEBAUBDxEQEickJCtAODtEVlFTW2RjZGljYl9yXVxadVdWVHNRUFNqR0RHXT03NkcpJyctFBUWEwgHCAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20if%20%28%20e.button%20%29%20return%3B%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u043E%u0447%u0438%u0441%u0442%u0438%u0442%u044C%20%u043A%u044D%u0448%20....%0A%20%20%20%20%20try%20%7B%20%0A%20%20%20%20%20%20%20%20%20Services.cache.evictEntries%28Ci.nsICache.STORE_IN_MEMORY%29%3B%0A%20%20%20%20%20%20%20%20%20Services.cache.evictEntries%28Ci.nsICache.STORE_ON_DISK%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20%20catch%28e%29%20%7B%20Services.cache2.clear%28%29%20%7D%0A%0A%20%20%20%20%20//%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20Flash%20%u043A%u0443%u043A%u0438%u0441%u0438%20....%0A%20%20%20%20%20var%20dir%20%3D%20Cc%5B%22@mozilla.org/file/directory_service%3B1%22%5D.getService%28Ci.nsIProperties%29.get%28%22Home%22%2C%20Ci.nsIFile%29%3B%0A%20%20%20%20%20dir.append%28%22Application%20Data%22%29%3B%0A%20%20%20%20%20dir.append%28%22Macromedia%22%29%3B%0A%20%20%20%20%20if%20%28%20dir.exists%28%29%20%29%20dir.remove%28true%29%3B%0A%20%20%20%20%20if%20%28%20%21dir.exists%28%29%20%29%20dir.create%28Ci.nsIFile.DIRECTORY_TYPE%2C%200777%29%3B%0A%0A%20%20%20%20%20//%20%u0412%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0435%u0435%20%u0441%u043E%u043E%u0431%u0449%u0435%u043D%u0438%u0435%20....%0A%20%20%20%20%20const%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%3B%0A%20%20%20%20%20alertsService.showAlertNotification%28self.image%2C%20self.label%2C%20%27%u041E%u0447%u0438%u0441%u0442%u0438%u043B%20%u043A%u0435%u0448%20%u0438%20%u0443%u0434%u0430%u043B%u0438%u043B%20Flash%20%u043A%u0443%u043A%u0438%u0441%u0438%27%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0A%0A%7D%3B%0A%0A%0A//%20%u0421%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0430%u044F%20%u043F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20....%0A%28function%28%29%20%7B%0A%20%20%20%20var%20title%20%3D%20self.label%20+%20%22%3A%5Cn%5Cn%22%3B%0A%20%20%20%20var%20data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20memory%3A%20%22Memory%20Cache%3A%20%20%22%2C%0A%20%20%20%20%20%20%20%20disk%3A%20%22Disk%20Cache%3A%20%20%22%2C%0A%20%20%20%20%20%20%20%20offline%3A%20%22Offline%20Cache%3A%20%20%22%0A%20%20%20%20%7D%3B%0A%20%20%20%20function%20getSize%28size%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21size%29%20return%20size%20%3D%3D%3D%200%20%3F%20%220%22%20%3A%20%22%3F%22%3B%0A%20%20%20%20%20%20%20%20for%28var%20count%20%3D%20-1%3B%20size%20%3E%3D%201024%3B%20size%20/%3D%201024%2C%20count++%29%3B%0A%20%20%20%20%20%20%20%20return%20size.toFixed%282%29.replace%28/0+%24/%2C%20%22%22%29.replace%28/%5C.%24/%2C%20%22%22%29%20+%20%22%20%22%20+%20%28%22KMGT%22%5Bcount%5D%20%7C%7C%20%22%22%29%20+%20%22B%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20function%20setInf%28tot%2C%20max%2C%20type%2C%20i%29%20%7B%0A%20%20%20%20%20%20%20%20var%20inf%20%3D%20getSize%28tot%29%20+%20%22%20/%20%22%20+%20getSize%28max%29%3B%0A%20%20%20%20%20%20%20%20var%20key%20%3D%20%22browser.cache.%22%20+%20type%20+%20%22.enable%22%3B%0A%20%20%20%20%20%20%20%20if%20%28%21Services.prefs.getBoolPref%28key%29%29%20inf%20+%3D%20%22%20%28disabled%29%22%3B%0A%20%20%20%20%20%20%20%20self.tooltipText%20%3D%20self.tooltipText.replace%28zws%28i%29%2C%20inf%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20function%20zws%28ind%29%20%22%5Cu200B%5Cu200B%5Cu200B%22.slice%280%2C%20++ind%29%3B%0A%0A%20%20%20%20var%20types%20%3D%20Object.keys%28data%29%3B%0A%20%20%20%20var%20ttt%20%3D%20title%20+%20types.map%28function%28key%2C%20i%29%20data%5Bkey%5D%20+%20zws%28i%29%29.join%28%22%5Cn%22%29%3B%0A%0A%20%20%20%20self.onmouseenter%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20self.tooltipText%20%3D%20ttt%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20entries%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Services.cache.visitEntries%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20visitDevice%3A%20function%28device%2C%20info%29%20entries%5Bdevice%5D%20%3D%20info%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20visitEntry%3A%20function%28%29%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20types.forEach%28function%28type%2C%20i%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20info%20%3D%20entries%5Btype%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInf%28info%20%26%26%20info.totalSize%2C%20info%20%26%26%20info.maximumSize%2C%20type%2C%20i%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Services.cache2%20%26%26%20types.forEach%28function%28type%2C%20i%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20func%20%3D%20function%28aEntryCount%2C%20aConsumption%2C%20aCapacity%2C%20aDiskDirectory%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInf%28aConsumption%2C%20aCapacity%2C%20type%2C%20i%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20storage%20%3D%20Services.cache2%5B%28type%20%3D%3D%20%22offline%22%20%3F%20%22app%22%20%3A%20type%29%20+%20%22CacheStorage%22%5D%28%7B%7D%2C%20null%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%20storage.asyncVisitStorage%28%7BonCacheStorageInfo%3A%20func%7D%2C%20false%29%20%7D%20catch%28ex%29%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%7D%29%28%29%3B%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Большое спасибо! =)

День добрый. Есть кнопочка CB Mouse Gestures+ (мне её на делали для изменения масштаба страницы ПКМ+колёсико) помогите добавить сброс масштаба по ПКМ+ЛКМ.

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

Выделить код

Код:

// Объявляем переменные для этой вкладки ................................
var _this = this;
var alertsService = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);
var bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Components.interfaces.nsINavBookmarksService);


var ucjsMouseGestures = {

   // настройки ....
   enableWheelGestures: true,
   enableRockerGestures: true,
   enablePopupGestures: true,

   _lastX: 0,
   _lastY: 0,
   _directionChain: '',
   _isMouseDownL: false,
   _isMouseDownR: false,
   _hideFireContext: false,    //for windows
   _shouldFireContext: false, //for linux
   POPUP_ID: 'GesturePopup',
   
   // Жесты ....
   GESTURES: {
           
// Управление страницей ................................
  'W-':{name:'Увеличить масштаб',cmd:function(){ FullZoom.enlarge() }},
  'W+':{name:'Уменьшить масштаб',cmd:function(){ FullZoom.reduce() }},
  'UDU':{name:'Сбросить масштаб',cmd:function(){ FullZoom.reset() }},
},

init:function() {
    var self = this;
    var events = ["mousedown", "mousemove", "mouseup", "contextmenu"];
    if ( this.enableRockerGestures ) events.push("draggesture");
    if ( this.enableWheelGestures ) events.push("DOMMouseScroll");
    function registerEvents( aAction, eventArray ) {
       eventArray.forEach(function(aType) { gBrowser.mPanelContainer[aAction + "EventListener"]( aType, self, true ) });
    };
    registerEvents("add", events);

    window.addEventListener("unload", function() { 
           registerEvents("remove",events);
    }, false );
    addDestructor(function() { registerEvents("remove", events) }); 
},

handleEvent:function( event ) {
    switch( event.type ) {
        case"mousedown":
            if ( event.button ==2 ) {
                 this._isMouseDownR = true;
                 this._hideFireContext = false;
                 this._startGesture( event );
                 }
            if ( this.enableRockerGestures ) {
                 if ( event.button == 2 && this._isMouseDownL ) {
                      this._isMouseDownL = false;
                      this._isMouseDownR = false;
                      this._shouldFireContext = false;
                      this._hideFireContext = true;
                      this._directionChain = "L>R";
                      this._stopGesture(event);
                      }
                 else if ( event.button == 0 ) {
                           this._isMouseDownL = true;
                           if ( this._isMouseDownR ) {
                                this._isMouseDownL = false;
                                this._shouldFireContext = false;
                                this._hideFireContext = true;
                                this._directionChain = "L<R";
                                this._stopGesture( event );
                                }
                           }
                 }
                break;

        case"mousemove":
            if ( this._isMouseDownR ) {
                 this._hideFireContext = true;
                 this._progressGesture( event );
                 }
            break;

        case"mouseup":
            if ( content.xdTrailArea ) {
                 content.xdTrailArea.parentNode.removeChild( content.xdTrailArea );
                 content.xdTrailArea = content.document.documentElement.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "xdTrailArea"));
                 }
            if ( event.ctrlKey && event.button == 2 ) {
                 this._isMouseDownL = false;
                 this._isMouseDownR = false;
                 this._shouldFireContext = false;
                 this._hideFireContext = false;
                 this._directionChain = '';
                 event.preventDefault();
                 XULBrowserWindow.statusTextField.label = "Reset Gesture";
                 break;
                 }
            if ( this._isMouseDownR && event.button == 2 ) {
                 if ( this._directionChain ) this._shouldFireContext = false;
                      this._isMouseDownR = false;
                      this._stopGesture( event );
                 if ( this._shouldFireContext && !this._hideFireContext ) {
                      this._shouldFireContext = false;
                      this._displayContextMenu( event );
                      }
                 }
            else if ( this.enableRockerGestures && event.button == 0 && this._isMouseDownL ) { 
                      this._isMouseDownL = false;
                      this._shouldFireContext = false;
                      }
            else if ( this.enablePopupGestures && ( event.button == 0 || event.button == 1 ) && event.target.localName =='menuitem' ) {
                      this._isMouseDownL = false;
                      this._shouldFireContext = false;
                      var popup = document.getElementById( this.POPUP_ID );
                      var activeItem = event.target;
                  
                      switch( popup.getAttribute("gesturecommand") ) {
                          case"WebSearchPopup":
                              var selText = popup.getAttribute("selectedtext");
                              var engine = activeItem.engine;
                              if ( !engine ) break;
                              var submission = engine.getSubmission( selText, null );
                              if ( !submission ) break;
                              document.getElementById('searchbar').textbox.value = selText;
                              gBrowser.loadOneTab( submission.uri.spec,null,null,submission.postData,null,false );
                              break;
                          case"ClosedTabsPopup":
                              undoCloseTab( activeItem.index );
                              break;
                          case"HistoryPopup":
                              gBrowser.webNavigation.gotoIndex( activeItem.index );
                              break;
                          case"AllTabsPopup":
                              gBrowser.selectedTab = gBrowser.mTabs[activeItem.index];
                              break;
                          }
                      popup.hidePopup();
                      }
            try { document.getElementById("statusbar-display").label = "" } catch(e) {};
            break;
        
        case"popuphiding":
            var popup = document.getElementById( this.POPUP_ID );
            popup.removeEventListener("popuphiding",this,true);
            document.documentElement.removeEventListener("mouseup",this,true);
            while( popup.hasChildNodes() ) popup.removeChild( popup.lastChild );
            break;

        case"contextmenu":
            if ( this._isMouseDownL || this._isMouseDownR || this._hideFireContext ) {
                 event.preventDefault();
                 event.stopPropagation();
                 this._shouldFireContext = true;
                 this._hideFireContext = false;
                 }
            break;

        case"DOMMouseScroll":
            if ( this.enableWheelGestures&&this._isMouseDownR ) {
                 event.preventDefault();
                 event.stopPropagation();
                 this._shouldFireContext = false;
                 this._hideFireContext = true;
                 this._directionChain = "W" + ( event.detail > 0 ? "+" : "-" );
                 this._stopGesture(event);
                 }
             break;

        case"draggesture":
            this._isMouseDownL = false;
            break;
        }
},

_displayContextMenu:function( event ) {
    var evt = event.originalTarget.ownerDocument.createEvent("MouseEvents");
    evt.initMouseEvent("contextmenu",true,true,event.originalTarget.defaultView,0,event.screenX,event.screenY,event.clientX,event.clientY,false,false,false,false,2,null);
    event.originalTarget.dispatchEvent(evt);
},

_startGesture:function( event ) {
    this._lastX = event.screenX;
    this._lastY = event.screenY;
    this._directionChain = "";
},

_progressGesture:function( event ) {
    var x = event.screenX, y = event.screenY;
    var lastX = this._lastX, lastY = this._lastY;
    var subX = x-lastX, subY=y-lastY;
    var distX = ( subX > 0 ? subX : (-subX) ), distY = ( subY > 0 ? subY : ( -subY ) );
    var direction;
    if ( distX < 10 && distY < 10 ) return;
        
        if ( distX > distY ) direction = subX < 0 ? "L" : "R";
    else direction = subY < 0 ? "U" : "D";

    var dChain = this._directionChain;
    if ( direction !== dChain.charAt( dChain.length-1 ) ) {
         dChain += direction;
         this._directionChain += direction;
         var gesture = this.GESTURES[dChain];
         XULBrowserWindow.statusTextField.label = "Жест мыши: "+ dChain + ( gesture ? ' ('+ gesture.name +')' : '' );
         }
    this._lastX = x;
    this._lastY = y;
},

_stopGesture:function(event){
    try {
        if ( dChain = this._directionChain ) this.GESTURES[dChain].cmd( this, event );
        XULBrowserWindow.statusTextField.label = "";
    }
    catch(e) {
             setTimeout(function() { XULBrowserWindow.statusTextField.label = "Неизвестный жест мыши: " + dChain }, 0);
             setTimeout(function() { XULBrowserWindow.statusTextField.label = "" }, 600);
    }
    this._directionChain = "";
},

_buildPopup:function( event,gestureCmd ) {
    if ( !this.enablePopupGestures ) return;
    var popup = document.getElementById( this.POPUP_ID );
    if ( !popup ) {
         popup = document.createElement("popup");
         popup.id = this.POPUP_ID;
         }
    document.getElementById("mainPopupSet").appendChild( popup );
    popup.setAttribute("gesturecommand", gestureCmd );
    
    switch( gestureCmd ) {
        case"WebSearchPopup":
            var searchSvc = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);
            var engines = searchSvc.getVisibleEngines({});
            if ( engines.length < 1 ) throw"Поисковые системы не установлены.";
            for ( var i = engines.length - 1; i >= 0;--i ) {
                  var engine = engines[i];
                  var menuitem = document.createElement("menuitem");
                  menuitem.setAttribute("label", engine.name );
                  menuitem.setAttribute("class", "menuitem-iconic");
                  if ( engine.iconURI ) menuitem.setAttribute("src", engine.iconURI.spec );
                  popup.insertBefore( menuitem, popup.firstChild );
                  menuitem.engine = engine;
                  }
            popup.setAttribute("selectedtext", getBrowserSelection().toString() );
            break;
        
        case"ClosedTabsPopup":
            try {
                if ( !gPrefService.getBoolPref("browser.sessionstore.enabled") ) throw"Функция восстановления сессий отключена.";
                }
            catch(e){}
            var ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
            if ( ss.getClosedTabCount(window) ==0 ) throw"Нет восстанавливаемых вкладок в этом окне.";
            var undoItems = eval("("+ss.getClosedTabData(window)+")");
            for ( var i=0, LEN = undoItems.length; i<LEN; i++ ) {
                  var menuitem=popup.appendChild(document.createElement("menuitem"));
                  menuitem.setAttribute("label",undoItems[i].title);
                  menuitem.setAttribute("class","menuitem-iconic bookmark-item");
                  menuitem.index = i;
                  var iconURL = undoItems[i].image;
                  if ( iconURL ) menuitem.setAttribute("image", iconURL );
                  }
            break;
        
        case"HistoryPopup":
            var sessionHistory = gBrowser.webNavigation.sessionHistory;
            if ( sessionHistory.count<1 ) throw"Нет истории в этой вкладке.";
            var curIdx = sessionHistory.index;
            for ( var i = 0, shc = sessionHistory.count; i < shc; i++ ) {
                  var entry = sessionHistory.getEntryAtIndex(i,false);
                  if ( !entry ) continue;
                  var menuitem = document.createElement("menuitem");
                  popup.insertBefore(menuitem,popup.firstChild);
                  menuitem.setAttribute("label",entry.title);
                  try {
                      var iconURL = Cc["@mozilla.org/browser/favicon-service;1"].getService(Ci.nsIFaviconService).getFaviconForPage( entry.URI ).spec;
                      menuitem.style.listStyleImage = "url("+iconURL+")";
                      }
                  catch(e){}
                  menuitem.index = i;
                  if ( i==curIdx ) {
                       menuitem.style.listStyleImage = "";
                       menuitem.setAttribute("type","radio");
                       menuitem.setAttribute("checked","true");
                       menuitem.className = "unified-nav-current";
                       activeItem = menuitem;
                       }
                  else 
                       {
                       menuitem.className = i< curIdx ? "unified-nav-back menuitem-iconic" : "unified-nav-forward menuitem-iconic";
                       }
            }
            break;
        
        case"AllTabsPopup":
            var tabs = gBrowser.mTabs;
            if ( tabs.length < 1 ) return;
            for ( var i=0, LEN = tabs.length; i < LEN; i++ ) {
                  var menuitem = popup.appendChild(document.createElement("menuitem"));
                  var tab = tabs[i];
                  menuitem.setAttribute("class", "menuitem-iconic bookmark-item");
                  menuitem.setAttribute("label", tab.label);
                  menuitem.setAttribute("crop", tab.getAttribute("crop") );
                  menuitem.setAttribute("image", tab.getAttribute("image"));
                  menuitem.index = i;
                  if ( tab.selected ) menuitem.setAttribute("style", "color: red; font-weight: bold;");
                  if ( tab.hasAttribute('unread') ) menuitem.setAttribute("style", "color: blue;"); 
                  }
            break;
        }
        
    document.popupNode = null;
    document.tooltipNode = null;
    popup.addEventListener("popuphiding", this, true);
    popup.openPopup( null, "", event.clientX, event.clientY, false, false );
    document.documentElement.addEventListener("mouseup", this, true);
},
  };
ucjsMouseGestures.init();

Под:

Выделить код

Код:

'UDU':{name:'Сбросить масштаб',cmd:function(){ FullZoom.reset() }},

положи:

Выделить код

Код:

'R>L':{name:'Сбросить масштаб',cmd:function(){ FullZoom.reset() }},

bunda1
Не помогло что-то.

Mishania
поменяй на 'L<R'

Inko7, bunda1
Вот теперь всё заработало! Спасибо за помощь.

Inko7 пишет

Mishania
поменяй на 'L<R'

Объясните мне разницу между 'R>L' и  'L<R'
Почему это помогло?

Объясните мне разницу между 'R>L' и  'L<R'
Почему это помогло?

Ну просто так установлено в коде кнопки.

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

bazik210 пишет

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

Не понятно!

http://itmages.ru/image/view/1926077/ff538f45
перейти по введенной в адресную строку ссылке, хотелось бы такую кнопочку.

Создай кнопку с кодом:

Выделить код

Код:

loadURI( gURLBar.value );
bunda1 пишет

Создай кнопку с кодом:

Выделить код

Код:

loadURI( gURLBar.value );

пашет, пасиб. :)

есть замечательная кнопка "Bookmarks Menu". все хорошо кроме:
- По левому клику - меню закладок.
- По правому клику мышкой - боковая панель закладок.
можно функционал этих кнопок поменять?
подпилите пожалуйста.

okkamas_knife
Спасибо.:beer:

22-09-2014 12:06:47
okkamas_knife
что-то у меня не получается,
где 2 на 0 поменять вроде нашел. а где 0 на 2 непонятно

okkamas_knife
не, пока не работатет.

p.s. нужно чтоб закладки открывались в боковой панели по ЛевойКМ (до этого неправильно написал ПКМ. так кнопака настроена изначально)
это потому что все остальные кнопки, открывающие боковую панель (которые у меня стоят), делают это по ЛКМ, а тут по правой.

okkamas_knife
ок, понял.
за пробу пера, всеравно - Спасибо.

22-09-2014 17:38:08
нашел кнопку, в которой твоя микстура с цифрами сработала.
так что теперь все работает как запланировано.
и еще раз спасибо.

polk90
В первой кнопке надо помимо изменений проверок event.button поменять «this. setAttribute ("popup",» на «this. setAttribute ("context",».

Infocatcher
попробовал, сработало.
Спасибо!

Кто нибудь знает,как в новых версиях лиса закидывать в вертикальную панель кнопки?Раньше нажал изменить,покидал туда что нужно и всё.А теперь при изменить нет поля от кнопки,куда они ставились.

VORON
Я давнно приспособился так, профиль от новой кидаю в старую, перемещаю, добавляю кнопки в VT, потом обратно, а куда деватся, никто не хочет починить, давно просил.

villa7 пишет

VORON
Я давнно приспособился так, профиль от новой кидаю в старую, перемещаю, добавляю кнопки в VT, потом обратно, а куда деватся, никто не хочет починить, давно просил.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EVT%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAKP+AAIX/gAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAFf+AABUAAAAAAAAAAAAAAAAAAAAA/4AAJP+AAP//gAD//4AA//+AACQAAAAAAAAAAAAAAAAAAAAA/4AAEv+AAP//gAD//4AAEgAAAAAAAAAA/4AAIP+AAP//gAD//4AA//+AAP//gAD//4AAJgAAAAAAAAAAAAAAAP+AABH/gAD//4AA//+AABEAAAAAAAAAAP+AAP//gAD//4AA//+AADb/gAD//4AA//+AAP//gAAQAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AACAAAAAA/4AAIP+AAP//gAD//4AAEQAAAAAAAAAA/4AAD/+AAP//gAD//4AADwAAAAAAAAAA/4AA//+AAP//gAAMAAAAAP+AAAz/gAD//4AA//+AAA8AAAAAAAAAAP+AAA//gAD//4AA//+AAA8AAAAAAAAAAP+AAP//gAD//4AADwAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AAA8AAAAA/4AAD/+AAP//gAD//4AADAAAAAAAAAAA/4AACv+AAP//gAD//4AACgAAAAAAAAAA/4AA//+AAP//gAAPAAAAAP+AAA//gAD//4AA//+AAAv/gAAL/4AADP+AACH/gAD//4AA//+AACH/gAAK/4AAD/+AAP//gAD//4AAEQAAAAD/gAAR/4AA//+AAP//gAAm/4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AABIAAAAA/4AAEv+AAP//gAD//4AAJ/+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AAEf+AABIAAAAAAAAAAAAAAAD/gAAV/4AAEgAAAAD/gAAQ/4AAEf+AAA//gAAP/4AAD/+AAA//gAAP/4AADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQe//rEHH56xBg8OsQQHDrEEAw6xBEMOsQRDDrEEQw6xBEMOsQRAArEEQAKxBEACsQTkArEH//6xB//+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20vto%20%3D%20%7B%0A%09distanceShow%3A%202%2C%0A%09distanceHide%3A%2064%2C%0A%09showDelay%3A%20320%2C%0A%09color%3A%20%22%23a2dced%22%2C%0A%09fringe%3A%20%22black%22%2C%0A%09padding%3A%204%2C%0A%09name%3A%20%22VT%22%2C%0A%0A%09btn%3A%20this%2C%0A%09tcm%3A%20document.getElementById%28%22toolbar-context-menu%22%29%2C%0A%09ctm%3A%20document.getElementById%28%22customization-toolbar-menu%22%29%2C%0A%09deck%3A%20document.getElementById%28%22content-deck%22%29%2C%0A%09id%3A%20%22cb-vt%22%2C%0A%0A%09get%20cust%28%29%20gBrowser.currentURI.spec%20%3D%3D%20%22about%3Acustomizing%22%2C%0A%09get%20rdf%28%29%20%7B%0A%09%09delete%20this.rdf%3B%0A%09%09var%20rdf%20%3D%20Cc%5B%22@mozilla.org/rdf/rdf-service%3B1%22%5D.getService%28Ci.nsIRDFService%29%3B%0A%09%09return%20this.rdf%20%3D%20%5B%0A%09%09%09rdf%2C%0A%09%09%09rdf.GetDataSource%28%22rdf%3Alocal-store%22%29%2C%0A%09%09%09rdf.GetResource%28location%20+%20%22%23%22%20+%20this.id%29%2C%0A%09%09%09null%2C%20null%0A%09%09%5D%3B%0A%09%7D%2C%0A%09init%3A%20function%28%29%20%7B%0A%09%09if%20%28this.cust%20%7C%7C%20this.btn._destructors.length%29%20return%3B%0A%0A%09%09var%20vt%20%3D%20this.initVT%28%29%3B%0A%09%09var%20vto%20%3D%20this%3B%0A%0A%09%09this.btn.onclick%20%3D%20function%28e%29%20%7B%0A%09%09%09e.button%20%7C%7C%20vto.toggleVT%28%29%3B%0A%09%09%7D%0A%09%09window.addEventListener%28%22popupshown%22%2C%20this%2C%20false%29%3B%0A%09%09window.addEventListener%28%22popuphidden%22%2C%20this%2C%20false%29%3B%0A%09%09window.addEventListener%28%22resize%22%2C%20this%2C%20false%29%3B%0A%09%09this.tcm.addEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09this.tcm.addEventListener%28%22popupshowing%22%2C%20this%2C%20false%29%3B%0A%0A%09%09if%20%28vt.hasOwnProperty%28%22on%22%29%29%20%7B%0A%09%09%09vto.toggleVT%28vt.on%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09var%20%5Brdf%2C%20ds%2C%20source%5D%20%3D%20this.rdf%3B%0A%09%09%09var%20property%20%3D%20rdf.GetResource%28%22collapsed%22%29%3B%0A%09%09%09var%20target%20%3D%20ds.GetTarget%28source%2C%20property%2C%20true%29%3B%0A%09%09%09var%20collapsed%20%3D%20target%20%26%26%20target.QueryInterface%28Ci.nsIRDFLiteral%29.Value%20%3D%3D%20%22true%22%3B%0A%09%09%09vto.toggleVT%28%21collapsed%29%3B%0A%09%09%7D%0A%09%09this.resize%28%29%3B%0A%09%09vto.btn._destructors.push%28%7Bcontext%3A%20vto%2C%20destructor%3A%20vto.destroy%7D%29%3B%0A%09%7D%2C%0A%09destroy%3A%20function%28reason%29%20%7B%0A%09%09window.removeEventListener%28%22popupshown%22%2C%20this%2C%20false%29%3B%0A%09%09window.removeEventListener%28%22popuphidden%22%2C%20this%2C%20false%29%3B%0A%09%09window.removeEventListener%28%22resize%22%2C%20this%2C%20false%29%3B%0A%09%09this.tcm.removeEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09this.tcm.removeEventListener%28%22popupshowing%22%2C%20this%2C%20false%29%3B%0A%09%09this.setCollapser%28false%29%3B%0A%0A%09%09if%20%28reason%20%3D%3D%20%22destructor%22%20%26%26%20this.cust%29%20%7B%0A%09%09%09var%20vto%20%3D%20this%3B%0A%09%09%09vto.resize%28%29%3B%0A%0A%09%09%09gNavToolbox.addEventListener%28%22customizationready%22%2C%20vto%2C%20false%29%3B%0A%09%09%09CustomizableUI.addListener%28vto%29%3B%0A%0A%09%09%09this.ctm.addEventListener%28%22command%22%2C%20vto%2C%20false%29%3B%0A%09%09%09this.ctm.addEventListener%28%22popupshowing%22%2C%20vto%2C%20false%29%3B%0A%09%09%09window.addEventListener%28%22resize%22%2C%20vto%2C%20false%29%3B%0A%0A%09%09%09gNavToolbox.addEventListener%28%22aftercustomization%22%2C%20function%20ac%28%29%20%7B%0A%09%09%09%09gNavToolbox.removeEventListener%28%22aftercustomization%22%2C%20ac%2C%20false%29%3B%0A%09%09%09%09gNavToolbox.removeEventListener%28%22customizationready%22%2C%20vto%2C%20false%29%3B%0A%09%09%09%09CustomizableUI.removeListener%28vto%29%3B%0A%0A%09%09%09%09vto.ctm.removeEventListener%28%22command%22%2C%20vto%2C%20false%29%3B%0A%09%09%09%09vto.ctm.removeEventListener%28%22popupshowing%22%2C%20vto%2C%20false%29%3B%0A%09%09%09%09window.removeEventListener%28%22resize%22%2C%20vto%2C%20false%29%3B%0A%0A%09%09%09%09document.getElementById%28vto.btn.id%29%20%7C%7C%20vto.destroyVT%28%29%3B%0A%0A%09%09%09%7D%2C%20false%29%3B%0A%09%09%7D%0A%09%09if%20%28reason%20%3D%3D%20%22delete%22%29%20%7B%0A%09%09%09CustomizableUI.removeWidgetFromArea%28this.btn.id%29%3B%0A%09%09%09this.destroyVT%28%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09handleEvent%3A%20function%28e%29%20this%5Be.type%5D%28e%29%2C%0A%0A%09command%3A%20function%28e%29%20%7B%0A%09%09if%20%28e.target.id%20%21%3D%20%22toggle_%22%20+%20this.id%29%20return%3B%0A%09%09e.preventDefault%28%29%3B%0A%09%09this.toggleVT%28%29%3B%0A%09%7D%2C%0A%09popupshowing%3A%20function%28e%29%20%7B%0A%09%09var%20menuitem%20%3D%20e.target.querySelector%28%22%23toggle_%22%20+%20this.id%29%3B%0A%09%09menuitem%20%26%26%20menuitem.setAttribute%28%22checked%22%2C%20this.vt.on%29%3B%0A%09%09if%20%28this.cust%20%7C%7C%20%21this.vt.contains%28e.target.triggerNode%29%29%20return%3B%0A%09%09for%28var%20selector%20of%20%5B%22.customize-context-moveToPanel%22%2C%20%22.customize-context-removeFromToolbar%22%5D%29%20%7B%0A%09%09%09menuitem%20%3D%20e.target.querySelector%28selector%29%3B%0A%09%09%09menuitem%20%26%26%20menuitem.removeAttribute%28%22disabled%22%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09mousemove%3A%20function%20collapser%28e%29%20%7B%0A%09%09var%20distance%20%3D%20collapser.distance%20%3D%20e.screenX%20-%20document.documentElement.boxObject.screenX%3B%0A%09%09if%20%28collapser.waiting%29%20return%3B%0A%09%09if%20%28distance%20%3C%3D%20this.distanceShow%20%26%26%20this.vt.collapsed%29%20%7B%0A%09%09%09if%20%28this.showDelay%20%3C%201%29%20%7B%0A%09%09%09%09this.vt.collapsed%20%3D%20false%3B%0A%09%09%09%09return%3B%0A%09%09%09%7D%0A%09%09%09collapser.waiting%20%3D%20true%3B%0A%09%09%09setTimeout%28function%28vto%29%20%7B%0A%09%09%09%09if%20%28collapser.distance%20%3E%3D%20vto.distanceShow%29%20%7B%0A%09%09%09%09%09collapser.waiting%20%3D%20false%3B%0A%09%09%09%09%09return%3B%0A%09%09%09%09%7D%0A%09%09%09%09vto.vt.collapsed%20%3D%20false%3B%0A%09%09%09%09collapser.waiting%20%3D%20false%3B%0A%09%09%09%7D%2C%20this.showDelay%2C%20this%29%3B%0A%09%09%7D%0A%09%09if%20%28distance%20%3E%3D%20this.distanceHide%20%26%26%20%21this.vt.collapsed%29%0A%09%09%09this.vt.collapsed%20%3D%20true%3B%0A%09%7D%2C%0A%09setCollapser%3A%20function%28set%29%20%7B%0A%09%09set%0A%09%09%3F%20this.cust%20%7C%7C%20window.addEventListener%28%22mousemove%22%2C%20this%2C%20false%29%0A%09%09%3A%20window.removeEventListener%28%22mousemove%22%2C%20this%2C%20false%29%3B%0A%09%7D%2C%0A%09callCollapser%3A%20function%28e%29%20%7B%0A%09%09this.mousemove%28%7BscreenX%3A%20document.documentElement.boxObject.screenX%20+%20MousePosTracker._x%7D%29%3B%0A%09%7D%2C%0A%09customizationready%3A%20function%28%29%20%7B%0A%09%09window.removeEventListener%28%22customizationready%22%2C%20this%2C%20false%29%3B%0A%09%09this.vt.on%20%26%26%20this.insertBox%28true%29%3B%0A%09%7D%2C%0A%09resize%3A%20function%28e%29%20%7B%0A%09%09this.vt.style.maxHeight%20%3D%20this.deck.boxObject.height%20+%201%20+%20%22px%22%3B%0A%09%7D%2C%0A%09popupshown%3A%20function%28e%29%20this.handlePopup%28e%29%2C%0A%09popuphidden%3A%20function%28e%29%20this.handlePopup%28e%29%2C%0A%0A%09handlePopup%3A%20function%28e%29%20%7B%0A%09%09if%20%28%0A%09%09%09this.vt.collapsed%20%7C%7C%20this.vt.on%0A%09%09%09%7C%7C%20%28e.target.localName%20%21%3D%20%22menupopup%22%20%26%26%20e.target.localName%20%21%3D%20%22panel%22%29%0A%09%09%29%20return%3B%0A%09%09setTimeout%28function%28vto%29%20%7B%0A%09%09%09var%20hasPopup%20%3D%20Array.concat%28%0A%09%09%09%09Array.slice%28document.getElementsByTagName%28%22menupopup%22%29%29%2C%0A%09%09%09%09Array.slice%28document.getElementsByTagName%28%22panel%22%29%29%0A%09%09%09%29.some%28function%28popup%29%0A%09%09%09%09%22state%22%20in%20popup%20%26%26%20popup.state%20%3D%3D%20%22open%22%20%26%26%20%28%0A%09%09%09%09%09vto.vt.contains%28popup%29%0A%09%09%09%09%09%7C%7C%20%28%22triggerNode%22%20in%20popup%20%26%26%20vto.vt.contains%28popup.triggerNode%29%29%0A%09%09%09%09%09%7C%7C%20%28%0A%09%09%09%09%09%09%22anchorNode%22%20in%20popup%20%26%26%20popup.anchorNode%20%26%26%20%28%0A%09%09%09%09%09%09%09vto.vt.contains%28popup.anchorNode%29%0A%09%09%09%09%09%09%09%7C%7C%20vto.vt.contains%28document.getBindingParent%28popup.anchorNode%29%29%0A%09%09%09%09%09%09%29%0A%09%09%09%09%09%29%0A%09%09%09%09%29%0A%09%09%09%29%3B%0A%09%09%09vto.setCollapser%28%21hasPopup%29%3B%0A%09%09%09hasPopup%20%7C%7C%20vto.callCollapser%28%29%3B%0A%09%09%7D%2C%20200%2C%20this%29%3B%0A%09%7D%2C%0A%09onWidgetAfterDOMChange%3A%20function%28...a%29%20%7B%0A%09%09if%20%28a%5B2%5D%20%3D%3D%20this.vt.box%29%20this.vt.hbox.style.minWidth%20%3D%20this.vt.boxObject.width%20+%20%22px%22%3B%0A%09%7D%2C%0A%09initVT%3A%20function%28%29%20%7B%0A%09%09var%20id%20%3D%20this.id%3B%0A%09%09var%20boxId%20%3D%20id%20+%20%22-customization-target%22%3B%0A%09%09var%20vt%20%3D%20this.vt%20%3D%0A%09%09%09document.getElementById%28id%29%20%7C%7C%0A%09%09%09document.createElement%28%22toolbar%22%29%3B%0A%09%09var%20attrs%20%3D%20%7B%0A%09%09%09id%3A%20id%2C%0A%09%09%09mode%3A%20%22icons%22%2C%0A%09%09%09iconsize%3A%20%22small%22%2C%0A%09%09%09orient%3A%20%22vertical%22%2C%0A%09%09%09customizable%3A%20%22true%22%2C%0A%09%09%09persist%3A%20%22collapsed%22%2C%0A%09%09%09toolbarname%3A%20this.name%2C%0A%09%09%09fullscreentoolbar%3A%20%22true%22%2C%0A%09%09%09class%3A%20%22chromeclass-toolbar%22%2C%0A%09%09%09context%3A%20%22toolbar-context-menu%22%2C%0A%09%09%09style%3A%20%22-moz-appearance%3A%20none%3B%20display%3A%20-moz-box%3B%20height%3A%20100%25%3B%20position%3A%20fixed%3B%20min-width%3A%2020px%22%0A%09%09%7D%3B%0A%09%09for%28var%20attr%20in%20attrs%29%20vt.setAttribute%28attr%2C%20attrs%5Battr%5D%29%3B%0A%09%09if%20%28%21vt.parentNode%29%20%7B%0A%0A%09%09%09var%20box%20%3D%20vt.box%20%3D%20document.createElement%28%22vbox%22%29%3B%0A%09%09%09vt.appendChild%28box%29%3B%0A%09%09%09box.id%20%3D%20boxId%3B%0A%09%09%09box.style.cssText%20%3D%20%22height%3A%20100%25%3B%20width%3A%20100%25%3B%22%0A%0A%09%09%09vt.customizationTarget%20%3D%20box%3B%0A%09%09%09gNavToolbox.appendChild%28vt%29%3B%0A%0A%09%09%09if%20%28CustomizableUI.areas.indexOf%28id%29%20%3D%3D%20-1%29%20%7B%0A%09%09%09%09CustomizableUI.registerArea%28id%2C%20%7Blegacy%3A%20true%7D%29%3B%0A%09%09%09%7D%0A%09%09%09box.removeAttribute%28%22class%22%29%3B%0A%09%09%09box.__defineGetter__%28%22localName%22%2C%20function%28%29%20arguments.callee.caller%20%3D%3D%20custombutton.buttonConstructor%20%3F%20%22toolbar%22%20%3A%20%22vbox%22%29%3B%0A%0A%09%09%09vt.hbox%20%3D%20document.createElement%28%22hbox%22%29%3B%0A%09%09%09vt.hbox.id%20%3D%20id%20+%20%22-hbox%22%3B%0A%09%09%7D%0A%09%09vt.box.style.padding%20%3D%20%220%20%22%20+%20this.padding%20+%20%22px%22%3B%0A%09%09vt.style.backgroundColor%20%3D%20this.color%3B%0A%09%09vt.style.borderRight%20%3D%20%221px%20solid%20%22%20+%20this.fringe%3B%0A%09%09return%20vt%3B%0A%09%7D%2C%0A%09destroyVT%3A%20function%28reason%29%20%7B%0A%09%09var%20vt%20%3D%20this.vt%3B%0A%09%09CustomizableUI.unregisterArea%28vt.id%2C%20%7B%7D%29%3B%0A%09%09vt.hbox.parentNode%20%26%26%20vt.hbox.parentNode.removeChild%28vt.hbox%29%3B%0A%09%09vt.parentNode%20%26%26%20vt.parentNode.removeChild%28vt%29%3B%0A%0A%09%09var%20%5Brdf%2C%20ds%2C%20source%2C%20property%2C%20target%5D%20%3D%20this.rdf%3B%0A%09%09var%20enumerator%20%3D%20ds.ArcLabelsOut%28source%29%3B%0A%09%09while%28enumerator.hasMoreElements%28%29%29%20%7B%0A%09%09%09property%20%3D%20enumerator.getNext%28%29%3B%0A%09%09%09target%20%3D%20ds.GetTarget%28source%2C%20property%2C%20true%29%3B%0A%09%09%09ds.Unassert%28source%2C%20property%2C%20target%29%3B%0A%09%09%7D%0A%09%09target%20%3D%20source.QueryInterface%28Ci.nsIRDFNode%29%3B%0A%09%09source%20%3D%20rdf.GetResource%28location%29%3B%0A%09%09property%20%3D%20rdf.GetResource%28%22http%3A//home.netscape.com/NC-rdf%23persist%22%29%3B%0A%09%09ds.Unassert%28source%2C%20property%2C%20target%29%3B%0A%09%7D%2C%0A%09insertBox%3A%20function%28ins%29%20%7B%0A%09%09var%20vt%20%3D%20this.vt%3B%0A%09%09var%20box%20%3D%20vt.hbox%3B%0A%09%09if%20%28%21ins%29%20%7B%0A%09%09%09box.parentNode%20%26%26%20box.parentNode.removeChild%28box%29%3B%0A%09%09%09return%3B%0A%09%09%7D%0A%09%09var%20id%20%3D%20this.cust%20%3F%20%22customization-palette-container%22%20%3A%20%22sidebar-box%22%3B%0A%09%09var%20point%20%3D%20document.getElementById%28id%29%3B%0A%09%09point.parentNode.insertBefore%28box%2C%20point%29%3B%0A%09%09var%20mw%20%3D%20function%28%29%20box.style.minWidth%20%3D%20vt.boxObject.width%20+%20%22px%22%3B%0A%09%09mw%28%29%3B%20setTimeout%28mw%2C%20100%29%3B%0A%09%7D%2C%0A%09toggleVT%3A%20function%28on%29%20%7B%0A%09%09var%20vt%20%3D%20this.vt%3B%0A%09%09if%20%28on%20%3D%3D%20undefined%29%20on%20%3D%20%21vt.on%3B%0A%09%09vt.on%20%3D%20on%3B%0A%09%09this.setCollapser%28%21on%29%3B%0A%09%09vt.collapsed%20%3D%20%21on%3B%0A%09%09this.insertBox%28on%29%3B%0A%09%7D%0A%7D%3B%0Avto.init%28%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bevent.target%20%7C%7C%20this.click%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
У меня немножко другая кнопка, VT2, на одну панель не влезают все кнопки.
https://forum.mozilla-russia.org/viewto … 72#p650972

bunda1
Спасибо огромное!:beer:А жизнь то-налаживается.
А ещё не посмотришь кнопку,что-то в 31й лисе она не работает.

VORON пишет

bunda1
Спасибо огромное!:beer:А жизнь то-налаживается.
А ещё не посмотришь кнопку,что-то в 31й лисе она не работает.

Удали в начале кода: Cu.import("resource://gre/modules/XPIProvider.jsm");

bunda1 пишет

Удали в начале кода: Cu.import("resource://gre/modules/XPIProvider.jsm");

Спасибо заработала.  А можешь сделать, чтобы Место установки открывалось в Total Commander?

villa7 пишет

У меня немножко другая кнопка, VT2, на одну панель не влезают все кнопки.

хотел попробовать, правильный код не нашел, подскажите где смотреть?

polk90
Код здесь
https://forum.mozilla-russia.org/viewto … 14#p611514
Но наполнять кнопками нужно в старых версиях, а потом переносить на новую.

voqabuhe пишет
bunda1 пишет

Удали в начале кода: Cu.import("resource://gre/modules/XPIProvider.jsm");

Спасибо заработала.  А можешь сделать, чтобы Место установки открывалось в Total Commander?

Наверно нет, мне кажется это надо настраивать в windows или в Total Commander, ну ассоциации с файлами.

bunda1 пишет

мне кажется это надо настраивать в windows или в Total Commander, ну ассоциации с файлами.

Ну очень сомнительно, что там это настраивается, да и какая ассоциация с файлами, если открывать надо папку?

villa7 пишет

Но наполнять кнопками нужно в старых версиях, а потом переносить на новую.

а ... теперь понял.

может кто знает аналогичный вариант панели, чтоб с автоскрытием и работал?
зы. или может аксакалы могут подправить VT2.

может кто знает аналогичный вариант панели, чтоб с автоскрытием и работал?

https://addons.mozilla.org/en-US/firefo … l-toolbar/
хороший вариант,уже год стоит,проблем нет

roadrunner
попробовал. очень замечательно. Спасибо.

А кто-то может подсказать по созданию кнопок?
Мне нужна кнопка для TB, при клике в которую в адресаты письма добавлялся бы новый адрес в Bcc. Он там бывает нужен, чтобы письмо зарегистрировалось в CRM.

Можно ли сделать CB кнопку - компаньон для Stylish? Описание функциональности привожу ниже.
1. Stylish - это Файрфокс аддон, позволяющий назначать стили определённым доменам (хостам) и УРЛ-префиксам.
Сами стили хранятся в подразделе "Стили" аддон менеджера и имеют имена.
2. Некоторые сайты настолько непритязательны, что для них могут использоваться предельно простые стили. Например:

Выделить код

Код:

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document url-prefix("chrome"),url-prefix("file"), domain("yandex.ru") {

body {background-image:url(file:///C:/Users/yudith/Pictures/Icons/gold.gif) !important;background-size: cover !important;background-repeat:no-repeat !important;background-attachment:fixed !important}

all {background-color:transparent !important}
}

То есть, всё что этот стиль делает - вставляет в качестве фона - заданную картинку.
3. Суть моей просьбы - иметь СВ кнопку-компаньон, которая содержала бы что-то типа списков для подобного рода стилей:
<Имя стиля 1> - <Список1 фоновых картинок (их адресов/урл-ов) >
<Имя стиля 2> - <Список2 фоновых картинок (их адресов/урл-ов) >
...
<Имя стиля К> - <СписокК фоновых картинок (их адресов/урл-ов) >
И чтоб каждую минуту (например) для каждого из указанных стилей подменялся бы  background-image:url на один из списка адресов фоновых картинок (желательно - случайным образом).
Можно ли сделать такую СВ кнопку (вернее - код, где юзер может задать имена стилей и списки адресов
Такой код просто бы оживил "гуляние" по сайтам

Есть замечательная кнопка

Выделить код

Код:

var oSvc = Components.classes["@mozilla.org/observer-service;1"]
           .getService(Components.interfaces.nsIObserverService);

var observer = {

observe: function(subject, topic, data) {
         subject.addEventListener("load", this, false); },
      
handleEvent: function(e) {
    var doc = e.target;
    var win = doc.defaultView;
        win.removeEventListener("load", this, false);

    if (doc.location.href != "chrome://browser/content/preferences/cookies.xul") return;

    oSvc.removeObserver(observer, "domwindowopened", false);

  var filter = doc.getElementById("filter");
  var host = gBrowser.contentDocument.location.host;
  var words = host.split(".");
  var theHost = words[words.length - 2] + "." + words[words.length - 1];
  
  filter.value = theHost;
  
  window.setTimeout(function() {win.gCookiesWindow.filter();}, 250) }};

oSvc.addObserver(observer, "domwindowopened", false);

var wm = Components. classes["@mozilla.org/appshell/window-mediator;1"].
     getService (Components. interfaces. nsIWindowMediator);
var win = wm. getMostRecentWindow ("Browser:Cookies");
if (win) {
    alert("Сначала закройте уже открытое окно с куками");
    oSvc.removeObserver(observer, "domwindowopened", false);
    return; }
else
    openDialog ("chrome://browser/content/preferences/cookies.xul", "_blank", "resizable,dialog=yes,centerscreen", null);

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

Можно кнопку https://forum.mozilla-russia.org/viewto … 86#p625686 немного изменить, т.е. вместо "выключить показ изображений на страницах" сделать "только с исходного сервера"? Или повесить на ПКМ.

manuk пишет

Можно кнопку https://forum.mozilla-russia.org/viewto … 86#p625686 немного изменить, т.е. вместо "выключить показ изображений на страницах" сделать "только с исходного сервера"? Или повесить на ПКМ.

Сделать наверно можно, но лично я не знаю как.

bunda1 пишет

Сделать наверно можно, но лично я не знаю как.

Оказалось только одну цифру в коде изменить нужно.

manuk пишет

Оказалось только одну цифру в коде изменить нужно.

А я и забыл что есть такая настройка.
permissions.default.image (Целое) - отвечает за отображение изображений. Значения:
   3 - Загружать изображения только с этого же сервера

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

polk90
Вроде исчезают :/. Завершённые.

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

Выделить код

Код:

gBrowser.currentURI.spec != "about:customizing" && (() => {
    var id = _id + "-" + Components.stack.lineNumber;
    var mod = Cu.import("resource:///modules/DownloadsLogger.jsm", {});
    if (mod[id]) return; mod[id] = true;
    addDestructor(() => delete mod[id]);
    var err = Cu.reportError, tmp = OS.Constants.Path.tmpDir + "\\";
    Task.spawn(function() {

        var list = yield Downloads.getList(Downloads.ALL), view = {};
        view.onDownloadAdded = view.onDownloadChanged = download =>
            download.progress == 100
            && download.target.path.startsWith(tmp)
            && setTimeout(() => {
                var uri = makeURI(download.source.url);
                PlacesUtils.bhistory.removePage(uri);
                list.remove(download).then(null, err);
            }, 1e3);
        yield list.addView(view);
        setTimeout(() => delete view.onDownloadAdded, 5e3);
        addDestructor(() => list.removeView(view).then(null, err));

    }).then(null, err);
})();

Dumby
магнет ссылки торрентов чистятся!!! причем нет даже анимации конца загрузки. огромное спасибо!

torrent/zip/pdf/doc - не убирается. другие не пробовал.
p.s. на всякий случай win7-64/Waterfox/ и TMP в системе настроен на D:\Temp\_sys_Temp\

polk90 пишет

zip/pdf/doc - не убирается

Если они в одной папке с торрентами, то не знаю.
А если в другой, то можно попробовать ещё своих путей добавить.

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

Выделить код

Код:

gBrowser.currentURI.spec != "about:customizing" && (() => {
    var id = _id + "-" + Components.stack.lineNumber;
    var mod = Cu.import("resource:///modules/DownloadsLogger.jsm", {});
    if (mod[id]) return; mod[id] = true;
    addDestructor(() => delete mod[id]);
    var err = Cu.reportError;
    var directories = [

        OS.Constants.Path.tmpDir + "\\",
        "D:\\Temp\\_sys_Temp\\"
    ];
    function checkDir(path) directories.some(dir =>
        path.startsWith(dir)
        //&& !path.slice(dir.length).contains("\\")
    );
    Task.spawn(function() {

        var list = yield Downloads.getList(Downloads.ALL), view = {};
        view.onDownloadAdded = view.onDownloadChanged = download =>
            download.progress == 100
            && checkDir(download.target.path)
            && setTimeout(() => {
                var uri = makeURI(download.source.url);
                PlacesUtils.bhistory.removePage(uri);
                list.remove(download).then(null, err);
            }, 1e3);
        yield list.addView(view);
        setTimeout(() => delete view.onDownloadAdded, 5e3);
        addDestructor(() => list.removeView(view).then(null, err));

    }).then(null, err);
})();

Dumby
Супер, работает!!!

и первый вариант тоже работает.
проблема не в нем. я косячил вставляя код в не в "Initialization Code" а в "Code".
Все работает!!!Спасибо!!!

подскажите ка удалить кнопку у которой не отображается меню редактирования?
по ПКМ варианты работы кнопки а не главное меню кнопки. Меню по СКМ там не предусмотрено.

skynet281978
Ctrl+Shift+a ->  Сustom Buttons -> Удалить

спасибо всем. получилось через шифт ПКМ

Подскажите код копирующий в буфер ссылку находящуюся под указателем мыши :)

oopsididagainster пишет

Подскажите код копирующий в буфер ссылку находящуюся под указателем мыши

oncommand = gContextMenu.copyLink();

Pony_Smile_Pack пишет

oncommand = gContextMenu.copyLink();

Поместил код в инициализацию кнопку, повесил кнопку на клавишу, но при нажатии на клавишу ничего не происходит.

Ну это из контекстного меню. Возможно легче просто этот пункт меню наверх переместить, чем двумя руками ссылки копировать.

[del]

bunda1, подскажи, что изменить в этом твоем коде, чтобы открытие происходило в новой вкладке

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

Выделить код

Код:

// удаление обработчика для адресной строки, при открытии настройки панелей
this.onDestroy = function() {document.getElementById("urlbar").removeEventListener("dblclick", mclick, false);};
 
// добавляем обработчик для адресной строки 
document.getElementById("urlbar").addEventListener("dblclick", mclick, false);

//функция которую запускает обработчик
function mclick(event){

if (event.button==0){
        //отключать реакцию по умолчанию на левую кнопку мыши
            event.preventDefault();
            event.stopPropagation();
//Вставить в адресную строку
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var text = content.getSelection().toString();
if(text){gURLBar.value = text;}
else
{
gURLBar.value = readFromClipboard();
}
//поиск/перейти
gURLBar.handleCommand(event);
}
              };

thrower

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

Выделить код

Код:

//gURLBar.handleCommand(event);
gURLBar.handleCommand(new MouseEvent("", {
    ctrlKey: true,
    //shiftKey: true
}));

Dumby, работает! Спасибо :)

Раньше была такая кнопка-Extensions Options Menu

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EExtensions%20Options%20Menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU4NzIwMkI5QkNFNDExRTBCOEIwQzU3QzQyMDBGNDk2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjU4NzIwMkJBQkNFNDExRTBCOEIwQzU3QzQyMDBGNDk2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTg3MjAyQjdCQ0U0MTFFMEI4QjBDNTdDNDIwMEY0OTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NTg3MjAyQjhCQ0U0MTFFMEI4QjBDNTdDNDIwMEY0OTYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4v/lPcAAACe0lEQVR42nRTW0tUURQ++3IuHmecdCJzLDRqisaKoR4zlMDKKLEoiR4qIiLwB/QS/YN6CYSgiCBCaKDAIqJI6GKQGFEqhjUQqQk5w5hnZjq3vVtrPMY46YaPb6+111pn3Q6RUioVhwMMgApwAX8AnrLawQBloH03bzU0b935bN2GLbPIKKO+wu4faEU8MvD4aasvaVO4rn4KGWXUr5YADVIOAeoQfTeuTyeTyc+mGc4io7z0FtjxZV+ENEJN8R0px/YSCiWCq3qhKhSeU3Uz79qF6qK1sNZzbVMRkmo6H/8+OXoC/KzyhmlC4bGaaPQrIdQjlArGuU0p94luOoxpBSkE9EDwgjUfA3sdUAQIbCGWIBnXFjjXclzX51W9KguyBYGKyJphZnQz9Msww7M63DOZbG3Hoa7D4BcGMAxgd3a0fRgbfj7Qub91xvddGoxvOQhxmKpa7Qe7r4xNTF6LJ3bfxnGjsXf+7On7wKnei2ee+K6NZTkrgXMj50kWqo7UffF80oi7gsb83IVLPd1HjxiDr960QbPcwOG/Q6hCd21P5D5+Gq1PtGxLY2Y4hdrGTS0vmapZKtd+G6HINNf0/EoB7KIVnRgZTPU/eBg/dfLYMKjeYgZUrzKnjerIFKXMI4y7vutwIX1OCfMoVx1CiI8BoDycwBA4DwFnlqagEMbype6r2oLiufzq5d6f4+9fvEOWrqOhL/ZKSFHafsBcwKVNlItXqF4I2bA+ynqOdz0CuR8ZZdSX5r5oJytX2Y5vbs5DfWscu1iTTn+r39t+IHnn7j0NGWXU4zvaoX3lKjPgfYBYoMNfdwTwA7ARsKds/2cAr4OSSuevAAMAy+gvpYr6B6sAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.label%20%3D%20%22Extensions%22%3B%0Athis.tooltipText%20%3D%20this.label%3B%0A%0A/*%20*****%20BEGIN%20LICENSE%20BLOCK%20*****%0A%20*%20Version%3A%20MPL%201.1%0A%20*%0A%20*%20The%20contents%20of%20this%20file%20are%20subject%20to%20the%20Mozilla%20Public%20License%20Version%0A%20*%201.1%20%28the%20%22License%22%29%3B%20you%20may%20not%20use%20this%20file%20except%20in%20compliance%20with%0A%20*%20the%20License.%20You%20may%20obtain%20a%20copy%20of%20the%20License%20at%0A%20*%20http%3A//www.mozilla.org/MPL/%0A%20*%0A%20*%20Software%20distributed%20under%20the%20License%20is%20distributed%20on%20an%20%22AS%20IS%22%20basis%2C%0A%20*%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND%2C%20either%20express%20or%20implied.%20See%20the%20License%0A%20*%20for%20the%20specific%20language%20governing%20rights%20and%20limitations%20under%20the%0A%20*%20License.%0A%20*%0A%20*%20Original%20code%20is%20Extensions%20Options%20Menu%20for%20Custom%20Buttons%0A%20*%0A%20*%20The%20Initial%20Developer%20of%20the%20Original%20Code%20is%20LouCypher.%0A%20*%20Portions%20created%20by%20the%20Initial%20Developer%20are%20Copyright%20%28C%29%202011%0A%20*%20the%20Initial%20Developer.%20All%20Rights%20Reserved.%0A%20*%0A%20*%20Contributor%28s%29%3A%0A%20*%20%20LouCypher%20%3Cloucypher@mozillaca.com%3E%0A%20*%0A%20*%20*****%20END%20LICENSE%20BLOCK%20*****%20*/%0A%0Afunction%20%24%28aId%29%20%7B%0A%20%20return%20document.getElementById%28aId%29%3B%0A%7D%0A%0Afunction%20%24xml%28aXML%29%20%7B%0A%20%20return%20cbu.makeXML%28aXML%29%3B%0A%7D%0A%0Afunction%20sort%28aArray%29%20%7B%0A%20%20aArray.sort%28function%28a%2C%20b%29%20%7B%0A%20%20%20%20a%20%3D%20a.name.toLowerCase%28%29%3B%0A%20%20%20%20b%20%3D%20b.name.toLowerCase%28%29%3B%0A%20%20%20%20if%20%28a%20%3C%20b%29%20return%20-1%3B%0A%20%20%20%20if%20%28a%20%3E%20b%29%20return%201%3B%0A%20%20%20%20return%200%3B%0A%20%20%7D%29%0A%7D%0A%0Athis.openDialog%20%3D%20function%28aURL%29%20%7B%0A%20%20openDialog%28aURL%2C%20%22%22%2C%20%22chrome%2C%20dialog%2C%20close%2C%20titlebar%2C%20toolbar%2C%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22scrollbars%2C%20minimizable%2C%20centerscreen%22%29%3B%0A%7D%0A%0Athis.setStatus%20%3D%20function%28aString%29%20%7B%0A%20%20document.getElementById%28%22statusbar-display%22%29.label%20%3D%20aString%3B%0A%7D%0A%0Athis.onclick%20%3D%20function%20inspectExtensions%28aEvent%29%20%7B%0A%20%20if%20%28%28typeof%20inspectObject%20%21%3D%20%22function%22%29%20%7C%7C%0A%20%20%20%20%20%20%28aEvent.button%20%21%3D%201%29%29%20return%3B%0A%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20var%20extensions%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aAddons.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20if%20%28aAddons%5Bi%5D.type%20%3D%3D%20%22extension%22%29%20%7B%0A%20%20%20%20%20%20%20%20extensions.push%28aAddons%5Bi%5D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20sort%28extensions%29%3B%0A%20%20%20%20inspectObject%28extensions%29%3B%0A%20%20%7D%29%0A%7D%0A%0Athis.addonsMgr%20%3D%20function%28aPopup%2C%20aCallback%29%20%7B%0A%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20var%20extensions%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aAddons.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20aAddons%5Bi%5D.toString%20%3D%20function%28%29%20%7B%20return%20this.name%3B%20%7D%0A%20%20%20%20%20%20if%20%28%28aAddons%5Bi%5D.type%20%3D%3D%20%22extension%22%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28aAddons%5Bi%5D.optionsURL%20%21%3D%20null%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20aAddons%5Bi%5D.isActive%29%20%7B%0A%20%20%20%20%20%20%20%20extensions.push%28aAddons%5Bi%5D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20sort%28extensions%29%3B%0A%20%20%20%20aCallback%28aPopup%2C%20extensions%29%3B%0A%20%20%7D%29%0A%7D%0A%0Afunction%20getExtensionObject%28aId%2C%20aCallback%29%20%7B%0A%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aAddons.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20if%20%28aAddons%5Bi%5D.id%20%3D%3D%20aId%29%20%7B%0A%20%20%20%20%20%20%20%20aCallback%28aAddons%5Bi%5D%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%29%0A%7D%0A%0Afunction%20addItem%28aNode%2C%20aId%2C%20aLabel%2C%20aURL%2C%20aIcon%2C%20aHomePage%2C%20aDesc%29%20%7B%0A%20%20aNode.appendChild%28%24xml%28%3Cmenuitem%20xmlns%3D%7Bxulns%7D%20class%3D%22menuitem-iconic%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20GUID%3D%7BaId%7D%20label%3D%7BaLabel%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20image%3D%7BaIcon%7D%20homepage%3D%7BaHomePage%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20statustext%3D%7BaURL%7D%20tooltiptext%3D%7BaDesc%7D/%3E%29%29%3B%0A%7D%0A%0Avar%20popup%20%3D%20%24xml%28%3Cmenupopup%20xmlns%3D%7Bxulns%7D%20context%3D%22cb-extensions-menu%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%22event.stopPropagation%28%29%3B%20this.parentNode.openDialog%28event.target.statusText%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%22this.parentNode.setStatus%28event.target.statusText%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%22this.parentNode.setStatus%28%27%27%29%3B%22/%3E%29%3B%0A%0Athis.populate%20%3D%20function%28aPopup%2C%20aExtensions%29%20%7B%0A%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aExtensions.length%3B%20i++%29%20%7B%0A%20%20%20%20let%20ext%20%3D%20aExtensions%5Bi%5D%3B%0A%20%20%20%20addItem%28aPopup%2C%20ext.id%2C%20ext.name%20+%20%22%20%22%20+%20ext.version%2C%20ext.optionsURL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28ext.iconURL%20%3F%20ext.iconURL%20%3A%20%22chrome%3A//mozapps/skin/extensions/extensionGeneric-16.png%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28ext.homepageURL%20%3F%20ext.homepageURL%20%3A%20ext.reviewURL.replace%28/%5C/reviews/%2C%20%22%22%29.toString%28%29%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ext.description%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.addonsMgr%28popup%2C%20this.populate%29%3B%0A%0Athis.appendChild%28popup%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%0A%0A//---------------------------------%0A%0Athis.copyId%20%3D%20function%28aId%29%20%7B%0A%20%20Cc%5B%22@mozilla.org/widget/clipboardhelper%3B1%22%5D.%0A%20%20getService%28Ci.nsIClipboardHelper%29.copyString%28aId%29%3B%0A%7D%0A%0Athis.goHome%20%3D%20function%28aURL%29%20%7B%0A%20%20gBrowser.loadOneTab%28aURL%29%3B%0A%7D%0A%0Athis.inspect%20%3D%20function%28aId%29%20%7B%0A%20%20getExtensionObject%28aId%2C%20inspectObject%29%3B%0A%7D%0A%0Athis.explore%20%3D%20function%28aId%29%20%7B%0A%20%20var%20dirService%20%3D%20Cc%5B%22@mozilla.org/file/directory_service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIProperties%29%3B%0A%20%20var%20dir%20%3D%20dirService.get%28%22ProfD%22%2C%20Ci.nsIFile%29%3B%0A%20%20dir.append%28%22extensions%22%29%3B%0A%20%20dir.append%28aId%29%3B%0A%20%20if%20%28%21dir.exists%28%29%29%20%7B%0A%20%20%20%20alert%28%22Directory%20%22%20+%20dir.path%20+%20%22%20doesn%27t%20exist%21%22%29%3B%0A%20%20%20%20return%3B%0A%20%20%20%20//dir.append%28%22.xpi%22%29%3B%0A%20%20%20%20//Application.console.log%28dir.path%29%3B%0A%20%20%7D%0A%20%20var%20localFileInterface%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Ci.nsILocalFile%29%3B%0A%20%20localFileInterface.initWithPath%28dir.path%29%3B%0A%20%20var%20iDirectory%20%3D%20localFileInterface%3B%0A%20%20try%20%7B%0A%20%20%20%20iDirectory.reveal%28%29%3B%0A%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20var%20uri%20%3D%20Cc%5B%22@mozilla.org/network/io-service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIIOService%29.newFileURI%28iDirectory%29%3B%0A%20%20%20%20var%20protocolSvc%20%3D%20Cc%5B%22@mozilla.org/uriloader/external-protocol-service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getService%28Ci.nsIExternalProtocolService%29%3B%0A%20%20%20%20protocolSvc.loadUrl%28uri%29%3B%0A%20%20%7D%0A%7D%0A%0Aif%20%28%24%28%22cb-extensions-menu%22%29%29%20%7B%0A%20%20%24%28%22cb-extensions-menu%22%29.parentNode.removeChild%28%24%28%22cb-extensions-menu%22%29%29%3B%0A%7D%0A%0Athis.checkForDOMI%20%3D%20function%28aEvent%29%20%7B%0A%20%20if%20%28typeof%20inspectObject%20%21%3D%20%22function%22%29%20%7B%0A%20%20%20%20aEvent.target.getElementsByTagName%28%22menuitem%22%29%5B2%5D.hidden%20%3D%20true%3B%0A%20%20%7D%0A%7D%0A%0Avar%20popupset%20%3D%20document.getElementById%28%22mainPopupSet%22%29%3B%0Avar%20context%20%3D%20popupset.appendChild%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24xml%28%3Cmenupopup%20xmlns%3D%7Bxulns%7D%20id%3D%22cb-extensions-menu%22%20onclick%3D%22event.stopPropagation%28%29%3B%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onpopupshowing%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.checkForDOMI%28event%29%3B%22%7D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20label%3D%22Visit%20Home%20Page%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28document.popupNode.getAttribute%28%27homepage%27%29%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28%27%27%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.goHome%28document.popupNode.getAttribute%28%27homepage%27%29%29%3B%22%7D/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20label%3D%22Copy%20GUID%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28%27%27%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.copyId%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20label%3D%22Inspect%20Extension%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28%27%27%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.inspect%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cmenuitem%20label%3D%22Browse%20Install%20Directory%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseover%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onmouseout%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.setStatus%28%27%27%29%3B%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oncommand%3D%7B%22document.getElementById%28%27%22%20+%20this.id%20+%20%22%27%29.explore%28document.popupNode.getAttribute%28%27GUID%27%29%29%3B%22%7D/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/menupopup%3E%29%29%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20url%20%3D%20%22chrome%3A//mozapps/content/extensions/extensions.xul%22%3B%0A%0Aif%20%28gBrowser.mCurrentTab.linkedBrowser.currentURI.spec%20%3D%3D%20%22about%3Ablank%22%29%20%7B%0A%20%20loadURI%28url%29%3B%0A%20%20return%3B%0A%7D%0A%0Avar%20tabs%20%3D%20gBrowser.mTabs%3B%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20tabs.length%3B%20i++%29%20%7B%0A%20%20if%20%28tabs%5Bi%5D.linkedBrowser.currentURI.spec%20%3D%3D%20url%29%20%7B%0A%20%20%20%20gBrowser.selectedTab%20%3D%20tabs%5Bi%5D%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%7D%0A%0AgBrowser.loadOneTab%28url%2C%20null%2C%20null%2C%20null%2C%20false%29%3B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


Теперь неактивна,точнее просто открывает вкладку с дополнениями.Можно починить?

VORON
Эта что ли.

Dumby
Примерно.Та,что в моём посте выглядит так,а из вашего-так

Indomito пишет

Кнопка перестала сохранять CB из PanelUI, можешь поправить?

voqabuhe
Попробуй

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

Выделить код

Код:

(() => {
    var document = {
        getElementsByTagName: tag => {
            var res = window.document.getElementsByTagName(tag);
            if (PanelUI.contents.hasChildNodes())
                res = [...res].concat([...PanelUI.contents.getElementsByTagName(tag)]);
            return res;
        },
        implementation: window.document.implementation
    };

    // Здесь код кнопки

})();

Dumby пишет

Попробуй

У меня всё равно не сохраняет.

voqabuhe
36.0a1 (2014-10-29). Вот так и живём :(. img.

voqabuhe пишет

36.0a1 (2014-10-29).

Да, но ведь PanelUI уже не только в [nightly].

Dumby пишет

Вот так и живём :(. img.

Скрин не понял к чему?

voqabuhe пишет

Скрин не понял к чему?

Просто посетовал, на то, что у меня сохраняет, а у тебя не сохраняет.
Сейчас ещё раз проделал то, что посоветовал тебе, — всё равно сохраняет.
На 30.0 — то же.

Dumby пишет

Просто посетовал, на то, что у меня сохраняет, а у тебя не сохраняет.
Сейчас ещё раз проделал то, что посоветовал тебе, — всё равно сохраняет.
На 30.0 — то же.

Теперь понЯл. А на [nightly] нет желания попробовать?:)

voqabuhe пишет

А на [nightly] нет желания попробовать?:)

Так именно на Nightly и пробовал. И скрин с Nightly.
И на Nightly работает. Или за два дня успели что-то поломать ?

Dumby пишет

И на Nightly работает. Или за два дня успели что-то поломать ?

Разобрался, действительно работает. Спасибо.

По поводу кнопки Target control(Firefox)(Seamonkey). Как я понял, она удаляет атрибут target='_blank' из ссылок. Просветите, пожалуйста, а нельзя ли в usercontent.css прописать стиль, чтоб из всех ссылок убирать  target='_blank'  , как в этом стиле для старой Оперы:

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

Выделить код

Код:

/*
Name: Remove blank
Version: 0.1
Author: profiT
Description: removes target='_blank' links
             http://usercss.ru/styles/remove_blank/
*/


a[href][target='_blank'] {
    -o-link: attr(href) !important; 
    -o-link-source: current !important;
    }


или это какая-то нестандартная фишка Оперы, не имеющая аналогичного воплощения в Лисе? Кажется мне, что CSS не может менять HTML-код...

okkamas_knife спасибо!

Александр Колесников пишет

Просветите, пожалуйста, а нельзя ли в usercontent.css прописать стиль, чтоб из всех ссылок убирать  target='_blank'

Так кто ж тебе запретит ?
А вот будет ли нормально работать — не знаю.

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

Выделить код

Код:

a[href][target="_blank"] {
    -moz-binding: url("data:application/xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Cbindings%20id%3D%22a-target-bindings%22%20xmlns%3D%22http%3A%2F%2Fwww.mozilla.org%2Fxbl%22%3E%0A%09%3Cbinding%20id%3D%22a-target-_blank%22%3E%0A%09%09%3Cimplementation%3E%0A%09%09%09%3Cconstructor%3E%0A%09%09%09%09this.removeAttribute(%22target%22)%3B%0A%09%09%09%3C%2Fconstructor%3E%0A%09%09%3C%2Fimplementation%3E%0A%09%3C%2Fbinding%3E%0A%3C%2Fbindings%3E%0A") !important;
}

Dumby Спасибо!
Я думал, что у меня применение  browser.link.open_newwindow =1   (replaces existing URL page in the current browser tab with the link contents) вызвало то, что при клике по лупе в строке поиска открывало результаты в текущей вкладке. Единичку я как раз поставил для борьбы с эффектом target='_blank'. Оказалось, что эта настройка в about:config не при чём и воевать с target='_blank' другими способами нет нужды... Просто это баг лисы - по ENTER настройка browser.search.openintab=TRUE срабатывает и результаты поиска открываются в новой вкладке, а по ЛКМ по значку лупы - в текущей.  Баг 513180 https://bugzilla.mozilla.org/show_bug.cgi?id=513180. Дело в том, что я как раз снёс TMP, а там этот баг как-то обходился, по-видимому...

ALL Можно ли написать CB-код для обхода этого бага, а то уж больно привык кликать ЛКМ по лупе?

Александр Колесников
Ну, раз привык

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

Выделить код

Код:

(bar => {
    if (!bar) return;
    var btn = document.getAnonymousElementByAttribute(bar, "anonid", "search-go-button");
    var prfx = 'event.button == 0 && gPrefService.getBoolPref("browser.search.openintab")\n\t'
        + '? doSearch(value, event.shiftKey ? "tabshifted" : "tab")\n\t: ';
    function setAttr(arg) btn.setAttribute("onclick", (arg ? "" : prfx) + "handleSearchCommand(event);");
    setAttr(); addDestructor(setAttr);
})(BrowserSearch.searchBar);

Dumby Спасибо, багфикс работает! :)

wolwerine Поправьте, пожалуйста, в Go and paste: если в буфере обмена находится не URL, а текст, то он по ПКМ (открыть в текущей вкладке) ищется в текущем поисковике, а по СКМ  (открыть в новой вкладке)- не ищется с выдачей ошибки

Формат адреса неверен. URL недействителен и не может быть загружен.

Александр Колесников
Ну, раз не ищется

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

Выделить код

Код:

this.onclick = e => {
    var arg, paste;
    switch (e.button) {
        case 2:
            if (e.ctrlKey || e.shiftKey) return;
            e.preventDefault();
        case 1:
            if (!(paste = readFromClipboard())) return;
            if (e.button == 1) arg = new MouseEvent("", {ctrlKey: true});
            gURLBar.value = paste;
        case 0:
            gURLBar.handleCommand(arg);
    }
}
this.onmouseenter = () => this.tooltipText = readFromClipboard() || this.label;

Dumby Респект!

Напишите, пожалуйста, код "Не открывать пустые вкладки при закачке файлов" типа zip, pdf...

P.S. Уже есть: Releases · Infocatcher/Close_Download_Tabs · GitHub

Народ, что то не нахожу инфы, а можно добавлять кнопки в "автозагрузку"? Вот есть у меня кнопка "добавить страницу в закладки по двойному клику". Для ее работы, кнопку надо вытащить на панель и жмакнуть после каждого перезапуска браузера, а можно этот процесс автоматизировать и убрать кнопку с панели? В CB полный ноль, если глупость сморозил, извините.

Pony_Smile_Pack пишет

Это что-то с ней не то, раз надо по ней жмакать.

У меня она по другому принципу работает. Я один раз жму на CB на панели и после этого, до перезагрузки, страницы добавляются в закладки по двойному клику на нужной папке, а не как у вас - всегда в корневой каталог. Мой вариант явно удобней когда в закладках все по папкам отсортировано, вот бы еще при каждом перезапуске кнопку не нажимать....

mozillka_ru пишет

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

А вот вариант ещё удобней и главное продолжает работать даже после перезагрузки. :)

mozillka_ru пишет
Pony_Smile_Pack пишет

Это что-то с ней не то, раз надо по ней жмакать.

У меня она по другому принципу работает. Я один раз жму на CB на панели и после этого, до перезагрузки, страницы добавляются в закладки по двойному клику на нужной папке, а не как у вас - всегда в корневой каталог. Мой вариант явно удобней когда в закладках все по папкам отсортировано, вот бы еще при каждом перезапуске кнопку не нажимать....

[CB]Двойным левым кликом добавить закладку в папку закладок. | Форум Mozilla Россия

Pony_Smile_Pack

Это мне и было нужно, спасибо!

ps а саму кнопку с панели убрать? :blush:
или такого сам принцип действия кнопок не позволяет?

mozillka_ru пишет

Pony_Smile_PackЭто мне и было нужно, спасибо!ps а саму кнопку с панели убрать? или такого сам принцип действия кнопок не позволяет?

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

Проверил - не работает! :) Но это я уже обнаглел конечно (просто любитель минимализма), а CB у меня всего одна, я про них узнал когда меня плагин Add Bookmark Here своими глюками задолбал и пришлось искать замену. Тему с готовыми кнопками пролистывал, чет ничего больше не зацепило.

okkamas_knife

Спасибо, я уже нашел вторую полезную кнопку, которая в один клик показывает\скрывает дополнительную панель и перетащил на неё все редко используемые кнопки :).

подскажите кнопку перезагрузки для CB можно разместить в главном меню как на картинке?

6169135.png

Александр Колесников пишет

wolwerine Поправьте, пожалуйста, в Go and paste

Обновлено.

подскажите пожалуйста.хотел кнопку для запуска раширения fire commander создать,а кннопку расширения убрать потому-что она его только в плавающем окне запускает. сделал запуск по скм во вкладке, а по лкм хотел чтобы как раньше вызывалось. у него есть горячяя клавиша alt-c для запуска, а послать эту комбинацию не выходит. видел несколько вариантов,но ничего не получается,сам я ноль в этом деле. подскажите пожалуйста что надо вписать. сейчас код кнопки выглядит так:

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

Выделить код

Код:

/*Initialization Code*/
                   
// Fire Commander(в боковой панели)
function lbMouse(){
sendKeyEvent({ alt: true, keyCode: "DOM_VK_C" });
};

// Fire Commander(во вкладке)
function mbMouse(){
getBrowser (). selectedTab = getBrowser (). addTab ("chrome://FireCommander/content/FireCommander.xul")
};

this.onclick = function(event) {
   if(event.button == 0) {
// Действие при клике ЛКМ
lbMouse();
    }
    else if(event.button == 1) {
        // Действие при клике СКМ

mbMouse();
    }
};


спасибо.

Поправьте кто нибудь VT2 очень надо. Заранее благодарю

okkamas_knife пишет

сам подход изначально неверный, там надо не нажатие клавиши посылать а посмотреть какая команда вызывается нажатием и использовать её.
если нужное тебе действие есть в меню то используй DOM Inspector  чтоб посмотреть какая там команда (её и вписывай в кнопку) как пользоваться им смотри в готовых кнопках заглавный пост там есть ссылка на инструкцию с картинками

Вот я давно хотел узнать на этот счет. Если берем команду для кнопки, в каких случаях надо писать goDoCommand ("..."),  а когда onCommand, а когда ничего не добавлять, а просто вписать команду?

skynet281978 пишет

подскажите кнопку перезагрузки для CB можно разместить в главном меню как на картинке?

http://savepic.ru/6169135.png

Во, как раз сам решил себе запилить. У меня работает. Вроде :D
Положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

(function() {
    const restartbtnId = 'ui-restart-button';
    var restartbtn = document.getElementById(restartbtnId);
    
    if(!restartbtn){
        restartbtn = document.createElement('toolbarbutton');
        restartbtn.id = restartbtnId;
        restartbtn.tooltipText = "Перезапустить Firefox";
        restartbtn.onclick = function(event){
            if(event.button == 0) {
                var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
                .getService(Components.interfaces.nsIAppStartup);
                appStartup.quit(appStartup.eForceQuit | appStartup.eRestart);
            }
        };
        restartbtn.setAttribute('style', 'padding-right: 11px; padding-left: 11px; list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QUKCjI2BicMFgAAA0FJREFUeNqlk29oG3Ucxp/f/c8luaRJujQm7RbHLK4dwobaKrWTdX/YBAcDfaEizheCL/ayL9SpL3wxZDDwhY4hyqY4HYh04hiy1o11GyOidGi1o7t0bZo/veTSyyV3l7vLnS+W+sK99Pvygefz5fnyfIH/OeQhIfPeHikWfBkU9XQkKvZoumXZlqNYmnrSL5z8EUAHgP8wIP0uHY2Hzr76ysjhF/ZvD7IBHmrLhW51QDwPV678aX5/4easNf/+YQDmBoTpmkOxRPjSqY+PjAw/nmJPTxdRVQ0YLRNUgAcEDgYXCUh9yRGrMP48GtdmupAHgN6k9Pm5M689K0aC1EcXZPxx9fZ6WV4u+5695hMuLsYTKSYUErRySYF+SwPAA7AA+AzpPx7Zti059uhAD/XB+UXc+uHnauXOd8d9PTcPwADgtrhMBHzmEThKC76tA7D/jZBM9xz7cHJf3427GkqLK+26fP0TX8/NAVgC0ADgwS4Q2AUGAENC2wmXfX2ScNwbnU7nGhMIi8PxeJCamilieUFW26WpWQCrAGrdTQAANrmXEgYOHaU59p0ndu9I84lN3PWvf3qSYVlGMGwPvuuCYZl2N1sdgLNhjj3z6QGaZ07tnhje3P9YX+CG3ERhRQNN2WsMxbFNVbeR7BURkCSJiQyGXG3B28jYf+jcifGxrW/vGdsanpWbuDyvoWV7IKYJ4jZkql6vf3b15pKeToUxOJSJpkePTQIQAFAAQBGoatPxv8opuLNq4IFG4BiWS6zSIt26f3nVSR48+tSuTExKhIgDLoXefRPiwITO9+4s0EJPsFaz9rJBMQyeI07HB/Ep2JU1w8xPf0sAYPDIly/2Z9NfHDg4FDNsH6bpoLCy7uTzVXXL5riUzcYCDdvDr7IFzXLg2h3od2W1dPHNl2gAqP01dY9Nj7eq6/5ofJMkeBRBJCrSO4eSoXBUZHNLJlaqHaj3i3q7WNE9jheIZWr138+ep7uH9mrzF+cQ3bFUVMiw1nD5hkXYfLVNFmTNV5aVZqNcqSi5b04ot0+fCad2xWz13i/64vQc+c9ncgDifaNvPReIZYeESGKL3Vqv1RdmflP/vpTvNrMMoA0gCsD6B3vab6ot2QOXAAAAAElFTkSuQmCC)');
        
        var quitbtn = document.getElementById('PanelUI-quit');
        quitbtn.parentNode.insertBefore(restartbtn, quitbtn);
        quitbtn.parentNode.insertBefore(document.createElement('toolbarseparator'), quitbtn);
    }
})();

Подскажите,что подправить,что бы заработала кнопка на 34-й лисе?

VORON пишет

Подскажите,что подправить,что бы заработала кнопка на 34-й лисе?

Если ты воспользовался советом №505, то должна работать. Во всяком случае у меня в [nightly] работает.

voqabuhe
Да уж :blush:
Сам же просил и забыл

Попалась мне такая кнопочка

"ABP EHH"

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//custombuttons2.com/%22%3E%0A%20%20%3CCb2Ver%3E3.0.0%3C/Cb2Ver%3E%0A%20%20%3Cname%3EABP%20EHH%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAdVJREFUOE+lk79LAmEYx2sI+oHQErQ0NDSJblY4NNkfELhFQ0ENQkGCUMSFP0BMCqMhQiIrSxD8A2xpkMIghwizJXJxddHj3jvv7Nv7vGTkqQ113APHy30/z/d57nv96Ovj9z8uM+D49HSdF3rU0c9WQtsCcMFAYn9/5W5hAbWhoa71NDeH82g0yN8dJlAbgMQ5t7unuAUtuFy4DoUkDhn5BpDt3zqbHRXm53HBnfwEiM51mw1qIAB5dhby9DTUvT2oh4dQPB7ITie0gwNosRjqdjuS4TDaARYLtLU1fFSrUFZXoSwuwnh+BvP7Yby8QPF6YeTz0G9v0UilcBWPmwDj49CiUeiFAlgwCGV5Gcb7Oxq5HPSbG7ClJQE0ikXoDw+4SiTaAfXJSTSyWej399CSSbDNTRivr1C3t4WI7eyg+fYG7ewMdau1cwR5ZgbNSkWI9MdHMXuzVIK6u4tmuQyVu9PSadSmpsS+Onag8kUxSRJ0mpdtbIhujUwGbGsLMt888/lQm5joCjiikPQKkPm85HDgMhK5bAsSJYxC0hUyOIgaFbde5J84LUknPDuj5igPU8IoJB2QLwB1/hKPdUSZDiielDBaULci29S59UN9O6CHv9YnyBQiGHRETHQAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B//%20Open/Close%20the%20Adblock%20Plus%3A%20Element%20Hiding%20Helper%0AehhSelectElement%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20Check%20for%20Custom%20Buttons%B2%0Aif%20%28typeof%20custombuttons.uCbuttonButes%20%21%3D%20%27function%27%29%20%7B%0A%20%20alert%28%20%22This%20Button%20requires%20the%20Custom%20Buttons%25s%20Extension%22.replace%28%20/%25s/%2CString.fromCharCode%28%20178%20%29%20%29%20%29%3B%0A%20%20this.disabled%28true%29%3B%0A%7D%0A%0A//%20Initialise%20the%20tooltip%0Athis.tooltipText%20%3D%20%22Toggle%20ABP%3A%20Element%20Hiding%20Helper%22%3B%0A%0A%0A/*-------------------%20Attributes%20Block%20Start%20------------------*/%0A%0Athis.setAttribute%28%27author%27%2C%27Rawny%27%29%3B%0Athis.setAttribute%28%27version%27%2C%271%20%282009-04-20%29%27%29%3B%0Athis.setAttribute%28%27homepage%27%2C%20%27http%3A//custombuttons2.com/forum/buttons/buttons-database/toggle-adblock-plus-element-hiding-helper.html%27%29%3B%0Athis.setAttribute%28%27dependency%27%2C%27FF3.0*%2C%20CB2%202.0.9*%27%29%3B%0Athis.setAttribute%28%27status%27%2C%27Complete%27%29%3B%0Athis.setAttribute%28%27public%27%2Ctrue%29%3B%0A%0A/*-------------------%20Attributes%20Block%20End%20-------------------*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5BClick%20the%20button%20to%20open%20the%20Adblock%20Plus%3A%20Element%20Hiding%20Helper%20%28ABP%20EHH%29%20or%20close%20it%20if%20you%20are%20already%20in%20it.%5D%5D%3E%3C/help%3E%0A%3C/custombutton%3E


Я так понимаю что она должна запускать Element Hiding Helper для Adblock Plus. В 34 она не работает. Может кто-нибудь сможет разобраться в чём причина и починит?

Mishania
Есть гораздо более функциональная кнопка.
https://forum.mozilla-russia.org/viewto … 06#p543706

villa7
Мне нужна кнопка которая включает функционал расширения Element Hiding Helper, а не сама кнопка. Я наверно неправильно понял назначение"ABP EHH".

Mishania
А смысл? Это то расширение которое включается лишь по необходимости, всё остальное время оно будет отключено, не отжирая ресурсов. Нет смысла заменять его кнопкой, если только эта причина.

villa7
Вы меня не понимаете. Я хочу чтоб мне не приходилось каждый раз нажимать на меню ABP что-бы вызвать функцию блокировки.  В этом весь смысл. А ресурсов у меня хватает и ничего страшного если расширение будут постоянно включено, особенно если учесть что каждый раз придётся перезагружать браузер для включения-выключения.

Mishania
Действительно не пойму. А как тогда вызывать функцию скрытия если не нажимать АВР?

villa7
Сейчас для того что-бы вызвать функцию "скрыть элемент на странице", мне надо нажать на значок ABP и выбрать в открывшемся меню функцию.
484f32809f065667d931307f5acf61d2.jpeg
Я хочу чтоб при нажатии на кнопку сразу включалась функция "скрыть элемент на странице". Например как в кнопке Attributes Inspector. Если вы не можете помочь, или опять не поняли что требуется - то не надо отвечать.

Mishania пишет

Мне нужна кнопка которая включает функционал расширения Element Hiding Helper, а не сама кнопка. Я наверно неправильно понял назначение"ABP EHH".

ABP и Element Hiding Helper должны быть включены.

Выделить код

Код:

var cm = document.getElementById("abp-toolbar-popup");
cm.collapsed = true;
cm.openPopup();
document.getElementsByAttribute("label", "Скрыть элемент на странице")[0].doCommand();
cm.hidePopup();
cm.collapsed = false;

bunda1
Спасибо, вы как всегда спасли.

можно ли подправить кнопку https://forum.mozilla-russia.org/viewto … 47#p531447

bunda1
Здравствуйте.
Установил FF 34 и скрипт изменения масштаба страниц снова перестал работать.
Скрипт работает через дополнение UC

Ссылка на скрипт (4кб)
http://www.adrive.com/public/hfF4ZA/ucjs_statusbar_zoom_panel_1.3.uc.zip

Содержание скрипта

Выделить код

Код:

// ==UserScript==
// @name            ucjs_statusbar_zoom_panel_1.3.uc.js
// @namespace        http://bbs2ch.sourceforge.jp/uploader/upload.php
// @description        г‚№гѓ†гѓјг‚їг‚№гѓђгѓјгЃ«г‚єгѓјгѓ еЂ¤г‚’иЎЁз¤єгѓ»е¤‰ж›ґгЃ™г‚‹гѓ‘гѓЌгѓ«г‚’иїЅеЉ гЃ™г‚‹гЂ‚
// @include            main
// @author            otokiti
// @compatibility    WindowsXP / Ubuntu8.04(gnome)
// @compatibility    Firefox 3.0 - 3.6a1pre
// @compatibility    userChrome.js 0.7 - 0.8 / userChromeJS 1.0
// @compatibility    Sub-Script/Overlay Loader v3.0.24mod
// @version            0.1: 08/10/21 初版
// @version            0.2: 08/10/23 г‚єгѓјгѓ еЂ¤д»Ґе¤–гЃ®гѓЎгѓ‹гѓҐгѓјг‚’иїЅеЉ 
// @version            0.3: 08/11/18 uc.xul から uc.js へ変更
// @version            0.4: 08/12/13 Zoom 関係の関数の書き換える様に変更
// @version            0.5: 09/01/22 パネル上のホイール・スクгѓгѓјгѓ«гЃ§г‚єгѓјгѓ 
// @version            0.6: 09/02/18 onLocationChange гЃ®гѓ•гѓѓг‚ЇгЃ«ж°—гЃҐгЃ„гЃ¦гЃ„гЃЄгЃ‹гЃЈгЃџгЃ®гЃ§иїЅеЉ гЃ—гЃџ
// @version                          thanks: http://pc11.2ch.net/test/read.cgi/software/1230791860/717
// @version            0.7: 09/02/19 з›ґжЋҐж•°еЂ¤гЃ§жЊ‡е®љгЃ—гЃ¦г‚єгѓјгѓ еЂ¤г‚’е¤‰ж›ґгЃ™г‚‹гѓЎгѓ‹гѓҐгѓјг‚’иїЅеЉ 
// @version            0.8: 09/02/20 メニューが toolkit.zoomManager.zoomValues гЃЁеђЊжњџгЃ™г‚‹гѓўгѓјгѓ‰г‚’иїЅеЉ гЃ—гЃџ(default)гЂ‚
// @version            0.9: 09/02/21 ホイール・スクгѓгѓјгѓ«ж™‚гЃ«гѓЎгѓ‹гѓҐгѓјгЃЊе‡єгЃ¦гЃ„г‚‹е ґеђ€гЃЇж¶€гЃ™ж§˜гЃ«гЃ—гЃџгЂ‚
// @version            1.0: 09/02/21 onLocationChange の引数を忘れていたのを修жЈ
// @version                           thanks: http://pc11.2ch.net/test/read.cgi/software/1230791860/757
// @version            1.1: 09/05/12 Zoom 関係の関数を書き換え方法の変更とその他微修жЈгЂ‚
// @version                          з”»йќўдёЉгЃ§гЃ® Ctrl+<マウススクгѓгѓјгѓ«> гЃ«е†ЌеЇѕеїњгЂ‚пјЉжіЁж„Џ
// @version            1.2: 09/05/13 гѓЎгѓ‹гѓҐгѓјгЃ®ж•°еЂ¤жЊ‡е®љгЃ§г‚єгѓјгѓ г‚’е¤‰ж›ґгЃ—гЃџе ґеђ€г‚їгѓ–гЃ®е€‡г‚Љж›їгЃ€гЃ«еЇѕеїњгЃ—гЃ¦гЃ„гЃЄгЃ‹гЃЈгЃџгЃ®г‚’дї®жЈ(0.7から)гЂ‚
// @version            1.3: 09/05/18 _handleMouseScrolled だけ別扱いにしてみる。
// @Note            1) г‚№гѓ†гѓјг‚їг‚№гѓђгѓјгЃ«г‚єгѓјгѓ еЂ¤гѓ»гѓўгѓјгѓ‰г‚’иЎЁз¤єгЃ™г‚‹гѓ‘гѓЌгѓ«г‚’иїЅеЉ гЃ™г‚‹гЂ‚
// @Note            2) パネルのコンテクスト・メニューにズーム・メニューを表示する。
// @Note            3) パネル上のホイール・スクгѓгѓјгѓ«гЃ§г‚єгѓјгѓ гЂ‚
// @Note            4) гѓ‘гѓЌгѓ«гѓ»г‚ЇгѓЄгѓѓг‚ЇгЃ§гѓЄг‚»гѓѓгѓ€гЂ‚
// @Note            5) 直接ズームを指定可能なメニューリスト。
// @Note    仕様    _SYNC_ZOOMVALUES гЃЊ false гЃ®е ґеђ€ toolkit.zoomManager.zoomValues г‚„ USER_ZOOM_LEVEL の値を変更すると
// @Note            Zoom In(Ctrl++)/Zoom Out(Ctrl+-)гЃ§е¤‰гЃ€гЃџг‚єгѓјгѓ еЂ¤гЃЊгѓЎгѓ‹гѓҐгѓјгЃ«з„ЎгЃЏзµђжћњгѓЃг‚§гѓѓг‚ЇгЃЊд»˜гЃ‹гЃЄгЃ„е ґеђ€гЃЊгЃ‚г‚‹гЂ‚
// @Note    еЇѕз–    A) _SYNC_ZOOMVALUES г‚’ true гЃ§дЅїгЃ†гЂ‚
// @Note            B) 別に構わないとそのまま使う。
// @Note    пјЉжіЁж„Џ    Ctrl+<マウススクгѓгѓјгѓ«> гЃ§гЃЇз‹¬и‡Єг‚№гѓ†гѓѓгѓ—гЃЊе€©з”ЁгЃ•г‚Њг‚‹з‚єгѓЎгѓ‹гѓҐгѓјгЃ®еЂ¤д»Ґе¤–гЃ«гЃЄг‚‹е ґеђ€гЃЊжњ‰г‚‹гЂ‚
// @Note    ----------------------------------------------------------------------------------------------
// @Note    пјЉгЃ“гЃ®г‚№г‚ЇгѓЄгѓ—гѓ€гЃЇ Alice0775ж°ЏдЅњгЃ®ж‹ЎејµгЂЊDefault FullZoom Level 3.5гЂЌг‚’еЏ‚иЂѓгЃ«гЃ•гЃ›гЃ¦й ‚гЃЌгЃѕгЃ—гЃџгЂ‚
// @Note    ----------------------------------------------------------------------------------------------
// ==/UserScript==
var ucjs_zoom = {
// ------------------------------ д»»ж„ЏгЃ«иЁе®љ -----------------------------------------------
    // 
    _TAGET_ID:    "page-report-button",

    // 
    _ZOOM_MODE: [ { txt: "\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443", color: "#00000" },                     
                  { txt: "\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442", color: "#096CE6" } ],    

    // 
    _SYNC_ZOOMVALUES: true,

    // 
    USER_ZOOM_LEVEL: [ 30, 50, 67, 80, 90, 100, 110, 120, 133, 150, 170, 200, 240, 300 ],
//    USER_ZOOM_LEVEL: [ 30, 50, 75, 100, 150, 200, 250, 300 ],
// --------------------------------------------------------------------------------

    // 
    ZoomLevel: [ ],

    // 
    init: function() {

        // Zoom 
        var _cmd = "ucjs_zoom.updateZoom();$&";
        // toggleZoom
        eval("ZoomManager.toggleZoom = " + ZoomManager.toggleZoom.toString().replace(/}$/, _cmd));
        // reset
        eval("FullZoom.reset = " + FullZoom.reset.toString().replace(/}$/, _cmd));
        // enlarge
        eval("FullZoom.enlarge = " + FullZoom.enlarge.toString().replace(/}$/, _cmd));
        // reduce
        eval("FullZoom.reduce = " + FullZoom.reduce.toString().replace(/}$/, _cmd));
        // onLocationChange
        addEventListener("TabAttrModified", function(e) {        
           if ( e.target.linkedBrowser.currentURI.spec == gBrowser.currentURI.spec ) {          
                ucjs_zoom.updateZoom();
                }
        }, true, gBrowser.tabContainer );        
        // _handleMouseScrolled
        _cmd = "setTimeout(ucjs_zoom.updateZoom, 0); $&";
        eval("FullZoom._handleMouseScrolled = " + FullZoom._handleMouseScrolled.toString().replace(/}$/, _cmd));
    
        
        // 
        if (this._SYNC_ZOOMVALUES) {    // toolkit.zoomManager.zoomValues 
            var SysZoomLevel = Cc["@mozilla.org/preferences;1"].getService(Ci.nsIPrefBranch)
                        .getCharPref("toolkit.zoomManager.zoomValues").split(",");
            for (var i=0; i<SysZoomLevel.length; i++) this.ZoomLevel.push(parseInt(parseFloat(SysZoomLevel[i])*100));
        } else {                        
            this.ZoomLevel = this.USER_ZOOM_LEVEL;
        }

        // 
        var zoomPanel = document.createElement("statusbarpanel");
        zoomPanel.setAttribute("id", "ucjs_zoom_statuslabel");
        zoomPanel.setAttribute("context", "ucjs_zoom-context");
        zoomPanel.setAttribute("onclick", "ucjs_zoom.click_StatusLabel(event);event.stopPropagation();");
        var targetPanel = document.getElementById(this._TAGET_ID);
        targetPanel.parentNode.insertBefore(zoomPanel, targetPanel.nextSibling);

        // 
        var MainPopup = document.getElementById("mainPopupSet");
        var PopupMenu = MainPopup.appendChild(document.createElement("menupopup"));
        PopupMenu.id = "ucjs_zoom-context";
        PopupMenu.setAttribute("oncommand", "event.stopPropagation();");
        PopupMenu.setAttribute("onpopupshowing", "ucjs_zoom.show_Popup(event);");
        ucjs_zoom.updateZoom();

        // 
        zoomPanel.addEventListener("DOMMouseScroll", function(event){
            ucjs_zoom.wheelZoom(event);
        }, false);
    },

    // 
    show_Popup : function(e) {
        var aPopup = e.target;
        for(var i = aPopup.childNodes.length - 1; i >= 0; i--) {
            aPopup.removeChild(aPopup.childNodes.item(i));
        }

        // 
        for (var i = ucjs_zoom.ZoomLevel.length-1; i >=0 ; i--) {
            var tempItem = document.createElement("menuitem");
            tempItem.setAttribute("label", ucjs_zoom.ZoomLevel[i] + "%");
            tempItem.setAttribute("oncommand","ucjs_zoom.set_Zoom(" + ucjs_zoom.ZoomLevel[i]/100 + ");");
            tempItem.setAttribute("type", "checkbox");
            if(ucjs_zoom.ZoomLevel[i] == Math.floor((ZoomManager.zoom + 0.005) * 100) ){
                tempItem.setAttribute("checked",true);
            }
            aPopup.appendChild(tempItem);
        }

        var tempItem = document.createElement("menuseparator");
        aPopup.appendChild(tempItem);

        // 
        var popup = document.getElementById("viewFullZoomMenu").lastChild;
        for (var i = 0; i < popup.childNodes.length; i++) {
            var tempItem = popup.childNodes[i].cloneNode(true);
            if (tempItem.id) tempItem.id = "ucjs-" + tempItem.id;
            aPopup.appendChild(tempItem);
        }
    },

    // 
    set_Zoom: function(n) {
        var markupDocumentViewer = getBrowser().markupDocumentViewer;
        if (!markupDocumentViewer) return;

        if (ZoomManager.useFullZoom) {
            if (markupDocumentViewer.textZoom != 1) markupDocumentViewer.textZoom = 1;
            if (markupDocumentViewer.fullZoom != n) markupDocumentViewer.fullZoom = n;
        } else {
            if (markupDocumentViewer.textZoom != n) markupDocumentViewer.textZoom = n;
            if (markupDocumentViewer.fullZoom != 1) markupDocumentViewer.fullZoom = 1;
        }
        ucjs_zoom.updateZoom();
        return n;
    },

    // 
    wheelZoom: function(e) {
        ucjs_zoom.hidePopup(document.getElementById("ucjs_zoom-context"));
        // 
        if (e.detail > 0) FullZoom.reduce();
        else FullZoom.enlarge();
    },

    // 
    hidePopup: function (menu) {
        var popupBox = null;
        var menuBox = null;
        try {
            popupBox = menu.boxObject.QueryInterface(Ci.nsIPopupBoxObject);
        } catch (e) {}
        try {
            menuBox = menu.parentNode.boxObject.QueryInterface(Ci.nsIMenuBoxObject);
        } catch (e) {}

        if (menuBox) menuBox.openMenu(false);
        else if (popupBox) popupBox.hidePopup();
     },

    // 
    click_StatusLabel:function(e){
        if(e.button != 0) return;
        FullZoom.reset();
    },

    // 
    updateZoom: function(){
        // 
        var Toggle_org = document.getElementById("toggle_zoom");
        if (Toggle_org) {
            Toggle_org.setAttribute("checked", !ZoomManager.useFullZoom);
        }
        var Toggle_ucjs = document.getElementById("ucjs-toggle_zoom");
        if (Toggle_ucjs) {
            Toggle_ucjs.setAttribute("checked", !ZoomManager.useFullZoom);
        }
        // 
        var Zoom = document.getElementById("ucjs_zoom_statuslabel");
        Zoom.setAttribute("label", Math.floor((ZoomManager.zoom + 0.005) * 100) + "%");
        Zoom.setAttribute("tooltiptext", ucjs_zoom._ZOOM_MODE[ZoomManager.useFullZoom? 0: 1].txt);
        Zoom.setAttribute("style", "color: " + ucjs_zoom._ZOOM_MODE[ZoomManager.useFullZoom? 0: 1].color + ";");
    }
}
ucjs_zoom.init();;

1fesFFFF пишет

bunda1
Здравствуйте.
Установил FF 34 и скрипт изменения масштаба страниц снова перестал работать.

Что то не смог исправить :/, может попробуй Изменить масштаб

Вот напасть, потребовалось отключать этот скрипт на одном сайте.

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

Выделить код

Код:

// ==UserScript==
// @author         Al_H
// @description    Add URL in tooltip to include more informaton
// @include        *
// @name           Add URL in tooltip
// @version 0.0.1.20141013112432
// @namespace https://greasyfork.org/users/5117
// ==/UserScript==

for(var i=0;i<document.links.length;i++) {
    if(document.links[i]) document.links[i].title+=((document.links[i].title=='')?'':'\n')+decodeURI(document.links[i].href);
}


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

villa7 пишет

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

Может поставь исключение для сайта тут: if(document.links[i] ) ну там && document.domain !==

bunda1
В исключения добавить было бы вообще замечательно. Но дело в том что в Scriptish добавляю в поле "Пользовательские исключения" адрес http://www.ex.ua/ это не срабатывает, срабатывает только если добавить конкретную страницу, что нереально. Попробовал то что ты посоветовал, в сам скрипт, но у меня он ломается, видать неправильно что то делаю. Может добавишь http://www.ex.ua/ как надо.

villa7 пишет

Но дело в том что в Scriptish добавляю в поле "Пользовательские исключения" адрес http://www.ex.ua/ это не срабатывает

А звёздочку ставишь http://www.ex.ua/* ?

voqabuhe
Точно надо * ставить, и на лбу себе наколоть, недавно другой скрипт исключал и забыл. Всем спасибо, кто откликнулся.

villa7 пишет

и на лбу себе наколоть

На лбу это конечно круто :), а вот в Greasemonkey подсказка появляется с примером http://example.com/*, при попытке добавить сайт в исключения.

voqabuhe
У меня Scriptish.

villa7 пишет

У меня Scriptish.

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

WinXP sp3 - FF 35.0 - CB 0.0.5.8 - Autocopy+3 от 26.12.2013
При попытке выделения текста в строке имя в окне Библиотека, окно библиотеки сразу закрывается. Кнопку удалил, перезагрузил FF - все работает.
Может быть это как-то лечится?

P.S. Прошу прощения. Ошибся веткой, перенес сообщение из ветки обсуждения CB/

AlexCondor пишет

WinXP sp3 - FF 35.0 - CB 0.0.5.8 - Autocopy+3 от 26.12.2013
При попытке выделения текста в строке имя в окне Библиотека, окно библиотеки сразу закрывается. Кнопку удалил, перезагрузил FF - все работает.
Может быть это как-то лечится?

Исправил: Autocopy+3

bunda1 пишет

Исправил: Autocopy+3

Большое спасибо за помощь.

Умельцы ! А можно на СКМ (клик колесом мыши) повесить действие "копировать выделенный текст" ? :rolleyes:

HaGEN пишет

Умельцы ! А можно на СКМ (клик колесом мыши) повесить действие "копировать выделенный текст" ? :rolleyes:

Выделить код

Код:

addEventListener("mouseup", (e)=>{ e.button==1 && goDoCommand("cmd_copy") }, false, gBrowser );

bunda1
А можно объяснить что это за форма записи?

Выделить код

Код:

(e)=>{ e.button==1 && goDoCommand("cmd_copy") }

bunda1 благодарю! Завсегда помогаешь страждущим :)
зы. Ежели будет желание то можно довести до завершения это действие. Есть в about:config параметр general.autoScroll который отвечает за появление этого autoscroller-a по СКМ.
Так вот, сейчас он появляется и текс копируется. Т.е. два действия. Можно отключить глобально этот "автоскроллер", тогда норм.
Вот ежелиб сделал кто :D что-то типа

if {есть выделенный текст на странице, то отменить/destroy autoscroller}
     {goDoCommand("cmd_copy")}
else
      {do nothing()} // т.е. стандартное поведение, появляется autoscroller если нету выделенного текста
ежели фигню написал звиняйте... так тоже норм. отключил его глобально и клёва.

21-01-2015 19:16:02

rbfyec пишет

А можно объяснить что это за форма записи?

хехех, ну это и я понял, даже проверил.
Это выбор кнопок мыши на которое нужно повесить действие.
например ежели сделать

addEventListener("mouseup", (e)=>{ e.button==0 && goDoCommand("cmd_copy") }, false, gBrowser );

то при выделив текст и сделав ЛКМ - выделенный текст будет скопирован и убрано выделение текста. Два в одном, хехе...
0=ЛКМ, 1=СКМ, 2=ПКМ, ну и наверное так и дальше , скока есть кнопок у мыша(?)

HaGEN пишет
rbfyec пишет

А можно объяснить что это за форма записи?

хехех, ну это и я понял, даже проверил.
Это выбор кнопок мыши на которое нужно повесить действие.
например ежели сделать

addEventListener("mouseup", (e)=>{ e.button==0 && goDoCommand("cmd_copy") }, false, gBrowser );

то при выделив текст и сделав ЛКМ - выделенный текст будет скопирован и убрано выделение текста. Два в одном, хехе...
0=ЛКМ, 1=СКМ, 2=ПКМ, ну и наверное так и дальше , скока есть кнопок у мыша(?)

Про выбор кнопок мыши я догадался :D
Меня интересует вот это — (e)=>{...}
Это функция что ли записана каким-то причудливым образом?

Почему не

Выделить код

Код:

addEventListener("mouseup", function(e) { if (e.button==1) goDoCommand("cmd_copy") }, false, gBrowser );
rbfyec пишет

А можно объяснить что это за форма записи?

Выделить код

Код:

(e)=>{ e.button==1 && goDoCommand("cmd_copy") }

Анонимную функцию с передачей аргумента e которую запускает обработчик:
addEventListener("mouseup", function(e) {
   e.button==1 && goDoCommand("cmd_copy");
}, false, gBrowser );

можно написать короче:
(e)=>{ e.button==1 && goDoCommand("cmd_copy") }

а можно и без скобок если код для запуска не сложный в одной строке:
addEventListener("mouseup", ()=> BrowserHome(), false, gBrowser );

а можно сократить просто анонимная функцию и без обработчика:

Выделить код

Код:

(function() {        
   setTimeout(function() { custombuttons.alertSlide("alert", "function") }, 5500);
})();

вот так:

Выделить код

Код:

(() => {
   setTimeout(function() { custombuttons.alertSlide("alert", "=>") }, 5500);
})();

Тут почитай: https://developer.mozilla.org/en-US/doc … _functions

bunda1 пишет

Анонимную функцию с передачей аргумента e которую запускает обработчик:
addEventListener("mouseup", function(e) {
   e.button==1 && goDoCommand("cmd_copy");
}, false, gBrowser );

А почему здесь

Выделить код

Код:

e.button==1 && goDoCommand("cmd_copy");

а не

Выделить код

Код:

if (e.button==1) goDoCommand("cmd_copy")
rbfyec пишет

А почему здесь

Выделить код

Код:

e.button==1 && goDoCommand("cmd_copy");

а не

Выделить код

Код:

if (e.button==1) goDoCommand("cmd_copy")

можно и так:

Выделить код

Код:

if (e.button==1) goDoCommand("cmd_copy");

но с && короче, но не всё работает, например:

Выделить код

Код:

e.button==1 && return;

не будет работать, тут почитай http://learn.javascript.ru/logical-ops

HaGEN пишет

Вот ежелиб сделал кто :D что-то типа

if {есть выделенный текст на странице, то отменить/destroy autoscroller}
     {goDoCommand("cmd_copy")}
else
      {do nothing()} // т.е. стандартное поведение, появляется autoscroller если нету выделенного текста

Выделить код

Код:

addEventListener("mousedown", (e)=>{
   
   if ( e.button !== 1 ) return;
   
   var selection = document.commandDispatcher.focusedWindow.getSelection().toString();
   if ( selection == '' ) {
        var theBox = document.commandDispatcher.focusedElement;
        if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { 
             var startPos = theBox.selectionStart;
         var endPos = theBox.selectionEnd;
         var selection = theBox.value.substring(startPos, endPos);  
             }
        };  
   selection = ( selection !== '' ) ? true : false;   

   if ( selection ) { 
        e.preventDefault();
        e.stopPropagation();
        
        setTimeout(()=> document.activeElement.blur(), 50);  
        setTimeout(()=> window.content.focus(), 300);        
        }
        
   goDoCommand("cmd_copy");
      
}, true, gBrowser );

Но мне кажется что копировать выделенный текст двойным правым кликом удобней:

Выделить код

Код:

addEventListener("dblclick", (e)=>{
  if ( e.button == 2 && !/findbar|tabbrowser/.test( e.target.localName ) ) { 
       e.preventDefault();
       goDoCommand("cmd_copy");       
       document.getElementById("contentAreaContextMenu").hidePopup(); 
       }        
}, false, gBrowser );

Афигеть ! bunda1 - кудесник.
e710dabd9aa9052b10d9297760cc1edc.gif
Просто по двойному клику у мну перевод слова во всплыв. окошке из кнопки ContextTranslate привык уже .

bunda1
спасибо за разъяснения :)

Помогите с кнопкой. Пункт создается, но действие не знаю как сделать, пробовал много, ниччё не получилося. Постоянный пункт меню при выделении текста "Открыть как ссылку". Пункт создается, с действием подмогните:

Код кнопки
// Открыть как ссылку.
//
(function() {
   if ( document.getElementById("go2link") ) return;
 
        var str = {получить в переменную выделенный текст};  // №1 хз.

   var menuItem = document.createElement("menuitem");

   menuItem.id = "go2link";
   menuItem.setAttribute("label", "Перейти по ссылке");
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACIUlEQVQ4jZ2STUtUYRSAn3vfj3tnnBybUdEKTZ2gJjDQ/AHt3PWhTNAmadsq2tUPadG2JGWwRZugRbSKSAqHmkUpVMagoo7a1Rnv3Pu+LdJQYYQ6u8N5znM4nOPQJPLj079c1/1ijLlTLhbmmnFuswKQwuGSK9xn+fHpgf8RcHGoVyTbTpx3hfsuPz6d+2fBZhDRf66TdEc6K5QsDd6aGT3KOJncXatbMqiWNNJPIbSP0AqhFReGB4hjQ+dJn6XlLb4vrBiL86r09NroIUH+6k2kcJBSoJWL1gJrQQqXza06rnDItHrUd0KWK1W2g93Z0uT1EQC5b6qUPuOl2tBJHy/p4adTaP2nLIVLUI/ozCTpP93Kh0+Vy8MTL9biRjQmwQKwXd0gjhWNyBBGlkgo/IRFKwGAVoLQwHotoqennW8Ly5lGLF66e/0AWCwH86NRq0dIx2GpUiXYDqOu3o6Bvyv0DA3iJRIIJdFKoH2JtRAE4b6dbKti/usKqytbi6dy3bnnD0ZCCZafs+/RyRTKb0F5HspTKE/R3deF6zokfUkqIZn7uEjYiGdKkzfGSnuDJXClVl0nCg3Ktwgd7Z1Rvs6eiWnPJnGsZfbtvMVx3pgonjj0B832zY9N2b7BszSCHSo/1izw2MTmYblYWD3IySb9AKxUqtQ2AmOMfYK198vFQnCUOVZQ2wh2TWzulYuFR82Y5gLHMSY2t8vFwtRxQ34DLk/NkLifJmMAAAAASUVORK5CYII=");
   menuItem.setAttribute("oncommand", getBrowser (). selectedTab = getBrowser (). addTab (str));  // №2 хз.
   document.getElementById("context-copy").parentNode.insertBefore( menuItem, document.getElementById("context-copy") );

   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu.isTextSelected;
     }, false);
})();

HaGEN

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

Выделить код

Код:

(function() {
   if ( document.getElementById("go2link") ) return;
   var menuItem = document.createElement("menuitem");

   menuItem.id = "go2link";
   menuItem.setAttribute("label", "Перейти по ссылке");
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACIUlEQVQ4jZ2STUtUYRSAn3vfj3tnnBybUdEKTZ2gJjDQ/AHt3PWhTNAmadsq2tUPadG2JGWwRZugRbSKSAqHmkUpVMagoo7a1Rnv3Pu+LdJQYYQ6u8N5znM4nOPQJPLj079c1/1ijLlTLhbmmnFuswKQwuGSK9xn+fHpgf8RcHGoVyTbTpx3hfsuPz6d+2fBZhDRf66TdEc6K5QsDd6aGT3KOJncXatbMqiWNNJPIbSP0AqhFReGB4hjQ+dJn6XlLb4vrBiL86r09NroIUH+6k2kcJBSoJWL1gJrQQqXza06rnDItHrUd0KWK1W2g93Z0uT1EQC5b6qUPuOl2tBJHy/p4adTaP2nLIVLUI/ozCTpP93Kh0+Vy8MTL9biRjQmwQKwXd0gjhWNyBBGlkgo/IRFKwGAVoLQwHotoqennW8Ly5lGLF66e/0AWCwH86NRq0dIx2GpUiXYDqOu3o6Bvyv0DA3iJRIIJdFKoH2JtRAE4b6dbKti/usKqytbi6dy3bnnD0ZCCZafs+/RyRTKb0F5HspTKE/R3deF6zokfUkqIZn7uEjYiGdKkzfGSnuDJXClVl0nCg3Ktwgd7Z1Rvs6eiWnPJnGsZfbtvMVx3pgonjj0B832zY9N2b7BszSCHSo/1izw2MTmYblYWD3IySb9AKxUqtQ2AmOMfYK198vFQnCUOVZQ2wh2TWzulYuFR82Y5gLHMSY2t8vFwtRxQ34DLk/NkLifJmMAAAAASUVORK5CYII=");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab(document.commandDispatcher.focusedWindow.getSelection().toString())");
   document.getElementById("context-copy").parentNode.insertBefore( menuItem, document.getElementById("context-copy") );

   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu.isTextSelected;
     }, false);
})();

turbot Благодарю! Всё отлично.
А какие еще есть команды для загрузки текста в адр. строку кроме getBrowser().addTab ? Т.е. сейчас оно проверяет на "правильность" и если текст не похож на URl то ничче не открывается, ибо неверный адресс, проверьте... и т.д. а ежели это одно слово - то попытка подствить спереди www. и сзади добавить .com или .ru (то что прописано в "дополнять адресс")
У меня стоит плуг KeywordSearch который отвечает за поисковики(у мну их моного штук 15) в адр. строке и для строки закреплен один поисковик(Bing)(независимо от поисковой, ее вообще нету, убрана). Если вписать слово любое в адр. строку , то оно ищет в bing , если адресс - переходит по адресу.
Вот собсна в этом и след. вопросс: мож другая какая команда для открытия вкладки есть, типа шобы для бравзера это было будто я ручками вписал "нечто" в адр. строку и нажал ALT-SHIFT ? (ALT-SHIFT не обязательно)
ежели слишком сложно/невозможно то фигсним. Так тоже отлично, хоть работает теперь для ссылок в тексте без префикса http:// для чего собсна и было задумано :)

Помогите с кнопкой Save + http://forum.mozilla-russia.org/viewtop … 40#p493040
Сама кнопка установлена, но перестала работать - нажимаю сохранить страницу как png или часть страницы, выскакивает диалог о сохранении, но сохранения не происходит((
Windows XP, Mozilla Forefox v.36

4zz

"nsIWebBrowserPersist.saveURI изменили в FF36 и для работы он теперь требует восемь параметров"

Можно скажем воткнуть «null,» посередине в

Выделить код

Код:

wbp.saveURI(url, null, null, null, null, fp.file, null);

Или сделать как у меня там, если нужна работа в нескольких версиях фокса.

Lex1 пишет

4zz

"nsIWebBrowserPersist.saveURI изменили в FF36 и для работы он теперь требует восемь параметров"

Можно скажем воткнуть «null,» посередине в

Выделить код

Код:

wbp.saveURI(url, null, null, null, null, fp.file, null);

Или сделать как у меня там, если нужна работа в нескольких версиях фокса.

Я в кодах не силен, но
"воткнуть «null,» посередине в..." - так так оно и есть в первоначальном коде
а твою кнопку тоже воткнул, правда окно сохранения в ней нужно закрывать самостоятельно)

Там семь параметров - теперь требуется восемь. Т.е.

Выделить код

Код:

wbp.saveURI(url, null, null, null, null, null, fp.file, null);

Lex1
Ура!!! заработало!
Спасибо!!!))

Когда делаешь скриншот страницы с ютюбом, то на месте ютюба - чёрный прямоугольник. Это можно как-то исправить?

difabor пишет

Когда делаешь скриншот страницы с ютюбом, то на месте ютюба - чёрный прямоугольник. Это можно как-то исправить?

Если ты про кнопку Save+ то я не знаю.

Плагины плохо захватываются (нужен wmode=opaque), html5 - нормально. Также см. http://forums.mozillazine.org/viewtopic.php?f=19&t=2663435

Lex1 пишет

Плагины плохо захватываются (нужен wmode=opaque), html5 - нормально. Также см. http://forums.mozillazine.org/viewtopic.php?f=19&t=2663435

Спасибо :)

bunda1
А можно и [CB]CB drag and go обновить? Та же беда - картинки без запроса не сохраняются. (И, может быть скажете что-нибудь?.. shuffle.gif) Спасибо.

turbot
Завтра посмотрю.

turbot пишет

bunda1
А можно и [CB]CB drag and go обновить? Та же беда - картинки без запроса не сохраняются.

Укажи в главных настройках FF папку для сохранения.

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

Выделить код

Код:

document.getElementById('здесь id пункта меню ScrapBook для сохранения страницы или текста в нужную папку').click();

bunda1
Спасибо за ScrapBook. Так просто... :)

Укажи в главных настройках FF папку для сохранения.

Указан "E:\", может поэтому? Или потому что [nightly]. Но не работает.

turbot пишет

Указан "E:\", может поэтому? Или потому что [nightly]. Но не работает.

Странно, я сейчас установил [nightly] и также указал

в настройках диск E:
98ecbb03d09f14b01e42f2d0442c674c.jpg

и у меня сохраняет без запроса. Может сбрось все настройки и тогда попробуй сохранить.

bunda1
Да, спасибо, на чистом профиле работает. Сбило с толку, что обнаружил неработоспособность, как раз когда с другими кнопками эта проблема появилась. Буду ковырять причину. Виноват.

А случаем ни у кого  нет кнопочки для замены Go Parent Folder?
ПС Или может для кого-нибудь не сложно сделать, если такой нет в природе. :)

voqabuhe пишет

А случаем ни у кого  нет кнопочки для замены Go Parent Folder?
ПС Или может для кого-нибудь не сложно сделать, если такой нет в природе. :)

Тогда уж заодно желательно бы сделать и Show Parent Folder

bunda1
Выручай, перестала работать кнопка переключения стилей на 36 [firefox]

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

Выделить код

Код:

// ЛКМ переключить настройки кнопки и стиль ..........
this._handleClick = function() setStyleForPages(void(run.value = !run.value));


// Создать настройки кнопки в about:config если они не существует ..........
var s = "CB" + _id.slice(20) + ".setStyleForPage";
cbu.isPref(s, false);
var previousUri = "CB" + _id.slice(20) + ".previousUri";


// Получить настройки кнопки и css код из вкладки Справка ..........
var css = self.Help;
var run = Application.prefs.get(s);
    




// Переключить css стиль для страницы ..........
function setStyleForPages(reason) {
   if ( reason == "destructor" ) return; 

   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); 
   var uri = makeURI("data:text/css," + encodeURIComponent(css)); 
   
   try { sss.unregisterSheet(Services[_id + "previousUri"] || uri, 0) } catch(e) {};
   Services[_id + "previousUri"] = uri;
   
   run.value && !reason && sss.loadAndRegisterSheet( uri, 0 );
};
addDestructor(setStyleForPages);
run.value && setStyleForPages();


// Подсказка для кнопки .......... 
this.tooltipText = "Л: Переключить черный фон страниц";


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

difabor пишет
voqabuhe пишет

А случаем ни у кого  нет кнопочки для замены Go Parent Folder?
ПС Или может для кого-нибудь не сложно сделать, если такой нет в природе. :)

Тогда уж заодно желательно бы сделать и Show Parent Folder

Горячо поддерживаю! show parent folder очень бы не помешала.

а поиском воспользоваться тяжело?
совсем обленились.

А разве эта кнопка существует в природе, что её можно найти поиском?

villa7,

кнопка от Infocatcher-а

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EStyle%20toggler%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-1%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0Athis.toggleStyle%20%3D%20function%28enable%29%20%7B%0A%20%20%20%20var%20cssURI%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28this.Help%29%29%3B%0A%20%20%20%20var%20sss%20%3D%20Components.classes%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIStyleSheetService%29%3B%0A%20%20%20%20this.toggleStyle%20%3D%20function%28enable%29%20%7B%0A%20%20%20%20%20%20%20%20if%28enable%20%3D%3D%20undefined%29%0A%20%20%20%20%20%20%20%20%20%20%20%20enable%20%3D%20%21this.checked%3B%0A%20%20%20%20%20%20%20%20this.checked%20%3D%20enable%3B%0A%20%20%20%20%20%20%20%20document.persist%28this.id%2C%20%22checked%22%29%3B%0A%20%20%20%20%20%20%20%20var%20has%20%3D%20sss.sheetRegistered%28cssURI%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%20%20%20%20%20if%28enable%20%26%26%20%21has%29%0A%20%20%20%20%20%20%20%20%20%20%20%20sss.loadAndRegisterSheet%28cssURI%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%20%20%20%20%20else%20if%28%21enable%20%26%26%20has%29%0A%20%20%20%20%20%20%20%20%20%20%20%20sss.unregisterSheet%28cssURI%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20this.toggleStyle%28enable%29%3B%0A%7D%3B%0Aif%28this.checked%29%0A%20%20%20%20this.toggleStyle%28true%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Athis.toggleStyle%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B/*%u0430%u0432%u0442%u043E%u0440%20Infocatcher%20%u043A%u043D%u043E%u043F%u043A%u0430%20%22%u043F%u043E%u043C%u043D%u0438%u0442%22%20%u0441%u0432%u043E%u0435%20%u0441%u043E%u0441%u0442%u043E%u044F%u043D%u0438%u0435%20%u043F%u043E%u0441%u043B%u0435%20%u043F%u0435%u0440%u0435%u0437%u0430%u043F%u0443%u0441%u043A%u0430%20firefox%2C%20%u0442%u043E%20%u0435%u0441%u0442%u044C%20%u0431%u044B%u043B%u0430%20%u043E%u043D%u0430%20%22%u0432%u043A%u043B.%22%20%u0438%u043B%u0438%20%22%u0432%u044B%u043A%u043B.%22%20*/%0A%0A/*http%3A//userstyles.org/styles/45663/global-pseudo-brightness-control*/%0A%0A%0A@namespace%20url%28http%3A//www.w3.org/1999/xhtml%29%3B%0A%0A@-moz-document%20url-prefix%28http%3A//%29%2C%20url-prefix%28https%3A//%29%2C%20url-prefix%28ftp%3A//%29%2C%20url-prefix%28file%3A//%29%2C%20url-prefix%28about%3A%29%7B%0A%0A%0A%0Ahtml%3Aafter%20%7B%0A%0A%0A%0Acontent%3A%22%22%20%21important%3B%0A%0Aposition%3A%20fixed%20%21important%3B%0A%0Atop%3A%200%20%21important%3B%0A%0Abottom%3A%200%20%21important%3B%0A%0Aleft%3A%200%20%21important%3B%0A%0Aright%3A%200%20%21important%3B%0A%0A/*background%3A%20%23000%20%21important%3B*/%0A/*background%3A%20%23002288%20%21important%3B*/%0Abackground%3A%20-moz-linear-gradient%28top%2C%20rgba%280%2C0%2C255%2C1%29%200%25%2C%20rgba%28110%2C119%2C116%2C1%29%2050%25%2C%20rgba%2810%2C14%2C10%2C1%29%2051%25%2C%20rgba%2810%2C8%2C9%2C1%29%20100%25%29%20%21important%3B%0A/*background%3A%23CDCDFD%21important%3B*/%0Az-index%3A%2099999999%20%21important%3B%0A%0Apointer-events%3A%20none%20%21important%3B%0A%0Aopacity%3A%20.2%20%21important%7D%0A%0A%0A%0A%7D%0A%0A%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


Кнопка "помнит" свое состояние после перезапуска [firefox], то есть была она "вкл." или "выкл." Не пишет в about:config. В раздел "Справка" вставить свой стиль.

SendInfo
Тоже самое, добавил стили для сайтов, некоторые сайты открывает чёрными страницами без букв, где в стиле фон чёрный. На 34 всё нормально.

villa7, а можно сам стиль. Я у себя посмотрю. Думается мне здесь дело не в js, а в css.

rbfyec пишет

А разве эта кнопка существует в природе, что её можно найти поиском?

Да нет такой кнопки, во всяком случае в свободном доступе. Это он так, чтобы в разговор встрясть :sick:, не обращай внимания.

voqabuhe пишет

А случаем ни у кого  нет кнопочки для замены Go Parent Folder?
ПС Или может для кого-нибудь не сложно сделать, если такой нет в природе. :)

А что делает это расширение?

bunda1
После поиска нужной закладки по ключевому слову, открывается  список закладок без папок их размещения.  Так вот расширение добавляет в контекстное меню закладок пункт Go Parent Folder, нажатие на который осуществляет переход в родительскую папку закладки.

voqabuhe пишет

bunda1
После поиска нужной закладки по ключевому слову, открывается  список закладок без папок их размещения.  Так вот расширение добавляет в контекстное меню закладок пункт Go Parent Folder, нажатие на который осуществляет переход в родительскую папку закладки.

А Show Parent Folder добавляет колонку в Библиотеку закладок в которой указывается Parent Folder - полезно для меток, недавних добавлений и пр. В остальных случаях - не нужна, но эту колонку можно и убирать

villa7 пишет

bunda1
Выручай, перестала работать кнопка переключения стилей на 36 [firefox]
Сайты где менял на чёрный стиль загружаются всё в чёрном, если отключить кнопку и загрузить а потом включить, то стиль срабатывает, а вот загружаться сразу с включенной кнопкой не хочет.

Похоже дело не в кнопке а в Css чёрном стиле, с другими стилями порядок. Советую удалять куски чёрного стиля по одному чтобы узнать где ошибка. Странно что консоль ошибок ничего не показывает.

bunda1
А на 34 всё нормально было, жалко тёмные стили удалять, у меня они почти везде на постоянно посещаемых сайтах. Ладно, будем думать.
P.S. Забыл добавить, некоторые сайты с чёрным стилем открывает, а некоторые нет.

SendInfo
Вот к примеру в 36 [firefox] перестал открывать, хотя в 34 [firefox] всё нормально.

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

Выделить код

Код:

/*######################RUBOARD##################*/
@-moz-document domain("forum.ru-board.com"), 
domain("gallery.ru-board.com"),
domain("forall.ru-board.com")
{
div, body, .tit, table, td, form{background: #333333 !important; }
font, td,  a {color: #cccccc !important;}
span {color: #f2f2f2 !important;}
.dats {background: #444444 !important;}
a:link {color: #dddddd !important;}
.lgf, table {border-color: #333333 !important;}
img[src="board/temp/itech-promo/r/4.gif"], img[src="board/temp/itech-promo/r/1.gif"], img[src="board/temp/itech-promo/r/3.gif"], img[src="board/temp/itech-promo/r/2.gif"], img[src="board/temp/itech-promo/r/5.gif"], img[src="board/temp/itech-promo/r/6.gif"], img[src="board/temp/itech-promo/r/7.gif"], img[src="board/temp/itech-promo/r/8.gif"], img[src="board/temp/itech-promo/r/9.gif"], img[src="board/temp/itech-promo/r/10.gif"] 
{display: none !important;}
textarea{
-moz-appearance: none !important;
background-color: #333333 !important; 
color: #e2e2e2 !important;}}


http://forum.ru-board.com/topic.cgi?for … start=4680

villa7

кнопка от Infocatcher-а
h_1425685905_3930317_fc826df4a3.png

SendInfo
Бред какой то происходит. 36 [firefox] полностью чистая, только СВ 0.0.5.8
положил один стиль, и не фурычит.
a20ae1d6040ed04a862f9700a9ef52fe.jpeg
СВ 0.0.5.9pre1 тоже не помогает, чудеса.
Вы на какой версии проверяли, на 34 [firefox] этот же стиль нормально открывает, а на 36 уже не хочет.
Проверил на 38 [firefox] для успокоения души, открывает нормально. Как же они задолбали своими экспериментами. Придется следующих версий ждать, если опять чего нибудь не нахимичат.

voqabuhe пишет

После поиска нужной закладки по ключевому слову, открывается  список закладок без папок их размещения.  Так вот расширение добавляет в контекстное меню закладок пункт Go Parent Folder, нажатие на который осуществляет переход в родительскую папку закладки.

Ну, раз уж согласился на стиль, тогда может попробуй обновить этим. Бэкап, рестарт, и всё такое.

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

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

#placesContext .box-inherit.scrollbox-innerbox {
    -moz-binding: url('data:application/xml,\
\
<?xml version="1.0"?>\%0A\
<bindings xmlns="http://www.mozilla.org/xbl">\%0A\
    <binding id="placesContext_extraMenuitems">\%0A\
        <implementation>\%0A\
            <constructor>\%0A\
                <![CDATA[\%0A\
                    var before = document.getElementById("placesContext_editSeparator");\%0A\
                    var popup = this.linkedPopup = this.parentNode.parentNode.parentNode;\%0A\
                    var menuitem = popup.insertBefore(document.createElement("menuitem"), before);\%0A\
                    menuitem.id = "placesContext_updateBookmarkURL";\%0A\
                    menuitem.setAttribute("label", decodeURIComponent(\%0A\
                        "%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D1%83"\%0A\
                    ));\%0A\
                    menuitem.setAttribute("oncommand", "this.cmd();");\%0A\
                    menuitem.cmd = function() {\%0A\
                        var id = popup._view.selectedNode.itemId;\%0A\
                        var win = Services.wm.getMostRecentWindow("navigator:browser");\%0A\
                        var {currentURI: uri, selectedBrowser: br, selectedTab: tab} = win.gBrowser;\%0A\
\%0A\
                        PlacesUtils.bookmarks.changeBookmarkURI(id, uri);\%0A\
                        PlacesUtils.bookmarks.setItemTitle(id, tab.label);\%0A\
\%0A\
                        var favicon = br.mIconURL, fs = Ci.nsIFaviconService;\%0A\
                        var faviconURI = favicon ? win.makeURI(favicon) : PlacesUtils.favicons.defaultFavicon;\%0A\
                        var private = win.PrivateBrowsingUtils.isBrowserPrivate(br);\%0A\
                        PlacesUtils.favicons.setAndFetchFaviconForPage(uri, faviconURI, true,\%0A\
                            private ? fs.FAVICON_LOAD_PRIVATE : fs.FAVICON_LOAD_NON_PRIVATE\%0A\
                        );\%0A\
                    }\%0A\
\%0A\
                    var menuitem2 = popup.insertBefore(document.createElement("menuitem"), before);\%0A\
                    menuitem2.id = "placesContext_goParentFolder";\%0A\
                    menuitem2.setAttribute("label", decodeURIComponent(\%0A\
                        "Go Parent Folder"\%0A\
                    ));\%0A\
                    function sel(view, id) {\%0A\
                        var str = "node.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER";\%0A\
                        var src = view.selectItems.toString();\%0A\
                        var code = src.replace(str + ";", "(" + str + " || " + str + "_SHORTCUT);");\%0A\
                        view.place = view.place; eval("(" + code + ")").bind(view)([id]);\%0A\
                        vis(view);\%0A\
                    }\%0A\
                    function vis(tree) {\%0A\
                        var pos = 0.5, tbo = tree.treeBoxObject;\%0A\
                        var ind = tbo.view.selection.currentIndex;\%0A\
                        var first = tbo.getFirstVisibleRow();\%0A\
                        var visibleRows = tbo.height/tbo.rowHeight;\%0A\
                        var newFirst = ind - pos*visibleRows + 1;\%0A\
                        tbo.scrollByLines(Math.round(newFirst - first));\%0A\
                    }\%0A\
                    menuitem2.setAttribute("oncommand", "this.cmd();");\%0A\
                    menuitem2.cmd = function() {\%0A\
                        var view = popup._view, id = view.selectedNode.itemId;\%0A\
                        if (view.id == "placeContent") {\%0A\
                            var plView = document.getElementById("placesList");\%0A\
                            var parentId = PlacesUtils.bookmarks.getFolderIdForItem(id);\%0A\
                            sel(plView, parentId);\%0A\
                            setTimeout(() => {view.selectItems([id]); vis(view);}, 100);\%0A\
                        } else\%0A\
                            sel(view, id);\%0A\
                    }\%0A\
                    var handler = this.linkedPopupPopupshowihgHandler = function () {\%0A\
                        var place = (popup._view.selectedNodes.length == 1) && popup._view.selectedNode;\%0A\
                        menuitem.hidden = menuitem.disabled = !(place && PlacesUtils.nodeIsBookmark(place));\%0A\
                        menuitem2.hidden = menuitem2.disabled = menuitem.hidden || !location.href.contains("a");\%0A\
                    };\%0A\
                    handler(); popup.addEventListener("popupshowing", handler);\%0A\
                ]]>\%0A\
            </constructor>\%0A\
            <destructor>\%0A\
                    this.linkedPopup.removeEventListener("popupshowing", this.linkedPopupPopupshowihgHandler);\%0A\
            </destructor>\%0A\
        </implementation>\%0A\
    </binding>\%0A\
</bindings>\
\
    ') !important;
}

Dumby
А не поправите вашу кнопку

orPaste for Stylish

Выделить код

Код:

var theSeparator = "►►►►►►►";
    theSeparator = "\n" + theSeparator + "\n";

var items = this.Help.split(theSeparator);

//====================================================================================
this.imageOn  = "data:image/gif;base64,R0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs=";

this.imageOff = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==";

this.image = this.imageOn;
//====================================================================================

var cbIdNumber = this.id.replace("custombuttons-button", "");
var insertButtonId = "or-paste-by-cb" + cbIdNumber;

//====================================================================================

var prefs = Components.classes["@mozilla.org/preferences-service;1"]
            .getService(Components.interfaces.nsIPrefService)
            .getBranch("custombutton.orPasteForStylish.");
try      { var pref = prefs.getBoolPref("off"); }
catch(e) { prefs.setBoolPref("off", false); };
this.off = prefs.getBoolPref("off");

//====================================================================================

const  kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

function createButton(aWindow) {

var  button = document.createElementNS(kXULNS, "button");
     button.setAttribute("id", insertButtonId);
     button.setAttribute("class", "devtools-toolbarbutton");
     button.setAttribute("type", "menu");
     button.setAttribute("label", "Шаблоны");

var  menupopup = document.createElementNS(kXULNS, "menupopup");
     button.appendChild(menupopup);
     
     aWindow["textStorage" + cbIdNumber] = [];  // :D

for (var i = 0; i < items.length; i++) {

  var  menuitem = document.createElementNS(kXULNS, "menuitem");

  var      label = items[i].split("\n",1);
  var insertText = items[i].replace(label + "\n", "");
  
       aWindow["textStorage" + cbIdNumber].push(insertText)

       menuitem.setAttribute("label", label);


  var  Arg = "this.ownerDocument.defaultView" +
             ".textStorage" + cbIdNumber + "[" + i + "]";
  var  commandString = "insertCodeAtCaret(" + Arg + ")";
  
       menuitem.setAttribute("oncommand", commandString);
       menupopup.appendChild(menuitem); }
       
       return button; }
       
//===================================================================================

function isButtonAlredyPresent(aDoc) { // advice by Inforcatcher
             return !!aDoc.getElementById(insertButtonId); }

//===================================================================================

var oSvc = Components.classes["@mozilla.org/observer-service;1"]
           .getService(Components.interfaces.nsIObserverService);

var observer = { // thanks for Infocatcher

observe: function(subject, topic, data) {
         subject.addEventListener("load", this, false); },
      
handleEvent: function(e) { var doc = e.target;
                           var win = doc.defaultView;
                           var pageURL = doc.location.href;
                           win.removeEventListener("load", this, false);
                          if(!/^about:stylish-edit/.test(pageURL)) return;

    var hbox = doc.getElementById("editor-tools");
    var btn = hbox.lastChild;

    if (!isButtonAlredyPresent(doc)) {
       hbox.insertBefore(createButton(win), btn.nextElementSibling); }}};

//==================================================================================

var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
         .getService(Components.interfaces.nsIWindowWatcher);

var activeWin = null;         
this.onmouseover = function() { activeWin = ww.activeWindow; }

//====================================================================================

this.run = function() { 

  if (!this.off)  { oSvc.addObserver(observer, "domwindowopened", false);
                    prefs.setBoolPref("off", false); }
                    
  if (this.off )  { oSvc.removeObserver(observer, "domwindowopened");
                    prefs.setBoolPref("off", true); }
   
  var enumerator = ww.getWindowEnumerator();
  var win = true;
  while (win) { win = enumerator.getNext();
                if (!win) return;
                var doc = win.document;
                var pageURL = doc.location.href;
                if (!/^about:stylish-edit/.test(pageURL)) continue;

        if (!this.off) { if ( isButtonAlredyPresent(doc))  continue; 

                         var hbox = doc.getElementById("editor-tools");
                         var btn = hbox.firstChild;
                         hbox.insertBefore(createButton(win), btn.nextElementSibling);
                         if (win == activeWin) win.focus(); }

        if (this.off)  { var b = doc.getElementById(insertButtonId);
            
                         while (b) { b = doc.getElementById(insertButtonId);
                                     if (b) { b.parentElement.removeChild(b); }
                                     if (win == activeWin) win.focus();  }}
            }}

//====================================================================================

if (this.off) { this.image = this.imageOff; return; }

this.run();

//====================================================================================

this.onDestroy = function() { // thanks for Infocatcher, again
    var on = !this.off;
    if(on) this.off = true;
    this.run();
    if(on) { this.off = false; prefs.setBoolPref("off", false); }};


Если с редактором последней версии Stylish'а, открытым в окне, я разобрался ((!/^about:stylish-edit/.test(pageURL)) - там при редактировании id стиля к адресу в конце добавляется), то заставить его работать с редактором, открытым во вкладке, у меня не выходит. И, если можно, еще хотелка - добавить сепаратор, который бы запихивал шаблоны между ним в подменю. Тоже с этим не заладилось, а список уже излишне разросся... shuffle.gif Спасибо.

villa7,проверял на[nightly]39 . В профиле указано. Попробуйте только эту кнопку , в ней уже ваш стиль, не меняя ничего.

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EStyle%20toggler%20RUBOARD%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-1%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0Athis.toggleStyle%20%3D%20function%28enable%29%20%7B%0A%20%20%20%20var%20cssURI%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28this.Help%29%29%3B%0A%20%20%20%20var%20sss%20%3D%20Components.classes%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIStyleSheetService%29%3B%0A%20%20%20%20this.toggleStyle%20%3D%20function%28enable%29%20%7B%0A%20%20%20%20%20%20%20%20if%28enable%20%3D%3D%20undefined%29%0A%20%20%20%20%20%20%20%20%20%20%20%20enable%20%3D%20%21this.checked%3B%0A%20%20%20%20%20%20%20%20this.checked%20%3D%20enable%3B%0A%20%20%20%20%20%20%20%20document.persist%28this.id%2C%20%22checked%22%29%3B%0A%20%20%20%20%20%20%20%20var%20has%20%3D%20sss.sheetRegistered%28cssURI%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%20%20%20%20%20if%28enable%20%26%26%20%21has%29%0A%20%20%20%20%20%20%20%20%20%20%20%20sss.loadAndRegisterSheet%28cssURI%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%20%20%20%20%20else%20if%28%21enable%20%26%26%20has%29%0A%20%20%20%20%20%20%20%20%20%20%20%20sss.unregisterSheet%28cssURI%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20this.toggleStyle%28enable%29%3B%0A%7D%3B%0Aif%28this.checked%29%0A%20%20%20%20this.toggleStyle%28true%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Athis.toggleStyle%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B/*%u0430%u0432%u0442%u043E%u0440%20Infocatcher%20%u043A%u043D%u043E%u043F%u043A%u0430%20%22%u043F%u043E%u043C%u043D%u0438%u0442%22%20%u0441%u0432%u043E%u0435%20%u0441%u043E%u0441%u0442%u043E%u044F%u043D%u0438%u0435%20%u043F%u043E%u0441%u043B%u0435%20%u043F%u0435%u0440%u0435%u0437%u0430%u043F%u0443%u0441%u043A%u0430%20firefox%2C%20%u0442%u043E%20%u0435%u0441%u0442%u044C%20%u0431%u044B%u043B%u0430%20%u043E%u043D%u0430%20%22%u0432%u043A%u043B.%22%20%u0438%u043B%u0438%20%22%u0432%u044B%u043A%u043B.%22%20*/%0A/*%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23RUBOARD%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23*/%0A@namespace%20url%28http%3A//www.w3.org/1999/xhtml%29%3B%0A@-moz-document%20domain%28%22forum.ru-board.com%22%29%2C%20%0Adomain%28%22gallery.ru-board.com%22%29%2C%0Adomain%28%22forall.ru-board.com%22%29%0A%7B%0Adiv%2C%20body%2C%20.tit%2C%20table%2C%20td%2C%20form%7Bbackground%3A%20%23333333%20%21important%3B%20%7D%0Afont%2C%20td%2C%20%20a%20%7Bcolor%3A%20%23cccccc%20%21important%3B%7D%0Aspan%20%7Bcolor%3A%20%23f2f2f2%20%21important%3B%7D%0A.dats%20%7Bbackground%3A%20%23444444%20%21important%3B%7D%0Aa%3Alink%20%7Bcolor%3A%20%23dddddd%20%21important%3B%7D%0A.lgf%2C%20table%20%7Bborder-color%3A%20%23333333%20%21important%3B%7D%0Aimg%5Bsrc%3D%22board/temp/itech-promo/r/4.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/1.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/3.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/2.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/5.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/6.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/7.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/8.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/9.gif%22%5D%2C%20img%5Bsrc%3D%22board/temp/itech-promo/r/10.gif%22%5D%20%0A%7Bdisplay%3A%20none%20%21important%3B%7D%0Atextarea%7B%0A-moz-appearance%3A%20none%20%21important%3B%0Abackground-color%3A%20%23333333%20%21important%3B%20%0Acolor%3A%20%23e2e2e2%20%21important%3B%7D%7D%0A%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


. И отключите все другие стили. Может где-то пересекаются.

SendInfo пишет

проверял на[nightly]39

Попроубуйте Инспектор открыть с включенной кнопкой. :)

villa7
Замените в коде кнопки AGENT_SHEET на USER_SHEET. У меня вроде тогда порядок со стилем.

turbot пишет

Попроубуйте Инспектор открыть с включенной кнопкой.

Да пожалуйста:

скрытый текст
%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA%20CB%20|%20%D0%A4%D0%BE%D1%80%D1%83%D0%BC%20Mozilla%20%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F%20-%20Nightly.png

Dumby пишет

Ну, раз уж согласился на стиль, тогда может попробуй обновить этим. Бэкап, рестарт, и всё такое.

Ну как всегда просто шикарно. Огромное спасибо.:beer:. Минус ещё одно расширение. И что самое приятное стиль работает заметно быстрее, чем соответствующее расширение.
ПС Это что же получается, так со временем у всех останется одно расширение Stylish?:D

SendInfo
Я имею в виду на ру-борде, с включенным стилем.

SendInfo
Не открывает.
turbot
Заменил в кнопке AGENT_SHEET на USER_SHEET стал открывать, но тогда почему с AGENT_SHEET работает и в 38 и в 34, а в 36 не хочет, мистика.

villa7 пишет

SendInfo
Не открывает.
turbot
Заменил в кнопке AGENT_SHEET на USER_SHEET стал открывать, но тогда почему с AGENT_SHEET работает и в 38 и в 34, а в 36 не хочет, мистика.

Да мистика, что то наверно поменяли, но помнится в старых версиях <36 с USER_SHEET тоже работали не все стили

turbot,в вопросе villa7 об инспекторе ни слова, я его и не смотрел. А то что на сайте у меня работает - ранее выложен скрин.

Вот есть такая кнопка "deletion flash cookies"

Выделить код

Код:

var dir = Components.classes["@mozilla.org/file/directory_service;1"]
          .getService(Components.interfaces.nsIProperties)
          .get("Home", Components.interfaces.nsIFile);

dir.append("Application Data");
dir.append("Macromedia");
dir.remove(true);

У меня не работает. Кто может починить?

SendInfo
Оно и у меня работает. Пока Инспектор не открою. Видимо, при открытии Инспектора, повер страницы располагается какой-то прозрачный div, к которому и применяется правило

Выделить код

Код:

div, body, .tit, table, td{background: #333333 !important; }

с AGENT_SHEET, и, соответственно, он становится непрозрачным. А вот что у villa7 поверх страницы расположено - фиг знает.


villa7
Можете, кстати, просто div убрать из стиля (я не увидел, чтоб это что-то поломало в стиле), а то без AGENT_SHEET браузер перебивает некоторые стили, например к input. Либо:

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

Выделить код

Код:

@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document domain("forum.ru-board.com"), 
domain("gallery.ru-board.com"),
domain("forall.ru-board.com")
{div,body,.tit,table,td{background:#333333!important}
font,td,a{color:#cccccc!important}
span{color:#f2f2f2!important}
.dats{background:#444444!important}
a:link{color:#dddddd!important}
.lgf,table {border-color:#333333!important}
img[src*="/itech-promo/"]{display:none!important}
textarea,select,input,form,img[src^='http://i.ru-board.com/images/']{filter:grayscale(100%)invert(80%)!important}}

Нужно включить поддержку свойства filter в about:config: layout.css.filters.enabled;true.

С ними можно и вовсе радикально сделать:

Выделить код

Код:

@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document domain("forum.ru-board.com"), 
domain("gallery.ru-board.com"),
domain("forall.ru-board.com")
{body{background: #303030!important}
html{filter:grayscale(100%) invert(80%)!important}}

Да-да, я для себя их недавно открыл, и теперь всюду сую. :)

lokiju пишет

Вот есть такая кнопка "deletion flash cookies"

Выделить код

Код:

var dir = Components.classes["@mozilla.org/file/directory_service;1"]
          .getService(Components.interfaces.nsIProperties)
          .get("Home", Components.interfaces.nsIFile);

dir.append("Application Data");
dir.append("Macromedia");
dir.remove(true);

У меня не работает. Кто может починить?

Выделить код

Код:

var dir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).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);

turbot
Всё это понятно, непонятно почему только в 36 [firefox] не пашет, а в 34,38 нормально.

bunda1, нет не удаляет содержимое "Macromedia".

lokiju пишет

нет не удаляет содержимое "Macromedia".

Всё удаляет, положи во вкладку Код

voqabuhe пишет

lokiju пишет: нет не удаляет содержимое "Macromedia".Всё удаляет, положи во вкладку Код

Там и лежит. Но содержимому "Macromedia" все равно. И Вetter Privacy удалено по той же причине.

lokiju
Может, в этом причина:

Mozilla/5.0 (X11; Linux i686; rv:39.0) Gecko/20100101 Firefox/39.0

A: In Firefox open BetterPrivacy (Menu->Tools->BetterPrivacy) and enter the correct path of your Flash data directory. Depending on your operating system this should be one of the following paths:
Windows: %APPDATA%\Macromedia\Flash Player\
Macintosh: ~/Library/Preferences/Macromedia/Flash Player/
Linux/Unix: ~/.macromedia/Flash_Player/

Если, конечно, ваш юзерагент не врет, как мой. :rolleyes:

turbot пишет

lokijuМожет, в этом причина:Mozilla/5.0 (X11; Linux i686; rv:39.0) Gecko/20100101

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

turbot пишет

Firefox/39.0A: In Firefox open BetterPrivacy (Menu->Tools->BetterPrivacy) and enter the correct path of your Flash data directory. Depending on your operating system this should be one of the following paths:Windows: %APPDATA%\Macromedia\Flash Player\Macintosh: ~/Library/Preferences/Macromedia/Flash Player/Linux/Unix: ~/.macromedia/Flash_Player/
Если, конечно, ваш юзерагент не врет, как мой.

Нет не врет.

lokiju пишет

bunda1, нет не удаляет содержимое "Macromedia".

Да, мой код для Windows, может попробуй этот код:

Выделить код

Код:

var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
dir.initWithPath("C:\\Macromedia");
dir.exists() && dir.remove(true);
!dir.exists() && dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);

Но вместо C:\\Macromedia укажи свой свой путь к папке Macromedia, может с двумя \\

bunda1

Выделить код

Код:

var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
dir.initWithPath("~/.macromedia/");
dir.exists() && dir.remove(true);
!dir.exists() && dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);

Вот так удаляет

08-03-2015 02:54:42
bunda1
А как сделать чтобы чистилось две папки .macromedia и .adobe одной кнопкой?

lokiju пишет

bunda1
А как сделать чтобы чистилось две папки .macromedia и .adobe одной кнопкой?

Выделить код

Код:

var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
dir.initWithPath("~/.macromedia/");
dir.exists() && dir.remove(true);
!dir.exists() && dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
dir.initWithPath("~/.adobe/");
dir.exists() && dir.remove(true);
!dir.exists() && dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
turbot пишет

работать с редактором, открытым во вкладке, у меня не выходит

Я попробовал запилить, вроде вставляет, наверно :/.

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

Выделить код

Код:

({
    buttonsData: [
        {
            "BUTTON 1": {
                image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==",
                id: "Button-1-id",
                data: {
                    "Button 1 menuitem 1": `
8461257969972130394635750604812869365370931486851886606643085
6226096450462739462668149466854904346848587433786390959291217
859556681023673155470765942664293343867480839875179799100937521
                    `,
                    "Button 1 menuitem 2": `
211719589689090920082926741548657453548273240041478388434571297
    9467134014976113453058689329012399251109065413787280533498154
9033973941518880395243302959334777718781604739376219685379215

                    `,
                    "Button 1 menu 1": {
                        "Button 1 menu 1 menuitem 1": `

2051991579069607310657879309722017441960000137380237785566423
82366451515210699197167835877150747720503556174426352286230224
245703349625817314565034119246802882333194576375906748723837

                        `,
                        "Button 1 menu 1 menuitem 2": `
218722713331159305668806110918112536255804285389845217355049114
8310252513869211823316302359823897208708687865872857059938107
030564260447343283699623654152284462156273428194141667685271482

                        `,
                        "Button 1 menu 1 menu 1": {
                            "Button 1 menu 1 menu 1 menuitem 1": `
281804303220221146597605561935037356359018645418047020458794

4384938073647720339731610031281287090482630762556709830910227

399140227763397062946197043867452445291342396083641831699693
                            `
                        }
                    }
                }
            }
        },
//◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙
        {
            "BUTTON 2": {
                image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBjP+TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEj///NEX//3F9//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0gf//MEH//yg6//80Rf//fYn//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBjP//M0P//yg6//8oOv//KDr//zRF//90gf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANrg/41UYv//M0T//yg6//8oOv//KDr//yg6//8oOv//MEH//0hX///W3P+NAAAAAAAAAAAAAAAAAAAAANbc/40xQv//LD3//ys8//8rPP//Kzz//ys8//8rPP//Kzz//ys8//8rPP//Kzv//9bc/40AAAAAAAAAAAAAAABBUP//MEP//zJF//8yRf//MkX//zJF//8yRf//MkX//zJF//8yRf//MkX//zFE//84SP//AAAAAAAAAAC0vP+NOUn//zxQ//88UP//PFD//zxQ//88UP//PFD//zxQ//88UP//PFD//zxQ//88UP//OEn//52n/40AAAAAl6H/jTpO//9GXf//Rl3//0Zd//9GXf//Rl3//0Zd//9GXf//Rl3//0Zd//9GXf//Rl3//zlN//97h/+NAAAAAKSt/40/Uf//UWr//1Fq//9Rav//UWr//1Fq//9Rav//UWr//1Fq//9Rav//UWr//1Fq//8+U///jpj/jQAAAADR1/+NNEb//1t2//9bdv//W3b//1t2//9Ycv//OUv//1hy//9bdv//W3b//1t2//9bdv//PU///7rC/40AAAAAAAAAAGZ0//9GXP//Y3///2N///9ge///QVT//4GN/404Sv//X3r//2N///9jf///Rlz//1xr//8AAAAAAAAAAAAAAAAAAAAAXGv//ztN//9AU///MEH//3yI/40AAAAAhJD/jTFC//9AU///OUr//1po///a4P+NAAAAAAAAAAAAAAAAAAAAAAAAAADDyv+Ntr7/jQAAAAAAAAAAAAAAAAAAAAAAAAAAtr7/jcrR/40AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf9/rEH+P6xB/B+sQfgPrEHgA6xBwAGsQcABrEGAAKxBgACsQYAArEGAAKxBwAGsQeCBrEHz56xB//+sQQ==",
                id: "Button-2-id",
                data: {
                    "Button 2 menuitem 1": `
1704808533483901912593511057615798482706959734226981232605644
554364593368568792241103455746052909837105410644466183177142
8491036970273453442391718902925334048053461781577074832179994
                    `,
                    "Button 2 menu 1": {
                        "Button 2 menu 1 menuitem 1": `
9188134855185033238311828665629715333876611982705880582763672
78018885404637109297633520    043865080315035899737560093465767124
395336760559446747709696748148666879296254004631107783736979
                        `,
                        "Button 2 menu 1 menuitem 2": `
5680021603172030840205691680158991695283324356770429331137686
485734254327862726853675364881849334230932442689674286326549
42123122519280921504265246263330912181059123544347533761097224
                        `
                    },
                    "Button 2 menuitem 2": `
639315668318676304872944474192825257426286701763560448668300918
6516906487685234047552040688776748056337078135324403316543704
61982903287961345045288774833253159273727795146141071494331236
                    `
                }
            }
        },
//◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙◙
        {
            "I am a Human": {
                image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////////////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////////////////wAAAP////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD//////wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA//////8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////////////////////////////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////////////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==",
                id: "Invent-this-id",
                data: {
                    "q": `
« """ ''' \`\`\`... »
                    `,
                    "template strings stuff": `
${xhtmlns}\n${xulns}\n\n${"inserted by " + _id}
                    `,
                    "¯\\_(ツ)_/¯": `
¯\\_(ツ)_/¯
                    `
                }
            }
        }
    ],
    id: "cb-stylish-paste-buttons-box",
    isStylishTab: function(doc) doc.location.href.startsWith("about:stylish-edit"),
    get buttons () {
        delete this.buttons;
        return this.createButtons();
    },
    createButtons: function() {
        var box = this.insertElement("hbox", null, {id: this.id});
        for(var buttonData of this.buttonsData) {
            var key = Object.keys(buttonData)[0], data = buttonData[key];
            var btn = this.insertElement("toolbarbutton", box, data);
            btn.tooltipText = key; btn.linkedPopup = this.createPopup(data.data);
            btn.setAttribute("oncommand", "var popup = this.appendChild(this.linkedPopup); popup.openPopup(this);");
        }
        return this.buttons = box;
    },
    createPopup: function(data, notRoot) {
        var popup = this.insertElement("menupopup");
        notRoot || popup.setAttribute("position", "after_start");
        popup.setAttribute("oncommand", "event.stopPropagation(); insertCodeAtCaret(event.originalTarget.value);");
        for(var [key, val] in Iterator(data)) {
            if (typeof val == "string") {
                var value = val.slice(val.indexOf("\n") + 1, val.lastIndexOf("\n"));
                var menuitem = this.insertElement("menuitem", popup, {label: key, value: value});
                menuitem.tooltipText = value;
            } else {
                var menu = this.insertElement("menu", popup, {label: key});
                this.insertElement(this.createPopup(val, true), menu);
            }
        }
        return popup;
    },
    insertElement: function(element, parent, attributes, before = null) {
        var notExist = typeof element != "object";
        if (notExist) element = document.createElement(element);
        if (notExist && attributes) {
            for(var attribute in attributes) {
                attribute == "data" || element.setAttribute(attribute, attributes[attribute]);
            }
        }
        parent && parent.insertBefore(element, before);
        return element;
    },
    deleteAndAddForDoc(add, doc) {
        var box = doc.getElementById(this.id);
        box && box.remove();
        add && this.pageshow({target: doc});
    },
    deleteAndAddForAll(add) {
        for(var br of gBrowser.browsers) {
            var doc = br.contentDocument;
            this.isStylishTab(doc) && this.deleteAndAddForDoc(add, doc);
        }
    },
    init: function() {
        addEventListener("pageshow", this, false, gBrowser);
        this.deleteAndAddForAll(true);
        addDestructor(() => this.deleteAndAddForAll(), this);
    },
    handleEvent: function(e) this[e.type](e),
    pageshow: function(e) {
        if (!this.isStylishTab(e.target)) return;
        var before = e.target.getElementById("wrap-lines");
        var buttons = this.buttons, clone = buttons.cloneNode(true);
        before && this.insertElement(clone, before.parentNode, null, before);
        for(var i = 0, l = clone.childNodes.length; i < l; i++) {
            clone.childNodes[i].linkedPopup = buttons.childNodes[i].linkedPopup;
        }
    }
}).init();

Dumby
Оу, красота! :) Спасибо.

А можно сделать ее единой и для редактора во вкладке и в окне? Иногда так удобнее, иногда так. Боюсь, я сам не осилю...

bunda1, спасибо. А можно сделать очистку папок автоматом, перед закрытием браузера?

а может кто нибудь добавить в кнопку
Proxy
запуск приложения по типа

Выделить код

Код:

startProcess("G:\\Programs\\HandyCache\\HandyCache.exe",[""]);

function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("Файл не найден", path); 
};

а при повтором нажатии(тоесть выключении прокси) убивание процесса программы(как это сделано в "Остановить очистку потребляемой оперативной памяти")

Ну если по простому то в начале кода инициализации после:

Выделить код

Код:

cbu.setPrefs("network.proxy.type", (cbu.getPrefs("network.proxy.type") == 1 ) ? 0 : 1 );

положи:       

Выделить код

Код:

if ( cbu.getPrefs("network.proxy.type") == 1 ) {
             var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
             file.initWithPath("C:\\Program Files\\HandyCache\\HandyCache.exe");
             file.launch();
             }
        else
             {
             // Закрыть все процессы 'HandyCache.exe' ................
             var VBScript =
                   'strComputer = "."\
                   \nSet objWMIService = GetObject("winmgmts:" _\
                   \n& "{impersonationLevel=impersonate}!\\\\" & strComputer & "\\root\\cimv2")\
                   \nSet colProcessList = objWMIService.ExecQuery _\
                   \n("Select * from Win32_Process Where Name = \x27HandyCache.exe\x27")\
                   \nFor Each objProcess in colProcessList\
                   \nobjProcess.Terminate()\
                   \nNext';
   
             var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
             file.append("processTerminate.vbs");
             custombuttonsUtils.writeFile(file.path, VBScript);
             file.launch();                          
             }

Прошу поясните кто может: что делает эта кнопка Script Loader
ежели из описания коротенького что там есть(и ежели прально понял):
Script Loader by LouCypher (aka Zoolcar9)
    Load a script and execute it

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

HaGEN пишет

Прошу поясните кто может: что делает эта кнопка Script Loader
ежели из описания коротенького что там есть(и ежели прально понял):
Script Loader by LouCypher (aka Zoolcar9)
    Load a script and execute it

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

Кнопка не работает потому что в ней используется makeXML() который не поддерживается уже давно. И этот Script Loader кажется предназначен для запуска текстовых файлов типа .js с кодами которые работают в CB кнопках но не с кодами GM с некоторыми исключениями.

Ага, знач не то что я думал и не буду пытаться.
Благодарю.

Может кто знает, кнопка переключения стилей от Infocatcher Style toggler
не подхватывает картинку из папки chrome.
не так
background-image: url("C:\\Firefox\\Profile\\chrome\\background.jpg");
не так background-image: url("background.jpg");
не хочет. Как в кнопке правильно путь прописать?

villa7
file:///E:/Images/blabla.png

turbot
Точно, смутно помнил про три слеша, да давно с этим сталкивался, надо на лбу записать. Спасибо.

turbot пишет

А можно сделать ее единой и для редактора во вкладке и в окне? Иногда так удобнее, иногда так. Боюсь, я сам не осилю...

Во, может такая подойдёт

скрытый текст
У меня, вроде, не сильно глючит.
Для редактирования предполагается контекстное меню.
Результат редактирования (innerHTML) пишется на вкладку Справка.
Попробуй.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EUnnamed%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5BgBrowser.currentURI.spec%20%3D%3D%20%22about%3Acustomizing%22%20%7C%7C%20%28%28%29%20%3D%3E%20%7B%0A%09var%20obsId%20%3D%20%22CB%22%20+%20_id.slice%2820%29%20+%20%22_PasteButtonsForStylish%22%3B%0A%09var%20obs%20%3D%20Application.storage.get%28obsId%2C%20null%29%3B%0A%09if%20%28%21obs%29%20%7B%0A%09%09obs%20%3D%20%7B%0A%09%09%09id%3A%20obsId%2C%0A%09%09%09boxId%3A%20obsId%20+%20%22_Box%22%2C%0A%09%09%09brURL%3A%20location.href%2C%0A%09%09%09topic%3A%20%22document-shown%22%2C%0A%09%09%09init%3A%20function%28%29%20%7B%0A%09%09%09%09this.proceedAll%28true%29%3B%0A%09%09%09%09Services.obs.addObserver%28this%2C%20this.topic%2C%20false%29%3B%0A%09%09%09%7D%2C%0A%09%09%09destroy%3A%20function%28%29%20%7B%0A%09%09%09%09this.proceedAll%28false%29%3B%0A%09%09%09%09try%20%7BServices.obs.removeObserver%28this%2C%20this.topic%29%3B%7D%0A%09%09%09%09catch%28ex%29%20%7BCu.reportError%28ex%29%3B%7D%0A%09%09%09%7D%2C%0A%0A//%09%09%09-----------------------------------%20OBS%20----------------------------------%0A%0A%09%09%09observe%3A%20function%28doc%29%20this.proceedDoc%28doc%2C%20true%29%2C%0A%09%09%09isStylishDoc%3A%20function%28doc%29%20doc.location%0A%09%09%09%09%26%26%20doc.location.href.startsWith%28%22about%3Astylish-edit%22%29%2C%0A%09%09%09isBrowserDoc%3A%20function%28doc%29%20doc.location%0A%09%09%09%09%26%26%20doc.location.href%20%3D%3D%20this.brURL%2C%0A%09%09%09proceedAll%3A%20function%28init%29%20%7B%0A%09%09%09%09var%20en%20%3D%20Services.wm.getEnumerator%28null%29%3B%0A%09%09%09%09while%28en.hasMoreElements%28%29%29%20%7B%0A%09%09%09%09%09var%20doc%20%3D%20en.getNext%28%29.document%3B%0A%09%09%09%09%09if%20%28this.isBrowserDoc%28doc%29%29%20%7B%0A%09%09%09%09%09%09for%28var%20br%20of%20doc.defaultView.gBrowser.browsers%29%20%7B%0A%09%09%09%09%09%09%09this.proceedDoc%28br.contentDocument%2C%20init%29%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09var%20sidebarDoc%20%3D%20doc.getElementById%28%22sidebar%22%29.contentDocument%3B%0A%09%09%09%09%09%09this.proceedDoc%28sidebarDoc%2C%20init%29%3B%0A%09%09%09%09%09%09var%20wpb%20%3D%20sidebarDoc.getElementById%28%22web-panels-browser%22%29%3B%0A%09%09%09%09%09%09wpb%20%26%26%20this.proceedDoc%28wpb.contentDocument%2C%20init%29%3B%0A%09%09%09%09%09%7D%20%0A%09%09%09%09%09else%0A%09%09%09%09%09%09this.proceedDoc%28doc%2C%20init%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%0A%09%09%09proceedDoc%3A%20function%28doc%2C%20add%29%20%7B%0A%09%09%09%09if%20%28%21this.isStylishDoc%28doc%29%20%7C%7C%20doc.readyState%20%21%3D%20%22complete%22%29%20return%3B%0A%09%09%09%09var%20box%20%3D%20doc.getElementById%28this.boxId%29%3B%0A%09%09%09%09if%20%28add%20%26%26%20%21box%29%20%7B%0A%09%09%09%09%09var%20before%20%3D%20doc.getElementById%28%22wrap-lines%22%29%3B%0A%09%09%09%09%09this.addBox%28before%29%3B%0A%09%09%09%09%7D%20else%20if%20%28%21add%20%26%26%20box%29%20%7B%0A%09%09%09%09%09box%20%26%26%20box.remove%28%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%0A%0A//%09%09%09---------------------------------------------%20BOX%20--------------------------------------------%0A%0A%09%09%09get%20box%28%29%20%7B%0A%09%09%09%09delete%20this.box%3B%0A%09%09%09%09return%20this.box%20%3D%20this.createBox%28%29%3B%0A%09%09%09%7D%2C%0A%09%09%09createBox%3A%20function%28%29%20%7B%0A%09%09%09%09var%20box%20%3D%20this.insertElement%28%22hbox%22%2C%20null%2C%20%7B%0A%09%09%09%09%09id%3A%20this.boxId%2C%0A%09%09%09%09%09onclick%3A%20%60%0A%09%09%09%09%09%09if%20%28event.button%20%21%3D%202%29%20return%3B%0A%09%09%09%09%09%09var%20popup%20%3D%20this.linkedPopup%3B%0A%09%09%09%09%09%09if%20%28popup.state%20%21%3D%20%22closed%22%29%20popup.hidePopup%28%29%3B%0A%09%09%09%09%09%09popup.linkedTarget%20%3D%20event.originalTarget%3B%0A%09%09%09%09%09%09popup.openPopupAtScreen%28event.screenX%2C%20event.screenY%29%3B%0A%09%09%09%09%09%60%2C%0A%09%09%09%09%09oncommand%3A%20%60%0A%09%09%09%09%09%09event.stopPropagation%28%29%3B%0A%09%09%09%09%09%09var%20trg%20%3D%20event.originalTarget%3B%0A%09%09%09%09%09%09if%20%28trg.nodeName%20%3D%3D%20%22toolbarbutton%22%29%0A%09%09%09%09%09%09%09trg.firstChild.openPopup%28trg%29%3B%0A%09%09%09%09%09%09/*%0A%09%09%09%09%09%09else%20if%20%28trg.nodeName%20%3D%3D%20%22menuitem%22%29%0A%09%09%09%09%09%09%09trg.hasAttribute%28%22value%22%29%0A%09%09%09%09%09%09%09%26%26%20insertCodeAtCaret%28trg.value%29%3B%0A%09%09%09%09%09%09*/%0A%09%09%09%09%09%09else%20if%20%28trg.nodeName%20%3D%3D%20%22menuitem%22%20%26%26%20trg.hasAttribute%28%22value%22%29%29%20%7B%0A%09%09%09%09%09%09%09insertCodeAtCaret%28trg.value%29%3B%0A%09%09%09%09%09%09%09codeElementWrapper.focus%28%29%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%60%0A%09%09%09%09%7D%29%3B%0A%09%09%09%09return%20box%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20boxContent%28%29%20%7B%0A%09%09%09%09delete%20this.boxContent%3B%0A%09%09%09%09return%20this.boxContent%20%3D%20self.Help.trim%28%29%3B%0A%09%09%09%7D%2C%0A%09%09%09addBox%3A%20function%28before%29%20%7B%0A%09%09%09%09var%20box%20%3D%20before.parentNode.insertBefore%28this.box.cloneNode%28false%29%2C%20before%29%3B%0A%09%09%09%09box.innerHTML%20%3D%20this.boxContent%3B%0A%09%09%09%09box.linkedPopup%20%3D%20box.appendChild%28this.popup.cloneNode%28true%29%29%3B%0A%09%09%09%09box.style.cssText%20%3D%20%22max-height%3A%2032px%20%21important%3B%20max-width%3A%20320px%20%21important%3B%22%3B%0A%09%09%09%7D%2C%0A%0A//%09%09%09-------------------------------------------%20CONTEXT%20------------------------------------------%0A%0A%09%09%09popupXUL%3A%20%60%0A%09%09%09%09%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%09%09%09%09id%3D%22%24%7BobsId%20+%20%22_Context%22%7D%22%0A%09%09%09%09%09oncommand%3D%22event.stopPropagation%28%29%3B%20var%20obs%20%3D%20Application.storage.get%28%27%24%7BobsId%7D%27%2C%20null%29%3B%20if%20%28obs%29%20obs.cmdDispatcher%28event%29%3B%22%0A%09%09%09%09%09onpopupshowing%3D%22var%20obs%20%3D%20Application.storage.get%28%27%24%7BobsId%7D%27%2C%20null%29%3B%20if%20%28obs%29%20obs.contextPopupshowing%28this%29%3B%22%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u0418%u0437%u043C%u0435%u043D%u0438%u0442%u044C%22%20value%3D%22openEditor%22/%3E%0A%09%09%09%09%09%3Cmenuseparator/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u0412%u044B%u0448%u0435%22%20value%3D%22moveUp%22/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u041D%u0438%u0436%u0435%22%20value%3D%22moveDown%22/%3E%0A%09%09%09%09%09%3Cmenuseparator/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u041A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%22%20value%3D%22copyItem%22%20closemenu%3D%22none%22/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u0412%u0441%u0442%u0430%u0432%u0438%u0442%u044C%22%20value%3D%22pasteItem%22/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u0423%u0434%u0430%u043B%u0438%u0442%u044C%22%20value%3D%22deleteItem%22/%3E%0A%09%09%09%09%09%3Cmenuseparator/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u041D%u043E%u0432%u044B%u0439%20menuitem%22%20value%3D%22newMenuitem%22/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u041D%u043E%u0432oe%20menu%22%20value%3D%22newMenu%22/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u041D%u043E%u0432%u044B%u0439%20toolbarbutton%22%20value%3D%22newButton%22/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u041D%u043E%u0432%u044B%u0439%20menuseparator%22%20value%3D%22newSeparator%22/%3E%0A%09%09%09%09%09%3Cmenuseparator/%3E%0A%09%09%09%09%09%3Cmenuitem%20label%3D%22%u041A%u0430%u0440%u0442%u0438%u043D%u043A%u0430%20base64%22%20value%3D%22imgBase64%22/%3E%0A%09%09%09%09%3C/menupopup%3E%0A%09%09%09%60%2C%0A%09%09%09get%20popup%28%29%20%7B%0A%09%09%09%09delete%20this.popup%3B%0A%09%09%09%09return%20this.popup%20%3D%20this.createPopup%28%29%3B%0A%09%09%09%7D%2C%0A%09%09%09createPopup%3A%20function%28%29%20%7B%0A%09%09%09%09var%20xul%20%3D%20this.popupXUL.trim%28%29.replace%28/%3E%5Cs+%3C/g%2C%20%22%3E%3C%22%29%3B%0A%09%09%09%09var%20popup%20%3D%20new%20DOMParser%28%29.parseFromString%28xul%2C%20%22application/xml%22%29.documentElement%3B%0A%09%09%09%09return%20popup%3B%0A%09%09%09%7D%2C%0A%09%09%09cmdDispatcher%3A%20function%28e%29%20%7B%0A%09%09%09%09var%20trg%20%3D%20e.originalTarget%2C%20popup%20%3D%20trg.parentNode%2C%20cmd%20%3D%20trg.value%3B%0A%09%09%09%09if%20%28%21cmd%29%20return%3B%0A%09%09%09%09var%20popupNode%20%3D%20popup.linkedTarget%3B%0A%09%09%09%09cmd.startsWith%28%22new%22%29%0A%09%09%09%09%09%3F%20this.newItem%28popupNode%2C%20cmd.slice%283%29%29%0A%09%09%09%09%09%3A%20this%5Bcmd%5D%28popupNode%2C%20popup%29%3B%0A%09%09%09%09%22copyItem%20openEditor%20imgBase64%22.contains%28cmd%29%20%7C%7C%20this.save%28popupNode%29%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20emptySeparator%28%29%20%7B%0A%09%09%09%09delete%20this.emptySeparator%3B%0A%09%09%09%09return%20this.emptySeparator%20%3D%20this.insertElement%28%22menuseparator%22%29%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20emptyMenuitem%28%29%20%7B%0A%09%09%09%09delete%20this.emptyMenuitem%3B%0A%09%09%09%09return%20this.emptyMenuitem%20%3D%20this.insertElement%28%22menuitem%22%2C%20null%2C%20%7Blabel%3A%20%22menuitem%22%2C%20value%3A%20%22%22%7D%29%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20emptyMenupopup%28%29%20%7B%0A%09%09%09%09delete%20this.emptyMenupopup%3B%0A%09%09%09%09var%20popup%20%3D%20this.insertElement%28%22menupopup%22%29%3B%0A%09%09%09%09popup.appendChild%28this.emptyMenuitem.cloneNode%28false%29%29%3B%0A%09%09%09%09return%20this.emptyMenupopup%20%3D%20popup%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20emptyMenu%28%29%20%7B%0A%09%09%09%09delete%20this.emptyMenu%3B%0A%09%09%09%09var%20menu%20%3D%20this.insertElement%28%22menu%22%2C%20null%2C%20%7Blabel%3A%20%22menu%22%7D%29%3B%0A%09%09%09%09menu.appendChild%28this.emptyMenupopup.cloneNode%28true%29%29%3B%0A%09%09%09%09return%20this.emptyMenu%20%3D%20menu%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20emptyButton%28%29%20%7B%0A%09%09%09%09delete%20this.emptyButton%3B%0A%09%09%09%09var%20btn%20%3D%20this.insertElement%28%22toolbarbutton%22%2C%20null%2C%20%7B%0A%09%09%09%09%09image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////////////////////////////////////////////////////////////////////AAAA/wAAAP//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP8AAAD//////wAAAP//////////////////////////////////////////////////////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////////////////////////////////////////////////////AAAA//////8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////AAAA/wAAAP///////////////////////////////////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEH4KxBB+CsQQfgrEEH4KxBB+CsQQfgrEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%0A%09%09%09%09%7D%29%3B%0A%09%09%09%09btn.appendChild%28this.emptyMenupopup.cloneNode%28true%29%29%3B%0A%09%09%09%09return%20this.emptyButton%20%3D%20btn%3B%0A%09%09%09%7D%2C%0A%09%09%09newItem%3A%20function%28node%2C%20name%29%20%7B%0A%09%09%09%09var%20newItem%20%3D%20this%5B%22empty%22%20+%20name%5D.cloneNode%28true%29%3B%0A%09%09%09%09node.parentNode.insertBefore%28newItem%2C%20node.nextSibling%29%3B%0A%09%09%09%09if%20%28name%20%3D%3D%20%22Button%22%29%20newItem.firstChild.setAttribute%28%22position%22%2C%20%22after_start%22%29%3B%0A%09%09%09%7D%2C%0A%09%09%09deleteItem%3A%20function%28node%29%20%7B%0A%09%09%09%09var%20win%20%3D%20this.top%28node%29%3B%0A%09%09%09%09if%20%28%21win.confirm%28%22%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%3F%22%29%29%20return%3B%0A%09%09%09%09node.remove%28%29%3B%0A%09%09%09%7D%2C%0A%09%09%09moveUp%3A%20function%28node%29%20%7B%0A%09%09%09%09node.parentNode.insertBefore%28node%2C%20node.previousSibling%29%3B%0A%09%09%09%7D%2C%0A%09%09%09moveDown%3A%20function%28node%29%20%7B%0A%09%09%09%09node.parentNode.insertBefore%28node%2C%20node.nextSibling.nextSibling%29%3B%0A%09%09%09%7D%2C%0A%09%09%09copyItem%3A%20function%28node%2C%20popup%29%20%7B%0A%09%09%09%09this.transactionNode%20%3D%20node.cloneNode%28true%29%3B%0A%09%09%09%09popup.querySelector%28%27menuitem%5Bvalue%3D%22pasteItem%22%5D%27%29.disabled%20%3D%20false%3B%0A%09%09%09%7D%2C%0A%09%09%09pasteItem%3A%20function%28node%29%20%7B%0A%09%09%09%09node.parentNode.insertBefore%28this.transactionNode%2C%20node%29%3B%0A%09%09%09%7D%2C%0A%09%09%09imgBase64%3A%20function%28node%29%20%7B%0A%09%09%09%09var%20obs%20%3D%20this%3B%0A%09%09%09%09var%20picker%20%3D%20makeFilePicker%28%29%3B%0A%09%09%09%09picker.appendFilters%28picker.filterImages%29%3B%0A%09%09%09%09picker.init%28this.top%28node%29%2C%20%22%u0418%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%22%2C%20picker.modeOpen%29%3B%0A%09%09%09%09picker.open%28%7Bdone%3A%20function%28result%29%20%7B%0A%09%09%09%09%09if%20%28result%20%21%3D%20picker.returnOK%29%20return%3B%0A%09%09%09%09%09var%20reader%20%3D%20new%20FileReader%28%29%3B%0A%09%09%09%09%09reader.onload%20%3D%20function%28%29%20%7B%0A%09%09%09%09%09%09if%20%28%21reader.result%29%20return%3B%0A%09%09%09%09%09%09var%20name%20%3D%20node.nodeName%3B%0A%09%09%09%09%09%09%22menuitem%22.contains%28name%29%20%26%26%20node.classList.add%28name%20+%20%22-iconic%22%29%3B%0A%09%09%09%09%09%09node.setAttribute%28%22image%22%2C%20reader.result%29%3B%0A%09%09%09%09%09%09obs.save%28node%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09reader.readAsDataURL%28new%20File%28picker.file%29%29%3B%0A%09%09%09%09%7D%7D%29%3B%0A%09%09%09%7D%2C%0A%09%09%09disablers%3A%20%7B%0A%09%09%09%09moveUp%3A%20function%28node%29%20%21node.previousSibling%2C%0A%09%09%09%09moveDown%3A%20function%28node%29%20%21node.nextSibling%20%7C%7C%20node.nextSibling.nodeName%20%3D%3D%20%22menupopup%22%2C%0A%09%09%09%09deleteItem%3A%20function%28node%29%20%7B%0A%09%09%09%09%09var%20count%20%3D%20node.parentNode.childElementCount%3B%0A%09%09%09%09%09return%20count%20%3D%3D%201%20%7C%7C%20%28node.nodeName%20%3D%3D%20%22toolbarbutton%22%20%26%26%20count%20%3D%3D%202%29%3B%0A%09%09%09%09%7D%2C%0A%09%09%09%09top%3A%20function%28node%29%20%22toolbarbutton%20hbox%22.contains%28node.nodeName%29%2C%0A%09%09%09%09newMenuitem%3A%20function%28node%29%20this.top%28node%29%2C%0A%09%09%09%09newMenu%3A%20function%28node%29%20this.top%28node%29%2C%0A%09%09%09%09newSeparator%3A%20function%28node%29%20this.top%28node%29%2C%0A%09%09%09%09newButton%3A%20function%28node%29%20%21this.top%28node%29%2C%0A%09%09%09%09copyItem%3A%20function%28node%29%20node.nodeName%20%3D%3D%20%22hbox%22%2C%0A%09%09%09%09pasteItem%3A%20function%28%29%20%21%28%22transactionNode%22%20in%20this.obs%29%2C%0A%09%09%09%09imgBase64%3A%20function%28node%29%20%21%22toolbarbutton%20menu%20menuitem%22.contains%28node.nodeName%29%0A%09%09%09%7D%2C%0A%09%09%09contextPopupshowing%3A%20function%28popup%29%20%7B%0A%09%09%09%09this.disablers.obs%20%3D%20this%3B%0A%09%09%09%09var%20node%20%3D%20popup.linkedTarget%3B%0A%09%09%09%09for%28var%20key%20in%20this.disablers%29%20%7B%0A%09%09%09%09%09var%20menuitem%20%3D%20popup.querySelector%28%60menuitem%5Bvalue%3D%22%24%7Bkey%7D%22%5D%60%29%3B%0A%09%09%09%09%09if%20%28menuitem%29%20menuitem.disabled%20%3D%20this.disablers%5Bkey%5D%28node%29%20%7C%7C%20node.nodeName%20%3D%3D%20%22menupopup%22%3B%0A%09%09%09%09%7D%0A%09%09%09%09popup.querySelector%28%27menuitem%5Bvalue%3D%22openEditor%22%5D%27%29.disabled%20%3D%20node.nodeName%20%3D%3D%20%22hbox%22%3B%0A%09%09%09%7D%2C%0A%0A//%09%09%09-----------------------------------------------%20EDITOR%20----------------------------------------------%0A%0A%09%09%09editorXUL%3A%20%60%0A%09%09%09%09%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%09%09%09%09%3C%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%3F%3E%0A%09%09%09%09%3C%3Fxml-stylesheet%20href%3D%22chrome%3A//custombuttons/content/codeeditor.css%22%20type%3D%22text/css%22%3F%3E%0A%09%09%09%09%3Cdialog%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%09%09%09%09title%3D%22%u0418%u0437%u043C%u0435%u043D%u0438%u0442%u044C%22%0A%09%09%09%09%09onload%3D%22obs%20%3D%20Application.storage.get%28%27%24%7BobsId%7D%27%2C%20null%29%3B%20obs.initEditor%28window%29%3B%22%0A%09%09%09%09%09ondialogaccept%3D%22obs.setAttributes%28window%29%3B%22%0A%09%09%09%09%09buttons%3D%22extra2%2Caccept%2Ccancel%22%0A%09%09%09%09%09buttonlabelextra2%3D%22%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u0430%u0442%u0440%u0438%u0431%u0443%u0442%22%0A%09%09%09%09%09ondialogextra2%3D%22obs.deleteAttribute%28window%29%3B%22%3E%0A%09%09%09%09%09%3Chbox%20align%3D%22center%22%3E%0A%09%09%09%09%09%09%3Clabel%20value%3D%22%u041D%u043E%u0432%u044B%u0439%20%u0430%u0442%u0440%u0438%u0431%u0443%u0442%22/%3E%0A%09%09%09%09%09%09%3Ctextbox%20flex%3D%221%22%20multiline%3D%22false%22%20onkeydown%3D%22obs.onTexboxKeydown%28event%29%3B%22/%3E%0A%09%09%09%09%09%09%3Cbutton%20label%3D%22%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%22%20oncommand%3D%22obs.newAttribute%28window%2C%20textbox.value%29%3B%22/%3E%0A%09%09%09%09%09%3C/hbox%3E%0A%09%09%09%09%09%3Ctabbox%20flex%3D%221%22%3E%0A%09%09%09%09%09%09%3Ctabs/%3E%0A%09%09%09%09%09%09%3Ctabpanels%20flex%3D%221%22/%3E%0A%09%09%09%09%09%3C/tabbox%3E%0A%09%09%09%09%3C/dialog%3E%0A%09%09%09%60%2C%0A%09%09%09get%20editorURL%28%29%20%7B%0A%09%09%09%09delete%20this.editorURL%3B%0A%09%09%09%09var%20xul%20%3D%20this.editorXUL.trim%28%29%3B%0A%09%09%09%09return%20this.editorURL%20%3D%20%22data%3Aapplication/vnd.mozilla.xul+xml%2C%22%20+%20encodeURIComponent%28xul%29%3B%0A%09%09%09%7D%2C%0A%09%09%09openEditor%3A%20function%28node%29%20%7B%0A%09%09%09%09this.node%20%3D%20node%3B%20this.elm%20%3D%20this.insertElement%28%22box%22%29%3B%0A%09%09%09%09Services.ww.openWindow%28this.top%28node%29%2C%20this.editorURL%2C%20%22%22%2C%0A%09%09%09%09%09%22chrome%2Cmodal%2Cresizable%2Ccenterscreen%2Cwidth%3D700%2Cheight%3D500%22%0A%09%09%09%09%2C%20null%29%3B%0A%09%09%09%7D%2C%0A%09%09%09initEditor%3A%20function%28win%29%20%7B%0A%09%09%09%09for%28var%20str%20of%20%5B%22tabs%22%2C%20%22tabpanels%22%2C%20%22textbox%22%5D%29%20%7B%0A%09%09%09%09%09win%5Bstr%5D%20%3D%20win.document.querySelector%28str%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09for%28var%20%7Bname%2C%20value%7D%20of%20this.node.attributes%29%20%7B%0A%09%09%09%09%09var%20isVal%20%3D%20name%20%3D%3D%20%22value%22%3B%0A%09%09%09%09%09var%20tab%20%3D%20this.addTab%28win%2C%20name%2C%20value%2C%20isVal%29%3B%0A%09%09%09%09%09if%20%28isVal%29%20tab.style.cssText%20%3D%20%22font-weight%3A%20bold%3B%20color%3A%20navy%3B%22%3B%0A%09%09%09%09%7D%0A%09%09%09%09if%20%28win.tabs.selectedIndex%20%3D%3D%20-1%29%20win.tabs.selectedIndex%20%3D%200%3B%0A%09%09%09%7D%2C%0A%09%09%09addTab%3A%20function%28win%2C%20name%2C%20value%2C%20sel%29%20%7B%0A%09%09%09%09var%20tab%20%3D%20this.insertElement%28%22tab%22%2C%20win.tabs%2C%20%7Blabel%3A%20name%7D%29%3B%0A%09%09%09%09tab.linkedCbeditor%20%3D%20this.insertElement%28%22cbeditor%22%2C%20win.tabpanels%2C%20%7B%0A%09%09%09%09%09class%3A%20%22custombuttons-editor-codeBox%22%2C%0A%09%09%09%09%09multiline%3A%20%22true%22%2C%0A%09%09%09%09%09flex%3A%20%221%22%2C%0A%09%09%09%09%09value%3A%20value%0A%09%09%09%09%7D%29%3B%0A%09%09%09%09if%20%28sel%29%20%7B%0A%09%09%09%09%09win.tabs.selectedItem%20%3D%20tab%3B%0A%09%09%09%09%09tab.linkedCbeditor.focus%28%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09return%20tab%3B%0A%09%09%09%7D%2C%0A%09%09%09newAttribute%3A%20function%28win%2C%20name%29%20%7B%0A%09%09%09%09name%20%26%26%20this.addTab%28win%2C%20name%2C%20%22%22%2C%20true%29%3B%0A%09%09%09%09win.textbox.value%20%3D%20%22%22%3B%0A%09%09%09%7D%2C%0A%09%09%09onTexboxKeydown%3A%20function%28e%29%20%7B%0A%09%09%09%09if%20%28e.keyCode%20%3D%3D%20e.DOM_VK_RETURN%29%20%7B%0A%09%09%09%09%09e.preventDefault%28%29%3B%0A%09%09%09%09%09this.newAttribute%28e.target.ownerGlobal%2C%20e.target.value%29%3B%0A%09%09%09%09%7D%20else%20try%20%7B%0A%09%09%09%09%09var%20attr%20%3D%20e.target.value%20+%20e.key%3B%0A%09%09%09%09%09this.elm.setAttribute%28attr%2C%20true%29%3B%0A%09%09%09%09%09this.elm.removeAttribute%28attr%29%3B%0A%09%09%09%09%7D%20catch%28ex%29%20%7B%0A%09%09%09%09%09e.preventDefault%28%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%0A%09%09%09setAttributes%3A%20function%28win%29%20%7B%0A%09%09%09%09for%28var%20tab%20of%20win.tabs.childNodes%29%20%7B%0A%09%09%09%09%09var%20val%20%3D%20tab.linkedCbeditor.value%3B%0A%09%09%09%09%09this.node.setAttribute%28tab.label%2C%20val%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09this.save%28%29%3B%0A%09%09%09%7D%2C%0A%09%09%09deleteAttribute%3A%20function%28win%29%20%7B%0A%09%09%09%09var%20tab%20%3D%20win.tabs.selectedItem%3B%0A%09%09%09%09var%20attr%20%3D%20tab.label%3B%0A%09%09%09%09if%20%28%21win.confirm%28%22%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u0430%u0442%u0440%u0438%u0431%u0443%u0442%20%22%20+%20attr%20+%20%22%20%3F%22%29%29%20return%3B%0A%09%09%09%09this.node.removeAttribute%28tab.label%29%3B%0A%09%09%09%09tab.linkedCbeditor.remove%28%29%3B%20tab.remove%28%29%3B%0A%09%09%09%09win.tabs.selectedIndex%20%3D%200%3B%0A%09%09%09%7D%2C%0A%09%09%09save%3A%20function%28node%20%3D%20this.node%29%20%7B%0A%09%09%09%09var%20box%20%3D%20node.ownerDocument.getElementById%28this.boxId%29%3B%0A%09%09%09%09if%20%28%21box%29%20return%3B%0A%09%09%09%09box.removeChild%28box.linkedPopup%29%3B%0A%09%09%09%09var%20xul%20%3D%20box.innerHTML.replace%28/%5Ct/g%2C%20%22%26%23x9%3B%22%29.replace%28/%5Cn/g%2C%20%22%26%23xA%3B%22%29.replace%28/%5Cr/g%2C%20%22%26%23xD%3B%22%29%3B%0A%09%09%09%09var%20link%20%3D%20custombuttons.makeButtonLink%28%22edit%22%2C%20_id%29%3B%0A%09%09%09%09var%20param%20%3D%20custombuttons.cbService.getButtonParameters%28link%29%3B%0A%09%09%09%09param%20%3D%20param.wrappedJSObject%20%7C%7C%20param%3B%0A%09%09%09%09param.help%20%3D%20xul%3B%0A%09%09%09%09custombuttons.cbService.installButton%28param%29%3B%09%0A%09%09%09%7D%2C%0A%0A//%09%09%09-----------------------------------------------%20MISC%20------------------------------------------%0A%0A%09%09%09insertElement%3A%20function%28element%2C%20parent%2C%20attributes%2C%20before%20%3D%20null%29%20%7B%0A%09%09%09%09var%20notExist%20%3D%20typeof%20element%20%21%3D%20%22object%22%3B%0A%09%09%09%09if%20%28notExist%29%20element%20%3D%20document.createElement%28element%29%3B%0A%09%09%09%09if%20%28notExist%20%26%26%20attributes%29%20%7B%0A%09%09%09%09%09for%28var%20attribute%20in%20attributes%29%20%7B%0A%09%09%09%09%09%09attribute%20%3D%3D%20%22data%22%20%7C%7C%20element.setAttribute%28attribute%2C%20attributes%5Battribute%5D%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%09parent%20%26%26%20parent.insertBefore%28element%2C%20before%29%3B%0A%09%09%09%09return%20element%3B%0A%09%09%09%7D%2C%0A%09%09%09top%3A%20function%28node%29%20%7B%0A%09%09%09%09var%20win%20%3D%20node.ownerGlobal%3B%0A%09%09%09%09if%20%28%21%28win%20instanceof%20ChromeWindow%29%29%0A%09%09%09%09%09win%20%3D%20Services.wm.getMostRecentWindow%28%22navigator%3Abrowser%22%29%3B%0A%09%09%09%09return%20win%3B%0A%09%09%09%7D%0A%09%09%7D%3B%0A%09%09Application.storage.set%28obsId%2C%20obs%29%3B%0A%09%09obs.init%28%29%3B%0A%09%7D%0A%09function%20destructor%28reason%29%20%7B%0A%09%09if%20%28%21%22update%20delete%22.contains%28reason%29%29%20return%3B%0A%09%09var%20obs%20%3D%20Application.storage.get%28obsId%2C%20null%29%3B%0A%09%09if%20%28obs%29%20%7B%0A%09%09%09obs.destroy%28%29%3B%0A%09%09%09Application.storage.set%28obsId%2C%20null%29%3B%0A%09%09%7D%0A%09%7D%0A%09addDestructor%28reason%20%3D%3E%20%7B%0A%09%09destructor%28reason%29%3B%0A%09%09setTimeout%28function%28%29%20%7B%0A%09%09%09custombuttons.palette.querySelector%28%27toolbarbutton%5Bid%3D%22%27%20+%20_id%20+%20%27%22%5D%27%29%20%26%26%20destructor%28%22delete%22%29%3B%0A%09%09%7D%2C%20500%29%3B%0A%09%7D%29%3B%0A%7D%29%28%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%3Ctoolbarbutton%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%20image%3D%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%20tooltiptext%3D%22Button%26%23xA%3BTooltip%26%23xA%3BText%22%3E%3Cmenupopup%20position%3D%22after_start%22%3E%3Cmenuitem%20label%3D%22%21Close%20menu%22%20value%3D%22%26%23xA%3B***%26%23xA%3B%26%23xA%3Bclosemenu%3D%26quot%3Bnone%26quot%3B%26%23xA%3B%26%23xA%3B***%26%23xA%3B%22%20closemenu%3D%22none%22/%3E%3Cmenuseparator/%3E%3Cmenuitem%20label%3D%22Styled%20menuitem%22%20value%3D%22bla%26%23xA%3B%26%23x9%3Bbla%26%23xA%3Bbla%22%20style%3D%22font-style%3A%20italic%3B%26%23xA%3B%26%23xA%3Bcolor%3A%20blue%3B%26%23xA%3Bfont-weight%3A%20bold%3B%26%23xA%3B%26%23xA%3B-moz-appearance%3A%20none%3B%26%23xA%3Bbackground-color%3A%20lightyellow%3B%26%23xA%3Bborder%3A%202px%20solid%20yellow%3B%22/%3E%3Cmenu%20label%3D%22Menu%20iconic%22%20class%3D%22menu-iconic%22%20image%3D%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm////////////////////////////////////////////////////////////////////////////zGZm/8xmZv///////////////////////////////////////////////////////////////////////////8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm////////////////////////////////////////////////////////////////////////////zGZm/8xmZv///////////////////////////////////////////////////////////////////////////8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm////////////////////////////////////////////////////////////////////////////zGZm/8xmZv///////////////////////////////////////////////////////////////////////////8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm////////////////////////////////////////////////////////////////////////////zGZm/8xmZv///////////////////////////////////////////////////////////////////////////8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm////////////////////////////////////////////////////////////////////////////zGZm/8xmZv///////////////////////////////////////////////////////////////////////////8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/zGZm/8xmZv/MZmb/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3E%3Cmenupopup%3E%3Cmenuitem%20label%3D%22menuitem%22%20value%3D%22%22/%3E%3C/menupopup%3E%3C/menu%3E%3Cmenuitem%20label%3D%22Menuitem%20iconic%22%20value%3D%22123%26%23xA%3B%26%23xA%3B4567%26%23xA%3B890...%26%23xA%3B%22%20class%3D%22menuitem-iconic%22%20image%3D%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAGDBrppU5gMj/OH7H/zh+x/84fsf/OX7H/zl+x/85fsf/OX7H/zl+x/85fsf/OX7H/zl+x/84fsf/OYDI/zBrppU5gMj/Xdb//1TO//9Tzf//U83//1XO//9Vzv//VM3//1TN//9Vzv//Vc7//1TN//9Uzf//VM7//13W//85gMj/OH7H/1vP//9Dwv//TsX//z/A//9Dwf//RsL//0LB//9AwP//Q8H//0bC//9Cwf//QMD//0PC//9bz///OH7H/zZ9x/9XzP//y+7/////////////zO7//zW8/////////////8vt//81vP/////////////L7v//V8z//zZ9x/81fcf/V8v///////8ntv//K7f///////8zuv//L7j//yO0////////Lrj//y64//8jtP///////1fL//81fcf/NH3H/1nM////////KLX//zO5//8xuP//MLj//ye0///E6////////yi1//8mtP//xOr///////9czf//NX3H/zR9x/9dzP///////yGx//8stf//KbT//yOy////////wer//x+x//8hsf///////8Hq//8esf//Z8///zZ+x/80fcf/Y83///////8Sq///F63///////8WrP///////xCq//8brv//G67///////8Pqf//Ga7//23R//82fsf/NX3H/27R//+86f/////////////C6v//FKz//8Dp/////////////xWs///A6f////////////9w0f//NX3H/zZ+x/971f//Dqr//w2p//8Oqf//Eqr//xas//8Sqv//D6n//xGq//8Wq///Eqr//w6p//8Nqf//etT//zZ+x/83gMj/hNz//4LY//+C1///g9f//4TY//+E2P//hNj//4PX//+D2P//hNj//4TY//+C1///gtj//4Tc//83gMj/OYPKjTeAyP82fsf/Nn7H/zZ+x/82fsf/Nn7H/zZ+x/82fsf/Nn7H/zZ+x/82fsf/Nn7H/zZ+x/83gMj/OYPKjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEH//6xB//+sQQ%3D%3D%22/%3E%3Cmenuseparator/%3E%3Cmenuitem%20label%3D%22JS%22%20oncommand%3D%27alert%28%22JS%22%29%3B%27%20tooltiptext%3D%22%u041F%u0440%u043E%u0441%u0442%u043E%20demo%22/%3E%3Cmenuitem%20label%3D%22%u0414%u043B%u044F%20%u0441%u043B%u0435%u0434%u0443%u044E%u0449%u0435%u0433%u043E%20%u043F%u0443%u043D%u043A%u0442%u0430%22%20value%3D%22@namespace%20url%28http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%29%3B%26%23xA%3B%26%23xA%3B%23blablabla%20%7B%26%23xA%3B%26%23x9%3Bcolor%3A%20black%3B%26%23xA%3B%26%23x9%3Bdisplay%3A%20-moz-box%20%21important%3B%26%23xA%3B%26%23x9%3Bwidth%3A100px%3B%26%23xA%3B%26%23x9%3Bheight%3A30px%21important%3B%26%23xA%3B%7D%22%20tooltiptext%3D%22@namespace%20url%28http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%29%3B%26%23xA%3B%26%23xA%3B%23blablabla%20%7B%26%23xA%3B%26%23x9%3Bcolor%3A%20black%3B%26%23xA%3B%26%23x9%3Bdisplay%3A%20-moz-box%20%21important%3B%26%23xA%3B%26%23x9%3Bwidth%3A100px%3B%26%23xA%3B%26%23x9%3Bheight%3A30px%21important%3B%26%23xA%3B%7D%22/%3E%3Cmenuitem%20label%3D%22JS%20%20%20%20%20%21important%3B%22%20oncommand%3D%22event.stopPropagation%28%29%3B%26%23xA%3Bthis.text%20%3D%20this.result%3B%26%23xA%3B%22%20onmouseenter%3D%27this.text%20%3D%20codeElementWrapper.value%3B%26%23xA%3Bthis.result%20%3D%20this.text%26%23xA%3B%26%23x9%3B.replace%28/%20%3F%21important%3B/g%2C%20%22%3B%22%29%26%23xA%3B%26%23x9%3B.replace%28/%3B/g%2C%20%22%20%21important%3B%22%29%26%23xA%3B%26%23x9%3B.replace%28/%28@namespace%5B%5E%3B%5D+%29%20%21important%3B/%2C%20%22%241%3B%22%29%3B%26%23xA%3B%26%23xA%3BsourceEditor.setText%28this.result%29%3B%27%20onmouseleave%3D%22sourceEditor.setText%28this.text%29%3B%26%23xA%3Bdelete%20this.text%3B%26%23xA%3Bdelete%20this.result%3B%22%20tooltiptext%3D%22%u041D%u0435%20%u0434%u0435%u043B%u0430%u0439%20%u0442%u0430%u043A%22%20class%3D%22menuitem-iconic%22%20image%3D%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABchMtebZPU+HWZ1+5tk9PJZ47Rk2uQ0r9xltTkd5vY83me2v96ndr5bZLT+WaN0PBiic6eXITLNgAAAAAAAAAAbZPUzqXH8/+rzPj/j7Dj/5O06P+hxPH/rc73/7HS+/+bve7/cpfV/42x5P+myPD/oMLt/26U1OoAAAAAAAAAAIKo4PO62/v/utr7/7DR+f+01fz/u9z8/77e/f+11vv/kLPn/26U1P9xldX/dZnW/3SY1f9njtDhXITLBwAAAACNseT/vt79/77e/f+93f3/vt79/77e/f+93f3/nb/v/3KX1f+Ut+f/udr6/77e/f+83fz/m73r/1yEy2sAAAAAjrHk/77e/f++3v3/vt79/77e/f++3v3/uNn8/5q87f9zl9f/cJTU/3WZ1v91mdb/dZnW/3CU1P9dhcxpAAAAAIqu4vq83Pz/vt79/77e/f++3v3/vt79/7TV/P+Dp9//dJnX/7HS9v++3v3/vt79/77e/f+y0/f/dZvY6gAAAAB4ndnbsdH2/6fI8f+pyvX/t9n6/77e/f+21/v/jrHl/2mQ0v9vlNT/dZnW/3WZ1v91mdb/c5fV/2SLzr0AAAAAXITLbHab2fd1mtridJnXq5Cz6P+21vn/vNz8/6/R+v+Dp9//ia3j/7jY+f++3v3/vt79/7XV+P96oNvqAAAAAAAAAAAAAAAAAAAAAAAAAABehsx4lLjr/7ra+v+42Pz/iq3j/2mP0f+DqeD/jrHk/46x5P+DqeD+XITLpQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiP0qSnyPH/vNz9/5a56v9ki9ApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABchMsVia3j7bbW+v+Xuez/XITLfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGaO0IqqzPP/r9D3/3SZ2dUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABchMtboMLt/7vb+/+Bp+H2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXITLNpi76v+72/v/g6nh9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFyEyxKGq+H/rM30/3Sa19IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXITLim+V1fVchMtfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsQQADrEEAAaxBAAGsQQABrEEAAaxBAAGsQQABrEHwAaxB+D+sQfg/rEH8P6xB/D+sQfw/rEH8P6xB/j+sQQ%3D%3D%22/%3E%3C/menupopup%3E%3C/toolbarbutton%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Dumby
Спасибо, фантастика! Очень удобно новые пункты добавлять. :)

Может, стоит опубликовать в готовых? Полезная кнопка, на мой взгляд.

turbot пишет

Dumby
Спасибо, фантастика! Очень удобно новые пункты добавлять. :)

Может, стоит опубликовать в готовых? Полезная кнопка, на мой взгляд.

Присоединяюсь.
Хотелось бы понять, что она делает и когда её используют.
Спасибо.

difabor пишет

Хотелось бы понять, что она делает и когда её используют.

Вставляет заданные пользователем шаблоны в редакторе Stylish. Полезная штука для лентяев вроде меня. Которым и автодополнения редактора мало. :)

Можно ли в CB использовать переменные процесса FF такие как %MOZILLA_PLUGINS%, %MOZ_PROFILE_PATH% и др. Для чего - для портабельной сборки со своим софтом(хочу сделать себе нечто наподобие ОпераAC).
Есть такая штука как PaleMoon portable и там клёвый загрузчег в котором можно добавлять свои переменные к процессу в проcтом файле *.ini дописывая что нужно.

Например вот

Выделить код

Код:

[Environment]
;(multiple istances)
;MOZ_NO_REMOTE=1
; Путь к папке с прогами
PM_SOFT=$Home$\$AppName$\Profiles\$Profile$\Soft
;(profile path)
MOZ_PROFILE_PATH=$Home$\$AppName$\Profiles\$Profile$


PM_SOFT - это моя добавленная и она есть в "окружении" процесса. И хотелось бы запускать программы из кнопок используя в пути к файлу переменную %PM_SOFT% шобы с флэхи запускать везде.
типа так:
startProcess("%PM_SOFT%\\FVD-Suite\\FVD Downloader\\FVD Downloader.exe",[""]);
... и дальше как в кнопке-примере
scratch_one-s_head.gif
Решено :D

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

okkamas_knife большое спасибо!

bunda1
В кнопках https://forum.mozilla-russia.org/viewto … 06#p543706, https://forum.mozilla-russia.org/viewto … 58#p625358 и https://forum.mozilla-russia.org/viewto … 66#p643966 (а может и еще в каких) стоило бы заменить url("chrome://mozapps/skin/extensions/extensions.svg#greyscale") на grayscale(1), а то с 36-ой версии их убрали.

bunda1
К сообщению turbot, у меня ещё иконка пропадает после нажатия (отключения) и появляется после включения в 3-й кнопке "Переключить JavaScript для сайтов".
FF 36.0.1

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

turbot
Попробовал, не получилось. Сейчас заменил целиком, как Вы написали.

turbot пишет

заменить url("chrome://mozapps/skin/extensions/extensions.svg#greyscale") на grayscale(1)

Работает, спасибо.

Может кто нибудь починить Disable style
https://forum.mozilla-russia.org/viewto … 82#p397782
стиль отключает, а назад не включает.

xrun1 пишет

turbot,
Попробовал, не получилось. Сейчас заменил целиком, как Вы написали.
turbot пишет: заменить url("chrome://mozapps/skin/extensions/extensions.svg#greyscale") на grayscale(1)Работает, спасибо.

Есть еще вариант, вот для примера иконка:
с

Выделить код

Код:

grayscale(1)

aC93aL0.png

и с

Выделить код

Код:

url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale")

FUypfpZ.png

villa7 пишет

Может кто нибудь починить Disable style
https://forum.mozilla-russia.org/viewto … 82#p397782
стиль отключает, а назад не включает.

А так пробовал ?

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

Выделить код

Код:

gPageStyleMenu._getStyleSheetInfo().authorStyleDisabled
    ? gPageStyleMenu.switchStyleSheet("") : gPageStyleMenu.disableStyle();

turbot пишет

bunda1
В кнопках https://forum.mozilla-russia.org/viewto … 06#p543706, https://forum.mozilla-russia.org/viewto … 58#p625358 и https://forum.mozilla-russia.org/viewto … 66#p643966 (а может и еще в каких) стоило бы заменить url("chrome://mozapps/skin/extensions/extensions.svg#greyscale") на grayscale(1), а то с 36-ой версии их убрали.

Спасибо за ценные замечания, исправил :)

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

Пользуюсь кнопкой для коротких ссылок

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

Выделить код

Код:

(function(location){
    var icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzQxNEMxNjhCQkFFMzExQjBBMUQ4Qzc3OUM1QjM5QyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0RUQ1MTc3NUJBQUYxMUUzQTcwOUY5Qzg3QkE3RDUwRSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0RUQ1MTc3NEJBQUYxMUUzQTcwOUY5Qzg3QkE3RDUwRSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NDE0QzE2OEJCQUUzMTFCMEExRDhDNzc5QzVCMzlDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA3NDE0QzE2OEJCQUUzMTFCMEExRDhDNzc5QzVCMzlDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+pwkIsgAAA5BJREFUeNq0l11IU2EYx9+zneFyynIFFUXDwmBkDNHYVaJhXVTYh4VUtIu+KIToQ/u4yoiWFBkkfVwUBHURZhRh3hSVN90oJESDunARBactE1KHm9P1f8ZzYm4785zDfODHznbec97nfd7n/T/PpGQyKQppvb29orW1VZSUlNDXleAs2AGWg5/gBbgGvtMAi5g/qwVvQQtPLvizhX+vnRcHZFmmjwpe6WqNYfT7c7BGzrwzPj4uIpGIkCTJlAOKogiLxXIRl2VzDHWB9iwH+vv7RVtbm3A4HGaDsLC4uHizzrGbshyYmZkRiURCTE9Pm5odkXMROocvlnO8gEKYwqQ5aR3AqmNsvJBJuBCcp5MIbDqf+SIXYGI7OAjOgFUGn+3KuQU6jUK8F5wDlSYcfwQeyJlKSEmow7aDC8Cncf8luA42gBNgqfruaDSq4PIOCNBPUlNTU/qDXujAlnA4XIEk/IvvH3hPo3x/I0/coDHxO3AVvE7PdLAep2qJ0+n8VVdXN4Ao//4f8crKVPRsrM8tVqvVxmqm2idwA2wFezQmHgQd4JlWyGKxmPB4PKK7u3u2chYVFdHnLXBM49l14KHGvSCH+jFIzLVvtAW05el5RkttzjO5ln0DN8H9tO0xVzvAaSNSD25zEv0pSPECVQbGnwJPClk9jSrhNhNik9p7SsKpqamcDnw08K79PP4uWKvnASpqLpdL1NTUCDpxmUInVVdXN5sM6yR4SnIKBjTGuLFyu8/nCzc2No6qSktAD1JtGzkgeEX5TkKMK9yCXItk5etiISI7Ao4CDyazI/TheDxO4nQFpf4rtEb09fWJ8vJyIdPesFxOagjRZ3aOsv4k2AccGTVhJ/OKnd2l3qRzj/ctA34SM+TDbszxXi33RqVY7feOA3rhIhMJqcCBqp6eHsXtdgsps/hQW00tGbfV+WwFOAwO8bXuEwEHLsGBdnLAoiaFioFO6Ac1lawj1AuEDASiIV2IZpmJPypU2TrBSJ6akdUL0vbTdFkOUEM6NjZmvC2y28M2m03vAsjpZM4I0NHw+/30QkMODA0NDYZCoVFke5mO4W80t8Dr9aYwaoFAIBIMBjtLS0sv6yho98zWAk0jnUcSd3BvoGUj3EcqmhEwa1A6MTExkcApOkB/sFgNPdw1R7hNC+AYppRQzRWpUH/PkQNieHhYUCKm1wJ2IAxG1VNGx72+vj6lNf8EGADGSCd20PLWBgAAAABJRU5ErkJggg==';
    if (location.protocol.startsWith('http')) {
        var xhr = new XMLHttpRequest();
        var request = {
            longUrl : location.toString(),
            key     : '{YOUR_API_KEY}'
        }
        xhr.onload = function(){
            var link = JSON.parse(xhr.response).id;

            const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
            gClipboardHelper.copyString(link)
            
            try {
                Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService)
                    .showAlertNotification(icon, link, 'Скопирован в буфер обмена', false, "", null, "");
            } catch (e) {}
        }
        xhr.open('POST', 'https://www.googleapis.com/urlshortener/v1/url', true);
        xhr.setRequestHeader("Content-type", "application/json");
        xhr.send(JSON.stringify(request));
    }
})(content.window.location);


На 36.0.3 перестала работать. Поправьте пожалуйста, или подскажите другую.

Mishania пишет

Пользуюсь кнопкой для коротких ссылок
На 36.0.3 перестала работать. Поправьте пожалуйста, или подскажите другую.

На FF24 тоже не работает, наверно сервис коротких ссылок изменился или глючит.

Mishania

"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."

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

Выделить код

Код:

(function(location){
    var icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzQxNEMxNjhCQkFFMzExQjBBMUQ4Qzc3OUM1QjM5QyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0RUQ1MTc3NUJBQUYxMUUzQTcwOUY5Qzg3QkE3RDUwRSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0RUQ1MTc3NEJBQUYxMUUzQTcwOUY5Qzg3QkE3RDUwRSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NDE0QzE2OEJCQUUzMTFCMEExRDhDNzc5QzVCMzlDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA3NDE0QzE2OEJCQUUzMTFCMEExRDhDNzc5QzVCMzlDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+pwkIsgAAA5BJREFUeNq0l11IU2EYx9+zneFyynIFFUXDwmBkDNHYVaJhXVTYh4VUtIu+KIToQ/u4yoiWFBkkfVwUBHURZhRh3hSVN90oJESDunARBactE1KHm9P1f8ZzYm4785zDfODHznbec97nfd7n/T/PpGQyKQppvb29orW1VZSUlNDXleAs2AGWg5/gBbgGvtMAi5g/qwVvQQtPLvizhX+vnRcHZFmmjwpe6WqNYfT7c7BGzrwzPj4uIpGIkCTJlAOKogiLxXIRl2VzDHWB9iwH+vv7RVtbm3A4HGaDsLC4uHizzrGbshyYmZkRiURCTE9Pm5odkXMROocvlnO8gEKYwqQ5aR3AqmNsvJBJuBCcp5MIbDqf+SIXYGI7OAjOgFUGn+3KuQU6jUK8F5wDlSYcfwQeyJlKSEmow7aDC8Cncf8luA42gBNgqfruaDSq4PIOCNBPUlNTU/qDXujAlnA4XIEk/IvvH3hPo3x/I0/coDHxO3AVvE7PdLAep2qJ0+n8VVdXN4Ao//4f8crKVPRsrM8tVqvVxmqm2idwA2wFezQmHgQd4JlWyGKxmPB4PKK7u3u2chYVFdHnLXBM49l14KHGvSCH+jFIzLVvtAW05el5RkttzjO5ln0DN8H9tO0xVzvAaSNSD25zEv0pSPECVQbGnwJPClk9jSrhNhNik9p7SsKpqamcDnw08K79PP4uWKvnASpqLpdL1NTUCDpxmUInVVdXN5sM6yR4SnIKBjTGuLFyu8/nCzc2No6qSktAD1JtGzkgeEX5TkKMK9yCXItk5etiISI7Ao4CDyazI/TheDxO4nQFpf4rtEb09fWJ8vJyIdPesFxOagjRZ3aOsv4k2AccGTVhJ/OKnd2l3qRzj/ctA34SM+TDbszxXi33RqVY7feOA3rhIhMJqcCBqp6eHsXtdgsps/hQW00tGbfV+WwFOAwO8bXuEwEHLsGBdnLAoiaFioFO6Ac1lawj1AuEDASiIV2IZpmJPypU2TrBSJ6akdUL0vbTdFkOUEM6NjZmvC2y28M2m03vAsjpZM4I0NHw+/30QkMODA0NDYZCoVFke5mO4W80t8Dr9aYwaoFAIBIMBjtLS0sv6yho98zWAk0jnUcSd3BvoGUj3EcqmhEwa1A6MTExkcApOkB/sFgNPdw1R7hNC+AYppRQzRWpUH/PkQNieHhYUCKm1wJ2IAxG1VNGx72+vj6lNf8EGADGSCd20PLWBgAAAABJRU5ErkJggg==';
    if (location.protocol.startsWith('http')) {
        var xhr = new XMLHttpRequest();
        var request = {
            longUrl : location.toString()
        }
        xhr.onload = function(){
            var link = JSON.parse(xhr.response).id;

            const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
            gClipboardHelper.copyString(link)
            
            try {
                Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService)
                    .showAlertNotification(icon, link, 'Скопирован в буфер обмена', false, "", null, "");
            } catch (e) {}
        }
        xhr.open('POST', 'https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyC7uWVak6m9AFIMORinK4gfNZZ5IrNPgKA', true);
        xhr.setRequestHeader("Content-type", "application/json");
        xhr.send(JSON.stringify(request));
    }
})(content.window.location);

Lex1
Большое спасибо.
PS. Гугл отказывается сокращать ссылки на рутрекер.
http://goo.gl/WGCB
Можно как-то победить?

Кнопка Linkification (Делает текстовые ссылки кликабельными) но для этого кнопку нужно каждый раз кликать)
Можно ли сделать так, чтобы она автоматом сканировала открывающуюся страницу на наличие ссылок без клика по кнопке???

Quartz1t
Есть ещё скрипт ,после него кнопка ну очень редко нужна.

VORON, спасибо, но всё же хотелось бы автоматизировать кнопку.

Quartz1t
Можно клавиатурное сочетание повесить или жест. Для FireGestures такой:

Выделить код

Код:

document.getElementsByAttribute("label", "Linkification")[0].doCommand();

P.S. "Linkification" - название кнопки, т.е. то, что при редактировании кнопки "Имя (N):"

Доброго времени суток.

Имеется кнопка, собранная по видимому из кусков кода для открытия закладок, но тем не менее работающая.

Выделить код

Код:

/*Initialization Code*/
this.tooltipText = "L = Открыть в боковой панели\n" + "M = Открыть в окне\n" + "R = Открыть во вкладке\n\n" +
                   "Shift-R = Меню кнопки";

this. onclick = function (event)
{

    if (event. button == 0)
    PlacesCommandHook.showPlacesOrganizer('AllBookmarks') 

    if (event. button == 1) toggleSidebar('viewBookmarksSidebar');


    if (event. button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
    getBrowser (). selectedTab = getBrowser (). addTab ("chrome://browser/content/places/places.xul")
    }
    
    if(event.button == 2 && !event.shiftKey && !event.altKey && !event.metaKey) {
    event.preventDefault();
    event.stopPropagation();
    }
};

Можно-ли как-нибудь на ЛКМ повесить функционал "родной" кнопки, не библиотеки (редактора закладок) как сделано, а целиком : меню с закладками и пунктами "показать закладки", "редактировать закладки" ну и ниже сами закладки. То есть :

s_1427221262_7074749_9b5d9345de.png

Решения на форуме не нашёл (пропустил ?)
Спасибо.

Мне кажется тут легче повесить на "родную" кнопку дополнительные клики, пример:

Выделить код

Код:

addEventListener("click", function(e) {   
   
   if ( e.button == 1 ) { 
        alert("1");
        }
   
   if ( e.button == 2 ) {
        e.preventDefault();
        e.stopPropagation();
        
        alert("2");
        }
        
}, false, document.getElementById("bookmarks-menu-button") );

Я когда писал, под "родной" имел в виду собственную кнопку [firefox], встроенную. Её ведь не изменишь.

Выделить код

Код:

if ( !this.lastChild ) {
  var mc = document.getElementById("bookmarksMenuPopup");
  var mcc = mc.cloneNode( true );
  this.appendChild( mcc );
}

var bo = document.getBoxObjectFor( this );
this.lastChild.showPopup ( this, -1, -1, "popup", "bottomleft", "topleft" );

bunda1, спасибо огромное. Всё прекрасно работает и что называется "душа спокойна".
Искренне благодарю. :beer:

okkamas_knife пишет

bunda1
у кнопки Запуск VBScript обнаружился баг:
вводим простой скрипт
MsgBox "Как видно?"
запускаем и видим в сообщении  0: 284=>?
это изза перекодировки при сохранении. UTF-8 решил бы проблему но vbs его не понимает..пичалька

Да, проблема :(

okkamas_knife пишет

UTF-8 решил бы проблему но vbs его не понимает..пичалька

Вот так можно:

Выделить код

Код:

var data = self.Help;
var suc = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
    .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
suc.charset = "UTF-16";
data = suc.ConvertFromUnicode(data);

var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
file.append("runVBScript.vbs");
custombuttonsUtils.writeFile(file.path, data);
file.launch();

Infocatcher
Отлично, большое спасибо :)

Кстати, так тоже работает:

Выделить код

Код:

var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
file.append("runVBScript.vbs");
custombuttonsUtils.writeFile( file.path, convertFromUnicode("UTF-16", self.Help) );
file.launch();

25-03-2015 19:33:52

okkamas_knife пишет

кстати а ведь спич апи можно заюзать вместо заморочек со звуковыми файлами для сигнализации о каких либо событиях
CreateObject("SAPI.SpVoice").Speak " user is online "
CreateObject("SAPI.SpVoice").Speak " meow!"
или даже так
CreateObject("SAPI.SpVoice").Speak "~waka~waka~waka~/~waka~waka~waka~/~waka~waka~waka~/~waka~waka~waka~/"

Прикольно, смотрю ты что то соображаешь в VBScript, а не подскажешь код для кнопки который после закрытия Firefox выключает программу или процесс через:

Выделить код

Код:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = 'Notepad.exe'")
For Each objProcess in colProcessList
    objProcess.Terminate()
Next

Вот тут есть что то похожее 26-05-2006 22:53:49 но код также запускает Firefox что не нужно.

okkamas_knife
Жаль, жаль, но и на этом спасибо.

Я не знаю за VBSscript, просто может каг идея...

bunda1 пишет

код для кнопки который после закрытия Firefox выключает программу или процесс

Можно сделать процесс Firefox доченним и запускать его из своего скрипта, который и будет ждать закрытия бравзера и затем выполнять остальной код по уничтожению.
Грубый но рабочий пример на cmd :

Выделить код

Код:

@start/wait "" "%~dp0Palemoon-Portable.exe"
@taskkill /F /im notepad.exe
@exit

Переписать тоже самое на VBS думаю можно :) Т.е. отдать ОС всю эту суету по отслеживанию и запуску убийства.

Скажите,есть ли кнопка-остановить/перезагрузить страницу?После 28 го лиса,очень не хватает.

Что-то вроде этого не подойдёт ?
https://forum.mozilla-russia.org/viewto … 90#p416590

VORON пишет

Скажите,есть ли кнопка-остановить/перезагрузить страницу?После 28 го лиса,очень не хватает.

Остановить - Перезагрузить

bunda1
Спасибо,то что надо!

Ослеп и ничего не вижу. Для 39 (Developer Edition ) не ? :(

bunda1
А нельзя яркость у кнопки увеличить?Уж больно тусклая на фоне остальных
http://i.imgur.com/UpwPSwh.png

VORON пишет

bunda1
А нельзя яркость у кнопки увеличить?Уж больно тусклая на фоне остальных
http://i.imgur.com/UpwPSwh.png

Можно конечно, замени иконку кнопки или Css стилем изменить или положить в кнопку что то типа:

Выделить код

Код:

this.style.cssText = "opacity: 1 !important;"; // Css стиль для кнопки

Есть кнопочка Proxy В ней по ЛКМ меняется состояние network.proxy.type с 1 на 0 и обратно. Я сменил на 2 и 5

Выделить код

Код:

if ( e.button == 0 ) { 
        cbu.setPrefs("network.proxy.type", (cbu.getPrefs("network.proxy.type") == 2 ) ? 5 : 2 );
        }

но так как я совсем нифига не понимаю ни в коде, ни в кнопках, то у меня не меняется состояние иконки, с красного на зеленый :( . какой параметр подкрутить?

о! понял

Выделить код

Код:

// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ................................
var  s = "network.proxy.type";
function toggleImage() {
    var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
    icon.src = ( cbu.getPrefs(s) == 2 )

надо менять cbu.getPrefs(s) == с 2 на 5, ну или наоборот.

Что не так снопкой, поглядите...
Нужно запустиь программу с двумя параметрами из папки профиля. Не получается, подставляется только второй параметр(урл) , а "средний"  который должен не вставляется.
Нужно так       ProfD\Soft\Tools\DomainHostingView.exe /StartDomain [url]
Второй парам. не подставляется. Щас сделал чтобы копировался в буфер, вариант в общем-то... но хотелось бы сразу. Поглядите

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

Выделить код

Код:

var urllink = getBrowser().currentURI.spec;
    gClipboard.write(urllink);
var param="/StartDomain";

     var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
            file.initWithPath(file.path + "\\Soft\\Tools\\DomainHostingView.exe"); 

        startProcess(file.path,param,[urllink]);

        function startProcess(path,param,args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);

     file.initWithPath(path);

    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("URL не найден", path); 
};

HaGEN пишет

Что не так снопкой, поглядите...

Выделить код

Код:

var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
   file.initWithPath(file.path + "\\Soft\\Tools\\DomainHostingView.exe");
   var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   process.init(file);
   process.run(false, ["/StartDomain",content.window.location], 1);
bunda1 пишет

process.run(false, ["/StartDomain",content.window.location], 1);

Почему не
process.run(false, ["/StartDomain", content.document.domain], 2);

Благодарю bunda1! такой "упрощенный" вариант даже лучше.
Еле догнал методом тыка что последняя цифра в process.run(...) отвечает за количество параметров :lol:
Теперь бы узнать что означает первый , который обычно всегда false в примерах..?

Выделить код

Код:

var url = getBrowser().currentURI.spec;
    
 var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
    file.initWithPath(file.path + "\\Soft\\Tools\\DomainHostingView.exe");
   var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   process.init(file);
   process.run(false, ["/StartDomain", url], 2);

19-04-2015 21:24:01
Dumby - ну очепятка, бываить ;)

19-04-2015 21:47:42
Dumby блин, дошло до меня :(   Именно так, сударь!    content.document.domain  ибо на httpS страницах программа сама не фильтрует. Так вообще законченная кнопка, идеальная.
bunda1 мне поправил именно то шо я просил, без "отсебя", хехех... за дополнение благодарю.

Выделить код

Код:

var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
    file.initWithPath(file.path + "\\Soft\\Tools\\DomainHostingView.exe");
   var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   process.init(file);
   process.run(false, ["/StartDomain", content.document.domain], 2);

bunda1
Что-то поменялось в 37-й лисе,что кнопка VT ,при запуске лисы всегда запускается развёрнутой.

VORON
Попробуй последнюю версию:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EVT%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAKP+AAIX/gAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAFf+AABUAAAAAAAAAAAAAAAAAAAAA/4AAJP+AAP//gAD//4AA//+AACQAAAAAAAAAAAAAAAAAAAAA/4AAEv+AAP//gAD//4AAEgAAAAAAAAAA/4AAIP+AAP//gAD//4AA//+AAP//gAD//4AAJgAAAAAAAAAAAAAAAP+AABH/gAD//4AA//+AABEAAAAAAAAAAP+AAP//gAD//4AA//+AADb/gAD//4AA//+AAP//gAAQAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AACAAAAAA/4AAIP+AAP//gAD//4AAEQAAAAAAAAAA/4AAD/+AAP//gAD//4AADwAAAAAAAAAA/4AA//+AAP//gAAMAAAAAP+AAAz/gAD//4AA//+AAA8AAAAAAAAAAP+AAA//gAD//4AA//+AAA8AAAAAAAAAAP+AAP//gAD//4AADwAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AAA8AAAAA/4AAD/+AAP//gAD//4AADAAAAAAAAAAA/4AACv+AAP//gAD//4AACgAAAAAAAAAA/4AA//+AAP//gAAPAAAAAP+AAA//gAD//4AA//+AAAv/gAAL/4AADP+AACH/gAD//4AA//+AACH/gAAK/4AAD/+AAP//gAD//4AAEQAAAAD/gAAR/4AA//+AAP//gAAm/4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AABIAAAAA/4AAEv+AAP//gAD//4AAJ/+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AAEf+AABIAAAAAAAAAAAAAAAD/gAAV/4AAEgAAAAD/gAAQ/4AAEf+AAA//gAAP/4AAD/+AAA//gAAP/4AADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQe//rEHH56xBg8OsQQHDrEEAw6xBEMOsQRDDrEEQw6xBEMOsQRAArEEQAKxBEACsQTkArEH//6xB//+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20vto%20%3D%20%7B%0A%09distanceShow%3A%202%2C%0A%09distanceHide%3A%2064%2C%0A%09showDelay%3A%20320%2C%0A%09color%3A%20%22%23green%22%2C%0A%09fringe%3A%20%22black%22%2C%0A%09padding%3A%203%2C%0A%09name%3A%20%22VT%22%2C%0A%0A%09btn%3A%20this%2C%0A%09tcm%3A%20document.getElementById%28%22toolbar-context-menu%22%29%2C%0A%09ctm%3A%20document.getElementById%28%22customization-toolbar-menu%22%29%2C%0A%09deck%3A%20document.getElementById%28%22content-deck%22%29%2C%0A%09id%3A%20%22cb-vt%22%2C%0A%0A%09get%20cust%28%29%20gBrowser.currentURI.spec%20%3D%3D%20%22about%3Acustomizing%22%2C%0A%09get%20rdf%28%29%20%7B%0A%09%09delete%20this.rdf%3B%0A%09%09var%20rdf%20%3D%20Cc%5B%22@mozilla.org/rdf/rdf-service%3B1%22%5D.getService%28Ci.nsIRDFService%29%3B%0A%09%09return%20this.rdf%20%3D%20%5B%0A%09%09%09rdf%2C%0A%09%09%09rdf.GetDataSource%28%22rdf%3Alocal-store%22%29%2C%0A%09%09%09rdf.GetResource%28location%20+%20%22%23%22%20+%20this.id%29%2C%0A%09%09%09null%2C%20null%0A%09%09%5D%3B%0A%09%7D%2C%0A%09init%3A%20function%28%29%20%7B%0A%09%09if%20%28this.cust%20%7C%7C%20this.btn._destructors.length%29%20return%3B%0A%0A%09%09var%20vt%20%3D%20this.initVT%28%29%3B%0A%09%09var%20vto%20%3D%20this%3B%0A%0A%09%09this.btn.onclick%20%3D%20function%28e%29%20%7B%0A%09%09%09e.button%20%7C%7C%20vto.toggleVT%28%29%3B%0A%09%09%7D%0A%09%09window.addEventListener%28%22popupshown%22%2C%20this%2C%20false%29%3B%0A%09%09window.addEventListener%28%22popuphidden%22%2C%20this%2C%20false%29%3B%0A%09%09window.addEventListener%28%22resize%22%2C%20this%2C%20false%29%3B%0A%09%09this.tcm.addEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09this.tcm.addEventListener%28%22popupshowing%22%2C%20this%2C%20false%29%3B%0A%0A%09%09if%20%28vt.hasOwnProperty%28%22on%22%29%29%20%7B%0A%09%09%09vto.toggleVT%28vt.on%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09var%20%5Brdf%2C%20ds%2C%20source%5D%20%3D%20this.rdf%3B%0A%09%09%09var%20property%20%3D%20rdf.GetResource%28%22collapsed%22%29%3B%0A%09%09%09var%20target%20%3D%20ds.GetTarget%28source%2C%20property%2C%20true%29%3B%0A%09%09%09var%20collapsed%20%3D%20target%20%26%26%20target.QueryInterface%28Ci.nsIRDFLiteral%29.Value%20%3D%3D%20%22true%22%3B%0A%09%09%09vto.toggleVT%28%21collapsed%29%3B%0A%09%09%7D%0A%09%09this.resize%28%29%3B%0A%09%09vto.btn._destructors.push%28%7Bcontext%3A%20vto%2C%20destructor%3A%20vto.destroy%7D%29%3B%0A%09%7D%2C%0A%09destroy%3A%20function%28reason%29%20%7B%0A%09%09window.removeEventListener%28%22popupshown%22%2C%20this%2C%20false%29%3B%0A%09%09window.removeEventListener%28%22popuphidden%22%2C%20this%2C%20false%29%3B%0A%09%09window.removeEventListener%28%22resize%22%2C%20this%2C%20false%29%3B%0A%09%09this.tcm.removeEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09this.tcm.removeEventListener%28%22popupshowing%22%2C%20this%2C%20false%29%3B%0A%09%09this.setCollapser%28false%29%3B%0A%0A%09%09if%20%28reason%20%3D%3D%20%22destructor%22%20%26%26%20this.cust%29%20%7B%0A%09%09%09var%20vto%20%3D%20this%3B%0A%09%09%09vto.resize%28%29%3B%0A%0A%09%09%09gNavToolbox.addEventListener%28%22customizationready%22%2C%20vto%2C%20false%29%3B%0A%09%09%09CustomizableUI.addListener%28vto%29%3B%0A%0A%09%09%09this.ctm.addEventListener%28%22command%22%2C%20vto%2C%20false%29%3B%0A%09%09%09this.ctm.addEventListener%28%22popupshowing%22%2C%20vto%2C%20false%29%3B%0A%09%09%09window.addEventListener%28%22resize%22%2C%20vto%2C%20false%29%3B%0A%0A%09%09%09gNavToolbox.addEventListener%28%22aftercustomization%22%2C%20function%20ac%28%29%20%7B%0A%09%09%09%09gNavToolbox.removeEventListener%28%22aftercustomization%22%2C%20ac%2C%20false%29%3B%0A%09%09%09%09gNavToolbox.removeEventListener%28%22customizationready%22%2C%20vto%2C%20false%29%3B%0A%09%09%09%09CustomizableUI.removeListener%28vto%29%3B%0A%0A%09%09%09%09vto.ctm.removeEventListener%28%22command%22%2C%20vto%2C%20false%29%3B%0A%09%09%09%09vto.ctm.removeEventListener%28%22popupshowing%22%2C%20vto%2C%20false%29%3B%0A%09%09%09%09window.removeEventListener%28%22resize%22%2C%20vto%2C%20false%29%3B%0A%0A%09%09%09%09document.getElementById%28vto.btn.id%29%20%7C%7C%20vto.destroyVT%28%29%3B%0A%0A%09%09%09%7D%2C%20false%29%3B%0A%09%09%7D%0A%09%09if%20%28reason%20%3D%3D%20%22delete%22%29%20%7B%0A%09%09%09CustomizableUI.removeWidgetFromArea%28this.btn.id%29%3B%0A%09%09%09this.destroyVT%28%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09handleEvent%3A%20function%28e%29%20this%5Be.type%5D%28e%29%2C%0A%0A%09command%3A%20function%28e%29%20%7B%0A%09%09if%20%28e.target.id%20%21%3D%20%22toggle_%22%20+%20this.id%29%20return%3B%0A%09%09e.preventDefault%28%29%3B%0A%09%09this.toggleVT%28%29%3B%0A%09%7D%2C%0A%09popupshowing%3A%20function%28e%29%20%7B%0A%09%09var%20menuitem%20%3D%20e.target.querySelector%28%22%23toggle_%22%20+%20this.id%29%3B%0A%09%09menuitem%20%26%26%20menuitem.setAttribute%28%22checked%22%2C%20this.vt.on%29%3B%0A%09%09if%20%28this.cust%20%7C%7C%20%21this.vt.contains%28e.target.triggerNode%29%29%20return%3B%0A%09%09for%28var%20selector%20of%20%5B%22.customize-context-moveToPanel%22%2C%20%22.customize-context-removeFromToolbar%22%5D%29%20%7B%0A%09%09%09menuitem%20%3D%20e.target.querySelector%28selector%29%3B%0A%09%09%09menuitem%20%26%26%20menuitem.removeAttribute%28%22disabled%22%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09mousemove%3A%20function%20collapser%28e%29%20%7B%0A%09%09var%20distance%20%3D%20collapser.distance%20%3D%20e.screenX%20-%20document.documentElement.boxObject.screenX%3B%0A%09%09if%20%28collapser.waiting%29%20return%3B%0A%09%09if%20%28distance%20%3C%3D%20this.distanceShow%20%26%26%20this.vt.collapsed%29%20%7B%0A%09%09%09if%20%28this.showDelay%20%3C%201%29%20%7B%0A%09%09%09%09this.vt.collapsed%20%3D%20false%3B%0A%09%09%09%09return%3B%0A%09%09%09%7D%0A%09%09%09collapser.waiting%20%3D%20true%3B%0A%09%09%09setTimeout%28function%28vto%29%20%7B%0A%09%09%09%09if%20%28collapser.distance%20%3E%3D%20vto.distanceShow%29%20%7B%0A%09%09%09%09%09collapser.waiting%20%3D%20false%3B%0A%09%09%09%09%09return%3B%0A%09%09%09%09%7D%0A%09%09%09%09vto.vt.collapsed%20%3D%20false%3B%0A%09%09%09%09collapser.waiting%20%3D%20false%3B%0A%09%09%09%7D%2C%20this.showDelay%2C%20this%29%3B%0A%09%09%7D%0A%09%09if%20%28distance%20%3E%3D%20this.distanceHide%20%26%26%20%21this.vt.collapsed%29%0A%09%09%09this.vt.collapsed%20%3D%20true%3B%0A%09%7D%2C%0A%09setCollapser%3A%20function%28set%29%20%7B%0A%09%09set%0A%09%09%3F%20this.cust%20%7C%7C%20window.addEventListener%28%22mousemove%22%2C%20this%2C%20false%29%0A%09%09%3A%20window.removeEventListener%28%22mousemove%22%2C%20this%2C%20false%29%3B%0A%09%7D%2C%0A%09callCollapser%3A%20function%28e%29%20%7B%0A%09%09this.mousemove%28%7BscreenX%3A%20document.documentElement.boxObject.screenX%20+%20MousePosTracker._x%7D%29%3B%0A%09%7D%2C%0A%09customizationready%3A%20function%28%29%20%7B%0A%09%09window.removeEventListener%28%22customizationready%22%2C%20this%2C%20false%29%3B%0A%09%09this.vt.on%20%26%26%20this.insertBox%28true%29%3B%0A%09%7D%2C%0A%09resize%3A%20function%28e%29%20%7B%0A%09%09this.vt.style.maxHeight%20%3D%20this.deck.boxObject.height%20+%201%20+%20%22px%22%3B%0A%09%7D%2C%0A%09popupshown%3A%20function%28e%29%20this.handlePopup%28e%29%2C%0A%09popuphidden%3A%20function%28e%29%20this.handlePopup%28e%29%2C%0A%0A%09handlePopup%3A%20function%28e%29%20%7B%0A%09%09if%20%28%0A%09%09%09this.vt.collapsed%20%7C%7C%20this.vt.on%0A%09%09%09%7C%7C%20%28e.target.localName%20%21%3D%20%22menupopup%22%20%26%26%20e.target.localName%20%21%3D%20%22panel%22%29%0A%09%09%29%20return%3B%0A%09%09setTimeout%28function%28vto%29%20%7B%0A%09%09%09var%20hasPopup%20%3D%20Array.concat%28%0A%09%09%09%09Array.slice%28document.getElementsByTagName%28%22menupopup%22%29%29%2C%0A%09%09%09%09Array.slice%28document.getElementsByTagName%28%22panel%22%29%29%0A%09%09%09%29.some%28function%28popup%29%0A%09%09%09%09%22state%22%20in%20popup%20%26%26%20popup.state%20%3D%3D%20%22open%22%20%26%26%20%28%0A%09%09%09%09%09vto.vt.contains%28popup%29%0A%09%09%09%09%09%7C%7C%20%28%22triggerNode%22%20in%20popup%20%26%26%20vto.vt.contains%28popup.triggerNode%29%29%0A%09%09%09%09%09%7C%7C%20%28%0A%09%09%09%09%09%09%22anchorNode%22%20in%20popup%20%26%26%20popup.anchorNode%20%26%26%20%28%0A%09%09%09%09%09%09%09vto.vt.contains%28popup.anchorNode%29%0A%09%09%09%09%09%09%09%7C%7C%20vto.vt.contains%28document.getBindingParent%28popup.anchorNode%29%29%0A%09%09%09%09%09%09%29%0A%09%09%09%09%09%29%0A%09%09%09%09%29%0A%09%09%09%29%3B%0A%09%09%09vto.setCollapser%28%21hasPopup%29%3B%0A%09%09%09hasPopup%20%7C%7C%20vto.callCollapser%28%29%3B%0A%09%09%7D%2C%20200%2C%20this%29%3B%0A%09%7D%2C%0A%09onWidgetAfterDOMChange%3A%20function%28...a%29%20%7B%0A%09%09if%20%28a%5B2%5D%20%3D%3D%20this.vt.box%29%20this.vt.hbox.style.minWidth%20%3D%20this.vt.boxObject.width%20+%20%22px%22%3B%0A%09%7D%2C%0A%09initVT%3A%20function%28%29%20%7B%0A%09%09var%20id%20%3D%20this.id%3B%0A%09%09var%20boxId%20%3D%20id%20+%20%22-customization-target%22%3B%0A%09%09var%20vt%20%3D%20this.vt%20%3D%0A%09%09%09document.getElementById%28id%29%20%7C%7C%0A%09%09%09document.createElement%28%22toolbar%22%29%3B%0A%09%09var%20attrs%20%3D%20%7B%0A%09%09%09id%3A%20id%2C%0A%09%09%09mode%3A%20%22icons%22%2C%0A%09%09%09iconsize%3A%20%22small%22%2C%0A%09%09%09orient%3A%20%22vertical%22%2C%0A%09%09%09customizable%3A%20%22true%22%2C%0A%09%09%09persist%3A%20%22collapsed%22%2C%0A%09%09%09toolbarname%3A%20this.name%2C%0A%09%09%09fullscreentoolbar%3A%20%22true%22%2C%0A%09%09%09class%3A%20%22chromeclass-toolbar%22%2C%0A%09%09%09context%3A%20%22toolbar-context-menu%22%2C%0A%09%09%09style%3A%20%22-moz-appearance%3A%20none%3B%20display%3A%20-moz-box%3B%20height%3A%20100%25%3B%20position%3A%20fixed%3B%20min-width%3A%2020px%22%0A%09%09%7D%3B%0A%09%09for%28var%20attr%20in%20attrs%29%20vt.setAttribute%28attr%2C%20attrs%5Battr%5D%29%3B%0A%09%09if%20%28%21vt.parentNode%29%20%7B%0A%0A%09%09%09var%20box%20%3D%20vt.box%20%3D%20document.createElement%28%22vbox%22%29%3B%0A%09%09%09vt.appendChild%28box%29%3B%0A%09%09%09box.id%20%3D%20boxId%3B%0A%09%09%09box.style.cssText%20%3D%20%22height%3A%20100%25%3B%20width%3A%20100%25%3B%22%0A%0A%09%09%09vt.customizationTarget%20%3D%20box%3B%0A%09%09%09gNavToolbox.appendChild%28vt%29%3B%0A%0A%09%09%09if%20%28CustomizableUI.areas.indexOf%28id%29%20%3D%3D%20-1%29%20%7B%0A%09%09%09%09CustomizableUI.registerArea%28id%2C%20%7Blegacy%3A%20true%7D%29%3B%0A%09%09%09%7D%0A%09%09%09box.removeAttribute%28%22class%22%29%3B%0A%09%09%09box.__defineGetter__%28%22localName%22%2C%20function%28%29%20arguments.callee.caller%20%3D%3D%20custombutton.buttonConstructor%20%3F%20%22toolbar%22%20%3A%20%22vbox%22%29%3B%0A%0A%09%09%09vt.hbox%20%3D%20document.createElement%28%22hbox%22%29%3B%0A%09%09%09vt.hbox.id%20%3D%20id%20+%20%22-hbox%22%3B%0A%09%09%7D%0A%09%09vt.box.style.padding%20%3D%20%220%20%22%20+%20this.padding%20+%20%22px%22%3B%0A%09%09vt.style.backgroundColor%20%3D%20this.color%3B%0A%09%09vt.style.borderRight%20%3D%20%221px%20solid%20%22%20+%20this.fringe%3B%0A%09%09return%20vt%3B%0A%09%7D%2C%0A%09destroyVT%3A%20function%28reason%29%20%7B%0A%09%09var%20vt%20%3D%20this.vt%3B%0A%09%09CustomizableUI.unregisterArea%28vt.id%2C%20%7B%7D%29%3B%0A%09%09vt.hbox.parentNode%20%26%26%20vt.hbox.parentNode.removeChild%28vt.hbox%29%3B%0A%09%09vt.parentNode%20%26%26%20vt.parentNode.removeChild%28vt%29%3B%0A%0A%09%09var%20%5Brdf%2C%20ds%2C%20source%2C%20property%2C%20target%5D%20%3D%20this.rdf%3B%0A%09%09var%20enumerator%20%3D%20ds.ArcLabelsOut%28source%29%3B%0A%09%09while%28enumerator.hasMoreElements%28%29%29%20%7B%0A%09%09%09property%20%3D%20enumerator.getNext%28%29%3B%0A%09%09%09target%20%3D%20ds.GetTarget%28source%2C%20property%2C%20true%29%3B%0A%09%09%09ds.Unassert%28source%2C%20property%2C%20target%29%3B%0A%09%09%7D%0A%09%09target%20%3D%20source.QueryInterface%28Ci.nsIRDFNode%29%3B%0A%09%09source%20%3D%20rdf.GetResource%28location%29%3B%0A%09%09property%20%3D%20rdf.GetResource%28%22http%3A//home.netscape.com/NC-rdf%23persist%22%29%3B%0A%09%09ds.Unassert%28source%2C%20property%2C%20target%29%3B%0A%09%7D%2C%0A%09insertBox%3A%20function%28ins%29%20%7B%0A%09%09var%20vt%20%3D%20this.vt%3B%0A%09%09var%20box%20%3D%20vt.hbox%3B%0A%09%09if%20%28%21ins%29%20%7B%0A%09%09%09box.parentNode%20%26%26%20box.parentNode.removeChild%28box%29%3B%0A%09%09%09return%3B%0A%09%09%7D%0A%09%09var%20id%20%3D%20this.cust%20%3F%20%22customization-palette-container%22%20%3A%20%22sidebar-box%22%3B%0A%09%09var%20point%20%3D%20document.getElementById%28id%29%3B%0A%09%09point.parentNode.insertBefore%28box%2C%20point%29%3B%0A%09%09var%20mw%20%3D%20function%28%29%20box.style.minWidth%20%3D%20vt.boxObject.width%20+%20%22px%22%3B%0A%09%09mw%28%29%3B%20setTimeout%28mw%2C%20100%29%3B%0A%09%7D%2C%0A%09toggleVT%3A%20function%28on%29%20%7B%0A%09%09var%20vt%20%3D%20this.vt%3B%0A%09%09if%20%28on%20%3D%3D%20undefined%29%20on%20%3D%20%21vt.on%3B%0A%09%09vt.on%20%3D%20on%3B%0A%09%09this.setCollapser%28%21on%29%3B%0A%09%09vt.collapsed%20%3D%20%21on%3B%0A%09%09this.insertBox%28on%29%3B%0A%09%7D%0A%7D%3B%0Avto.init%28%29%3B%0A%0A%0Afunction%20addBackground%28e%29%20%7B%0A%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20var%20toolbar%20%3D%20document.getElementById%28%27cb-vt%27%29%3B%0A%20%20%20%20%20%20var%20win%20%3D%20document.getElementById%28%22main-window%22%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20image%20%3D%20win.style.backgroundImage%3B%0A%20%20%20%20%20%20if%20%28%20image%20%3D%3D%20%27%27%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20toolbar.style.background%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20toolbar.style.background%20%3D%20image%3B%0A%20%20%20%20%20%20toolbar.style.backgroundSize%20%3D%20%27auto%20100%25%27%3B%0A%20%20%20%7D%2C%20500%29%3B%0A%7D%3B%0AaddBackground%28%29%3B%20%0AServices.obs.addObserver%28%20addBackground%2C%20%22lightweight-theme-styling-update%22%2C%20false%20%29%3B%0AaddDestructor%28function%28%29%20Services.obs.removeObserver%28%20addBackground%2C%20%22lightweight-theme-styling-update%22%29%20%29%3B%20%0A%0A%0A%0A%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Всё равно.Запускаю браузер,панель развёрнута.
Похоже всё таки самая стабильная версия,как по мне,осталась 28-я.Всё работает,ничего не глючит

VORON пишет

bunda1
Всё равно.Запускаю браузер,панель развёрнута.
Похоже всё таки самая стабильная версия,как по мне,осталась 28-я.Всё работает,ничего не глючит

По поводу 28 версии согласен с вами. Насколько много в плане производительности версии 28.0 и 37.0.2 различаются?

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

"код" кнопки
const showSec = true;

//==========================================================
/* dct-style

#digital-clock-text {
    color: #00ddff !important;
    font-weight: bold !important;

}

dct-style */
//==========================================================

const mark = "dct-style";
const init = this.getAttribute("cb-init");
const style = init.substring(
    init.indexOf("/* " + mark) + 3 + mark.length,
    init.lastIndexOf(mark + " */")
).replace(/\n+/g, "\n").replace(/^\n/, "").replace(/\n$/, "");

this.label = showSec ? "00:00:00" : "00:00";

const icon = document.getAnonymousElementByAttribute(this, "class", "toolbarbutton-icon");
icon.style.display = "none";
const text = document.getAnonymousElementByAttribute(this, "class", "toolbarbutton-text");
text.style.display = "block";
text.id = "digital-clock-text";

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
const cssURI = makeURI("data:text/css," + encodeURIComponent(style));
if (!sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);

const format = showSec ? "%H:%M:%S" : "%H:%M";
const timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
function tick() {
    var date = new Date();
//    date.setHours(date.getHours() + 0);
    self.label = date.toLocaleFormat(format)
}
timer.initWithCallback(tick, 1000, timer.TYPE_REPEATING_PRECISE);

this.onmouseenter = function() {
    this.interval = setInterval(function() {
        var date = new Date();
//        date.setHours(date.getHours() + 0);
        var day = date.toLocaleFormat("%A");
        self.tooltipText = date.toLocaleFormat("%d.%m.%Y ") + day[0].toUpperCase() + day.substring(1);
    }, 100)
};
this.onmouseleave = function() clearInterval(this.interval);
this.onDestroy = function(reason) {
    if (reason == "update" || reason == "delete") {
        if (sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.unregisterSheet(cssURI, sss.USER_SHEET);
    }
    timer.cancel()
};


"инициализация" кнопки
// Автоматически очистить панель поиска после запуска поиска + возврат нужного поисковика, от 19.12.2013. ..............
(function() {
   var func = BrowserSearch.searchBar.handleSearchCommand.toString()
                   .replace(/^\s*function.+{/, '').replace(/}\s*$/, '');   
     
   var code = ['setTimeout(function() { textBox.value = ""; }, 500);\
               \n var searchService = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);\
               \n searchService.currentEngine = searchService.getEngineByName("Яндекс");\
                '].join('');

   func += code;
   BrowserSearch.searchBar.handleSearchCommand = new Function('aEvent', func );
})();

// Показывать потребление памяти в адресной строке, от 28.07.2014. ................................
(function () {
   if ( document.getElementById('memoryDisplay') ) return;
   
   // Создать в адресной строке счётчик памяти ....
   var memoryDisplay = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons");
   urlbarIcons.insertBefore( memoryDisplay, urlbarIcons.lastChild ); // перед первой иконкой адресной строки
   
   memoryDisplay.id = "memoryDisplay";
   memoryDisplay.label = getMemory() + ' MB'; 
   self.timer = setInterval(function() { memoryDisplay.label = getMemory() + ' MB' }, 2000 ); // таймер обновляет счётчик раз в 2000мс( 2 сек )
   
   
   // Всплывающая подсказка у счётчика отображает заполнение дискового кеша ....
   var k = 100, mb = 1024 * 1024, str = "",
   cs = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService),
   visitor = { visitDevice: addInfo };

   function addInfo(device, info) {
      str += (str ? "\n" : "") + device[0].toUpperCase() + device.slice(1) + " Cache:  " +
      [info.totalSize, info.maximumSize].map(function(num) Math.round(k * num / mb) / k + " MB").join(" / ");
   };

   memoryDisplay.onmouseenter = function() {
     str = "";
     try { cs.visitEntries(visitor) } catch(e) {};
     memoryDisplay.tooltipText = "Л: Подробно показать потребление памяти в вкладке" + "\n\n"
        + ( cbu.getPrefs("browser.cache.memory.enable") || cbu.getPrefs("browser.cache.disk.enable") ? str : "Кэш отключен" );
   };
   
   
   // Получить всю занимаемую оперативную память в MB ....
   function getMemory() {           
      var reporterManager = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager);
      try {
          var e = reporterManager.enumerateReporters();
          while ( e.hasMoreElements() ) {
                  var mr = e.getNext().QueryInterface(Ci.nsIMemoryReporter);
                  self[mr.path] = mr;
                  }
          var memory = self["resident"].amount;
          }
      catch(e) { var memory = reporterManager.resident }; // для Nightly
     
      return ( Math.round( memory/1048576 ) );
   };     
   
   
   // По клику подробно показать потребление памяти в вкладке ....
   memoryDisplay.onclick = function(e) {
      if ( e.button ) return;
       var memoryTab = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("about:memory") );
         
       // oбработчик ждет пока откроется "about:memory", удаляет себя и нажимает кнопку на странице
       memoryTab.addEventListener("pageshow", function c(e) {         
          this.removeEventListener( e.type, c );           

          setTimeout(function() { try { e.originalTarget.getElementById('measureButton').click() } catch(e) {} }, 0);     
       }); 
   };
   
     
   // Css стиль для счётчика ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #memoryDisplay { -moz-appearance: none !important; margin-left: 2px !important; margin-right: -4px !important; border: 0 !important; min-width: 5.5em; text-align: right; }\
      #memoryDisplay[resetMemory] { color: red !important; }\
   '));
   const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);


   // Удалять счётчик памяти и другие изменения ....
   addDestructor(function() {
      sss.unregisterSheet(uri, sss.AGENT_SHEET);
      urlbarIcons.removeChild( memoryDisplay )
      try { window.clearTimeout( self.timer ) } catch(e) {};
   });
   
})();
try {
    document.getElementById("home-button").setAttribute("onclick", "event.stopPropagation(); if (event.button == '0') { ( (Application.prefs.getValue('browser.startup.homepage', 0)).split('|') ).forEach(function(url) { getBrowser().selectedTab = getBrowser().addTab( url ) }) }");
}
catch(e) { };
// Добавить новый пункт "Перезапуск" в главном меню .....................................................
(function() {
    // блокировать дублирование пункта при открытии настройки панелей
    if ( document.getElementById("restart_firefox") ) return;
   
    var menuItem = document.createElement("menuitem");
    menuItem.setAttribute("id", "restart_firefox");               
    menuItem.setAttribute("label", "Перезапуск");
    menuItem.setAttribute("oncommand", "Application.restart()");   
   
    var QuitItem = document.getElementById("menu_FileQuitItem"); // в меню 'Файл'
    QuitItem.parentNode.insertBefore( menuItem, QuitItem );
   
    var appmenuQuit = document.getElementById("appmenu_quit") || document.getElementById("appmenu-quit"); // в меню kнопки "Firefox"
    if ( appmenuQuit ) appmenuQuit.parentNode.insertBefore( menuItem.cloneNode(true), appmenuQuit );
})();

document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function(event) {
      if (!event.shiftKey) return;
      if (gContextMenu.onLink && !gContextMenu.onImage){ gContextMenu.saveLink()};
      //...
      if (gContextMenu.onLink && gContextMenu.onImage){ gContextMenu.saveMedia();};
}, false);

/*Initialization Code*/


проблема: тускло выглядит
должно быть: http://puu.sh/huYJl/f6f77caf45.jpg
как есть сейчас: http://puu.sh/htZNM/b378f2887c.jpg

и второй вопрос:
как отключить иконку загрузки ? зеленая и синяя такие
скрин (зеленой) http://puu.sh/htZNM/b378f2887c.jpg
что бы вместо этого, во время загрузки страницы был виден её фавикон (иконка).

29-04-2015 14:44:33

bunda1 пишет

this.style.cssText = "opacity: 1 !important;"; // Css стиль для кнопки

а куда данный стиль запихать ? и в код и в инициализацию пробывал, все равно тускло.

LittleMontana пишет

проблема: тускло выглядит

Такое происходит если в кодах кнопки которые ты положил в вкладку Код или Инициализация есть ошибка. Я проверил на FF38 и всё работает и кнопка выглядит как надо, наверно конфликт с другим кодом или расширением, смотри что пишет консоль ошибок или удаляй коды из своей кнопки по одному и проверяй тусклость.

29-04-2015 20:42:39

LittleMontana пишет
bunda1 пишет

this.style.cssText = "opacity: 1 !important;"; // Css стиль для кнопки

а куда данный стиль запихать ? и в код и в инициализацию пробывал, все равно тускло.

В инициализацию но в данном случае не поможет по выше упомянутым причинам.

29-04-2015 20:47:01

LittleMontana пишет

и второй вопрос:
как отключить иконку загрузки ? зеленая и синяя такие
скрин (зеленой) http://puu.sh/htZNM/b378f2887c.jpg
что бы вместо этого, во время загрузки страницы был виден её фавикон (иконка).

Я не понял о чём речь на твоём изображение не http://puu.sh/htZNM/b378f2887c.jpg не иконка загрузки :/

Извините, не тот скриншот
http://puu.sh/htYUk/fded7f9bad.jpg

LittleMontana пишет

Извините, не тот скриншот
http://puu.sh/htYUk/fded7f9bad.jpg

И где такая иконка загрузки?

bunda1
firefox 37.0.2
вкладки грузятся так...

bunda1
Поправьте, пожалуйста, Autocopy+3 для Nightly, в связи с этим. Она работает, но страшно засоряет консоль с "Deprecated.warning".

Вроде, если заменить getBrowserSelection на getSelection, то перестает ругаться, но текст тогда не мигает при копировании. (С document.commandDispatcher.focusedWindow.getSelection().toString(); и мигает и на "Deprecated" не ругается.)

Спасибо.

turbot пишет

Поправьте, пожалуйста, Autocopy+3 для Nightly ...
Вроде, если заменить getBrowserSelection на getSelection, то перестает ругаться, но текст тогда не мигает при копировании. (С document.commandDispatcher.focusedWindow.getSelection().toString(); и мигает и на "Deprecated" не ругается.)

Приятно когда пользователи находят в кнопках ошибки и сами исправляют:)  А кнопку я подправил, спасибо.

bunda1
:/

скрытый текст
document.commandDispatcher.focusedWindow.getSelection().toString();
e.target.ownerDocument.defaultView.getSelection().toString(); // + e10s

var lastSelection = ... // бесполезно
autocopy.lastSelection = ...

alt

Dumby пишет

e.target.ownerDocument.defaultView.getSelection().toString(); // + e10s
autocopy.lastSelection = ...

Да это работает на + e10s. Спасыбо :beer:

alt
А почему у тебя там removeEventListener для method(type, this, false, gBrowser); ведь CB должен сам удалять обработчика.

bunda1 пишет

А почему у тебя там removeEventListener для method(type, this, false, gBrowser); ведь CB должен сам удалять обработчика.

Да, CB должен сам удалять обработчика.
Но это когда срабатывает деструктор кнопки.
То есть когда кнопка удаляется или пересоздаётся.

А в данном случае имеется в виду совсем другое.
Задумано так: observer следит за изменением настройки «Autocopy».

Если настройка изменилась на true (Autocopy включён),
то добавляются listener'ы на mousedown и mouseup.

А если настройка изменилась на false (Autocopy выключен),
то listener'ы на mousedown и mouseup удаляются,
потому что теперь они не нужны, а только
бессмысленную работу будут делать при каждом клике.

Dumby
Понятно, я сам наверно мог догадаться. Спасибо.

Как сделать кнопку для вызова настроек  дополнения friGate, чтобы при клике появлялось окошко

скрытый текст
2015-05-07_181516.png

manuk
Есть кнопка-меню вызова настроек для всех плугов у кот. есть настройки.

Кнопка быстрого вызова настроек расширений. URl

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0411%u044B%u0441%u0442%u0440%u044B%u0439%20%u0434%u043E%u0441%u0442%u0443%u043F%20%u043A%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%u043C%20%u0440%u0430%u0441%u0448%u0438%u0440%u0435%u043D%u0438%u0439%20%5BExtensions%20Options%20Menu%5D%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABVUlEQVQ4y2P4//8/AyWYoALpQsb9ftPM/4tnM+4nywCQ5s5jRf8d+7T+k2VAxHzH/TUHkv57TDMgzgWyJYz74xZ6/E9Y4vU/ZaXv/9Jd0f/LDkb+j13v8N9xmtp/oy6J/xqN/P+5Ihj2YzUApHnxtb7/My83/e8+W/C/9nj8//yD/v+T99j/D99u8N9nk/J/h9Vi/+Vq2P5jNQBkMz7NTuvE/1ut5v0vV8+M3QCQs3Fptlsh+l93Ktd/pTaW/wKpjAgDYFEFCjCQn3HZDNLME8tYANLDEcrgADcAFlWg0AYFGC5nK3ew/McaC6BEAopnUFSBQhubZpMVbP81JrFgdwEyBkUVup9BNoM0681hBdMYYYCMQfGMzc8gGqQZ5BIQxhkLoEQCimeQs0E2IcuB+CDNxkvZ/ktX4jAAlMJAiQRkA8iZML+CaBAfJA7SDOTvJyovEMIAruB4gKjNkYMAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*%0A%20*%20%20This%20Source%20Code%20Form%20is%20subject%20to%20the%20terms%20of%20the%20Mozilla%20Public%0A%20*%20%20License%2C%20v.%202.0.%20If%20a%20copy%20of%20the%20MPL%20was%20not%20distributed%20with%20this%0A%20*%20%20file%2C%20You%20can%20obtain%20one%20at%20http%3A//mozilla.org/MPL/2.0/.%0A%20*/%0A%0Afunction%20%24%28aId%29%20%7B%0A%20%20return%20document.getElementById%28aId%29%3B%0A%7D%0A%0Afunction%20%24xml%28aXML%29%20%7B%0A%20%20return%20%28new%20DOMParser%29.parseFromString%28aXML%2C%20%22application/xml%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.documentElement%3B%0A%7D%0A%0Afunction%20sort%28aArray%29%20%7B%0A%20%20aArray.sort%28function%28a%2C%20b%29%20%7B%0A%20%20%20%20a%20%3D%20a.name.toLowerCase%28%29%3B%0A%20%20%20%20b%20%3D%20b.name.toLowerCase%28%29%3B%0A%20%20%20%20if%20%28a%20%3C%20b%29%20return%20-1%3B%0A%20%20%20%20if%20%28a%20%3E%20b%29%20return%201%3B%0A%20%20%20%20return%200%3B%0A%20%20%7D%29%0A%7D%0A%0Afunction%20openAM%28aView%29%20%7B%0A%20%20if%20%28%22toEM%22%20in%20window%29%20%7B%0A%20%20%20%20toEM%28aView%29%3B%0A%20%20%7D%20else%20if%20%28%22openAddonsMgr%22%20in%20window%29%20%7B%0A%20%20%20%20openAddonsMgr%28aView%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20BrowserOpenAddonsMgr%28aView%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.openOption%20%3D%20function%28aId%29%20%7B%0A%20%20AddonManager.getAddonByID%28aId%2C%20function%28aAddon%29%20%7B%0A%20%20%20%20if%20%28aAddon.optionsType%20%26%26%20%28parseInt%28aAddon.optionsType%29%20%3E%201%29%29%20%7B%0A%20%20%20%20%20%20switch%20%28parseInt%28aAddon.optionsType%29%29%20%7B%0A%20%20%20%20%20%20%20%20case%203%3A%0A%20%20%20%20%20%20%20%20%20%20switchToTabHavingURI%28aAddon.optionsURL%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%202%3A%0A%20%20%20%20%20%20%20%20%20%20openAM%28%22addons%3A//detail/%22%20+%20encodeURIComponent%28aAddon.id%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22/preferences%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20openDialog%28aAddon.optionsURL%2C%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22chrome%2C%20dialog%2C%20close%2C%20minimizable%2C%20%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22titlebar%2C%20toolbar%2C%20scrollbars%2C%20centerscreen%22%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%29%0A%7D%0A%0Athis.setStatus%20%3D%20function%28aString%29%20%7B%0A%20%20XULBrowserWindow.setOverLink%28aString%29%3B%0A%7D%0A%0Athis.onclick%20%3D%20function%20inspectExtensions%28aEvent%29%20%7B%0A%20%20switch%20%28aEvent.button%29%20%7B%0A%20%20%20%20case%200%3A%0A%20%20%20%20%20%20if%20%28aEvent.ctrlKey%29%20%7B%0A%20%20%20%20%20%20%20%20aEvent.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28typeof%20inspectObject%20%21%3D%20%22function%22%29%20return%3B%0A%20%20%20%20%20%20%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20extensions%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20%20%20aAddons.forEach%28function%28aAddon%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28aAddon.type%20%3D%3D%20%22extension%22%20%26%26%20aAddon.isActive%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20extensions.push%28aAddon%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%29%0A%20%20%20%20%20%20%20%20%20%20sort%28extensions%29%3B%0A%20%20%20%20%20%20%20%20%20%20inspectObject%28extensions%29%3B%0A%20%20%20%20%20%20%20%20%7D%29%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20case%201%3A%0A%20%20%20%20%20%20var%20prefs%20%3D%20Services.prefs.getBranch%28%22custombuttons.searchAddons%22%20+%20%22.%22%29%3B%0A%20%20%20%20%20%20var%20text%20%3D%20%22%22%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20text%20%3D%20prefs.getCharPref%28%22search%22%29%3B%0A%20%20%20%20%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20query%20%3D%20custombuttons.promptBox%28%22Search%20add-ons%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Enter%20add-on%20name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%2C%20null%29%3B%0A%20%20%20%20%20%20if%20%28%21query%5B0%5D%29%20return%3B%0A%20%20%20%20%20%20prefs.setCharPref%28%22search%22%2C%20query%5B1%5D%29%3B%0A%20%20%20%20%20%20openAM%28%22addons%3A//search/%22%20+%20encodeURIComponent%28query%5B1%5D%29%29%3B%0A%0A%20%20%20%20default%3A%0A%20%20%7D%0A%7D%0A%0Athis.addonsMgr%20%3D%20function%28aPopup%2C%20aCallback%29%20%7B%0A%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20var%20extensions%20%3D%20%5B%5D%3B%0A%20%20%20%20aAddons.forEach%28function%28aAddon%29%20%7B%0A%20%20%20%20%20%20/*aAddon.toString%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%22use%20strict%22%3B%0A%20%20%20%20%20%20%20%20return%20this.name%3B%0A%20%20%20%20%20%20%7D*/%0A%20%20%20%20%20%20if%20%28%28aAddon.type%20%3D%3D%20%22extension%22%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28aAddon.optionsURL%20%21%3D%20null%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20aAddon.isActive%29%20%7B%0A%20%20%20%20%20%20%20%20extensions.push%28aAddon%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%0A%20%20%20%20sort%28extensions%29%3B%0A%20%20%20%20aCallback%28aPopup%2C%20extensions%29%3B%0A%20%20%7D%29%0A%7D%0A%0Afunction%20getExtensionObject%28aId%2C%20aCallback%29%20%7B%0A%20%20AddonManager.getAllAddons%28function%28aAddons%29%20%7B%0A%20%20%20%20aAddons.forEach%28function%28aAddon%29%20%7B%0A%20%20%20%20%20%20if%20%28aAddon.id%20%3D%3D%20aId%29%20%7B%0A%20%20%20%20%20%20%20%20aCallback%28aAddon%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%0A%20%20%7D%29%0A%7D%0A%0Afunction%20htmlEntities%28aString%29%20%7B%0A%20%20return%20aString.replace%28/%26/g%2C%20%22%26amp%3B%22%29.replace%28/%3C/g%2C%20%22%26lt%3B%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace%28/%3E/g%2C%20%22%26gt%3B%22%29.replace%28/%22/g%2C%20%22%26quot%3B%22%29%3B%0A%7D%0A%0Afunction%20addItem%28aNode%2C%20aId%2C%20aLabel%2C%20aURL%2C%20aIcon%2C%20aHomePage%2C%20aDesc%29%20%7B%0A%20%20let%20mi%20%3D%20aNode.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20%20%20%20%20mi.setAttribute%28%22GUID%22%2C%20aId%29%3B%0A%20%20%20%20%20%20mi.className%20%3D%20%22menuitem-iconic%22%3B%0A%20%20%20%20%20%20mi.setAttribute%28%22label%22%2C%20aLabel%29%3B%0A%20%20%20%20%20%20mi.statusText%20%3D%20aURL%3B%0A%20%20%20%20%20%20mi.setAttribute%28%22image%22%2C%20aIcon%29%3B%0A%20%20%20%20%20%20mi.setAttribute%28%22homepage%22%2C%20aHomePage%29%3B%0A%20%20%20%20%20%20mi.tooltipText%20%3D%20aDesc%3B%0A%7D%0A%0Athis.populate%20%3D%20function%28aPopup%2C%20aExtensions%29%20%7B%0A%20%20while%20%28aPopup.lastChild%29%20aPopup.removeChild%28aPopup.lastChild%29%3B%0A%20%20if%20%28%28navigator.platform%20%3D%3D%20%22Win32%22%29%20%26%26%20%28aExtensions.length%20%3E%2020%29%29%20%7B%0A%20%20%20%20var%20hbox%20%20%3D%20aPopup.appendChild%28document.createElement%28%22hbox%22%29%29%3B%0A%20%20%20%20var%20vbox1%20%3D%20hbox.appendChild%28document.createElement%28%22vbox%22%29%29%3B%0A%20%20%20%20var%20vbox2%20%3D%20hbox.appendChild%28document.createElement%28%22vbox%22%29%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aExtensions.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20let%20vbox%20%3D%20%28i%20%3C%20parseInt%28aExtensions.length%20/%202%29%29%20%3F%20vbox1%20%3A%20vbox2%3B%0A%20%20%20%20%20%20let%20ext%20%3D%20aExtensions%5Bi%5D%3B%0A%20%20%20%20%20%20addItem%28vbox%2C%20ext.id%2C%20ext.name%20+%20%22%20%22%20+%20ext.version%2C%20ext.optionsURL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28ext.iconURL%20%3F%20ext.iconURL%20%3A%20%22chrome%3A//mozapps/skin/extensions/extensionGeneric-16.png%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28ext.homepageURL%20%3F%20ext.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20ext.reviewURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20ext.reviewURL.replace%28/%5C/reviews/%2C%20%22%22%29.toString%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22http%3A//www.google.com/search%3Fq%3D%22%20+%20ext.name%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ext.description%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%20else%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aExtensions.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20let%20ext%20%3D%20aExtensions%5Bi%5D%3B%0A%20%20%20%20%20%20addItem%28aPopup%2C%20ext.id%2C%20ext.name%20+%20%22%20%22%20+%20ext.version%2C%20ext.optionsURL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28ext.iconURL%20%3F%20ext.iconURL%20%3A%20%22chrome%3A//mozapps/skin/extensions/extensionGeneric-16.png%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28ext.homepageURL%20%3F%20ext.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20ext.reviewURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20ext.reviewURL.replace%28/%5C/reviews/%2C%20%22%22%29.toString%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22http%3A//www.google.com/search%3Fq%3D%22%20+%20ext.name%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ext.description%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0Avar%20popup%20%3D%20document.createElement%28%22menupopup%22%29%3B%0Apopup.setAttribute%28%22context%22%2C%20%22cb-extensions-menu%22%29%3B%0Apopup.setAttribute%28%22oncommand%22%2C%20%22event.stopPropagation%28%29%3B%20%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22this.parentNode.openOption%28%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22event.target.getAttribute%28%27GUID%27%29%29%3B%22%29%3B%0Apopup.setAttribute%28%22onmouseover%22%2C%20%22this.parentNode.setStatus%28%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22event.target.statusText%29%3B%22%29%3B%0Apopup.setAttribute%28%22onmouseout%22%2C%20%22this.parentNode.setStatus%28%27%27%29%3B%22%29%3B%0Apopup.setAttribute%28%22onpopupshowing%22%2C%20%22this.parentNode.addonsMgr%28%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22this%2C%20this.parentNode.populate%29%3B%22%29%3B%0A%0A//this.addonsMgr%28popup%2C%20this.populate%29%3B%0A%0Athis.appendChild%28popup%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0A%0A//---------------------------------%0A%0Athis.copyId%20%3D%20function%28aId%29%20%7B%0A%20%20Cc%5B%22@mozilla.org/widget/clipboardhelper%3B1%22%5D.%0A%20%20getService%28Ci.nsIClipboardHelper%29.copyString%28aId%29%3B%0A%7D%0A%0Athis.goHome%20%3D%20function%28aURL%29%20%7B%0A%20%20gBrowser.loadOneTab%28aURL%29%3B%0A%7D%0A%0Athis.inspect%20%3D%20function%28aId%29%20%7B%0A%20%20getExtensionObject%28aId%2C%20inspectObject%29%3B%0A%7D%0A%0Athis.explore%20%3D%20function%28aId%29%20%7B%0A%20%20var%20dir%20%3D%20Services.dirsvc.get%28%22ProfD%22%2C%20Ci.nsIFile%29%3B%0A%20%20dir.append%28%22extensions%22%29%3B%0A%20%20dir.append%28aId%29%3B%0A%20%20var%20nsLocalFile%20%3D%20Components.Constructor%28%22@mozilla.org/file/local%3B1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22nsILocalFile%22%2C%20%22initWithPath%22%29%3B%0A%20%20%28new%20nsLocalFile%28dir.path%20+%20%28dir.exists%28%29%20%3F%20%22%22%20%3A%20%22.xpi%22%29%29%29.reveal%28%29%3B%0A%7D%0A%0Aif%20%28%24%28%22cb-extensions-menu%22%29%29%20%7B%0A%20%20%24%28%22cb-extensions-menu%22%29.parentNode.removeChild%28%24%28%22cb-extensions-menu%22%29%29%3B%0A%7D%0A%0Athis.checkForDOMI%20%3D%20function%28aEvent%29%20%7B%0A%20%20if%20%28typeof%20inspectObject%20%21%3D%20%22function%22%29%20%7B%0A%20%20%20%20aEvent.target.getElementsByTagName%28%22menuitem%22%29%5B2%5D.hidden%20%3D%20true%3B%0A%20%20%7D%0A%7D%0A%0Avar%20popupset%20%3D%20document.getElementById%28%22mainPopupSet%22%29%3B%0Avar%20context%20%3D%20popupset.appendChild%28%24xml%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%3Cmenupopup%20xmlns%3D%22%27%20+%20xulns%20+%20%27%22%20id%3D%22cb-extensions-menu%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onclick%3D%22event.stopPropagation%28%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onpopupshowing%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.checkForDOMI%28event%29%3B%22%3E%3Cmenuitem%20label%3D%22Visit%20Home%20Page%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onmouseover%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.setStatus%28document.popupNode.getAttribute%28%5C%27homepage%5C%27%29%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onmouseout%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.setStatus%28%5C%27%5C%27%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27oncommand%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.goHome%28document.popupNode.getAttribute%28%5C%27homepage%5C%27%29%29%3B%22/%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3Cmenuitem%20label%3D%22Copy%20GUID%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onmouseover%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.setStatus%28document.popupNode.getAttribute%28%5C%27GUID%5C%27%29%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onmouseout%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.setStatus%28%5C%27%5C%27%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27oncommand%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.copyId%28document.popupNode.getAttribute%28%5C%27GUID%5C%27%29%29%3B%22/%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3Cmenuitem%20label%3D%22Inspect%20Extension%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onmouseover%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.setStatus%28document.popupNode.getAttribute%28%5C%27GUID%5C%27%29%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onmouseout%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.setStatus%28%5C%27%5C%27%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27oncommand%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.inspect%28document.popupNode.getAttribute%28%5C%27GUID%5C%27%29%29%3B%22/%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3Cmenuitem%20label%3D%22Browse%20Install%20Directory%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onmouseover%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.setStatus%28document.popupNode.getAttribute%28%5C%27GUID%5C%27%29%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27onmouseout%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.setStatus%28%5C%27%5C%27%29%3B%22%20%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27oncommand%3D%22document.getElementById%28%5C%27%27%20+%20this.id%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%5C%27%29.explore%28document.popupNode.getAttribute%28%5C%27GUID%5C%27%29%29%3B%22/%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3C/menupopup%3E%27%29%29%3B%0A%0A%0A/*%0A//%20%u0441%u043A%u0440%u044B%u0442%u0438%u0435%20%u0434%u0440%u043E%u043F%u043C%u0430%u0440%u043A%u0435%u0440%u0430%20%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438-%u043C%u0435%u043D%u044E%28%u0432%20%u0438%u043D%u0438%u0446%u0438%u0430%u043B%u0438%u0437%u0430%u0446%u0438%u044E%29%0Avar%20that%20%3D%20this%3B%0Athis.hideDropMarker%20%3D%20function%28%29%20%7B%0A%20%20var%20dropMarker%20%3D%20document.getAnonymousElementByAttribute%28that%2C%20%22class%22%2C%20%22toolbarbutton-menu-dropmarker%22%29%3B%0A%20%20if%20%28dropMarker%29%20%7B%0A%20%20%20%20dropMarker.setAttribute%28%22hidden%22%2C%20%22true%22%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20setTimeout%28that.hideDropMarker%2C%2010%29%3B%0A%20%20%7D%0A%7D%0Athis.hideDropMarker%28%29%3B%0A*/%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%20%0Athis.tooltipText%20%3D%20this.Help%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%u0411%u044B%u0441%u0442%u0440%u044B%u0439%20%u0434%u043E%u0441%u0442%u0443%u043F%20%u043A%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%u043C%20%u0440%u0430%u0441%u0448%u0438%u0440%u0435%u043D%u0438%u0439%20%u0443%20%u043A%u043E%u0442%u043E%u0440%u044B%u0445%20%u0435%u0441%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%0A---------------------------------------------------------------%0A%u041B%u041A%u041C%20-%20%u0432%u044B%u0437%u043E%u0432%u0435%u0442%20%u043E%u043A%u043D%u043E%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u0440%u0430%u0441%u0448%u0438%u0440%u0435%u043D%u0438%u044F.%0A%u0421%u041A%u041C%20-%20%u043F%u043E%u0438%u0441%u043A%20%u0440%u0430%u0441%u0448%u0438%u0440%u0435%u043D%u0438%u0439.%0A%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


Кнопка быстрого вызова настроек расширений. Инициализация

Выделить код

Код:

/*
 *  This Source Code Form is subject to the terms of the Mozilla Public
 *  License, v. 2.0. If a copy of the MPL was not distributed with this
 *  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

function $(aId) {
  return document.getElementById(aId);
}

function $xml(aXML) {
  return (new DOMParser).parseFromString(aXML, "application/xml")
                        .documentElement;
}

function sort(aArray) {
  aArray.sort(function(a, b) {
    a = a.name.toLowerCase();
    b = b.name.toLowerCase();
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
  })
}

function openAM(aView) {
  if ("toEM" in window) {
    toEM(aView);
  } else if ("openAddonsMgr" in window) {
    openAddonsMgr(aView);
  } else {
    BrowserOpenAddonsMgr(aView);
  }
}

this.openOption = function(aId) {
  AddonManager.getAddonByID(aId, function(aAddon) {
    if (aAddon.optionsType && (parseInt(aAddon.optionsType) > 1)) {
      switch (parseInt(aAddon.optionsType)) {
        case 3:
          switchToTabHavingURI(aAddon.optionsURL, true);
          break;
        case 2:
          openAM("addons://detail/" + encodeURIComponent(aAddon.id)
                                    + "/preferences");
      }
    } else {
      openDialog(aAddon.optionsURL, "",
                 "chrome, dialog, close, minimizable, " +
                 "titlebar, toolbar, scrollbars, centerscreen");
    }
  })
}

this.setStatus = function(aString) {
  XULBrowserWindow.setOverLink(aString);
}

this.onclick = function inspectExtensions(aEvent) {
  switch (aEvent.button) {
    case 0:
      if (aEvent.ctrlKey) {
        aEvent.preventDefault();
        if (typeof inspectObject != "function") return;
        AddonManager.getAllAddons(function(aAddons) {
          var extensions = [];
          aAddons.forEach(function(aAddon) {
            if (aAddon.type == "extension" && aAddon.isActive) {
              extensions.push(aAddon);
            }
          })
          sort(extensions);
          inspectObject(extensions);
        })
      }
      break;

    case 1:
      var prefs = Services.prefs.getBranch("custombuttons.searchAddons" + ".");
      var text = "";
      try {
        text = prefs.getCharPref("search");
      } catch(ex) {
      }
      var query = custombuttons.promptBox("Search add-ons",
                                          "Enter add-on name",
                                          text, null);
      if (!query[0]) return;
      prefs.setCharPref("search", query[1]);
      openAM("addons://search/" + encodeURIComponent(query[1]));

    default:
  }
}

this.addonsMgr = function(aPopup, aCallback) {
  AddonManager.getAllAddons(function(aAddons) {
    var extensions = [];
    aAddons.forEach(function(aAddon) {
      /*aAddon.toString = function() {
        "use strict";
        return this.name;
      }*/
      if ((aAddon.type == "extension") &&
          (aAddon.optionsURL != null) &&
          aAddon.isActive) {
        extensions.push(aAddon);
      }
    })
    sort(extensions);
    aCallback(aPopup, extensions);
  })
}

function getExtensionObject(aId, aCallback) {
  AddonManager.getAllAddons(function(aAddons) {
    aAddons.forEach(function(aAddon) {
      if (aAddon.id == aId) {
        aCallback(aAddon);
        return;
      }
    })
  })
}

function htmlEntities(aString) {
  return aString.replace(/&/g, "&amp;").replace(/</g, "&lt;")
                .replace(/>/g, "&gt;").replace(/"/g, "&quot;");
}

function addItem(aNode, aId, aLabel, aURL, aIcon, aHomePage, aDesc) {
  let mi = aNode.appendChild(document.createElement("menuitem"));
      mi.setAttribute("GUID", aId);
      mi.className = "menuitem-iconic";
      mi.setAttribute("label", aLabel);
      mi.statusText = aURL;
      mi.setAttribute("image", aIcon);
      mi.setAttribute("homepage", aHomePage);
      mi.tooltipText = aDesc;
}

this.populate = function(aPopup, aExtensions) {
  while (aPopup.lastChild) aPopup.removeChild(aPopup.lastChild);
  if ((navigator.platform == "Win32") && (aExtensions.length > 20)) {
    var hbox  = aPopup.appendChild(document.createElement("hbox"));
    var vbox1 = hbox.appendChild(document.createElement("vbox"));
    var vbox2 = hbox.appendChild(document.createElement("vbox"));
    for (var i = 0; i < aExtensions.length; i++) {
      let vbox = (i < parseInt(aExtensions.length / 2)) ? vbox1 : vbox2;
      let ext = aExtensions[i];
      addItem(vbox, ext.id, ext.name + " " + ext.version, ext.optionsURL,
                      (ext.iconURL ? ext.iconURL : "chrome://mozapps/skin/extensions/extensionGeneric-16.png"),
                      (ext.homepageURL ? ext.homepageURL
                                       : ext.reviewURL
                                         ? ext.reviewURL.replace(/\/reviews/, "").toString()
                                         : "http://www.google.com/search?q=" + ext.name),
                      ext.description);
    }
  } else {
    for (var i = 0; i < aExtensions.length; i++) {
      let ext = aExtensions[i];
      addItem(aPopup, ext.id, ext.name + " " + ext.version, ext.optionsURL,
                      (ext.iconURL ? ext.iconURL : "chrome://mozapps/skin/extensions/extensionGeneric-16.png"),
                      (ext.homepageURL ? ext.homepageURL
                                       : ext.reviewURL
                                         ? ext.reviewURL.replace(/\/reviews/, "").toString()
                                         : "http://www.google.com/search?q=" + ext.name),
                      ext.description);
    }
  }
}

var popup = document.createElement("menupopup");
popup.setAttribute("context", "cb-extensions-menu");
popup.setAttribute("oncommand", "event.stopPropagation(); " +
                   "this.parentNode.openOption(" +
                   "event.target.getAttribute('GUID'));");
popup.setAttribute("onmouseover", "this.parentNode.setStatus(" +
                   "event.target.statusText);");
popup.setAttribute("onmouseout", "this.parentNode.setStatus('');");
popup.setAttribute("onpopupshowing", "this.parentNode.addonsMgr(" +
                   "this, this.parentNode.populate);");

//this.addonsMgr(popup, this.populate);

this.appendChild(popup);
this.type = "menu";

//---------------------------------

this.copyId = function(aId) {
  Cc["@mozilla.org/widget/clipboardhelper;1"].
  getService(Ci.nsIClipboardHelper).copyString(aId);
}

this.goHome = function(aURL) {
  gBrowser.loadOneTab(aURL);
}

this.inspect = function(aId) {
  getExtensionObject(aId, inspectObject);
}

this.explore = function(aId) {
  var dir = Services.dirsvc.get("ProfD", Ci.nsIFile);
  dir.append("extensions");
  dir.append(aId);
  var nsLocalFile = Components.Constructor("@mozilla.org/file/local;1",
                                           "nsILocalFile", "initWithPath");
  (new nsLocalFile(dir.path + (dir.exists() ? "" : ".xpi"))).reveal();
}

if ($("cb-extensions-menu")) {
  $("cb-extensions-menu").parentNode.removeChild($("cb-extensions-menu"));
}

this.checkForDOMI = function(aEvent) {
  if (typeof inspectObject != "function") {
    aEvent.target.getElementsByTagName("menuitem")[2].hidden = true;
  }
}

var popupset = document.getElementById("mainPopupSet");
var context = popupset.appendChild($xml(
              '<menupopup xmlns="' + xulns + '" id="cb-extensions-menu" '
            + 'onclick="event.stopPropagation();" '
            + 'onpopupshowing="document.getElementById(\'' + this.id
            + '\').checkForDOMI(event);"><menuitem label="Visit Home Page" '
            + 'onmouseover="document.getElementById(\'' + this.id
            + '\').setStatus(document.popupNode.getAttribute(\'homepage\'));" '
            + 'onmouseout="document.getElementById(\'' + this.id
            + '\').setStatus(\'\');" '
            + 'oncommand="document.getElementById(\'' + this.id
            + '\').goHome(document.popupNode.getAttribute(\'homepage\'));"/>'
            + '<menuitem label="Copy GUID" '
            + 'onmouseover="document.getElementById(\'' + this.id
            + '\').setStatus(document.popupNode.getAttribute(\'GUID\'));" '
            + 'onmouseout="document.getElementById(\'' + this.id
            + '\').setStatus(\'\');" '
            + 'oncommand="document.getElementById(\'' + this.id
            + '\').copyId(document.popupNode.getAttribute(\'GUID\'));"/>'
            + '<menuitem label="Inspect Extension" '
            + 'onmouseover="document.getElementById(\'' + this.id
            + '\').setStatus(document.popupNode.getAttribute(\'GUID\'));" '
            + 'onmouseout="document.getElementById(\'' + this.id
            + '\').setStatus(\'\');" '
            + 'oncommand="document.getElementById(\'' + this.id
            + '\').inspect(document.popupNode.getAttribute(\'GUID\'));"/>'
            + '<menuitem label="Browse Install Directory" '
            + 'onmouseover="document.getElementById(\'' + this.id
            + '\').setStatus(document.popupNode.getAttribute(\'GUID\'));" '
            + 'onmouseout="document.getElementById(\'' + this.id
            + '\').setStatus(\'\');" '
            + 'oncommand="document.getElementById(\'' + this.id
            + '\').explore(document.popupNode.getAttribute(\'GUID\'));"/>'
            + '</menupopup>'));


/*
// скрытие дропмаркера у кнопки-меню(в инициализацию)
var that = this;
this.hideDropMarker = function() {
  var dropMarker = document.getAnonymousElementByAttribute(that, "class", "toolbarbutton-menu-dropmarker");
  if (dropMarker) {
    dropMarker.setAttribute("hidden", "true");
  } else {
    setTimeout(that.hideDropMarker, 10);
  }
}
this.hideDropMarker();
*/

// Подсказка для кнопки .......... 
// this.tooltipText = this.Help

HaGEN, тоже 3 клика... Хочется один. Может bunda1 попросить...

manuk пишет

HaGEN, тоже 3 клика... Хочется один. Может bunda1 попросить...

Выделить код

Код:

openDialog("chrome://frigate2/content/pref.xul", "", "chrome, dialog, close, minimizable, " + "titlebar, toolbar, scrollbars, centerscreen");

08-05-2015 18:28:13
Или так - будет отрываться только одно окошко настроек friGate с возможностью закрыть настройки friGate по клику на странице:

Выделить код

Код:

var windows = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getEnumerator(null);
while( windows.hasMoreElements() ) {
       var win = windows.getNext();
       if ( win.name == 'friGate') {    
            win.focus();
            return;
            }
       };   
var options = openDialog("chrome://frigate2/content/pref.xul", "friGate", "chrome, dialog, close, minimizable, " + "titlebar, toolbar, scrollbars, centerscreen");
   
gBrowser.addEventListener("click", function c() {
   this.removeEventListener("click", c );
   try { options.close() } catch(e) {}; 
}, true );

bunda1, спасибо. Я в тебя верил. А сразу открывать на второй вкладке настроек (как на картинке под спойлером https://forum.mozilla-russia.org/viewto … 82#p682282) возможно? Ещё минус один клик... Или проще friGate переделать?

manuk пишет

bunda1, спасибо. Я в тебя верил. А сразу открывать на второй вкладке настроек (как на картинке под спойлером https://forum.mozilla-russia.org/viewto … 82#p682282) возможно? Ещё минус один клик... Или проще friGate переделать?

Выделить код

Код:

var windows = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getEnumerator(null);
while( windows.hasMoreElements() ) {
       var win = windows.getNext();
       if ( win.name == 'friGate') {    
            win.focus();
            return;
            }
       };   
var options = openDialog("chrome://frigate2/content/pref.xul", "friGate", "chrome, dialog, close, minimizable, " + "titlebar, toolbar, scrollbars, centerscreen");
   
gBrowser.addEventListener("click", function c() {
   this.removeEventListener("click", c );
   try { options.close() } catch(e) {}; 
}, true );

options.addEventListener("load", function s(e) {
   this.removeEventListener(e.type, s);
   e.target.getElementsByAttribute("label", "Proxys")[0].click();
}, true )

bunda1, открывает на вкладке "Основное". Может ещё подаманишь?

manuk пишет

bunda1, открывает на вкладке "Основное". Может ещё подаманишь?

Упс, у меня настройки friGate на английском а код находит вкладку настроек по названию, поменяй в коде Proxys на Прокси

bunda1, всё прекрасно. Огромное спасибо!

Установлена кнопка CB Mouse Gestures+, сделал команду 'DR':{name:'Обновить',cmd:function(){ gBrowser.reload() }},
а как сделать чтоб обновлялось не как по F5, а как по ctrl+F5?

Mishania пишет

Установлена кнопка CB Mouse Gestures+, сделал команду 'DR':{name:'Обновить',cmd:function(){ gBrowser.reload() }},
а как сделать чтоб обновлялось не как по F5, а как по ctrl+F5?

Может:

Выделить код

Код:

BrowserReloadSkipCache();

bunda1
И как всегда большое человеческое спасибо.

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

Stakhovsky пишет

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

А контекстное меню где должно открываться?

bunda1 пишет

Stakhovsky пишет: Здравствуйте, подскажите если есть кнопка добавить ссылку в контекстное меню, желательно с иконкой, без подменю, что бы сразу, хочу добавить ссылки на несколько постоянно посещаемых сайтов. Спасибо.А контекстное меню где должно открываться?

При клике в любом пустом месте любой страницы.

Stakhovsky
Ну тогда такой кнопки нет, есть такие что добавляют в меню кнопки. Можно же просто в закладки добавлять.

bunda1 пишет

StakhovskyНу тогда такой кнопки нет, есть такие что добавляют в меню кнопки. Можно же просто в закладки добавлять.

Ясно, я пересмотрел уже все дополнения, вот нашел одно которое выполняет такую функцию (https://addons.mozilla.org/ru/firefox/addon/quick-tab), но там можно только одну ссылку указать. Вы бы не могли помочь если можно как то сделать из него кнопки в контекстное меню или что бы это дополнение модернизировать добавив еще пункты, или может как-то сделать что бы установить несколько таких дополнений переименовав их. Помогите пожалуйста.

Stakhovsky
А зачем сылки в контекстное меню не удобно же.

bunda1 пишет

StakhovskyА зачем сылки в контекстное меню не удобно же.

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

okkamas_knife пишет

ну а кто мешает сделать? при нынешнем количестве примеров да ещё с комментариями даже при полном незнании javascript только копипастой и методом тыка за час вполне реально сделать такую кнопку.на то они и кастомные - настраиваешь под себя.ну а если лень то https://addons.mozilla.org/ru/firefox/search/?q=context&cat=allтам есть на первой же странице расширение добавляюще меню закладок в контекстное меню.. думаю если полистать то и просто ссылки найдутся..

Никто не мешает, я и пытаюсь сделать, список поиска дополнений по контекстным меню я перелопатил весь, такого как я говорю нет, мне бы было естественно легче найти готовое, чем писать на форум.

Stakhovsky
Есть кнопка "Ext menu" в разделе "Кнопки для Firefox". Посмотрите здесь.

okkamas_knife пишет

ну так в чем проблема то?открываем раздел СВ на форуме там кнопок работающих с контекстным меню целая куча, подбираем подходящую попроще и заменяем в ней действие на открытие страницы (примеры есть и готовых кнопках и в инструментах)ну а если не заработает то тогда можно и привести свой код и спросить ЧЯДНТ и тут подскажут где ошибка.
                    Отредактировано okkamas_knife (Сегодня 02:26:48)

Спасибо, буду пробовать. Как думаете не проще будет переделать это дополнение? https://addons.mozilla.org/ru/firefox/addon/quick-tab/

13-05-2015 01:38:57

xrun1 пишет

StakhovskyЕсть кнопка "Ext menu" в разделе "Кнопки для Firefox". Посмотрите здесь.

Спасибо, то что нужно.

okkamas_knife пишет

Stakhovsky пишет: Как думаете не проще будет переделать это дополнение? http://addons.mozilla.org/ru/firefox/addon/quick-tab/ну так если устраивает открытие страницы по хоткеюто вообще всё решается кнопкой с одной строчкой открывающей страницу, просто в настройках кнопки указать хоткей и  всё

Дело не в хоткее, там добавляется пункт в контекстное меню.

Stakhovsky
На скорую руку из "Google Image Search":

скрытый текст
clipboard.png

Вариант 1:

Выделить код

Код:

(function() {
   if ( document.getElementById("context-site-1") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "context-site-1";
   menuItem.setAttribute("label", "Google");
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKBMpTCYX4GMrH/9gMxn/YDQV/2cyG/9nLxr/YjMd/10xHv9cMRz/XjIa/2ExHP9gNRn/YDIV/2IwHf9ULSL/RCcU4EEoEylLKBfgcjUe/349IP98QRr/gEEd/39AKP+FUjv/h2NL/4lkUP+GYEv/hVQ+/35CJv9+Phz/gEIb/4c8H/96PCT/azgb/0koFOBpMyT/jD8i/4RFIf97RB3/hEUr/7GCdf/q29L/+e3e/97HuP/dwLD/6M2+/76VhP9+RSr/hUMg/5NAH/+NQCX/h0Ai/2Q1Iv9yOyf/lkYn/4xFJP+HSSn/m25Y//7y6v/bw7f/fkw2/3hBJv90QSX/hFI9/+nUxv+2k4H/i0kq/5VIJP+QRiL/lkYn/3Q5Kv9zQSn/mUkp/5tJKf+XSin/roJr//757f+0gG//l0oq/5NMI/+WTCH/i00u/8q0o//jx7j/mFU6/5JMJP+TTiL/l0wl/3Y/K/93Rif/oE4p/6ZNK/+jTSz/pGpS//rn2v/Np5b/kFEx/5BSK/+XTyv/nmFJ/+rTyP/lyrv/nlk+/5NRJv+WUib/l1Ik/3lFK/+BSyr/plQt/6ZULP+mUyv/nFIz/6d3Yf/hxrX/3b6n/7SUf/+7l4b/8NjL//7z6//BkoH/mlMz/55TLP+iUyv/olMp/4FJK/+FSzP/qVUz/61ZMf+sWSv/rFYs/59TM/+cWT//nmJJ/8OSgf/+8ub/+O/b/8ikkv+iVTb/qVgv/6pVMP+1WDT/qVY1/4ZMMf+MUTX/q1sx/7RZMf+2WjH/t1wv/7JbLf+oXDT/nVtD/8yajv/+8uf/ybGZ/5VYOP+zWDL/t1sx/7NYMv+5WjX/sFk2/49SM/+VVDn/s143/7hfNP+8WzX/v141/6xeMv/ZoYD/+9/I/+DBtP/Ss6P/7L+l/7l1Tf+1XjT/vlw0/7tdM/+6YC//tV42/5FYNP+cU0D/uGE9/75fNf/GZTb/wGI4/8OBYv//5tT/5byr/6RjSP+lXD//26eM//TNsf+3YkH/xGI3/8NjNf+7Yi//uGE3/5pZOv+hWEH/wGY9/8RlNP/KaDf/xWY3/9+ef///5tv/v4Vt/8NmOv+9ZUD/xI16//7o2v/FgGX/x2g5/8poNv/KaDb/xWU5/6ZYQv+mYUH/y2s7/8xwN//TbTf/0m46/+CYd///59X/vIJk/81tOv/Bbz//4a6b//7n2P/FiGL/yWw4/9FtN//KcDf/zG45/6dfQP+tZT//1W4//9pxPf/VbTz/1G5B/75wTf/31L7/z56C/8V5TP/TkGP/+NXC//XSv/+4cEr/0nA7/9VwO//Ubz7/1G88/61kP/+0bkj/4XNC/99wPv/gckL/321B/9VwR//Gf2D/6reX/+/DoP/82br//uHO//LSvv/mp33/3nhJ/9dwQv/bb0X/23BG/7RrSP+wb0r/4nhK/+V3Rf/qeEX/8HZE/+lzQf/adUf/yWg+/7lfO/+tYDz/qWFA/6xeOf/IaTn/5nND/+h1SP/pdkj/3ndN/7RtUP+NWTrg2oJX/+uGVf/ofkv/84FN/++ETv/qfk//6n5Q/+h+Uv/ngFP/5oFS/+d/UP/nfk//839O/+5+Tv/uhVj/3YFa/5JYPOCRVkEppFo64NN8UP/dgVT/3oRR/92DTP/ihVj/34FX/+ODVf/mg1T/5IRO/96ET//cglH/4YJT/+CCVv/Te1D/oVk44JBVQCkAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEE=");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('https://www.google.com')");
   document.getElementById("context-searchselect").parentNode.insertBefore( menuItem, document.getElementById("context-searchselect") );
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu; 
     }, false);
})();
(function() {
   if ( document.getElementById("context-site-2") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "context-site-2";
   menuItem.setAttribute("label", "Форум Mozilla Россия");
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('https://forum.mozilla-russia.org/index.php')");
   document.getElementById("context-searchselect").parentNode.insertBefore(menuItem, document.getElementById("context-searchselect"));
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu; 
     }, false);
})();

Вариант 2:

Выделить код

Код:

(function() {
   if ( document.getElementById("context-site-1") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "context-site-1";
   menuItem.setAttribute("label", "Google");
   menuItem.setAttribute("tooltiptext", 'Перейти на "Google"');
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKBMpTCYX4GMrH/9gMxn/YDQV/2cyG/9nLxr/YjMd/10xHv9cMRz/XjIa/2ExHP9gNRn/YDIV/2IwHf9ULSL/RCcU4EEoEylLKBfgcjUe/349IP98QRr/gEEd/39AKP+FUjv/h2NL/4lkUP+GYEv/hVQ+/35CJv9+Phz/gEIb/4c8H/96PCT/azgb/0koFOBpMyT/jD8i/4RFIf97RB3/hEUr/7GCdf/q29L/+e3e/97HuP/dwLD/6M2+/76VhP9+RSr/hUMg/5NAH/+NQCX/h0Ai/2Q1Iv9yOyf/lkYn/4xFJP+HSSn/m25Y//7y6v/bw7f/fkw2/3hBJv90QSX/hFI9/+nUxv+2k4H/i0kq/5VIJP+QRiL/lkYn/3Q5Kv9zQSn/mUkp/5tJKf+XSin/roJr//757f+0gG//l0oq/5NMI/+WTCH/i00u/8q0o//jx7j/mFU6/5JMJP+TTiL/l0wl/3Y/K/93Rif/oE4p/6ZNK/+jTSz/pGpS//rn2v/Np5b/kFEx/5BSK/+XTyv/nmFJ/+rTyP/lyrv/nlk+/5NRJv+WUib/l1Ik/3lFK/+BSyr/plQt/6ZULP+mUyv/nFIz/6d3Yf/hxrX/3b6n/7SUf/+7l4b/8NjL//7z6//BkoH/mlMz/55TLP+iUyv/olMp/4FJK/+FSzP/qVUz/61ZMf+sWSv/rFYs/59TM/+cWT//nmJJ/8OSgf/+8ub/+O/b/8ikkv+iVTb/qVgv/6pVMP+1WDT/qVY1/4ZMMf+MUTX/q1sx/7RZMf+2WjH/t1wv/7JbLf+oXDT/nVtD/8yajv/+8uf/ybGZ/5VYOP+zWDL/t1sx/7NYMv+5WjX/sFk2/49SM/+VVDn/s143/7hfNP+8WzX/v141/6xeMv/ZoYD/+9/I/+DBtP/Ss6P/7L+l/7l1Tf+1XjT/vlw0/7tdM/+6YC//tV42/5FYNP+cU0D/uGE9/75fNf/GZTb/wGI4/8OBYv//5tT/5byr/6RjSP+lXD//26eM//TNsf+3YkH/xGI3/8NjNf+7Yi//uGE3/5pZOv+hWEH/wGY9/8RlNP/KaDf/xWY3/9+ef///5tv/v4Vt/8NmOv+9ZUD/xI16//7o2v/FgGX/x2g5/8poNv/KaDb/xWU5/6ZYQv+mYUH/y2s7/8xwN//TbTf/0m46/+CYd///59X/vIJk/81tOv/Bbz//4a6b//7n2P/FiGL/yWw4/9FtN//KcDf/zG45/6dfQP+tZT//1W4//9pxPf/VbTz/1G5B/75wTf/31L7/z56C/8V5TP/TkGP/+NXC//XSv/+4cEr/0nA7/9VwO//Ubz7/1G88/61kP/+0bkj/4XNC/99wPv/gckL/321B/9VwR//Gf2D/6reX/+/DoP/82br//uHO//LSvv/mp33/3nhJ/9dwQv/bb0X/23BG/7RrSP+wb0r/4nhK/+V3Rf/qeEX/8HZE/+lzQf/adUf/yWg+/7lfO/+tYDz/qWFA/6xeOf/IaTn/5nND/+h1SP/pdkj/3ndN/7RtUP+NWTrg2oJX/+uGVf/ofkv/84FN/++ETv/qfk//6n5Q/+h+Uv/ngFP/5oFS/+d/UP/nfk//839O/+5+Tv/uhVj/3YFa/5JYPOCRVkEppFo64NN8UP/dgVT/3oRR/92DTP/ihVj/34FX/+ODVf/mg1T/5IRO/96ET//cglH/4YJT/+CCVv/Te1D/oVk44JBVQCkAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEE=");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('https://www.google.com')");
   document.getElementById("context-navigation").appendChild( menuItem, document.getElementById("context-navigation") );
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu; 
     }, false);
})();
(function() {
   if ( document.getElementById("context-site-2") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "context-site-2";
   menuItem.setAttribute("label", "Форум Mozilla Россия");
   menuItem.setAttribute("tooltiptext", 'Перейти на "Форум Mozilla Россия"');
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('https://forum.mozilla-russia.org/index.php')");
   document.getElementById("context-navigation").appendChild(menuItem, document.getElementById("context-navigation"));
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu; 
     }, false);
})();

В инициализацию любой кнопки. Добавляйте свои сайты по образцу.

turbot пишет

Stakhovsky
На скорую руку из "Google Image Search":

скрытый текст
https://lh3.googleusercontent.com/-jaWy … pboard.png

Вариант 1:

Выделить код

Код:

(function() {
   if ( document.getElementById("context-site-1") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "context-site-1";
   menuItem.setAttribute("label", "Google");
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKBMpTCYX4GMrH/9gMxn/YDQV/2cyG/9nLxr/YjMd/10xHv9cMRz/XjIa/2ExHP9gNRn/YDIV/2IwHf9ULSL/RCcU4EEoEylLKBfgcjUe/349IP98QRr/gEEd/39AKP+FUjv/h2NL/4lkUP+GYEv/hVQ+/35CJv9+Phz/gEIb/4c8H/96PCT/azgb/0koFOBpMyT/jD8i/4RFIf97RB3/hEUr/7GCdf/q29L/+e3e/97HuP/dwLD/6M2+/76VhP9+RSr/hUMg/5NAH/+NQCX/h0Ai/2Q1Iv9yOyf/lkYn/4xFJP+HSSn/m25Y//7y6v/bw7f/fkw2/3hBJv90QSX/hFI9/+nUxv+2k4H/i0kq/5VIJP+QRiL/lkYn/3Q5Kv9zQSn/mUkp/5tJKf+XSin/roJr//757f+0gG//l0oq/5NMI/+WTCH/i00u/8q0o//jx7j/mFU6/5JMJP+TTiL/l0wl/3Y/K/93Rif/oE4p/6ZNK/+jTSz/pGpS//rn2v/Np5b/kFEx/5BSK/+XTyv/nmFJ/+rTyP/lyrv/nlk+/5NRJv+WUib/l1Ik/3lFK/+BSyr/plQt/6ZULP+mUyv/nFIz/6d3Yf/hxrX/3b6n/7SUf/+7l4b/8NjL//7z6//BkoH/mlMz/55TLP+iUyv/olMp/4FJK/+FSzP/qVUz/61ZMf+sWSv/rFYs/59TM/+cWT//nmJJ/8OSgf/+8ub/+O/b/8ikkv+iVTb/qVgv/6pVMP+1WDT/qVY1/4ZMMf+MUTX/q1sx/7RZMf+2WjH/t1wv/7JbLf+oXDT/nVtD/8yajv/+8uf/ybGZ/5VYOP+zWDL/t1sx/7NYMv+5WjX/sFk2/49SM/+VVDn/s143/7hfNP+8WzX/v141/6xeMv/ZoYD/+9/I/+DBtP/Ss6P/7L+l/7l1Tf+1XjT/vlw0/7tdM/+6YC//tV42/5FYNP+cU0D/uGE9/75fNf/GZTb/wGI4/8OBYv//5tT/5byr/6RjSP+lXD//26eM//TNsf+3YkH/xGI3/8NjNf+7Yi//uGE3/5pZOv+hWEH/wGY9/8RlNP/KaDf/xWY3/9+ef///5tv/v4Vt/8NmOv+9ZUD/xI16//7o2v/FgGX/x2g5/8poNv/KaDb/xWU5/6ZYQv+mYUH/y2s7/8xwN//TbTf/0m46/+CYd///59X/vIJk/81tOv/Bbz//4a6b//7n2P/FiGL/yWw4/9FtN//KcDf/zG45/6dfQP+tZT//1W4//9pxPf/VbTz/1G5B/75wTf/31L7/z56C/8V5TP/TkGP/+NXC//XSv/+4cEr/0nA7/9VwO//Ubz7/1G88/61kP/+0bkj/4XNC/99wPv/gckL/321B/9VwR//Gf2D/6reX/+/DoP/82br//uHO//LSvv/mp33/3nhJ/9dwQv/bb0X/23BG/7RrSP+wb0r/4nhK/+V3Rf/qeEX/8HZE/+lzQf/adUf/yWg+/7lfO/+tYDz/qWFA/6xeOf/IaTn/5nND/+h1SP/pdkj/3ndN/7RtUP+NWTrg2oJX/+uGVf/ofkv/84FN/++ETv/qfk//6n5Q/+h+Uv/ngFP/5oFS/+d/UP/nfk//839O/+5+Tv/uhVj/3YFa/5JYPOCRVkEppFo64NN8UP/dgVT/3oRR/92DTP/ihVj/34FX/+ODVf/mg1T/5IRO/96ET//cglH/4YJT/+CCVv/Te1D/oVk44JBVQCkAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEE=");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('https://www.google.com')");
   document.getElementById("context-searchselect").parentNode.insertBefore( menuItem, document.getElementById("context-searchselect") );
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu; 
     }, false);
})();
(function() {
   if ( document.getElementById("context-site-2") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "context-site-2";
   menuItem.setAttribute("label", "Форум Mozilla Россия");
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('https://forum.mozilla-russia.org/index.php')");
   document.getElementById("context-searchselect").parentNode.insertBefore(menuItem, document.getElementById("context-searchselect"));
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu; 
     }, false);
})();

Вариант 2:

Выделить код

Код:

(function() {
   if ( document.getElementById("context-site-1") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "context-site-1";
   menuItem.setAttribute("label", "Google");
   menuItem.setAttribute("tooltiptext", 'Перейти на "Google"');
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKBMpTCYX4GMrH/9gMxn/YDQV/2cyG/9nLxr/YjMd/10xHv9cMRz/XjIa/2ExHP9gNRn/YDIV/2IwHf9ULSL/RCcU4EEoEylLKBfgcjUe/349IP98QRr/gEEd/39AKP+FUjv/h2NL/4lkUP+GYEv/hVQ+/35CJv9+Phz/gEIb/4c8H/96PCT/azgb/0koFOBpMyT/jD8i/4RFIf97RB3/hEUr/7GCdf/q29L/+e3e/97HuP/dwLD/6M2+/76VhP9+RSr/hUMg/5NAH/+NQCX/h0Ai/2Q1Iv9yOyf/lkYn/4xFJP+HSSn/m25Y//7y6v/bw7f/fkw2/3hBJv90QSX/hFI9/+nUxv+2k4H/i0kq/5VIJP+QRiL/lkYn/3Q5Kv9zQSn/mUkp/5tJKf+XSin/roJr//757f+0gG//l0oq/5NMI/+WTCH/i00u/8q0o//jx7j/mFU6/5JMJP+TTiL/l0wl/3Y/K/93Rif/oE4p/6ZNK/+jTSz/pGpS//rn2v/Np5b/kFEx/5BSK/+XTyv/nmFJ/+rTyP/lyrv/nlk+/5NRJv+WUib/l1Ik/3lFK/+BSyr/plQt/6ZULP+mUyv/nFIz/6d3Yf/hxrX/3b6n/7SUf/+7l4b/8NjL//7z6//BkoH/mlMz/55TLP+iUyv/olMp/4FJK/+FSzP/qVUz/61ZMf+sWSv/rFYs/59TM/+cWT//nmJJ/8OSgf/+8ub/+O/b/8ikkv+iVTb/qVgv/6pVMP+1WDT/qVY1/4ZMMf+MUTX/q1sx/7RZMf+2WjH/t1wv/7JbLf+oXDT/nVtD/8yajv/+8uf/ybGZ/5VYOP+zWDL/t1sx/7NYMv+5WjX/sFk2/49SM/+VVDn/s143/7hfNP+8WzX/v141/6xeMv/ZoYD/+9/I/+DBtP/Ss6P/7L+l/7l1Tf+1XjT/vlw0/7tdM/+6YC//tV42/5FYNP+cU0D/uGE9/75fNf/GZTb/wGI4/8OBYv//5tT/5byr/6RjSP+lXD//26eM//TNsf+3YkH/xGI3/8NjNf+7Yi//uGE3/5pZOv+hWEH/wGY9/8RlNP/KaDf/xWY3/9+ef///5tv/v4Vt/8NmOv+9ZUD/xI16//7o2v/FgGX/x2g5/8poNv/KaDb/xWU5/6ZYQv+mYUH/y2s7/8xwN//TbTf/0m46/+CYd///59X/vIJk/81tOv/Bbz//4a6b//7n2P/FiGL/yWw4/9FtN//KcDf/zG45/6dfQP+tZT//1W4//9pxPf/VbTz/1G5B/75wTf/31L7/z56C/8V5TP/TkGP/+NXC//XSv/+4cEr/0nA7/9VwO//Ubz7/1G88/61kP/+0bkj/4XNC/99wPv/gckL/321B/9VwR//Gf2D/6reX/+/DoP/82br//uHO//LSvv/mp33/3nhJ/9dwQv/bb0X/23BG/7RrSP+wb0r/4nhK/+V3Rf/qeEX/8HZE/+lzQf/adUf/yWg+/7lfO/+tYDz/qWFA/6xeOf/IaTn/5nND/+h1SP/pdkj/3ndN/7RtUP+NWTrg2oJX/+uGVf/ofkv/84FN/++ETv/qfk//6n5Q/+h+Uv/ngFP/5oFS/+d/UP/nfk//839O/+5+Tv/uhVj/3YFa/5JYPOCRVkEppFo64NN8UP/dgVT/3oRR/92DTP/ihVj/34FX/+ODVf/mg1T/5IRO/96ET//cglH/4YJT/+CCVv/Te1D/oVk44JBVQCkAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEE=");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('https://www.google.com')");
   document.getElementById("context-navigation").appendChild( menuItem, document.getElementById("context-navigation") );
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu; 
     }, false);
})();
(function() {
   if ( document.getElementById("context-site-2") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "context-site-2";
   menuItem.setAttribute("label", "Форум Mozilla Россия");
   menuItem.setAttribute("tooltiptext", 'Перейти на "Форум Mozilla Россия"');
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('https://forum.mozilla-russia.org/index.php')");
   document.getElementById("context-navigation").appendChild(menuItem, document.getElementById("context-navigation"));
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu; 
     }, false);
})();

В инициализацию любой кнопки. Добавляйте свои сайты по образцу.

О, спасибо большое, вариант 1 в самый раз, а я вот только хотел написать:):

скрытый текст
Я похоже нашел то что нужно, вот эта вот кнопка https://forum.mozilla-russia.org/viewtopic.php?id=57905

// Добавить новый пункт "Поиск изображения в google" в контекстном меню изображений(с иконкой) ...........................
(function() {
   if ( document.getElementById("image-search") ) return;
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "image-search";
   menuItem.setAttribute("label", "Поиск изображения в google");
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKBMpTCYX4GMrH/9gMxn/YDQV/2cyG/9nLxr/YjMd/10xHv9cMRz/XjIa/2ExHP9gNRn/YDIV/2IwHf9ULSL/RCcU4EEoEylLKBfgcjUe/349IP98QRr/gEEd/39AKP+FUjv/h2NL/4lkUP+GYEv/hVQ+/35CJv9+Phz/gEIb/4c8H/96PCT/azgb/0koFOBpMyT/jD8i/4RFIf97RB3/hEUr/7GCdf/q29L/+e3e/97HuP/dwLD/6M2+/76VhP9+RSr/hUMg/5NAH/+NQCX/h0Ai/2Q1Iv9yOyf/lkYn/4xFJP+HSSn/m25Y//7y6v/bw7f/fkw2/3hBJv90QSX/hFI9/+nUxv+2k4H/i0kq/5VIJP+QRiL/lkYn/3Q5Kv9zQSn/mUkp/5tJKf+XSin/roJr//757f+0gG//l0oq/5NMI/+WTCH/i00u/8q0o//jx7j/mFU6/5JMJP+TTiL/l0wl/3Y/K/93Rif/oE4p/6ZNK/+jTSz/pGpS//rn2v/Np5b/kFEx/5BSK/+XTyv/nmFJ/+rTyP/lyrv/nlk+/5NRJv+WUib/l1Ik/3lFK/+BSyr/plQt/6ZULP+mUyv/nFIz/6d3Yf/hxrX/3b6n/7SUf/+7l4b/8NjL//7z6//BkoH/mlMz/55TLP+iUyv/olMp/4FJK/+FSzP/qVUz/61ZMf+sWSv/rFYs/59TM/+cWT//nmJJ/8OSgf/+8ub/+O/b/8ikkv+iVTb/qVgv/6pVMP+1WDT/qVY1/4ZMMf+MUTX/q1sx/7RZMf+2WjH/t1wv/7JbLf+oXDT/nVtD/8yajv/+8uf/ybGZ/5VYOP+zWDL/t1sx/7NYMv+5WjX/sFk2/49SM/+VVDn/s143/7hfNP+8WzX/v141/6xeMv/ZoYD/+9/I/+DBtP/Ss6P/7L+l/7l1Tf+1XjT/vlw0/7tdM/+6YC//tV42/5FYNP+cU0D/uGE9/75fNf/GZTb/wGI4/8OBYv//5tT/5byr/6RjSP+lXD//26eM//TNsf+3YkH/xGI3/8NjNf+7Yi//uGE3/5pZOv+hWEH/wGY9/8RlNP/KaDf/xWY3/9+ef///5tv/v4Vt/8NmOv+9ZUD/xI16//7o2v/FgGX/x2g5/8poNv/KaDb/xWU5/6ZYQv+mYUH/y2s7/8xwN//TbTf/0m46/+CYd///59X/vIJk/81tOv/Bbz//4a6b//7n2P/FiGL/yWw4/9FtN//KcDf/zG45/6dfQP+tZT//1W4//9pxPf/VbTz/1G5B/75wTf/31L7/z56C/8V5TP/TkGP/+NXC//XSv/+4cEr/0nA7/9VwO//Ubz7/1G88/61kP/+0bkj/4XNC/99wPv/gckL/321B/9VwR//Gf2D/6reX/+/DoP/82br//uHO//LSvv/mp33/3nhJ/9dwQv/bb0X/23BG/7RrSP+wb0r/4nhK/+V3Rf/qeEX/8HZE/+lzQf/adUf/yWg+/7lfO/+tYDz/qWFA/6xeOf/IaTn/5nND/+h1SP/pdkj/3ndN/7RtUP+NWTrg2oJX/+uGVf/ofkv/84FN/++ETv/qfk//6n5Q/+h+Uv/ngFP/5oFS/+d/UP/nfk//839O/+5+Tv/uhVj/3YFa/5JYPOCRVkEppFo64NN8UP/dgVT/3oRR/92DTP/ihVj/34FX/+ODVf/mg1T/5IRO/96ET//cglH/4YJT/+CCVv/Te1D/oVk44JBVQCkAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEE=");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('http://www.google.com/searchbyimage?image_url=' + encodeURIComponent( gContextMenu.mediaURL || gContextMenu.imageURL || gContextMenu.bgImageURL ) )");
   document.getElementById("context-viewimage").parentNode.insertBefore( menuItem, document.getElementById("context-viewimage") );
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu.onImage;
     }, false);
})();

Название переименовую в этой строке:

menuItem.setAttribute("label", "Поиск изображения в google");

Сюда вставляю код иконки base64, иконку создаю здесь: http://xaviesteve.com//pro/base64.php?

menuItem.setAttribute("image", "data:image/x-icon;base64,код base64");

Дальше прошу помочь
1.Куда вставлять ссылку на сайт?
2.Как сделать что бы сайт открывался в этой же вкладке, а не в новой?
3.Как сделать что бы пункт в меню был постоянно, а не только при клике на изображении?


Один вопрос остался, возможно ли так сделать, что бы при клике ЛКМ сайт открывался в этой же вкладке, а при клике средней кнопкой (колесиком) в новой?
ps. еще один, как можно регулировать расположение(подвинуть ближе к верху или опустить в самый низ)?
pps.еще третий вопрос) можно ли добавить туда же пункт новая вкладка?

Stakhovsky

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

Выделить код

Код:

menuItem.setAttribute("oncommand", "loadURI('https://www.google.com')"); //левый клик - в текущей вкладке
   menuItem.setAttribute("oncontextmenu", "getBrowser().selectedTab = getBrowser().addTab('https://www.google.com')"); //правый - в новой
Выделить код

Код:

document.getElementById("context-searchselect").parentNode.insertBefore( menuItem, document.getElementById("context-searchselect") );

- вставляет наш пукт до указанного элемента (context-searchselect). ID смотрите DOM Inspector'ом:
thumb.jpg 
(+ полезна будет кнопка [CB]Attributes Inspector)

Выделить код

Код:

document.getElementById("context-navigation").appendChild( menuItem, document.getElementById("context-navigation") );

- вставляет пукт последним элементом.

Вставьте about:newtab, вместо адреса, и будет новая вкладка (ну или chrome://speeddial/content/speeddial.xul, если, например, спиддиалом пользуетесь)

turbot пишет

Stakhovsky

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

Выделить код

Код:

menuItem.setAttribute("oncommand", "loadURI('https://www.google.com')"); //левый клик - в текущей вкладке
   menuItem.setAttribute("oncontextmenu", "getBrowser().selectedTab = getBrowser().addTab('https://www.google.com')"); //правый - в новой
Выделить код

Код:

document.getElementById("context-searchselect").parentNode.insertBefore( menuItem, document.getElementById("context-searchselect") );

- вставляет наш пукт до указанного элемента (context-searchselect). ID смотрите DOM Inspector'ом:
https://lh3.googleusercontent.com/-CAXj … /thumb.jpg 
(+ полезна будет кнопка [CB]Attributes Inspector)

Выделить код

Код:

document.getElementById("context-navigation").appendChild( menuItem, document.getElementById("context-navigation") );

- вставляет пукт последним элементом.

Вставьте about:newtab, вместо адреса, и будет новая вкладка (ну или chrome://speeddial/content/speeddial.xul, если, например, спиддиалом пользуетесь)

Все работает, большое спасибо за помощь!):):):)

Stakhovsky пишет

Один вопрос остался, возможно ли так сделать, что бы при клике ЛКМ сайт открывался в этой же вкладке, а при клике средней кнопкой (колесиком) в новой?
pps.еще третий вопрос) можно ли добавить туда же пункт новая вкладка?

Выделить код

Код:

((contextMenu) => {
   var array = [
      { lab: "Новая вкладка", url: "about:newtab", img: "https://addons.cdn.mozilla.net/user-media/collection_icons/5574/5574260.png?m=1426540508"},
      { lab: "Google", url: "https://www.google.com", img: "https://www.google.lv/favicon.ico"},
      { lab: "Форум Mozilla Россия", url: "https://forum.mozilla-russia.org/index.php", img: "https://forum.mozilla-russia.org/favicon.ico"}
   ]
   array.forEach(function(m,i) {  
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.lab );
       mItem.setAttribute("id", "link"+i );
       mItem.setAttribute("url", m.url );
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.img );
       mItem.addEventListener("click", openLink );
       
       contextMenu.appendChild( mItem );
   });
   function openLink(e) {
      var url = e.target.getAttribute("url");      
      e.button ? gBrowser.selectedTab = gBrowser.addTab(url) : loadURI(url);
   };

   addDestructor(()=> array.forEach(function(m,i) contextMenu.removeChild(document.getElementById('link'+i)) ));
          
})(document.getElementById("contentAreaContextMenu") );

Спасибо, работает:)

У меня еще пара вопросов:
1. При загрузке Firefox, в контекстное меню эти кнопки не добавляются пока я не открою меню, я туда добавил созданую кнопку "Ссылки в контекстном меню". Можно ли сделать что бы в контекстное меню пункты добавлялись сразу?

скрытый текст
c9219000b1cdde3aa1cf32caaf858504.png

2. У меня стоит разшерение New Tab Mod (https://addons.mozilla.org/ru/firefox/a … w-tab-mod/), но когда я выбираю в "Новая вкладка"(about:newtab) в контекстном меню оно не загружается, если нажать на "+" добавить новую вкладку, оно загружается. Что нужно прописать вместо about:newtab что бы оно загружалось в новой вкладке?

Stakhovsky

скрытый текст
1. Выносите на тулбар и, если не хотите, чтоб место занимала, либо прячьте стилем (

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
#custombuttons-button25 {
display:none!important;
}

(id кнопки смотрите DOM Inspector'ом или пишите toolbarbutton[label='Название кнопки'] )), либо используйте Merge Custom Buttons
2. Смотрите адрес сами:
clipboard2.png

1. Кнопку переименовал в Cntxtmenu, такой вот код вставить в инициализацию кнопки?

скрытый текст
toolbarbutton[label='Cntxtmenu'] ))
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
#custombuttons-button25 {
display:none!important;
}

2. В новой вкладке с этим дополнением нет такой кнопки "о сайте"
скрытый текст
efe8fbff8d4e70968379b0a3f326ec9b.png

Stakhovsky

скрытый текст
1. либо:

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
#custombuttons-button25 {
display:none!important;
}

либо:

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
toolbarbutton[label='Cntxtmenu'] {
display:none!important;
}

другие, если понадобится, добавлять так:

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
toolbarbutton[label='Cntxtmenu'],
toolbarbutton[label='бла-бла2'],
toolbarbutton[label='бла-бла3'],
toolbarbutton[label='и т.д.']  {
display:none!important;
}

Это вставлять в userChrome.css (если его нет, создаете в папке профиля браузера папку chrome, а в ней текстовый документ, который переименовываете в userChrome.css, и туда вставляете код (следите, чтобы userChrome.css.txt не вышел), сохраняете, перезапускаете браузер для применения), либо в Stylish, если пользуетесь.

2. У меня просто из-за стиля так выглядит. Щелкайте на значке глобуса.

1.Спасибо, получилось:)
2.Не могу нажать, он не нажимается. Можно как ли как-то еще вызвать это меню или другим способом посмотреть адрес?

Stakhovsky

скрытый текст
Сделайте кнопку с

Выделить код

Код:

BrowserPageInfo();

в секции код. При нажатии увидите это окно для текущей страницы.
Либо: Ctrl+Shift+K, введите content.location.href, ввод, и получите в ответ адрес.

Получилось, страцица "about:blank", добавил в конткекстную кнопку, но открывается всеравно пустая страница, без дополнения. Можно ли назначить на кнопку именно фукцию кнопки "+"(Открыть новую вкладку)?

Stakhovsky

Выделить код

Код:

menuItem.setAttribute("oncommand", "BrowserOpenNewTabOrWindow(event);");

Как впихнуть в код bunda1, если его кнопку взяли, не знаю.

Поставил заработало, спасибо, пока стоит два кода, ваш и bunda1, смотрю как удобней, спасибо.

Stakhovsky
В моём коде за:
var url = e.target.getAttribute("url");
положи:
if (url == "about:newtab") { BrowserOpenTab(); return; };

Прекрасно, спасибо, все работает:)

bunda1
Опытным путём вычислил(ох и задолбался же я по одной кнопки удалять и перезагружать браузер) что VT наглухо вешает браузер ,если в неё закрепить любую кнопку и нажать изменить http://images.vfl.ru/ii/1431675845/c9beae44/8737910.png
Как побороть,то?

VORON
Да есть такое. Кстати спасибо а то я тоже с этим сталкивался и не мог понять чём дело. Попробую завтра исправить :/

Нужна кнопка, что бы по нажатию на неё (вкл/выкл) показывалась и скрывалась панель вкладок
upd:
необходима немного другая кнопка. есть стиль для stylish, который скрывает вкладки. можно ли сделать кнопку, которая выводится на экран, и при нажатии так же включает/отключает данный стиль ?

Показать / скрыть панель вкладок(и другие любые панели изменяя id)

Выделить код

Код:

var bar = document.getElementById("TabsToolbar");
setToolbarVisibility(bar, bar.collapsed);

18-05-2015 14:33:07
Кнопка ВКЛ/ВЫКЛ стиль лежащий в Help (иконки менять на свои ессно можно)

Выделить код

Код:

this.checked = !this.checked;

if ( this. checked ) 
this.image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm1JREFUOI2Nkt1LU3EYx59zzs45m245p5buzaUiQV0V5AIRoswSItCY0UVXdtFf0z8QRFCwC6PCEAqL7CaYzZelc7rmltvOOjvbztzO287br6tgzS187r4Pn+8HHngwaDOTN+apiYkrd69PBYMUSeIbWzuR8NLy8ta3FamVJVoXs/OLAa/X++LRw7nQ+KjfeW7AdXbY77ufSudu2Xs90ezhLtfMY83h3sIi7fH43wT8ngZNQnRgoM9KYnqqIqDbotS4FE8ciJn04fTq+5fHfzt4s6Cvr39m9ubEHoVJr0AXIpJQ35V0epq2dg339DjEhbk7g263e76584+gwGTx8bERUpFFCQF00Tb7NYrEKQL0JE3iRZ9nULh4YcTT3LE0B9M0Ecdx+y6XSx7yBIYsFM2auvaDop3nZUVhMTCYMw5bpaPAMFD5y9pXYXQkgOx2+5CBAaFbCC9JYBXMStZ/ZdJCMpnKdTzBRBD7mWZcmqapslhbrwvCoW4YrIXAyoosZD6srvGZo/x2R8HnlXCtwPFZpsDRkiRUE8kcn2e4YqlSzWdzeSVX4EoP5maqHQUAAFYr/T22l3LUajVUYFlrLL5PHFeK1c1YoluS1e1QKAT/FbwNP9N5/jgnKSpO07hIUZjYUDUolfji8tLzRit/4hMBADCccKia8USVpUlNkS9nj5jxeHwnwhayv1tZSztBkUkJypj7sbt/FLd1dYPP70OfPr572o49cQIAgGkivVrlkc1GQTB4FcplDhoN1Ti1ACGoIYRFWJaDSGQdNje3DkzT5E8tqNfryl7iYPZMjzPs7O19HY1uTHFcqdyO/QM+cS7YiGvNZgAAAABJRU5ErkJggg==";
else 
this.image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANkE3LLaAgAAArVJREFUeJxtkktoVGcUx3/fd+/ceahMRum0E6vB+IKYFtpqFRFJu+imrgRdBkFoKC5cCC5cOM7GnQuXFqTSbqQWSsGFjS22Gsn4SqJJFCXJjBlnJol5mHHinbn3zj1dTKdMZA4c+M7hf37nnI+jeM8eXiLQGSMSqfGhrvEBBlqExYrLTC7M2+6jOM161Ry8uEhwU4L23Py2c/HNO7ujnT1xtKFLL++XFqaHn21c9/zsokMm0cvK+425lcS0f6Uze7nrD5n6uSrvJkWc6brbGZFiv+R++vKBc43dmR8JNep049Gx5+T+3HznuU37jn1FdL1F9QHYd+peSUOwwscHvt9dKO08rzf0HmxM3wAoT/zPQ5b1qQrYAakMggyDHgFjBNQI4qQR8lihtu6ayN5ksg4wAZJJlMHbsFa1GM4oRHwwXQh69T7KgIoJroWmEjVUeW0P6BT4ZmOFSNCZ8LXj4TwBX8CxQf8HsDXKDyOuCeL4kbD9ctUfpFL4y257vIaaQQdRfpHs3VdgzUBohuydAnivQENN67mS81H0b/D/XwHANAMjK57uEj/WRWRLG/oeSA18H0wFaz6DcoBq9emQDsbSqVQdYDQAsa0D+W8/WRotTskX0fZdW2M7viY74FIYi7K95wjiriefHnyUSGROZSfTQz9crwNW2fQvhJ0b7M9f7ZiUQq/I/BUZv3pIZO6EFH/b8cbt5/DiTaLNNbo5uDxOtbrCRLXsjPu527B8nY7EEOT/xFsuT3g2w48HVl/hqlMGkEsE7Hhoz9hCz81YdG1EIwgW8dDgd+sK2SuqDw+QlhMAqD5czzBfDFW+Md5tO4219wJ/zR/wXRUcV324zcUtAQA3HpVLPtaCFW7DCITQZtibXVKZVlqjVfLaP9Rml1b6S0uvD46NjqqnE8Xe42d+f9hK+y8c6jNrdcGm9QAAAABJRU5ErkJggg==";

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);  
var uri = makeURI("data:text/css," + encodeURIComponent( this.Help ));

if ( sss.sheetRegistered(uri, sss.AGENT_SHEET) ) sss.unregisterSheet(uri, sss.AGENT_SHEET);
else 
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);

Я так понял, второй код надо в окошко "код" новой кнопки?
Выяснилось, что нет возможности при установке новой кнопки вытащить её куда-либо, в списке кнопок (меню-дополнения) оно есть, а в окошке "изменить/настроить" - для того, что бы вытащить - нет.
Как можно это исправить ?
Отредактировал уже установленную кнопку иконка которой видна в том меню "изменить". При нажатии вижу - что меняется иконка (лампочка такая - круто получилось), но самих изменений с отображением панели вкладок не произошло.

Код Stylish для убирания вкладок:
#TabsToolbar {
    visibility: collapse !important;
}

#main-window[sizemode="normal"] > #titlebar {
    -moz-appearance: none !important;
}


upd: отключил все стили - перезагрузился - появилась панелька вкладок

кнопка для скрытия панели вкладок
var css = "#main-window #TabsToolbar {visibility: collapse !important;}";
css = css + "#main-window[sizemode=normal] #titlebar {-moz-appearance: none !important;}";
const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); 

this.onclick = function(e) {
    if ( e.button == 0 ) {
        var uri = makeURI("data:text/css," + encodeURIComponent(css));
        var enabled = sss.sheetRegistered( uri, sss.USER_SHEET );
        enabled ? sss.unregisterSheet( uri, sss.USER_SHEET ) : sss.loadAndRegisterSheet( uri, sss.USER_SHEET )
    };   
};


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

Я так понял, второй код надо в окошко "код" новой кнопки?

Да. А во вкладке Help нужный стиль. Init. пустая.
--------------
Кнопка конвертирует иконку/картинку (ico, png) в base64 кокраз для ...

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041A%u043E%u043D%u0432%u0435%u0440%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u0432%20base64%20-%20%u0440%u0435%u0437%u0443%u043B%u044C%u0442%u0430%u0442%20%u0432%20%u0431%u0443%u0444%u0435%u0440%u0435%20%u043E%u0431%u043C%u0435%u043D%u0430%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/vnd.microsoft.icon%3Bbase64%2CAAABAAEAEBAAACAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiIzWwkbMGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYoOlMQJT1iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcMkZyDCA4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAkjO24ZRnHZGUd0/h5Ne/wVP2bLBhwuVQAAAAAAAAAAAAAAAAAAABEAAAAAAAAAACZLc8EMITqXAAIDIBM/ZbghUID/G1B85B5Ods8XR3LbG0998SFVh/8NL0+QAAEEGylFXpcfQmnFAAAAAAAAAAAAAAAAEic9RyJSfPceRnD/ED9gnQAAAAAaKz1WDyU7ZAIRGgcURGy8H0Zw/x1PgfELHTFHAAAAAAAAAAAAAAAAAAAAAAAAAAAkWYPuLVt+7CFGbukAAwg5IzdKfBYrR4YIDxU7MVh/5xdCafgVPmXEAAAAAAAAAAAAAAAAAAAAAAAAAAAGFx4kIVF//xY6TngDChMNLVl1tT6+8f8ritv/GEButgIIDgoWPFmlHVB+/QAAAAAAAAAAAAAAAAAAAAAAAAAABBkjJyBOfP8ML0FyAAAAABpPZqhK5fv/V9X4/xk4UqUAAAAAHkFZoCBWhv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAGCAIfWYX3GlBz4RtGdOoKHDNQLmFyiiJRaJQYLUNRMVd86iBTefAjVXzQAAAAAAAAAAAAAAAAAAAAAAAAAAAGDxg0HViB8xxHcf8OO0+FAAAAABEfMlMHEyRhAAAAABBCXqYcQGn/IE916wIGDDMAAAAAAAAAAAAAAAAjRGW0EjJVpwggMTkbWH3UH0x4/xNHYcQfT2q8EkFeyBdNbtYhTXv/FlJ4swscLS8qTG+pGjdWsgAAAAAAAAAABhIfIQAAAAAAAAAAAxQZCRRUcJQeW4b5HUZw/x5Icf8fYI7vEEhkewAAAAAAAAAAAAAAAAcTIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARIXARxIYYUQPFqPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARITNQCRksXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzVNYg4nQ28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/n8AAP5/AAD+fwAAuB0AAIABAADCAwAA4AcAAMAHAADEJwAAwAcAAMJDAACAAQAAsB0AAPx/AAD+fwAA/n8AAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0Avar%20filePicker%20%3D%20Cc%5B%27@mozilla.org/filepicker%3B1%27%5D.createInstance%28Ci.nsIFilePicker%29%3B%0AfilePicker.init%28window%2C%20%22%u0424%u0430%u0439%u043B%22%2C%20filePicker.modeOpen%29%3B%0AfilePicker.appendFilters%28filePicker.filterImages%29%3B%0A%0Aif%20%28filePicker.show%28%29%20%3D%3D%20filePicker.returnOK%29%20%7B%0A%0A%09var%20url%20%3D%20filePicker.fileURL.spec%3B%0A%09var%20ext%20%3D%20url.substring%28url.lastIndexOf%28%22.%22%29%20+%201%2C%20url.length%29%3B%0A%09var%20mimeType%3B%0A%0A%09var%20mimeTypes%20%3D%20%7B%0A%09%0A%09%09png%3A%20%22png%22%2C%0A%09%09jpg%3A%20%22jpeg%22%2C%0A%09%09ico%3A%20%22vnd.microsoft.icon%22%2C%0A%09%09gif%3A%20%22gif%22%2C%0A%09%09bmp%3A%20%22x-bmp%22%0A//%09%09bla%3A%20%22bla-bla-bla%22%0A%09%7D%0A%09if%20%28ext%20in%20mimeTypes%29%20mimeType%20%3D%20%22image/%22%20+%20mimeTypes%5Bext%5D%0A%09else%20mimeType%20%3D%20%22%22%3B%0A%09%0A%09var%20req%20%3D%20new%20XMLHttpRequest%28%29%3B%0A%09req.open%28%22GET%22%2C%20url%2C%20true%29%3B%0A%09req.responseType%20%3D%20%22blob%22%3B%0A%09req.onload%20%3D%20function%28%29%20%7B%0A%0A%09%09var%20reader%20%3D%20new%20FileReader%28%29%3B%0A%09%09reader.onload%20%3D%20function%28%29%20%7B%0A%09%09%0A%09%09%09var%20result%20%3D%20%22data%3A%22%20+%20mimeType%20+%20%22%3Bbase64%2C%22%20+%20btoa%28reader.result%29%3B%0A%09%09%09gClipboard.write%28result%29%3B%0A%09%09%7D%0A%09%09reader.readAsBinaryString%28req.response%29%3B%0A%09%7D%0A%09req.send%28null%29%3B%0A%7D%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Code

Выделить код

Код:

var filePicker = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
filePicker.init(window, "Файл", filePicker.modeOpen);
filePicker.appendFilters(filePicker.filterImages);

if (filePicker.show() == filePicker.returnOK) {

    var url = filePicker.fileURL.spec;
    var ext = url.substring(url.lastIndexOf(".") + 1, url.length);
    var mimeType;

    var mimeTypes = {
    
        png: "png",
        jpg: "jpeg",
        ico: "vnd.microsoft.icon",
        gif: "gif",
        bmp: "x-bmp"
//        bla: "bla-bla-bla"
    }
    if (ext in mimeTypes) mimeType = "image/" + mimeTypes[ext]
    else mimeType = "";
    
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.responseType = "blob";
    req.onload = function() {

        var reader = new FileReader();
        reader.onload = function() {
        
            var result = "data:" + mimeType + ";base64," + btoa(reader.result);
            gClipboard.write(result);
        }
        reader.readAsBinaryString(req.response);
    }
    req.send(null);
}


18-05-2015 19:25:49
зы. шо надобно, какую(~ие) иконку? довай кидай, сделаем.

Да нет, хотел, что бы вы изменили кнопку в последнем моем сообщении, что бы при нажатии на неё погасала или загоралась лампочка))
Спасибо!

LittleMontana пишет

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

А эсли так :/:

Выделить код

Код:

this._handleClick = ()=> setStyleForPages(cbu.checked = !cbu.checked);

var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
var styleImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANkE3LLaAgAAArVJREFUeJxtkktoVGcUx3/fd+/ceahMRum0E6vB+IKYFtpqFRFJu+imrgRdBkFoKC5cCC5cOM7GnQuXFqTSbqQWSsGFjS22Gsn4SqJJFCXJjBlnJol5mHHinbn3zj1dTKdMZA4c+M7hf37nnI+jeM8eXiLQGSMSqfGhrvEBBlqExYrLTC7M2+6jOM161Ry8uEhwU4L23Py2c/HNO7ujnT1xtKFLL++XFqaHn21c9/zsokMm0cvK+425lcS0f6Uze7nrD5n6uSrvJkWc6brbGZFiv+R++vKBc43dmR8JNep049Gx5+T+3HznuU37jn1FdL1F9QHYd+peSUOwwscHvt9dKO08rzf0HmxM3wAoT/zPQ5b1qQrYAakMggyDHgFjBNQI4qQR8lihtu6ayN5ksg4wAZJJlMHbsFa1GM4oRHwwXQh69T7KgIoJroWmEjVUeW0P6BT4ZmOFSNCZ8LXj4TwBX8CxQf8HsDXKDyOuCeL4kbD9ctUfpFL4y257vIaaQQdRfpHs3VdgzUBohuydAnivQENN67mS81H0b/D/XwHANAMjK57uEj/WRWRLG/oeSA18H0wFaz6DcoBq9emQDsbSqVQdYDQAsa0D+W8/WRotTskX0fZdW2M7viY74FIYi7K95wjiriefHnyUSGROZSfTQz9crwNW2fQvhJ0b7M9f7ZiUQq/I/BUZv3pIZO6EFH/b8cbt5/DiTaLNNbo5uDxOtbrCRLXsjPu527B8nY7EEOT/xFsuT3g2w48HVl/hqlMGkEsE7Hhoz9hCz81YdG1EIwgW8dDgd+sK2SuqDw+QlhMAqD5czzBfDFW+Md5tO4219wJ/zR/wXRUcV324zcUtAQA3HpVLPtaCFW7DCITQZtibXVKZVlqjVfLaP9Rml1b6S0uvD46NjqqnE8Xe42d+f9hK+y8c6jNrdcGm9QAAAABJRU5ErkJggg==";

function setStyleForPages() {
   var css = self.Help;
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   var uri = makeURI("data:text/css," + encodeURIComponent(css)); 
   
   try { sss.unregisterSheet(cbu.previousUri || uri, 0) } catch(e) {};
   cbu.previousUri = uri;
   
   cbu.checked && sss.loadAndRegisterSheet(uri, 0);
   icon.src = cbu.checked ? styleImage : self.image;
};
cbu.checked && setStyleForPages();

18-05-2015 22:36:15
В инициализацию.

LittleMontana ЯННП ;)  зачем стиль если есть норм. команда для скрытия панелей.
Вот с твоим стилем кнопка и меняецца иконка:

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0412%u043A%u043B%u0430%u0434%u043A%u0438%20%u043F%u0430%u043D%u0435%u043B%u044C.%20%20%u043F%u043E%u043A%u0430%u0437%u0430%u0442%u044C/%u0441%u043A%u0440%u044B%u0442%u044C%202%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%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%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.checked%20%3D%20%21this.checked%3B%0A%0Aif%20%28%20this.%20checked%20%29%20%0Athis.image%20%3D%20%22data%3Aimage/x-icon%3Bbase64%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%22%3B%0Aelse%20%0Athis.image%20%3D%20%22data%3Aimage/x-icon%3Bbase64%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%22%3B%0A%0Aconst%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%20%20%0Avar%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28%20this.Help%20%29%29%3B%0A%0Aif%20%28%20sss.sheetRegistered%28uri%2C%20sss.AGENT_SHEET%29%20%29%20sss.unregisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0Aelse%20%0Asss.loadAndRegisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5BAlt+w%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%23main-window%20%23TabsToolbar%20%7B%0A%09visibility%3A%20collapse%20%21important%3B%0A%09%7D%0A%09%0A%23main-window%5Bsizemode%3Dnormal%5D%0A%23titlebar%20%7B%0A%09-moz-appearance%3A%20none%20%21important%3B%0A%09%7D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Код

Выделить код

Код:

this.checked = !this.checked;

if ( this. checked ) 
this.image = "data:image/x-icon;base64,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";
else 
this.image = "data:image/x-icon;base64,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";

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);  
var uri = makeURI("data:text/css," + encodeURIComponent( this.Help ));

if ( sss.sheetRegistered(uri, sss.AGENT_SHEET) ) sss.unregisterSheet(uri, sss.AGENT_SHEET);
else 
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);

Help

Выделить код

Код:

#main-window #TabsToolbar {
    visibility: collapse !important;
    }
    
#main-window[sizemode=normal]
#titlebar {
    -moz-appearance: none !important;
    }

Ребят, при установке новой кнопки (через URL), диалоговое окно установки кнопки появляется 2 раза. Если нажать только один раз установить - то кнопка не появляется. С чем это может быть связанно ?Особо не мешает, но при создании новых кнопок самому, становится невозможно вытащить кнопку какую надо.
ps ни один из предложенных выше вариантов не работает. upd: как то странно, само по себе вытащилось, и заработало. то что с черной стрелочкой.
ps2:
можно ли данный код кнопки дополнить, что бы при появлении скрытии вкладок менялась иконка. спасибо! (только он и работает)

кнопка
var css = "#main-window #TabsToolbar {visibility: collapse !important;}";
css = css + "#main-window[sizemode=normal] #titlebar {-moz-appearance: none !important;}";
const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);

this.onclick = function(e) {
    if ( e.button == 0 ) {
        var uri = makeURI("data:text/css," + encodeURIComponent(css));
        var enabled = sss.sheetRegistered( uri, sss.USER_SHEET );
        enabled ? sss.unregisterSheet( uri, sss.USER_SHEET ) : sss.loadAndRegisterSheet( uri, sss.USER_SHEET )
    };   
};

LittleMontana
У меня акое наблюдается при включенном Clean Links. Посмотрите, может у вас установлено что-то подобное.

Мб в этом проблема?  searchlinkfix других похожих не находил

LittleMontana пишет

Ребят, при установке новой кнопки (через URL), диалоговое окно установки кнопки появляется 2 раза.

У меня аналогично. Два раза — это минимум.
Но меня не напрягает, поскольку предпочитаю делать так:

Копирую URL кнопки в буфер обмена.
ПКМ по существующей кнопке > «Клонировать»
ПКМ по клонированной кнопке > «Обновить кнопку»

LittleMontana пишет

необходима немного другая кнопка. есть стиль для stylish, который скрывает вкладки. можно ли сделать кнопку, которая выводится на экран, и при нажатии так же включает/отключает данный стиль ?

Кнопка-переключалка Stylish'ного стиля. По имени стиля.
В Инициализацию. И правим имя стиля.

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

Выделить код

Код:

gBrowser.currentURI.spec == "about:customizing" || (am => {

    var styleName = "Здесь имя стиля";

    var imageStyleEnabled = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANkE3LLaAgAAArVJREFUeJxtkktoVGcUx3/fd+/ceahMRum0E6vB+IKYFtpqFRFJu+imrgRdBkFoKC5cCC5cOM7GnQuXFqTSbqQWSsGFjS22Gsn4SqJJFCXJjBlnJol5mHHinbn3zj1dTKdMZA4c+M7hf37nnI+jeM8eXiLQGSMSqfGhrvEBBlqExYrLTC7M2+6jOM161Ry8uEhwU4L23Py2c/HNO7ujnT1xtKFLL++XFqaHn21c9/zsokMm0cvK+425lcS0f6Uze7nrD5n6uSrvJkWc6brbGZFiv+R++vKBc43dmR8JNep049Gx5+T+3HznuU37jn1FdL1F9QHYd+peSUOwwscHvt9dKO08rzf0HmxM3wAoT/zPQ5b1qQrYAakMggyDHgFjBNQI4qQR8lihtu6ayN5ksg4wAZJJlMHbsFa1GM4oRHwwXQh69T7KgIoJroWmEjVUeW0P6BT4ZmOFSNCZ8LXj4TwBX8CxQf8HsDXKDyOuCeL4kbD9ctUfpFL4y257vIaaQQdRfpHs3VdgzUBohuydAnivQENN67mS81H0b/D/XwHANAMjK57uEj/WRWRLG/oeSA18H0wFaz6DcoBq9emQDsbSqVQdYDQAsa0D+W8/WRotTskX0fZdW2M7viY74FIYi7K95wjiriefHnyUSGROZSfTQz9crwNW2fQvhJ0b7M9f7ZiUQq/I/BUZv3pIZO6EFH/b8cbt5/DiTaLNNbo5uDxOtbrCRLXsjPu527B8nY7EEOT/xFsuT3g2w48HVl/hqlMGkEsE7Hhoz9hCz81YdG1EIwgW8dDgd+sK2SuqDw+QlhMAqD5czzBfDFW+Md5tO4219wJ/zR/wXRUcV324zcUtAQA3HpVLPtaCFW7DCITQZtibXVKZVlqjVfLaP9Rml1b6S0uvD46NjqqnE8Xe42d+f9hK+y8c6jNrdcGm9QAAAABJRU5ErkJggg==";
    var imageStyleDisabled = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm1JREFUOI2Nkt1LU3EYx59zzs45m245p5buzaUiQV0V5AIRoswSItCY0UVXdtFf0z8QRFCwC6PCEAqL7CaYzZelc7rmltvOOjvbztzO287br6tgzS187r4Pn+8HHngwaDOTN+apiYkrd69PBYMUSeIbWzuR8NLy8ta3FamVJVoXs/OLAa/X++LRw7nQ+KjfeW7AdXbY77ufSudu2Xs90ezhLtfMY83h3sIi7fH43wT8ngZNQnRgoM9KYnqqIqDbotS4FE8ciJn04fTq+5fHfzt4s6Cvr39m9ubEHoVJr0AXIpJQ35V0epq2dg339DjEhbk7g263e76584+gwGTx8bERUpFFCQF00Tb7NYrEKQL0JE3iRZ9nULh4YcTT3LE0B9M0Ecdx+y6XSx7yBIYsFM2auvaDop3nZUVhMTCYMw5bpaPAMFD5y9pXYXQkgOx2+5CBAaFbCC9JYBXMStZ/ZdJCMpnKdTzBRBD7mWZcmqapslhbrwvCoW4YrIXAyoosZD6srvGZo/x2R8HnlXCtwPFZpsDRkiRUE8kcn2e4YqlSzWdzeSVX4EoP5maqHQUAAFYr/T22l3LUajVUYFlrLL5PHFeK1c1YoluS1e1QKAT/FbwNP9N5/jgnKSpO07hIUZjYUDUolfji8tLzRit/4hMBADCccKia8USVpUlNkS9nj5jxeHwnwhayv1tZSztBkUkJypj7sbt/FLd1dYPP70OfPr572o49cQIAgGkivVrlkc1GQTB4FcplDhoN1Ti1ACGoIYRFWJaDSGQdNje3DkzT5E8tqNfryl7iYPZMjzPs7O19HY1uTHFcqdyO/QM+cS7YiGvNZgAAAABJRU5ErkJggg==";

    am.getAddonsByTypes(["userstyle"], addons => {
        var addon = addons.find(addon => addon.name == styleName);
        if (!addon) {
            alert("«" + styleName + "»\n\nStyle Not Found");
            return;
        }
        self._handleClick = () => addon.userDisabled = !addon.userDisabled;

        var [img] = document.getAnonymousNodes(self);
        function setImg() img.src = addon.userDisabled ? imageStyleDisabled : imageStyleEnabled;
        setImg();

        var listener = {};
        listener.onEnabling = listener.onDisabling = candidate => {
            if (candidate.type == "userstyle" && candidate.name == styleName) {
                addon = candidate;
                setImg();
            }
        }
        am.addAddonListener(listener);
        addDestructor(() => am.removeAddonListener(listener));
    });
})(AddonManager);

LittleMontana пишет

можно ли данный код кнопки дополнить, что бы при появлении скрытии вкладок менялась иконка.

Именно это я и сделал постом выше! В том(твоём) куске кода CSS-код юзаецца через переменные, а мну просто сделал его в отдельном табе и с иконкой. Работает и на PaleMoon и на FF 29-36 у мну, проверил спец.
зы. а то шо bunda1 предложил у мну не работает, не скрывает панель, тока иконки меняются. :P
А вообще это нафиг не надо, разве и так не видно шо панель скрыта ?!  зачем еще иконку менять...
Все панели скрываю этими двумя строчками:

Выделить код

Код:

var bar = document.getElementById("TabsToolbar");  // тут id панели("nav-bar", "TabsToolbar" или другие.
setToolbarVisibility(bar, bar.collapsed);

чего и вам желаю!

HaGEN
Уважаемый) я дополнил свое сообщение, именно ваша кнопка и заработала.
Всем большое спасибо! :)

Не подскажите, что нужно изменить в коде кнопки истории, что бы при клике по иконке, поменять ф-цию средней кнопки мыши на левую?

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

Выделить код

Код:

var menu = document. getElementById ("goPopup"). cloneNode (true);
for (var i = 0; i < menu. childNodes. length; i++)
{
    if (menu. childNodes [i]. hasAttribute ("id"))
        menu. childNodes [i]. setAttribute ("hidden", "true");
}
menu. setAttribute ("place", "type=0&sort=4&maxResults=37");
function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);
this. appendChild (menu);
//this. type = "menu";
//this. orient = "horizontal";
this. setAttribute ("popup", menu. id = "cbHistory-" + this. id);

this. onclick = function (event)
{
    var node = event. originalTarget. node;
    if ((event. button < 2) && node)
    {
        PlacesUIUtils. markPageAsTyped (node. uri);
        openUILink (node. uri, event, false, true);
    }
    else if (event. button == 1)
        PlacesCommandHook.showPlacesOrganizer('History');
    else if (event. button == 2)
    {
        if (event. shiftKey || (event. originalTarget. nodeName != "toolbarbutton"))
            return;
        toggleSidebar ("viewHistorySidebar");
        event. preventDefault ();
        event. stopPropagation ();
    }
};

Я думаю так:

Выделить код

Код:

if ((event. button == 0))
    PlacesCommandHook.showPlacesOrganizer('History');        
else if ((event. button < 2) && node) {
        PlacesUIUtils. markPageAsTyped (node. uri);
        openUILink (node. uri, event, false, true);
}

А просто циферки поменять может и не сработать.

bunda1
А можно сделать чтобы кнопка переключения стиля запоминала своё состояние, а то после перезагрузки приходиться её постоянно включать?

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

Выделить код

Код:

this._handleClick = ()=> setStyleForPages(cbu.checked = !cbu.checked);

var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
var styleImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANkE3LLaAgAAArVJREFUeJxtkktoVGcUx3/fd+/ceahMRum0E6vB+IKYFtpqFRFJu+imrgRdBkFoKC5cCC5cOM7GnQuXFqTSbqQWSsGFjS22Gsn4SqJJFCXJjBlnJol5mHHinbn3zj1dTKdMZA4c+M7hf37nnI+jeM8eXiLQGSMSqfGhrvEBBlqExYrLTC7M2+6jOM161Ry8uEhwU4L23Py2c/HNO7ujnT1xtKFLL++XFqaHn21c9/zsokMm0cvK+425lcS0f6Uze7nrD5n6uSrvJkWc6brbGZFiv+R++vKBc43dmR8JNep049Gx5+T+3HznuU37jn1FdL1F9QHYd+peSUOwwscHvt9dKO08rzf0HmxM3wAoT/zPQ5b1qQrYAakMggyDHgFjBNQI4qQR8lihtu6ayN5ksg4wAZJJlMHbsFa1GM4oRHwwXQh69T7KgIoJroWmEjVUeW0P6BT4ZmOFSNCZ8LXj4TwBX8CxQf8HsDXKDyOuCeL4kbD9ctUfpFL4y257vIaaQQdRfpHs3VdgzUBohuydAnivQENN67mS81H0b/D/XwHANAMjK57uEj/WRWRLG/oeSA18H0wFaz6DcoBq9emQDsbSqVQdYDQAsa0D+W8/WRotTskX0fZdW2M7viY74FIYi7K95wjiriefHnyUSGROZSfTQz9crwNW2fQvhJ0b7M9f7ZiUQq/I/BUZv3pIZO6EFH/b8cbt5/DiTaLNNbo5uDxOtbrCRLXsjPu527B8nY7EEOT/xFsuT3g2w48HVl/hqlMGkEsE7Hhoz9hCz81YdG1EIwgW8dDgd+sK2SuqDw+QlhMAqD5czzBfDFW+Md5tO4219wJ/zR/wXRUcV324zcUtAQA3HpVLPtaCFW7DCITQZtibXVKZVlqjVfLaP9Rml1b6S0uvD46NjqqnE8Xe42d+f9hK+y8c6jNrdcGm9QAAAABJRU5ErkJggg==";

function setStyleForPages() {
   var css = self.Help;
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   var uri = makeURI("data:text/css," + encodeURIComponent(css)); 
   
   try { sss.unregisterSheet(cbu.previousUri || uri, 0) } catch(e) {};
   cbu.previousUri = uri;
   
   cbu.checked && sss.loadAndRegisterSheet(uri, 0);
   icon.src = cbu.checked ? styleImage : self.image;
};
cbu.checked && setStyleForPages();

villa7

Выделить код

Код:

// ЛКМ переключить настройки кнопки и стиль ..........
this._handleClick = function() setStyleForPages(void(run.value = !run.value));


// Создать настройки кнопки в about:config если они не существует ..........
var s = "CB" + _id.slice(20) + ".setStyleForPage";
cbu.isPref(s, false);
var previousUri = "CB" + _id.slice(20) + ".previousUri";


// Иконка для включеной кнопки  ..........
var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
var styleImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANkE3LLaAgAAArVJREFUeJxtkktoVGcUx3/fd+/ceahMRum0E6vB+IKYFtpqFRFJu+imrgRdBkFoKC5cCC5cOM7GnQuXFqTSbqQWSsGFjS22Gsn4SqJJFCXJjBlnJol5mHHinbn3zj1dTKdMZA4c+M7hf37nnI+jeM8eXiLQGSMSqfGhrvEBBlqExYrLTC7M2+6jOM161Ry8uEhwU4L23Py2c/HNO7ujnT1xtKFLL++XFqaHn21c9/zsokMm0cvK+425lcS0f6Uze7nrD5n6uSrvJkWc6brbGZFiv+R++vKBc43dmR8JNep049Gx5+T+3HznuU37jn1FdL1F9QHYd+peSUOwwscHvt9dKO08rzf0HmxM3wAoT/zPQ5b1qQrYAakMggyDHgFjBNQI4qQR8lihtu6ayN5ksg4wAZJJlMHbsFa1GM4oRHwwXQh69T7KgIoJroWmEjVUeW0P6BT4ZmOFSNCZ8LXj4TwBX8CxQf8HsDXKDyOuCeL4kbD9ctUfpFL4y257vIaaQQdRfpHs3VdgzUBohuydAnivQENN67mS81H0b/D/XwHANAMjK57uEj/WRWRLG/oeSA18H0wFaz6DcoBq9emQDsbSqVQdYDQAsa0D+W8/WRotTskX0fZdW2M7viY74FIYi7K95wjiriefHnyUSGROZSfTQz9crwNW2fQvhJ0b7M9f7ZiUQq/I/BUZv3pIZO6EFH/b8cbt5/DiTaLNNbo5uDxOtbrCRLXsjPu527B8nY7EEOT/xFsuT3g2w48HVl/hqlMGkEsE7Hhoz9hCz81YdG1EIwgW8dDgd+sK2SuqDw+QlhMAqD5czzBfDFW+Md5tO4219wJ/zR/wXRUcV324zcUtAQA3HpVLPtaCFW7DCITQZtibXVKZVlqjVfLaP9Rml1b6S0uvD46NjqqnE8Xe42d+f9hK+y8c6jNrdcGm9QAAAABJRU5ErkJggg==";


// Получить настройки кнопки и css код из вкладки Справка ..........
var css = self.Help;
var run = Application.prefs.get(s);


// Переключить css стиль для страницы ..........
function setStyleForPages(reason) {
   if ( reason == "destructor" ) return; 

   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); 
   var uri = makeURI("data:text/css," + encodeURIComponent(css)); 
   
   try { sss.unregisterSheet(Services[_id + "previousUri"] || uri, 0) } catch(e) {};
   Services[_id + "previousUri"] = uri;
   
   run.value && !reason && sss.loadAndRegisterSheet( uri, 0 );
   icon.src = run.value ? styleImage : self.image;
};
addDestructor(setStyleForPages);
run.value && setStyleForPages();

bunda1
Как всегда, то что нужно. Спасибо.

bunda1 пишет

var run = Application.prefs.get(s);

Прикинь, Application будет уничтожен :(.

Это плохо, опять всё переделывать. А что вместо него можно использовать если надо что типа этого:

Выделить код

Код:

var pref = Application.prefs.get( s );
pref.value = !pref.value;

или просто что бы записать в настройку через pref.value = 'qwerty'

bunda1 пишет

А что вместо него можно использовать

Ну, на Nightly, можно приглядеться  к
resource://gre/modules/Preferences.jsm

Но остаётся глупая надежда, что кто-нибудь
выложит на AMO аддон, возвращающий
resource:///components/fuelApplication.js

И что AMO его подпишет.

bunda1
Red Links - не работает на ночнушке (e10s отключен).
В консоль ругается (при загрузке страницы) на:

Выделить код

Код:

NS_ERROR_UNEXPECTED: Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIPrefBranch.getCharPref] button.js:45:0

и на (при инициализации):

Выделить код

Код:

ReferenceError: reference to undefined property x.ss[i].cek button.js:165:13

Спасибо.

27-05-2015 19:24:46
Создал вручную параметр CB.RedLinks_externalColor, вместо CB.RedLinks_Exter_color (который задается через модальное окно) - заработало.

turbot пишет

В консоль ругается (при загрузке страницы) на:

Выделить код

Код:

NS_ERROR_UNEXPECTED: Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIPrefBranch.getCharPref] button.js:45:0

и на (при инициализации):

Выделить код

Код:

ReferenceError: reference to undefined property x.ss[i].cek button.js:165:13

Спасибо.

Да эту кнопку давно пора обновить, на днях переделаю.

turbot пишет

Создал вручную параметр CB.RedLinks_externalColor, вместо CB.RedLinks_Exter_color (который задается через модальное окно) - заработало.

Мистика однако :/

bunda1 пишет

на днях переделаю.

Спасибо.
(А можно заодно простенькую вариацию сделать, чтобы на внешние ссылки просто какой-нибудь атрибут вешался. Человек тут просит. :))

turbot пишет

(А можно заодно простенькую вариацию сделать, чтобы на внешние ссылки просто какой-нибудь атрибут вешался. Человек тут просит. :))

Можно и не сложно, можно даже стилем сделать и то что делает Red links тоже, если использовать -moz-binding: но тут я не специалист.

27-05-2015 20:08:41
Я тут подумал а нужны вообще для Red links какие то настройки кроме установки цвета ссылок, что скажешь?

bunda1
Эээ, я думаю лучше спрашивать тех, кто регулярно пользуется кнопкой. Я-то только посмотреть поставил. :)
Может, для кого-то другие опции и важны, а мне и просто подсветка внешних - излишество. :rolleyes:

Понятно.

Можно как то вытащить кнопки из адресной строки в отдельные кнопки?
22bfbd34afcd12220d96a36c5605a492.jpeg

villa7
Для чтения
(еще вот, для Reading List, если его еще выпилили.)

turbot
Ага, спасибо. Осталось блокировку выпилить.

villa7

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

Выделить код

Код:

(function() {
   var mc = document.getElementById("notification-popup-box");
   mcc = mc.cloneNode(true);
   mcc.setAttribute('class', 'toolbarbutton-1 chromeclass-toolbar-additional');
   document.getElementById("urlbar-wrapper").parentNode.insertBefore(mcc, document.getElementById("urlbar-wrapper")); // вместо urlbar-wrapper - id элемента, перед которым вставляем
})();

Вроде, работает:
clipboard.png

(код у bunda1 стащил. спасибки - ему)

turbot
Я имел ввиду кнопку которая появляется когда  privacy.trackingprotection.enabled;true выставлено.
23e1b43595f2096715455ca28e8ccf62.jpeg

villa7
По-простому, только всей кучей:
thumb.jpg
Может, кто другой и сможет.  idontnow.gif

Есть ли способ в дополнение All-in-one sidebar убрать в боковой панели, точнее сделать так, что бы с помощью CB показывались прятались следующие заголовки (как их еще обозвать, не знаю)
http://puu.sh/i4TjH/8d90500ed1.jpg
(сразу под адресной строкой, 2 панельки)
Большое спасибо)

Нужна кнопка, аналог пункта "вставить и перейти". Если в буфере ссылка, то будет переход по ней, если просто текст то поиск в поисковике по умолчанию. Результат должен открываться в текущей вкладке. Возможно ли такое? Сам в написании кнопок не силён.

KOT040188
https://forum.mozilla-russia.org/viewto … 49#p664249

villa7
Спасибо, но перетаскивание мне не нужно. Мне бы просто нажать на кнопку.

KOT040188
Какое перетаскивание, мышку на 3мм сдвинуть?

KOT040188 пишет

Если в буфере ссылка, то будет переход по ней, если просто текст то поиск в поисковике по умолчанию.

Дешево и сердито:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGo%20or%20Search%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACPklEQVQ4ja2Rv2saYRjH3zM2/0CHDtk6uLhkEXvleJ/nUDlDzmwZxOPgHFKdxEXiEs9foHHQSUfBQSVrF0vI3dZBdDUglJgO6S+KEFNCW9Kny1lU2tKhLzy8PLzP+32+n+dh7H8eAIgAgAUACycsRFT/+sk0TRdjjCFiCRHJiRkAfFjJS065sLyPjo4e/coRUUVEAoC3nPPnS3FElADgynmLbIisWbecTs82nAmSJPllWSYAsDa+CYeHh1tLgVtEnP2BUnCQblcRTNN0IaL7XwSYLMszRFw4AoJt227Hoet3CGuMkiT5nRlsIqzNIOIUXa/MQQAAMRAIzBCROOcvzs7Otle6C6vNhNU1KopyXSgUqNVqUSaTIVmWSVGUT7lc7nuz2aR8Pv9uuX7GGGO2bbsZY4xzfrC/v/+6UqnQzc0NTadTOj8/p3K5TKenpzSZTGg6nZJt2/fVavVlNBp9soZimqY7nU4vxuMxnZycUCgUIk3TqFarUTqdJk3TKBgMUjab/WFZFiWTyTeMMba1ZPF6vdvZbJZGo9F7xphLFMXFYDCg4XBIFxcX1O12SRRFAoCPlmU9HB8fP6w58Hg8T3Vdn4/HYwqHw6/8fv83zjmFw2Ha29sjzjmJokiKopBt26Tr+nxNYGdn53EwGLwsFovzTqfzudfrUb1ep0QiQalUihqNBvX7fWq3219KpdI8FApdbm5U8Pl8u4h4FYvF7gzDuDcM46uqqrqqqoF4PH5rGMa9pml3sixf+Xy+3Z/b7CADQxLi/wAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0Athis.setAttribute%28%22oncommand%22%2C%20%22gURLBar.select%28%29%3B%20goDoCommand%28%27cmd_paste%27%29%3B%20gURLBar.handleCommand%28%29%3B%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

turbot, спасибо, по идее то, что нужно, но есть один нюанс. У меня линукс и я привык, что все мои кнопки использующие буфер используют мышиный буфер. А эта неожиданно как назло использует обычный. Можно переделать на мышиный?

KOT040188
Э, не представляю, как.

:offtopic:
Я закоренелый виндузятник. Линуксом пользуюсь только на работе, постольку-поскольку. И не смотрите на UA - это из-за лени (один нужный и дома и на работе сайт имеет раздражающую манеру сбрасывать сессию, при смене юзерагента, вместе со всеми куками настроек (коии в них и хранит)). :)

Вот здесь объясняли, что мышиный буфер используется из-за специальной функции. Гляньте пожалуйста ヅ

Короче, кнопки ведут себя исключительно так, как написано в их коде: nsIClipboard позволяет использовать буфер для выделенного текста, если он доступен

KOT040188
Глянул. Но без возможности потыкать - не рискну что-то предлагать. Возможность потыкать на машине с Линуксом - только во вторник будет. Но, сдается мне, дешево и сердито тут не выйдет.

скрытый текст
(А проверьте-ка, какой буфер использует команда "Paste & Go" в контекстном меню адресной строки. Если нужный, то скопируйте это значение (DOM Inspector + [CB]Attributes Inspector - в помощь) в код кнопки, вместо "gURLBar.select(); goDoCommand('cmd_paste'); gURLBar.handleCommand();". Оттуда, кстати, и вытащил (потому и "дешево и сердито" :)).)

(А проверьте-ка, какой буфер использует команда "Paste & Go" в контекстном меню адресной строки

Обычный буфер

Оттуда, кстати, и вытащил (потому и "дешево и сердито"

Ну теперь понятно где собака порылась… Жаль, мне нужен именно мышиный буфер…

KOT040188 пишет

Ну теперь понятно где собака порылась… Жаль, мне нужен именно мышиный буфер…

Выделить код

Код:

gClipboard.read();

bunda1, и куда это вставлять?

KOT040188
Ну, тогда ждите кого-то знающего. idontnow.gif
(Или вторника. Но тут, как повезет, без гарантий. Я человек малоразбирающийся.)

30-05-2015 00:59:08

KOT040188 пишет

куда это вставлять?

Выделить код

Код:

gURLBar.select(); gClipboard.read(); goDoCommand('cmd_paste'); gURLBar.handleCommand();

Если я правильно догадался.

turbot, а это куда вставлять ? :blush:

KOT040188
https://lh3.googleusercontent.com/-2gU7 … 520001.png

Ладно, завтра попробую.

Похоже я ошибся, gClipboard.read(); тоже общий буфер обмена.

общий буфер обмена.
На форуме

В смысле обычный?

KOT040188 пишет

общий буфер обмена.
На форуме

В смысле обычный?

В смысле общий

Выделить код

Код:

gURLBar.select(); gClipboard.read(); goDoCommand('cmd_paste'); gURLBar.handleCommand();

С этим кнопка вообще не работает.

KOT040188

Выделить код

Код:

gURLBar.value = gClipboard.read(); gURLBar.handleCommand();

C этим тоже. Может я что не так делаю. Кнопка:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGo%20or%20Search%20%u043E%u0431%u044B%u0447%u043D%u044B%u0439%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACPklEQVQ4ja2Rv2saYRjH3zM2/0CHDtk6uLhkEXvleJ/nUDlDzmwZxOPgHFKdxEXiEs9foHHQSUfBQSVrF0vI3dZBdDUglJgO6S+KEFNCW9Kny1lU2tKhLzy8PLzP+32+n+dh7H8eAIgAgAUACycsRFT/+sk0TRdjjCFiCRHJiRkAfFjJS065sLyPjo4e/coRUUVEAoC3nPPnS3FElADgynmLbIisWbecTs82nAmSJPllWSYAsDa+CYeHh1tLgVtEnP2BUnCQblcRTNN0IaL7XwSYLMszRFw4AoJt227Hoet3CGuMkiT5nRlsIqzNIOIUXa/MQQAAMRAIzBCROOcvzs7Otle6C6vNhNU1KopyXSgUqNVqUSaTIVmWSVGUT7lc7nuz2aR8Pv9uuX7GGGO2bbsZY4xzfrC/v/+6UqnQzc0NTadTOj8/p3K5TKenpzSZTGg6nZJt2/fVavVlNBp9soZimqY7nU4vxuMxnZycUCgUIk3TqFarUTqdJk3TKBgMUjab/WFZFiWTyTeMMba1ZPF6vdvZbJZGo9F7xphLFMXFYDCg4XBIFxcX1O12SRRFAoCPlmU9HB8fP6w58Hg8T3Vdn4/HYwqHw6/8fv83zjmFw2Ha29sjzjmJokiKopBt26Tr+nxNYGdn53EwGLwsFovzTqfzudfrUb1ep0QiQalUihqNBvX7fWq3219KpdI8FApdbm5U8Pl8u4h4FYvF7gzDuDcM46uqqrqqqoF4PH5rGMa9pml3sixf+Xy+3Z/b7CADQxLi/wAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0Athis.setAttribute%28%22gURLBar.value%20%3D%20gClipboard.read%28%29%3B%20gURLBar.handleCommand%28%29%3B%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

KOT040188
thumb4.jpg 
А из инициализации код удалите.

Так это всё равно не мышиный буфер.

turbot пишет

Возможность потыкать на машине с Линуксом - только во вторник будет

Ну так что там слышно?

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

Ultima2m
Я думаю велосипед не стоит изобретать, просто скрыть, ничего вроде не прыгает, только вместо рожицы наоборот стрелка одна остаётся, но можете заменить на свою иконку. Зато без всяких изворотов.

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

Выделить код

Код:

.box-inherit.toolbarbutton-menubutton-button[label="Greasemonkey"] {-moz-appearance: none !important;
display: none !important;} 


/*Иконка*/
#greasemonkey-tbb > .toolbarbutton-menubutton-dropmarker  {-moz-appearance: none !important;
 list-style-image: url("data:image/png;base64,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") !important;
 -moz-image-region: auto !important;   
}

villa7
И как свою иконку поставить? Это же не СВ-кнопка.
К тому же пришлось включать стрелки на других кнопках, чтобы увидеть GreaseMonkey.
Получился обмен "шила на мыло".

Ultima2m
Откуда ж мне знать что там у вас поустановлено, ждите тогда.

KOT040188
Я пас. Не по моим куриным мозгам. idontnow.gif

Ultima2m
Дешево и сердито:

Выделить код

Код:

document.getElementById("greasemonkey-tbb").setAttribute('type', "menu");
document.getElementById("greasemonkey-tbb").setAttribute('oncontextmenu', 'if (event.target == this && !event.ctrlKey && !event.shiftKey) {event.preventDefault(); event.stopPropagation(); doCommand();}');

В инициализацию любой кнопки. ЛКМ по кнопке greasemonkey - попап, ПКМ - вкл/выкл. Без дропмаркера.

turbot
Супер. Фунциклинирует.
Спасибо.

Ultima2m
Хм, видимо, дешево не выйдет. Заметил, что при клике пкм по пунктам в самом меню, GM также отключается. Слишком сердито. :)
Так что, либо ждите, пока кто-нибудь недешевый вариант подскажет, либо убирайте второе (с oncontextmenu) и отключайте GM, когда требуется, через меню кнопки, либо придется каждый раз, после открытия скриптов для редактирования через меню, включать GM обратно.

turbot пишет

KOT040188
Я пас.

А так проверял ?

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

Выделить код

Код:

var str = readFromClipboard();
if (str) {
    gURLBar.value = str;
    gURLBar.handleCommand();
}

turbot пишет

Заметил, что при клике пкм по пунктам в самом меню, GM также отключается.

Может

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

Выделить код

Код:

document.getElementById("greasemonkey-tbb").setAttribute('oncontextmenu', 'if (event.target == this && !event.ctrlKey && !event.shiftKey) {event.preventDefault(); event.stopPropagation(); GM_util.setEnabled(!GM_util.getEnabled()); GM_BrowserUI.refreshStatus();}');
//                                                                             ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Dumby пишет

Может

О, спасибо. Поправил.

Dumby пишет

А так проверял ?

Э, нет. Меня куда-то совсем в другие дебри понесло. shuffle.gif
Проверить, на машине с линуксом, смогу теперь опять только на следующей неделе. Ну или, пусть KOT040188 сам проверяет.

turbot пишет

Ну или, пусть KOT040188 сам проверяет.

Поздно заметил. Завтра проверю…

Dumby пишет

А так проверял ?

Гениально! То что нужно! А можно добавить к этой кнопке отображение содержимого мышиного буфера при наведении на неё?

KOT040188 пишет

А можно добавить к этой кнопке отображение содержимого мышиного буфера при наведении на неё?

Разве что попробую вслепую. В Инициализацию.

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

Выделить код

Код:

(() => {
    var header = "Содержимое мышиного буфера:\n\n";
    var readFromSelectionClipboard = eval("(" +
        String.replace(readFromClipboard, /else\n.+\n/, "")
    + ")");
    self.onmouseenter = () => self.tooltipText = header
        + (readFromSelectionClipboard() || "");
})();

Dumby, спасибо работает. :)

https://forum.mozilla-russia.org/viewtopic.php?pid=663560#p663560
Можно ли сделать так чтобы по долгому клику ЛКМ перезагружались все вкладки и иконки более темными как по стандарту?
Спасибо.

Kiril__777 пишет

Можно ли сделать так чтобы по долгому клику ЛКМ перезагружались все вкладки и иконки более темными как по стандарту?

Иконки вкладок?

bunda1 пишет

Иконки вкладок?

иконки кнопки

Можно ли сделать кнопку "Вкл-Выкл. автообновление активной (или всех) вкладки через 5 минут?

manuk
https://forum.mozilla-russia.org/viewto … 31#p604831 и дальше еще пара вариантов.

turbot, спасибо. Поиском сам не нашёл.

manuk пишет

Можно ли сделать кнопку "Вкл-Выкл. автообновление активной (или всех) вкладки через 5 минут?

Автоматически перезагружать вкладку+

bunda1 пишет

Автоматически перезагружать вкладку+

Упс, я как-то ее пропустил.

bunda1 пишет

можно выключить авто перезагрузку вкладки если кликнуть на эту кнопку

У меня не реагирует... :rolleyes: В консоли тишина.

13-06-2015 23:59:56
Ага, нашел причину: у кнопки почему-то pointer-events: none; установил auto - заработало.

bunda1, благодарю. Эта кнопка удобней.

Дублирую сообщение под номером 832. Помогите пожалуйста :)

Есть ли способ в дополнение All-in-one sidebar убрать в боковой панели, точнее сделать так, что бы с помощью CB показывались (и прятались) следующие заголовки (как их еще обозвать, не знаю)
http://puu.sh/i4TjH/8d90500ed1.jpg
(сразу под адресной строкой, 2 панельки)
Большое спасибо)
ps. или это в Stylish ветке форума спрашивать?)))

LittleMontana
Не уверен что я правильно понял, но вот

Выделить код

Код:

#commandBar, #sidebar-header {display: none !important;}

Снова не нашёл... Может есть кнопка, которая листает вперёд страницы в поисковике (Яндекс, Гугл)? Аддон https://addons.mozilla.org/ru/firefox/a … xt/?src=ss какой-то кривоватый.

manuk
Про кнопку не скажу, а про расширения - недавно поднимался вопрос: https://forum.mozilla-russia.org/viewto … 09#p684909 и дальше.

turbot, там немного не то, кроме SpaceNext. А он не очень. Кнопку бы кликабельную для поисковиков (для сочетаний клавиш пальцев маловато).

villa7 пишет

LittleMontana
Не уверен что я правильно понял, но вот

Выделить код

Код:

#commandBar, #sidebar-header {display: none !important;}

Спасибо большое. Все работает

Здраствуйте. У встроеного html плеера firefox есть в контекстном меню выбор скорости воспроизведения видео - 0.5х 1х 1.5х 2х. Помогите пожалуйста сделать три кнопки (1х,1.5х,2х) на панель навигации.

Здраствуйте. Помогите создать кнопку, которая будет при ее нажатии копировать и передавать (запуская саму программу) ссылку из адресной строки в программу "4kvideodownloader" а та сама собой будет анализировать эту ссылку (youtube).

Violantius
https://forum.mozilla-russia.org/viewto … 64#p687264

turbot пишет

Violantiushttps://forum.mozilla-russia.org/viewto … 64#p687264

Спасибо, почти то что нужно, но это подходит если плеер запускать. Да я поменял путь к программе и она запускается, но вот только нужно что бы еще и ссылку копировала из буфера и вставляла. Проще говоря нужно так как это реализовано в проге "Freemake Video Downloader" при нажатии кнопки запускается прога и предлагает в каком качестве скачать видео с трубы.

Violantius
Эта кнопка итак передает в программу ссылку текущей вкладки: window.content.location.href
Если так не принимает, значит программе нужны какие-то параметры. Ищите в ее документации параметры запуска командной строки.

turbot
Ладно, спасибо.
Все еще актуально!

https://forum.mozilla-russia.org/viewtopic.php?pid=534793#p534793
Эта кнопка у кого-нибудь работает?

Kiril__777, UserScriptLoader[работа со скриптами Greasemonkey] | Форум Mozilla Россия. Код из первого поста у меня работает.

lokiju
а у меня не работает ни один вариант. проверял на скрипте кинопоиска.

bunda1
Search and open + - В ночнушках, уже давно, ругается на Deprecated (с nsIBrowserSearchService) и что-то про замедление работы с синхронными-что-то-там. Не утверждаю, что это правильное решение, но тупо позаменял на Services.search - ругаться перестал. :)

Еще хотелка: впиндюрить обсервер. В ночнушках теперь можно переключать дефолтный поисковик (с browser.search.showOneOffButtons;true) ctrl+стрелками вверх/вниз (с alt - временно), прямо из поисковой строки, и несколько смущает несменяющаяся с переключением иконка. (Опять-таки, не утверждаю, что именно так нужно, но у меня работает:

Выделить код

Код:

var pref = "browser.search.defaultenginename";
function toggleImage() {
    self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
    var uri = Services.search.currentEngine.iconURI.spec;
    src = self.image = PlacesUtils.getImageURLForResolution(window, uri);
};
toggleImage();
gPrefService.addObserver(pref, toggleImage, false);
addDestructor(function() gPrefService.removeObserver(pref, toggleImage));

:))

turbot пишет

bunda1
Search and open + - В ночнушках, уже давно, ругается на Deprecated (с nsIBrowserSearchService) и что-то про замедление работы с синхронными-что-то-там. Не утверждаю, что это правильное решение, но тупо позаменял на Services.search - ругаться перестал. :)

Спасибо :) Приятно когда пользователи находят ошибки в кнопках и сами их сразу исправляет.

turbot пишет

Еще хотелка: впиндюрить обсервер. В ночнушках теперь можно переключать дефолтный поисковик (с browser.search.showOneOffButtons;true) ctrl+стрелками вверх/вниз (с alt - временно), прямо из поисковой строки, и несколько смущает несменяющаяся с переключением иконка.

Не проблема, на днях сделаю.

Опять-таки, не утверждаю, что именно так нужно, но у меня работает:

Выделить код

Код:

var pref = "browser.search.defaultenginename";
function toggleImage() {
    self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
    var uri = Services.search.currentEngine.iconURI.spec;
    src = self.image = PlacesUtils.getImageURLForResolution(window, uri);
};
toggleImage();
gPrefService.addObserver(pref, toggleImage, false);
addDestructor(function() gPrefService.removeObserver(pref, toggleImage));

Спасибо, это пригодится в кнопке, только  нужно просто self.image

Можно ли сделать кнопку для https://addons.mozilla.org/ru/firefox/addon/export-cookies/?src=api
и если можно в кнопке указать папку сохранения.

Можно ли сделать так, чтобы закладки из боковой панели открывались в новой активной вкладке ЛКМ?

becool пишет

Можно ли сделать так, чтобы закладки из боковой панели открывались в новой активной вкладке ЛКМ?

Сегодня 12:13:10

Подскажите способ, чтобы кнопки имели квадратный вид. (рамку вокруг иконки)

firepox
Вопрос совсем не в тему. Это надо спрашивать в CSS-стили. Но проще поставить Classic Toolbar Buttons :: Add-ons for Firefox.

firepox, https://userstyles.org/styles/45355/fir … ton-styles

Всем добрый. В теме "готовые кнопки" была кнопка link master теперь её нет.Может кто продублирует здесь? Спасибо.

oleg953 пишет

Всем добрый. В теме "готовые кнопки" была кнопка link master теперь её нет.Может кто продублирует здесь?

Да она просто практически перестала работать, вот её наверное и ликвидировали за ненадобностью.

oleg953
Код

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

Выделить код

Код:

var this_=this;
if(vislink42==1){
var newSS, styles=':link, :link * { color: yellow ! important; background: red ! important; text-decoration: none ! important; font-weight: bold ! important; } :visited, :visited * { color:  red ! important; background: yellow ! important; text-decoration: blink ! important; font-weight: bold ! important; }';
newSS=content.document.createElement('link');
newSS.rel='stylesheet';
newSS.href='data:text/css,'+escape(styles);
content.document.getElementsByTagName("head")[0].appendChild(newSS);
vislink42=2;
}
else{
if (vislink42==2){
var newSS, styles=':link, :link * { color: red ! important; background: yellow ! important; text-decoration: blink ! important; font-weight: bold ! important; } :visited, :visited * { color:  red ! important; background: yellow ! important; text-decoration: blink ! important; font-weight: bold ! important; }';
newSS=content.document.createElement('link');
newSS.rel='stylesheet';
newSS.href='data:text/css,'+escape(styles);
content.document.getElementsByTagName("head")[0].appendChild(newSS);
vislink42=3;
}
else{
if (vislink42==3){
BrowserReload();
vislink42=1;
}
}
}


Инициализация
скрытый текст

Выделить код

Код:

var this_=this;
var folderpath="C:\\SAVEDURLS";// папка для сохранения ярлыков
var profilepath='C:\\myffprofiles\\profile01'; // Путь до папки с другим профилем Firefox
var firefox="C:\\Program Files\\Mozilla Firefox\\firefox.exe"; // путь до Firefox по-умолчанию, 
// если намерены использовать другую версию для "Открыть в другом профиле Firefox" то укажите свой путь.

this.tooltipText="Link  Master (Context menu)-Расширенное контекстное меню при клике на ссылку.\nЛКМ-сделать ссылки видимыми > Очень видимыми > Вернуть исходный вид(обновляет страницу)\nи так по кругу.\nПКМ-меню кнопки,настройки меню в секции Инициализация\nНе забудьте перезапустить Firefox после внесения изменений!\nСКМ - открывает пост с кнопкой на http://forum.mozilla-russia.org";
vislink42=1;
var lmicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAJkAAP8AMwAAZgAAAAAAmQD////7HhmTAAAAB3RSTlP///////8AGksDRgAAAAFiS0dEBmFmuH0AAAAJcEhZcwAACxMAAAsTAQCanBgAAABSSURBVHjaY2BLYwOhBAa2tDQQgw3IYGMAIQYwFyrClgBSw8AGVZwGBQyCUIAQSVIGksnGaQxOymZpacZGagxAXmiwMVAKyDAFM+BSEMVGaXDtADaGHx7bD2cMAAAAAElFTkSuQmCC";
var bbicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAKAAAP+gAAD/oAAA/6AAAP+gAAD/AAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAACgAAD///////////+gAAD/oAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAoAAA/////////////////6AAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAACAAP8AgAD/AIAA/6AAAP////////////////+gAAD/AAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAgAD///////////+gAAD/////////////////oAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAIAA////////////oAAA/6AAAP+gAAD/oAAA/6AAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAACAAP////////////////8AgAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAgAD/////////////////AIAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAIAA/wCAAP8AgAD/AIAA/wCAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///+sQQPArEEDwKxBP/ysQT4MrEE+DKxBPgysQTAMrEEwDKxBMAysQTB8rEEwfKxBMHysQT/8rEEDwKxBA8CsQQ==";
var htmicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAKAAAP+gAAD/oAAA/6AAAP+gAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAACgAAD///////////+gAAD/oAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAoAAA/////////////////6AAAP8AAAAAAAAA/wAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAACAAP8AgAD/AIAA/6AAAP////////////////+gAAD/AAAAAAAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAgAD///////////+gAAD/////////////////oAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAIAA////////////oAAA/6AAAP+gAAD/oAAA/6AAAP8AAAAAAAAAAAAAAP8AAAD/AAAAAAAAAP8AAAD/AAAAAACAAP////////////////8AgAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AgAD/////////////////AIAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf//rEHzz6xB5+esQc4DrEHOA6xBngmsQTAMrEFwDqxBMAysQZB5rEHAc6xBwHOsQefnrEHzz6xB//+sQQ==";
var txticon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAP+gAAD/oAAA/6AAAP+gAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAD///////////+gAAD/oAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAA/////////////////6AAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAP8AgAD/AIAA/6AAAP////////////////+gAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAD///////////+gAAD/////////////////oAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA////////////oAAA/6AAAP+gAAD/oAAA/6AAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAP////////////////8AgAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAD/////////////////AIAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA/wCAAP8AgAD/AIAA/wCAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAD/AAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+CsQf/grEH/4KxB/wCsQf8ArEH/AKxB/wesQf8HrEH/B6xB//+sQbRHrEGFX6xBtN+sQbVfrEGER6xB//+sQQ==";
var lnkicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy8vL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZpnM/zNmmf8zZmb/ZmaZ/zNmZv8zZmb/M2Zm/zNmmf8zZmb/b29v/wAAAAAAAAAAAAAAAAAAAAAAAAAAM5nM/zOZzP9mzMz/Zsz//2bM//9mzP//Zsz//2bM//9mzP//M8zM/zOZmf9vb2//AAAAAAAAAAAAAAAAAAAAADOZzP9mzMz/Zsz//5nM//9mzP//Zsz//2bM//+ZzP//Zsz//2bMzP8zmcz/b29v/wAAAAAAAAAAAAAAAAAAAAAzmcz/M5n//5n///+Z////Zv///5n///+Z////mf///5n///9mzP//M5nM/29vb/8AAAAAAAAAAAAAAAAAAAAAM5nM/2bMzP+ZzP//mf///8z////M////M5kz/5n///+Z////mcz//zOZzP9vb2//AAAAAAAAAAAAAAAAAAAAADOZzP9mzP//ZszM/2aZzP9mzMz/ZpnM/wDMAP8zzDP/ZpnM/zOZzP8zmcz/AAAAAAAAAAAAAAAAAAAAAAAAAAAzmcz/mf///5n///+Z////mf///wDMM/8A/wD/AMwz/8z/zP8zmZn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmczM/5nM///M////zP///zOZM/8AzAD/AMwz/wDMM/8AzAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM5nM/zOZZv8AzAD/AMwz/wDMAP8AzDP/M/8z/wDMM/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTP/AMwz/wDMAP8AzDP/M8wz/2bMZv9m/2b/Zsxm/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQD/AMwz/wDMAP8AzDP/AMwz/zP/Zv9m/5n/mcyZ/2bMmf+ZzJn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzmTP/AJkA/wDMM/9mzGb/mcyZ/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM5kz/wDMM/8AzAD/ZsyZ/5n/mf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZM/8AzAD/AMwz/5nMmf9mzGb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzmTP/AJkz/wDMM/9mzJn/Zsxm/wAAAAAAAAAAAAAAAAAAAAAAAAAA7/+sQeAHrEHAA6xBwAOsQcADrEHAA6xBwAesQcAPrEHAH6xB8A+sQfgHrEHwA6xB/B+sQfwfrEH8H6xB/B+sQQ==";
var gtlnkicon="data:image/gif;base64,R0lGODlhEAAQALMOAMz//8zM/5nM/2ZmzGZmmZmZzMyZzMzMmZmZ/5mZmQAAAP///2Zm/wD/AP///wAAACH5BAHoAw4ALAAAAAAQABAAAARw0EkJgghgajlIMQUxjMZmeNIhiYSGEEmwOUQrIUMiKXy/EYpJkOcIajob4izBTBR2xk1hQU20lJvEQrHQAo2BsERLrfJGCIYtwdsq2ER1yZFo2O26iXzMaygaeQ4BQHMEd3Y1BGo1hYmJAQsHKgRzEQA7";
var gticon="data:image/gif;base64,R0lGODlhEAAQALMMAMz//8zM/5nM/2ZmzGZmmZmZzMyZzJmZ/8zMmZmZmQAAAGZm/////wAAAAAAAAAAACH5BAHoAwwALAAAAAAQABAAAARbkEkJgghgajlIMQUxjMZmeBIiiYR2EEmwMUQrHUMiKXy/EYpJkMcIajob4qyWNP6cO+gEqVEGrhxCSagYHRa2ka3oA28DrK3GrKmJ1GiFmoFm1cC1+UQmQ6g0EQA7";
var gicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==";
var yicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAAsAAAAUwAAAF8AAABfAAAAXwAAAF8AAABfAAAAXwAAAF8AAABfAAAAXwAAADjBwcEAwcHBAMHBwQDBwcEAAAAAUbq6uurExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP9ubm6QAAAALcTExADExMQAxMTEAAAAAFrHx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/vr6+7h4eHmQAAAAQx8fHAMfHxwAAAABXy8vL/8vLy/+UlM3/AADU/4+Pzv/Ly8v/g4PO/wwM0//Ly8v/y8vL/8vLy/+kpKS6AAAAM8vLywDLy8sAAAAAU9DQ0P/Q0ND/0NDQ/05O2f8dHd3/y8vQ/4eH1f8MDN7/0NDQ/9DQ0P/Q0ND/0NDQ/2VlZXsAAAAk0NDQAAAAAE/U1NT/1NTU/9TU1P/Fxdb/FBTq/3Bw3/+Jidz/DAzr/9TU1P/U1NT/1NTU/9TU1P/JycnkDw8PUwAAAAcAAABL2dnZ/9nZ2f/Z2dn/2dnZ/4WF5f8KCvb/ODjv/w0N9f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6ioqKYAAAAqAAAASOLi4v/i4uL/4uLi/6io6v8LC/7/QkL2/zo69/8NDf3/4uLi/+Li4v/i4uL/4uLi/+Li4v/g4OD7AAAARgAAAETx8fH/8fHx//Hx8f81Ovz/bG/5//Hx8f+fovb/GB3+//Hx8f/x8fH/8fHx//Hx8f/x8fH/7+/v+wAAAEIAAABA9vb2//b29v/29vb/HSz//7K3+f/29vb/qK35/yUz/v/29vb/9vb2//b29v/29vb/9vb2/8jIyKMAAAAkAAAAPPn5+f/5+fn/+fn5/z5U/v+osvv/+fn5/6+4+/80TP//+fn5//n5+f/5+fn/+fn5//Dw8OMXFxdBAAAABgAAADj7+/v/+/v7//v7+/+Ro/3/UG7+/7/J/P+crf3/Q2P///v7+//7+/v/+/v7//v7+/+Tk5NnAAAAGfv7+wAAAAA1/f39//39/f/9/f3/9vj9/4yk/v9Td///QWn//05z///9/f3//f39//39/f/c3NysAAAAH/39/QD9/f0AAAAAMv7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/5+fnpPj4+PgAAAAn+/v4A/v7+AAAAACn39/fi////////////////////////////////////////////////tbW1cgAAABf///8A////AP///wAAAAAVAAAAKAAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAABv///8A////AP///wD///8AAA8AAAAHAAAAAwAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAADAAAABwAAAA8AAA==";
var nicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJaWlv88PDz/PDw8/93d3f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqamr//v7+//r6+v9qamr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDz/cnJy/zw8PP88PDz/lpaW/wAAAAC5ubn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmZmZ/3t7e/9mZmb/vr6+/wAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8/wAAAAAAAAAA7+/v/wAAAAAAAAAAAAAAAFBQUP8AAAAAAAAAAEdHR/8ICwj/Aj4C/0dHR/8ICwj/5ubm/zw8PP8AAAAAAAAAAISEhP/z8/P/AAAAAAAAAAA8PDz/Ei8S/wBCAP/4+Pj/R0dH/xgoGP/4+Pj/R0dH/zw8PP/ExMT/AAAAAAAAAAAAAAAAPDw8/wAAAADx8fH/QEtA/xGAEf8NRQ3//Pz8//j4+P+urq7/+Pj4//j4+P+ZmZn/AAAAAAAAAAAAAAAAAAAAAHh4eP9JSUn/RERE/wlHCf8A4gD/AVoB//j4+P/4+Pj/UmVS//j4+P/4+Pj/pqam/wAAAAAAAAAAAAAAAAAAAABnZ2f/AAAAAAAAAAADQAP/AOMA/wDUAP8FbQX/EYAR/wDTAP8DpAP/AlIC/zw8PP8AAAAAPDw8/wAAAAAAAAAAAAAAADw8PP88PDz/R1pH/wDhAP8A4gD/AOIA/wDiAP8A4gD/AOAA/yFIIf88PDz/PT09/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PP8AoQD/AOMA/wDjAP8A4wD/AOMA/wB+AP84ODj/AAAAAAAAAAA8PDz/AAAAAAAAAAAAAAAAAAAAAGRkZP9HR0f/JUgl/wDVAP8A4gD/AOIA/wCfAP8dIR3/r6+v/zw8PP9XV1f/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQRn/AJYA/wBrAP88PDz/V1dX/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIyM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/w8AAP8PAAD+CwAA8PsAAHYDAAAwAwAAoAcAAIAHAACwBQAAwAMAAPANAADgAwAA/B8AAP7/AAD+/wAA/v8AAA==";
var fficon="data:image/gif;base64,R0lGODlhFAAUAIcAANLOxsXBu4ifs1aVunu/11umx0yRvGGFprOvs8/KwmuTq5vY5YSEZaGIVeSVS1NTeB5yqrurfoK4vmm50HKyvp+RaPjLL/C/OM2zktTLu+B4H+KBKNOWZH3K2jFWj1BMSvbZKfC4F9HBs95zGspWFK+DVn6QkGCwzFmhwIafjvauBrikUr65td2kZt14J9qicjl+qBZWifGzIdm7DaOdj+SLNt5yFXuhoRhKfAc5bfzbRvbGGZSAXKktCnuBhjhumg0rYAgiVykvWfbEJGhYOtRcF7c0B3N1hE1/r19+lURqogYaTgcQRkpHYvO0M/jUBNJUFtdKBrx1OwMINVJabPnbNubLW2dhXMpyWtloEeJkDMpJDJYpDY4zIzUvOko3SLdxK/bKCPzgU62VR4iEg8y2sMo9D6ZXJyANc1A0IttwH+eXCPbHR/7yLVZGI7hQQNByKuWNCaeLFqw0HrkYCMY1E9pnHM6eBkM3Lca2pLIDAroRCr0gC6ZuCrSuo5JoYZgYC68iEH0uE5eSi3xza21oZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUIAIYALAAAAAAUABQAAAj/AA0JHGgIgEEABBMSNCihQIcCBRQYVCiQ4QkCBBYsICCAQYWJC1s8gFAggoSNEyhUsMBGBMiCGxw42MAB44QOBDx8ALEDA0KBGTQIdQGlhIkJSFEUSKFixU8ALzbYGDHCxQsBBWDEgDEghYwZNCrWmEp1w40CBnDkwAGDgY4hFYBu0DACSg8fCgag+AEkiJAGIIYQqViEbg8jR5AgSaJkCZMmTp6A+FMRytQoUWxIceGCx5QpVKqEsHKlIhYtI7Jo2cKli5fPX8CEETMmbEUzWUbYsHHmCxomadSsYdPGTYCBAN6YUZNltxo4aqjGaSOn0M+Kc/jUqVPEzgg1NuI8N7mDp0xCAGXm6NmzR/uWLHH64GFxHTmAP10A7QnUQ1CaK/RRVFEAgxBSCCE0BPCSgAw26CBBAQEAOw==";
var fdmicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAADAUlEQVR42nWTW0zTBxSH/23IfJyJLDNGB8M1XiIu2YPZImZmi7qH2WVkdJsmyoaYuQ0Rh9uMikZl4yK2sNZeaCxdtYUi6sRLi7WlUJFaBRUK1QJtoRYo1hEetiWbfD6gUSY+fA8nOb/v5ZyfAAjPc+agka2WQbIaEmRZE2zWhKmTHeD/e0+ZNhxQuVEFHnEuCqdCj1Df+pc9tr/5Qj3ON8fG8B6x8lLBzxY/lvAkf0QnUV3o5dAxByWaS1QabC8gP26nRN+Kuu7GVHiR9k1y2vvQBCf5vqoZRY0TpdHOtwVFyLKyppGbm4vZYsV3Z4ASnX1KIDWW82tXgsOd/5Fd5uKI3kFVjY3vds4ssNRa6eyJUKpvQnjdkIa03sv2lr/YdP4fZIecyA1OVEY7BT8V83V29jR25OfTcPos3XejlB93IGy8KmVddSOZtQ9Zr5sgc6+DKmMzatNlLjZ3EImNEr7/jFB0hL5IjED/MBWGKwj7urYhqVzDh0o/Hxx+wCc/XkZ1ogW7+zauNj8e312u3+7nlj+C/959gqERQkNj9EXiyI0uhALfBtJq55BR1s7KwmGkO5tQm1txeLpp8Qa41hHkZneIrsAQgf5hBgbjDMYSDAyNUWlyIaSbkvnIthTJL5+zLMfDx3l2dHVtuNt7udYRpN7roMh5FJX3BP1PwrH4OJHYQ5RmN8LbyuWssqaw4kwy8zWv8f7+QqobWmi7eY8bdwbQeaz84NvF1p6vkNq+JDb6J/HEBNGRcX476Z4643vlIpbUJPGZ/V12+bIp692NJlyCKabCHNdSProX2dBqlvYls7Yng7HEBLH4OIrfXVOCHQoZyzSzWagX85ZJjKRezKJzSSxumoXEnURau4jUThELekTMC4pY0pFKkeIseXvUz37aqVazQrGc+cokUg1iUsxiUk6LSbkgIvWKiDc8IuY6XyFdn46+sJAZywQIvXI5jY2NaLVaSktL2VKcwzs6CWmGV/m0OJOrFRW8tI0zMbxtM6dc9VSbqwlrNC+08TGX6c1kBSwiFwAAAABJRU5ErkJggg==";
var dosicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEwD65fLxHPXy8R0F8vEdBfLxHQXy4R0F8vEdBfLhHQXy4R0F8vEdBfLxHQXy8R0F8uEdBfLxHQWy4RzkIjCYl3VUT/LyQg/zAlIP8wJSD/MCUg/zAlIf8wJSH/MCUh/zAlIf8wJSH/MCUh/zAlIf8wJSH/LyUg/3M9Iv9GJAm4Y01C/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9fLhf/RiQJuWNNQv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Xy4X/0YkCbljTUL/////////////////AAAA/wAAAP8AAAD//////wAAAP8AAAD//////////////////////18uF/9GJAm5Y01C//////8AAAD/AAAA/wAAAP//////AAAA/wAAAP//////AAAA/wAAAP8AAAD/AAAA/wAAAP9fLhf/RiQJuWNNQv//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/Xy4X/0YkCbljTUL//////wAAAP8AAAD/AAAA//////8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/18uF/9GJAm5Y01C/////////////////wAAAP8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9fLhf/RiQJuWNNQ/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Xy8X/0YkCbnYlD//0Z1J/9GdSf/RnEn/0ZxJ/9GdSf/RnEn/0ZxJ/9GcSf/RnUn/0qtl/9KlWf/Rq2b/tJx8/7FtO/9FJAi3zGUU/+V+HP/mfh3/5n4c/+Z+HP/mfh3/5n4c/+Z+Hf/mfhz/5n4d//aoWv/xljz/86hc/5qAj/+uVij+RiQIgXc+BW6vXSussV4srbFeLK2xXiytsV4srbFeLK2xXiytsV4srbFeLK2wXCmtsV0qrbBcKa2vXCascj4LbUUpCBIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf//rEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxB//+sQQ==";
var uticon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////YP///8D/////////////////////////wP///2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8g////0P/////////////////////z9+//z+C/////////////////0P///yAAAAAAAAAAAAAAAAD///8g////8P////+ryY//VpQf//P37///////h7Jf/z+FAP9KjA//q8mP///////////w////IAAAAAAAAAAA////0P////+Hsl//P4UA/4eyX///////5/Df/z+FAP8/hQD/P4UA/z+FAP+Hsl///////////9AAAAAA////YP////+30Z//P4UA/z+FAP/P4L///////8PZr/9uoz//bqM//z+FAP8/hQD/P4UA/7fRn///////////YP///8D/////VpQf/z+FAP9WlB//////////////////2+jP//P37//D2a//P4UA/1aUH/9uoz///////////8D/////2+jP/z+FAP8/hQD/n8J////////z9+//bqM//z+FAP9imy//8/fv/8PZr////////////////////////////8/gv/8/hQD/P4UA/+fw3///////n8J//z+FAP8/hQD/P4UA/4eyX///////5/Df/2KbL//P4L/////////////P4L//P4UA/2KbL////////////1aUH/8/hQD/P4UA/z+FAP+30Z///////4eyX/8/hQD/z+C/////////////2+jP/z+FAP+30Z///////8PZr/8/hQD/P4UA/z+FAP9KjA///////+fw3/8/hQD/P4UA/9voz///////////wP////9WlB//h7Jf/7fRn/9uoz//P4UA/z+FAP8/hQD/n8J///////+Hsl//P4UA/1aUH///////////wP///2D/////w9mv/z+FAP8/hQD/P4UA/z+FAP8/hQD/P4UA/5O6b//D2a//P4UA/z+FAP/D2a///////////2AAAAAA////0P////+Hsl//P4UA/z+FAP8/hQD/P4UA/z+FAP8/hQD/P4UA/z+FAP+Hsl///////////9AAAAAAAAAAAP///yD////w/////8PZr/9WlB//P4UA/z+FAP8/hQD/P4UA/1aUH//D2a////////////D///8gAAAAAAAAAAAAAAAA////IP///9D//////////9voz//P4L//z+C//9voz////////////////9D///8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////YP///8D/////////////////////////wP///2AAAAAAAAAAAAAAAAAAAAAA8A+sQcADrEGAAaxBgAGsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBgAGsQYABrEHAA6xB8A+sQQ==";
var dticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAM7SURBVDiNfZNfTFN3FMe/vbd/L22hgBRavNiytPxbivxxTFM0EUmcRN389zKC0Wjiw9zetibzVfawh2XLjI8mTRamif8ejIGgiBoT/swWqzCwRS+scKGWXihtve39/faw0aAmfp/OyTn5nD85R0UpxYbiqynns/DCJTmn2J22kvPV9pL7ocjirxo1K7r5Lb8DSOA9qTYAjd29TouJGzyyt5kXRIlxbS1dUDMq/T+xNdN6RlZ37aob2NlQ1fk+QL3JnieEWDUsywDA9FysYnPii1nRXVig73bzpY/Sb3NJE6dbzncQmIleF8SV8lgi+dnfQowxcjoc8tbDWVGMdDaHydlF3P8rApZl5AK9Rmlwlo/ta3V1AsiwdwTujq3M8sXT6Sgfk1IqADh7sA1Wiwm/XH0IRSHQatTwfFKBaExip4RljSAmqmr4sudFRkOIMRp0Xr1WwwIABVBs5sBbi3BtaAK3H7/AyOQc9myvxo3hEE51tcLM6VBi5iSjQTsOAGyhu705PL/krttmZUwGHRRK4fU4MDg+g44WF7477gUARKJxZGQFfLkFA2Mzep1G3SglM1km4PcdFeNrzr6BsWGGoZgXE5CSGchZBW31fH6Jk6+XQEHR5LJDzubQNxjwTgnLPQwABPw+AcCPD8anUVlmRv/oNL7a/SlGJ+cg5xSc+/k6HgTCMOq10KpZyDkFclaB0aC1MRsVAn7fw+aaqkQkuoKbwyGkMjK0GhZxKQXbFjO+9DaguaYSE+EFZHMKis0cvB6HL38HZ3v/OFq9tbxoNfUGhFBc9A+i6/M6rKUzuNDT8d8Yr0RcvvUEclaBtJZGJBp35AHjU8K3tQ4bCCGQcwoIobg2NIE/7wVhLzVjPSNDXEmCEApCKWKrKYTCCyfzAIXQH/r6RweOdbQYhoOzaKmxQwUKSlUIzS5iaWUdhFJUlhWili8FoUg57SWPVJufqbG794C5QH/zULvn9ePgy28i0TceAGcO72503h19CUIoDrfXv7raP/KbmmWEsSvf334H8D+kMuD3zW/yW1tr+ZFF6S2SaRlfdzbdPd21Y/8H3/gxNfX89LytweHidNrg+RN7TvNWS3Aj9i/DpXFvat/iQgAAAABJRU5ErkJggg==";
var winicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAzwAAAEAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBkgP8RcY//AxQanwAAABAAAAAAAAAA/7+/v/+/wL//AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkUHj/F634/x287/8MUGbvAAAA/8nJyf/n6Of//////8nKyf8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7z6/G6P8fnPL/HcH9/xeVv/8/X2n/wMDA////////////0NDQ/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA7OzvPw97t/x+b8v8Upvj/Gr7//w5qj/+ZoKP////////////S0tL/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/1paWv/F5e//M7T4/w2Q8v8Srv3/EJzf/yVWb//ExMT//////9DQ0P8AAAD/AAAAAAAAAAAAAAAAAAAA/8fIx/+DjpH/OGJw/+P4//9J0f//EZr0/wqW+P8NqP//CX2//3iGjv//////ysvK/wAAAP8AAAAAAAAA/8PEw///////QGl5/xq///9Eyf//4vb//0XL//8VrPr/CIz0/waa/f8Hnv//doqX//////+/wL//AAAA/wAAAP/c3dz//////0lfdf9ClvH/E4Lx/zGO8f/h8P3/M8D//xa3//8LkPT/AYb4/zpfev//////v7+//wAAAP8AAAAAAAAA/+Dh4P+0tLT/fn5+/9Ll7/9NxP//Nbv//zGm9/9Vvf3/Va7f/0mOvP9DVmf/ycrJ/wAAAP8AAAAAAAAAAAAAAAAAAAD/4+Pj//////9ra2v/n5+f/5XZ//8Znvr/AWrp/wSM7f8BHjD/pqam/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/j4+P//////7W1tf9eXl7/wdTf/0Sr+v8Dben/DZzt/wIXIu8AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+Pj4////////////3N0c/+AgID/gbfq/xmJ7/8Vm8//AxIXrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4OHg///////k5OT/tLS0/yQkJN+fq7z/S630/xBkgP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/c3dz/w8TD/wAAAP8AAAAAAAAAUFVVVe9CUl7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAQAAAAjwAAAAAAAAAAnn8AAIQ/AACAHwAAgA8AAIAHAADAAwAAgAEAAAAAAAAAAAAAgAEAAMADAADgAwAA8AMAAPgDAAD8IwAA/nP//w==";
var vlcicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFy0ZABYxf8AWMX/AFjF/wBYxf8AWMX/AFjF/wBYxf8AWMX/AFjF/wBYxf8AWMX/AFjF/whmvmYAAAAAAAAAADa5+4oatf//GrX//xqs//8aoP//GqD//xqe//8an///GqP//xqj//8arv//Grr//xq9//8zxv+PAAAAAAAAAABzv+8yAJD4/wCN+P8Ad+//AGrn/wBm6P8AZer/AGvu/wBz8P8Adu7/AHvx/wCS+v8Amvv/fc72OAAAAAAAAAAAg7/mAxOM8dsAZ97/AErB/wBa2f8AYuP/AWbn/wJw7P8Ace//AF7h/wBEu/8AYNb/D4nu4YjG6QUAAAAAAAAAAAAAAAAxk+qSAFjV/w5Msv9ikcn/nbTL/7O+yv+0wcz/m7TK/16Mw/8ORaf/AD+7/yNy0ZoAAAAAAAAAAAAAAAAAAAAAYKbiPAJj5fNge6L+z8Oz/9TNxP/X0Mb/2NHI/9DIv//Bt6b/X3CQ/gBDxfM4eLxCAAAAAAAAAAAAAAAAAAAAAAAAAABTnd0Rgo2TgcS6rv/OzMf/xsnN/8fLzv/IxsH/uK+i/3+GioUqa68RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJaOhi5SgLb/IH7j/wx17v8MgvL/HoPo/0t0r/+Vj4czAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmWZYDAE652wBv5/8AcPH/AH/2/wB07v8ARbTgKFuYBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhPq5QAa+T/AHDy/wB/+P8Aauj/B0enmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxYZxGd6DK/6jB2v+oxNn/c5fC/zBdmU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5GJDMS7r+3l3dP/4tnP/72ypvCXkooQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyq6Gu4dzU/93Xzv+vppu1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATHSiYC2L6f8rjOr/S3KiZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFWpBwAcOf/AHLr/w1QoyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGfQfARl0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAFhq4ABAACAAVTQgAEAX8ADcm/AA3Rh4AdyYfAPa2vwD2xj+B9jb/gfZXj4H3J0/D8AAPw/QkD8PwAB/n8ABA==";
var opicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAFgAAABoAAAAWAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAEBGAABpgAkDm5kJA5uZAABpgAAAOk0AAAAwAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANykIA5+zDgbM/xAG0v8LBLv/CwS7/w4GzP8OBsz/CAOeswAAI0AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAXRoJBLHZDAXD/wIBmP8EAKX/BgCzzwYAs78EAKf/AgGW/wwFwf8KBLXyAAA7TQAAABMAAAAAAAAAAAAAAAAIA7OzCQS8/wAAmP8EAKj/BgCleQAAAAAAAAAABgCzcAQApv8AAJH/CAOy/wgDqtkAAAAtAAAAAAAAAAAAAKkwCwTI/wAApf8AAKP/BgCy/wAAABAAAAAAAAAAAAAAAAAGALH/AACZ/wAAmP8MBcX/AABxgAAAAAoAAAAABQLEgAcDx/8AALX/AQCz/wYAq9kAAAANAAAAAAAAAAAAAAAABgCzzwEAp/8AAKT/AwGr/wcDrL8AAAAWAAAAAAcD2b8AAM7/AADL/wIAw/8GAKjMAAAADQAAAAAAAAAAAAAAAAYAs78CALX/AAC0/wAAsv8JA8TmAAAAGgAAAAAJA+y/AADp/wAA5f8CANf/BgCozAAAAA0AAAAAAAAAAAAAAAAGALO/AgDF/wAAyf8AAMb/BQLN/wAAABoAAAAACAf9vwUF/v8EBP3/BALq/wYAqMwAAAANAAAAAAAAAAAAAAAABgCzvwIA2f8AAOP/AADg/wEB3v8AAAATAAAAABUV/58VFf//ExP//w4N7P8GAKjMAAAAEwAAAAAAAAAAAAAAAAYAs88FA+v/AwP9/wIC+/8BAenMAAAABgAAAAAlJf9QJSX//yMj//8fH/r/BgCz/wAAACMAAAAAAAAAAAAAAAAGALP/FBT//xIS//8QEP//DAzreQAAAAAAAAAAAAAAADQ0/98zM///MTH//w4Jwf8EAHBmAAAAEwAAAAAGALNADAfB/yMj//8iIv//Hx//7xgY/xAAAAAAAAAAAAAAAAA/P/8wQkL/70FB//8uLOf/BgCx8gUAm6YGAKScBgCz7yoo7P8zM///MTH//y0t/2AAAAAAAAAAAAAAAAAAAAAAAAAAAE1N/zBQUP/fT0///0VE9v8qJ9n/KSbZ/0A/9v9FRf//Q0P/7z09/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWVn/EFlZ/2BYWP+vV1f/v1ZW/79UVP+vUVH/cE5O/xAAAAAAAAAAAAAAAAAAAAAA/B+sQfAHrEHgA6xBwAGsQcGBrEGBwKxBgcCsQYHArEGBwKxBgcCsQYHArEGBwaxBwIGsQcADrEHgB6xB8A+sQQ==";
var faricon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAzQEBAfkBAQKZAQECyQEBAskBAQLJAQECyQEBAskBAQLJAQECyQEBAskBAQLJAQECyQEBAskBAQLJAQECyAAAA/3V1Gf91dRv/AAAA/3NzIP9yciL/AAAA/3BwJv9vbyj/AAAA/25uK/9tbSz/AAAA/21tLf9tbS3/QEBAssDAwP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/0BAQLLw8CT/7u4o/+zsLf/q6jL/6Og2/+bmO//k5D//4uJD/+HhSP/f30v/3t5P/9zcUv/b21X/2tpY/9nZWv9AQECy8vIf/9IGBv/MBgb/xgcH/8AICP+6CAj/tAkJ/+TkP/+qCwv/pAsL/6AMDP+bDAz/lw0N/5MNDf/a2lj/QEBAsvT0G//YBQX/0gYG/8wGBv/GBwf/wAgI/7oICP/m5jv/rwoK/6oLC/+kCwv/oAwM/5sMDP+XDQ3/29tV/0BAQLL19Rb/3QQE/9gFBf/SBgb/zAYG/8YHB//ACAj/6Og2/7QJCf+vCgr/qgsL/6QLC/+gDAz/mwwM/9zcUv9AQECy9/cS/+MEBP/09Bv/8vIf//DwJP/u7ij/xgcH/+rqMv+6CAj/tAkJ/68KCv+qCwv/pAsL/6AMDP/e3k//QEBAsvn5D//oAwP/4wQE/90EBP/YBQX/0gYG/8wGBv/s7C3/wAgI/7oICP+0CQn/rwoK/6oLC/+kCwv/399L/0BAQLL6+gv/7AIC//f3Ev/19Rb/9PQb//LyH//SBgb/7u4o/8YHB//q6jL/6Og2/+bmO//k5D//qgsL/+HhSP9AQECy/PwI//ECAv/sAgL/6AMD/+MEBP/dBAT/2AUF//DwJP/MBgb/xgcH/8AICP+6CAj/tAkJ/68KCv/i4kP/QEBAsv39Bf/1AQH/+voL//n5D//39xL/9fUW/90EBP/y8h//0gYG/+7uKP/s7C3/6uoy/+joNv+0CQn/5OQ//0BAQLL+/gL/+QEB//UBAf/xAgL/7AIC/+gDA//jBAT/9PQb/9gFBf/SBgb/zAYG/8YHB//ACAj/uggI/+bmO/9AQECy//8A//wAAP8G/v7/Cv7+/w79/f8T/f3/6AMD//X1Fv/dBAT/J/r6/y35+f8z+fn/Ofj4/8AICP/o6Db/QEBApv//AP//AAD//AAA//kBAf/1AQH/8QIC/+wCAv/39xL/4wQE/90EBP/YBQX/0gYG/8wGBv/GBwf/6uoy/0BAQH7//wD///8A////AP/+/gL//f0F//z8CP/6+gv/+fkP//f3Ev/19Rb/9PQb//LyH//w8CT/7u4o/+zsLf9AQEAzAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==";
var domicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAB3RJTUUH2wwDCBcOj0D8igAAAflJREFUeJx90DuIVGcYxvHfd86Z2eOM626ExULJohJBwcUkRkFQsZGEYMTOLhgIGLQQVDCxNpciBIJaKCqohVh5wVKxCBhQsqAokkVQsDCI6F5mnMs550sxSdhC8m/fh5f/8wR8tNLosFiJlRiNNNVSkcB0W7+QpBASk1MC7v5i/QZmaTDk0R/+mpYkqsq2CRbTos+w7ftkmG0rZvVaHj30oufURc9eSKj48gsTa6xdYmRYRr+UIUmkNMbsOeTVc7f3WLWUDrl9Vxw85/aPtn4i9gUyxEjm7n0fjLiwxaoxndfSRPnWiZ1iNDll9QpjiyFBVdG0+3tfj1s3rtdWT6VBPdV57eQupy+7NUlTWUkMiEYXahfKUgj+Ix3S61mQG6oRGShB8GZOI5OmysGikUq5RB7Mzer2CP8qhUBh64Splk5XVlOUypqiIX9u8rGP11o6JvaEIBmspOXsUb/+6bsb+ol6U21U/X2/X/LZGR9utGm1UMxXSvRn7FzntydO3TO+SNGR1V1YYWba4eOKGYe/ktfmddD18zcM2/uDsw/UM73C1SPW3PTTZd+e915Dqyvg1jGb1yvmBGKUN0n/+dOdM7TIgeNOXFNUDC77d1i2XEaWy3LzyXIKn24X33r4VLcvw53H2pRtaeKd9Aufb3L9jpcz7w78H38DmNm0vZpYVTMAAAAASUVORK5CYII=";
var ieicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChZiRN0pM+3dKVQfPMj0HQpWgjcIZRGyNsPxZFaD0WaWc/FWlnQhZgYkQZO1Q5FyFdRBkVa1EbCoBVKwMAAAAB3KJM2ZVeHJwAAAAAAAAAALJ1K8CNViDQYzkW41g0FOhVMxXnRyoT4UQpEdZbQhq3aFAeXllAGh5gSiAMSUkkBOukLOCKVh1wZj0UK2s+FJOAShrtwnwx/N6UO//qqEb/8LRT/9+yY/6nhEz5Vjod7UMpEtdoUB6CWD8ZH2ZNGgrppzLemmEf11YwEOG1cyb855g2//CbOP/vlzb/75o2//KnPP/3vVH/+tR2/+rKif5wVC/yQCYR1mxOHGJgQBoa2Zw7z92YLP25eSX58qY2/+ubMf/nky7/55Av/7JsJf64cCb65pUw//SxQf/71Gv/9NiT/mBBI+VbOhWzZEEXOr2DNV72tTz/86wz/+qgLv/llir/2ooo/3lHGOkAAAAAAAAAALVrJGPUhjH/9Kg7//zRbf/Tr3DnXz0WwmtCF0ZrURsK2J4yvvS0Nf/ooCr/4pUl/6NlHf1CJA/vTy4R11EuEc9lORXZgEkZ54FMGuqIVB7rhVss5l02FMVvQheBAAAAAIJiI0b0vD3+7ast/+WdJv/Qfyv/0H8r/9B/K//Qfyv/0H8r/9B/K//Qfyv/0H8r/9B/K/9MLBTdaDwWiH9XISAAAAAA1KhBdvTEQv/srC3/5Z8m/96WJ//glSj/35Iq/NqNKe/nky3/6ZUx//CaOf/toUH/VC8U2loyFF2EXScWtpFOuwAAAADhvEuv9cZB/7aAI/lfOhPsAAAAAAAAAACDURikv4Mt/+iWLf/umzT/zok0/FozEr1TMRM/AAAAALycVazpyYXmAAAAAOvMVIPfrTX5ZEMY7UAmEN5XNhPYtHYg+uaYKf/nlyz/8aQ4/55lJPJkOxRoXjkTEwAAAAAAAAAAy7Fqj+LDe+PYuFc/7Mxit+GxOf61fyL8zY4j/uWgKP/knCf/6qAt/+mlOP50RhWoZDwTMAAAAAAAAAAAAAAAAJh3NTjh0Iqz9duK8PLViNLm02T79tFG//G3Mf/trCr/7q0v/+ilNf6SXRypkWIhcKV9QDCaczUQAAAAAAAAAAAAAAAAjWsqMNG5bq/w2oTS+umA//vpav/0zET/+M9K/9uuRO+Zczy+g1wnSQAAAADcsFWwoXk8TAAAAAAAAAAAAAAAAAAAAAB6VBoBhWAiMJZxL1KZayZ1lGEaeb2LML7pwFW45Llg07yaUqO3jTtV06dPsZpvNT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtoMtD7SKRj/htli1269ZmqBzNFcAAAAAAACsQTAArEEAAKxBAACsQQAArEEBgKxBAACsQYAArEFAAKxBIYCsQZAArEHAAaxBwACsQeAErEHwAKxB/8GsQQ==";
var drwebicon="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AvwD/AP8A/wD/AP8A/wD/AP8A/wAAAP8AAAD/AP8A/wD/AP8A/wD/AL8A/wB/AP8A/wD/AP8A/wD/AP8A/wD/AL8A/wA/AP8A/wD/AP8A/wD/AP8AAAD/AAAA/wD/AP8A/wD/AL8A/wAAAP8A/wD/AP8A/wC/P/8/vz//AP8A/wD/AP8AAAD/AL8A/wD/AP8A/wD/AAAA/wAAAP8A/wD/AP8A/wA/AP8AAAD/AP8A/wA/AP8AAAD/AAAA/wAAAP8AvwD/AH8A/wAAAP8AvwD/AP8A/wAAAP8AAAD/AP8A/wC/AP8APwD/AH8A/wA/AP8AAAD/f39//39/f/8AAAD/AAAA/wC/AP8AAAD/AL8A/wD/AP8AAAD/AAAA/wD/AP8AfwD/AP8A/wD/AP8AAAD/AAAA/39/f/9/f3//Pz8//wAAAP8AfwD/AP8A/wC/AP8AvwD/AAAA/wAAAP8AfwD/AD8A/wA/AP8AvwD/AD8A/39/f/+/////v7+//7+/v/8AAAD/AL8A/wB/AP8APwD/AH8A/wAAAP8AAAD/AP8A/wC/AP8A/wD/AP8A/wD/AP8//z//Pz8//z8/P/8/vz//AP8A/wD/AP8A/wD/AP8A/wD/AP8AAAD/AAAA/wD/AP8APwD/AAAA/wA/AP8A/wD/AAAA/wC/AP8AvwD/AD8A/wB/AP8AfwD/AAAA/wAAAP8A/wD/AAAA/wAAAP8A/wD/AH8A/wD/AP8A/wD/AD8A/wB/AP8AAAD/AAAA/wA/AP8AfwD/AL8A/wD/AP8AvwD/AP8A/wAAAP8AAAD/AP8A/wD/AP8A/wD/AD8A/wB/AP8A/wD/AP8A/wD/AP8A/wD/AL8A/wAAAP8A/wD/AP8A/wD/AP8AAAD/AAAA/wD/AP8A/wD/AP8A/wB/AP8AvwD/AP8A/wD/AP8A/wD/AP8A/wC/AP8AfwD/AL8A/wD/AP8A/wD/AAAA/wAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==";

var mnusav="Ярлык "+folderpath;
(function LinkMasterMenu(){

 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-bookmarklink");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "LinkMasterMenu";
    menu.setAttribute("label", "Link Master>");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", lmicon);
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator );

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

      var lst = [
      
      {
          label:"Открыть ссылку в VLC",
          command:command18,
          image:vlcicon
        },
      
        { 
          label:"Копировать текст ссылки",
          command:command1,
          image:txticon
        },
        {
          label:"Копировать HTML код",
          command:command2,
          image:htmicon
        },
        {
          label:"Копировать BB код",
          command:command3,
          image:bbicon
        },
        {
          label:mnusav,
          command:command4,
          image:lnkicon
        },
         {
          label:"separator"
        },
        
        {
          label:"Искать в Google",
          command:command6,
          image:gicon
        },
        { label:"Искать в Nigma", 
        command:command5, 
        image:nicon },
        {
          label:"Искать в Yandex",
          command:command7,
          image:yicon
        },
         {
          label:"separator"
        },
       
        
         {
          label:"separator"
        },
        {
          label:"Проверить Dr.Web",
          command:command10,
          image:drwebicon          
        },
        {
          label:"Открыть в DOM ",
          command:command11,
          image:domicon
        },
         {
          label:"separator"
        },
        {
          label:"Открыть в Firefox",
          command:command12,
          image:fficon
        },
        {
          label:"Открыть в IE",
          command:command13,
          image:ieicon
        },
        {
          label:"Открыть в Opera",
          command:command14,
          image:opicon
        },
         {
          label:"separator"
        },
        
        
        {
          label:"Открыть в µTorrent",
          command:command17,
          image:uticon
        },
        
       
         {
          label:"separator"
        },
       
        {
          label:"Ping домена в ссылке",
          command:command21,
          image:dosicon
        },
        {
          label:"Trace домена в ссылке",
          command:command22,
          image:dosicon
        }
        ];
    
for(var i = 0, m; m = lst[i]; i++){
    if (m.label=="separator"){
     var menuItem = document.createElementNS(kXULNS, "menuseparator");
         menuItem.id = "context-Demo-Menu-" + m.label.toString();
        menuPopup.appendChild(menuItem);

    }
       else{
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("class", "menuitem-iconic");
        menuItem.setAttribute("image", m.image);
        menuItem.setAttribute("type", "m.radio");
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Demo-Menu-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        }
        
    }
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

 function setMenuDisplay(aEvent) {
                 if (gContextMenu.onLink)
                 {
                 document.getElementById("LinkMasterMenu").hidden = false;
                 }
                 else
                 document.getElementById("LinkMasterMenu").hidden = true;
                   }  

//-------------------------------------------------------------------------
//-----------------------------------------------------
function command1(){
var urltxt=gContextMenu.linkText();
const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].
getService(Components.interfaces.nsIClipboardHelper);
gClipboardHelper.copyString(urltxt)

}
//------------------------------------------------------
//-----------------------------------------------------
function command2(){
var urllink=gContextMenu.linkURL;
var urltxt=gContextMenu.linkText();
var txthtm='<a href="'+urllink+'">'+urltxt+'</a>'
const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].
getService(Components.interfaces.nsIClipboardHelper);
gClipboardHelper.copyString(txthtm)

}
//------------------------------------------------------
//-----------------------------------------------------
function command3(){
var urllink=gContextMenu.linkURL;
var urltxt=gContextMenu.linkText();
var txtbb='[url='+urllink+']'+urltxt+'[/url]'
const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].
getService(Components.interfaces.nsIClipboardHelper);
gClipboardHelper.copyString(txtbb)

}
//------------------------------------------------------
//-----------------------------------------------------
function command4(){
var file = Components.classes["@mozilla.org/file/local;1"].
           createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(folderpath);

if( !file.exists() || !file.isDirectory() ) {   file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0777);}

var savetodir=folderpath+"\\"; 

var urllink=gContextMenu.linkURL;
var urltxt=gContextMenu.linkText();
var out= urltxt.replace(/\"/g, "_");
var out= out.replace(/\+/g, "_");
var out= out.replace(/\%20/g, "_");
var out= out.replace(/\=/g, "_");
var out= out.replace(/\[/g, "_");
var out= out.replace(/\]/g, "_");
var out= out.replace(/\:/g, "_");
var out= out.replace(/\;/g, "_");
var out= out.replace(/\?/g, "_");
var out= out.replace(/\</g, "_");
var out= out.replace(/\>/g, "_");
var out= out.replace(/\*/g, "_");
var out= out.replace(/\|/g, "_");
var out= out.replace(/\«/g, "_");
var out= out.replace(/\//g, "_");
var out= out.replace(/\%/g, "_");
var out= out.replace(/\@/g, "_");
var out= out.replace(/\&/g, "_");
var out= out.replace(/\{/g, "_");
var out= out.replace(/\}/g, "_");
var out= out.replace(/\^/g, "_");
var out= out.replace(/\$/g, "_");
var out= out.replace(/\s/g, "_");
var out= out.replace(/\_+/g, "_");
var out= out.slice(0,128)
var filename=savetodir+out+'.url';
var data="[InternetShortcut]\r\nURL="+urllink+"\r\n";
var file = Components.classes["@mozilla.org/file/local;1"].
           createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(filename);
Components.utils.import("resource://gre/modules/NetUtil.jsm");
Components.utils.import("resource://gre/modules/FileUtils.jsm");
var ostream = FileUtils.openSafeFileOutputStream(file);
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8";
var istream = converter.convertToInputStream(data);
NetUtil.asyncCopy(istream, ostream, function(status) {
  if (!Components.isSuccessCode(status)) {
    return;
  }
});
     
custombuttons.alertSlide("Ярлык сохранён в:",filename)

}
//------------------------------------------------------
//-----------------------------------------------------
function command5(){
var urltxt=gContextMenu.linkText();
var nigma1='http://www.nigma.ru/index.php?s=';
urltxt =encodeURIComponent(urltxt);
var srchurl=nigma1+'"'+urltxt+'"';
getBrowser (). selectedTab = getBrowser (). addTab (srchurl)
}
//------------------------------------------------------
//-----------------------------------------------------
function command6(){
var urltxt=gContextMenu.linkText();
var google1='http://www.google.com/search?sclient=psy-ab&hl=en&site=&source=hp&q="';
var google2='"&btnG=Search';
urltxt =encodeURIComponent(urltxt);
var srchurl=google1+urltxt+google2;
getBrowser (). selectedTab = getBrowser (). addTab (srchurl)
}
//------------------------------------------------------
//-----------------------------------------------------
function command7(){
var urltxt=gContextMenu.linkText();
var yandex1='http://yandex.ru/yandsearch?text="';
var yandex2='"&lr=213';
urltxt =encodeURIComponent(urltxt);
var srchurl=yandex1+urltxt+yandex2;
getBrowser (). selectedTab = getBrowser (). addTab (srchurl)
}
//------------------------------------------------------
//-----------------------------------------------------
function command8(){
var urltxt=gContextMenu.linkText();
var gtr1='http://translate.google.com/?sl=auto&tl=ru&js=n&prev=_t&hl=en&ie=UTF-8&layout=2&eotf=1&text="';
var gtr2='"&fil';
urltxt =encodeURIComponent(urltxt);
var trurl=gtr1+urltxt+gtr2;
var sizex = screen.width/1.2;
var sizey = screen.height/1.2;
var wnd = window.open(trurl, this.name, 'resizable=yes,scrollbars=yes,width=' + sizex + ',height=' +sizey);
if (wnd.focus) wnd.focus();

}
//------------------------------------------------------
//-----------------------------------------------------
function command9(){
var urllink= encodeURIComponent(gContextMenu.linkURL);
var urltr="http://translate.google.com/?sl=auto&tl=ru&js=n&prev=_t&hl=en&ie=UTF-8&layout=2&eotf=1&text="+urllink;
getBrowser (). selectedTab = getBrowser (). addTab (urltr);
}
//------------------------------------------------------
//-----------------------------------------------------
function command10(){
var urllink=gContextMenu.linkURL
var chkurl="http://online.us.drweb.com/result?firefoxplugin=1&url="+urllink;
var sizex = screen.width/1.5;
var sizey = screen.height/1.5;
var wnd = window.open(chkurl, this.name, 'resizable=yes,scrollbars=yes,width=' + sizex + ',height=' +sizey);
if (wnd.focus) wnd.focus(); 

}
//------------------------------------------------------
//-----------------------------------------------------
function command11(){
try{inspectDOMNode(gContextMenu.target)}
         catch(e){
         if (window.confirm('DOM Inspector не установлен!\nПерейти на страницу загрузки?')==true){
getBrowser (). selectedTab = getBrowser (). addTab ("https://addons.mozilla.org/firefox/addon/6622");
}
         }
       


}
//------------------------------------------------------
//-----------------------------------------------------
function command12(){
var urllink=gContextMenu.linkURL;
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(profilepath);
if( !file.exists()|| !file.isDirectory() ) {
if (window.confirm('Папка профиля:'+profilepath+' не найдена!\nОткрыть адрес в новой вкладке?\n\n\nЧтобы указать правильный путь до папки с профилем\n1 ПКМ по кнопке-Редактировать-Вкладка Инициализация\n2 найти в коде строку var profilepath= и в ней изменить путь до профиля.')==true){
getBrowser (). selectedTab = getBrowser (). addTab (urllink);
} 
}
else{
function startProces(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("Файл не найден", path); 
};
startProces(firefox,["-no-remote","-profile",profilepath,urllink]);
};
}
//------------------------------------------------------
//-----------------------------------------------------
function command13(){
var urllink=gContextMenu.linkURL;
var pleerpath="C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE" 
startProcess(pleerpath,[urllink]);

        function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("Internet Explorer не найден!8-O"); 
};

}
//------------------------------------------------------
//-----------------------------------------------------
function command14(){
var urllink=gContextMenu.linkURL;
var operapath="C:\\Program Files\\Opera\\opera.exe" 

        startProcess(operapath,[urllink]);

        function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("Упс!","Браузер Opera не установлен..\n (и это правильно;)!Используйте программы с открытым кодом!)"); 
};

}
//------------------------------------------------------
//-----------------------------------------------------
function command15(){
var urllink=gContextMenu.linkURL;
var fdmpath="C:\\Program Files\\Free Download Manager\\fdm.exe"

var file = Components.classes["@mozilla.org/file/local;1"].
           createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(fdmpath);

if( !file.exists() ) {
if (window.confirm('Free Download Manager не установлен!\nПерейти на страницу загрузки?')==true){
getBrowser (). selectedTab = getBrowser (). addTab ("http://www.freedownloadmanager.org/download.htm");
} 

}
else{
function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("файл не найден", path); 
};
        startProcess(fdmpath,[urllink]);
};

}
//------------------------------------------------------
//-----------------------------------------------------
function command16(){
var urllink=gContextMenu.linkURL+"/";
var farpath="C:\\Program Files\\FAR\\Far.exe"; 
var file = Components.classes["@mozilla.org/file/local;1"].
           createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(farpath);

if( !file.exists() ) {
if (window.confirm('Far Manager не установлен!\nПерейти на страницу загрузки?')==true){
getBrowser (). selectedTab = getBrowser (). addTab ("http://www.farmanager.com/download.php?l=ru");
} 

}
else{
function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("файл не найден", path); 
};
        startProcess(farpath,[urllink]);
};

}
//------------------------------------------------------
//-----------------------------------------------------
function command17(){
var urllink=gContextMenu.linkURL;
var utpath="C:\\Program Files\\uTorrent\\utorrent.exe"; 
var file = Components.classes["@mozilla.org/file/local;1"].
           createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(utpath);

if( !file.exists() ) {
if (window.confirm('µTorrent не установлен!\nПерейти на страницу загрузки?')==true){
getBrowser (). selectedTab = getBrowser (). addTab ("http://www.utorrent.com/downloads");
} 

}
else{
function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("файл не найден", path); 
};
        startProcess(utpath,[urllink]);
};

}
//------------------------------------------------------
//-----------------------------------------------------
function command18(){
var urllink=gContextMenu.linkURL;
var pleerpath="C:\\Program Files\\VideoLAN\\VLC\\vlc.exe"; 
var file = Components.classes["@mozilla.org/file/local;1"].
           createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(pleerpath);

if( !file.exists() ) {
if (window.confirm('VLC плеер не установлен!\nПерейти на страницу загрузки?')==true){
getBrowser (). selectedTab = getBrowser (). addTab ("http://www.videolan.org/");
} 

}
else{
function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("файл не найден", path); 
};
        startProcess(pleerpath,[urllink]);
};

}
//------------------------------------------------------
//-----------------------------------------------------
function command19(){
var urllink=gContextMenu.linkURL;
var pleerpath="C:\\Program Files\\Winamp\\winamp.exe" 
var file = Components.classes["@mozilla.org/file/local;1"].
           createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(pleerpath);

if( !file.exists() ) {
if (window.confirm('Winamp не установлен!\nПерейти на страницу загрузки?')==true){
getBrowser (). selectedTab = getBrowser (). addTab ("http://www.winamp.com/media-player/ru");
} 

}
else{
function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("файл не найден", path); 
};
        startProcess(pleerpath,[urllink]);
};

}
//------------------------------------------------------
//-----------------------------------------------------
function command20(){
var urllink=gContextMenu.linkURL;
var chkpoint='/';
var arrayOfStrings = urllink.split(chkpoint);
var site=arrayOfStrings[2];
var sizex = screen.width/1.2;
var sizey = screen.height/1.2;
var chkurl="http://www.domaintools.com/go/?service=whois&q="+site;
var wnd = window.open(chkurl, this.name, 'resizable=yes,scrollbars=yes,width=' + sizex + ',height=' +sizey);
if (wnd.focus) wnd.focus(); 
}
//------------------------------------------------------
//-----------------------------------------------------
function command21(){
var urllink=gContextMenu.linkURL
var tracepath="C:\\Windows\\system32\\cmd.exe" 
var chkpoint='/';
var arrayOfStrings = urllink.split(chkpoint);
var site=arrayOfStrings[2];
        startProcess(tracepath,["/k","echo","------------------------------","&&","echo","LinkMaster","Button","by","(c)okkamas_knife","&&","echo","------------------------------","&&","ping.exe","-t",site]);

        function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("URL не найден", path); 
};


}
//------------------------------------------------------
//-----------------------------------------------------
function command22(){
var urllink=gContextMenu.linkURL
var tracepath="C:\\Windows\\system32\\cmd.exe" 
var chkpoint='/';
var arrayOfStrings = urllink.split(chkpoint);
var site=arrayOfStrings[2];
        startProcess(tracepath,["/k","echo","------------------------------","&&","echo","LinkMaster","Button","by","(c)okkamas_knife","&&","echo","------------------------------","&&","tracert.exe",site]);

        function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("URL не найден", path); 
};

}
//------------------------------------------------------
//-------------------------------------------------------------------------    
    

})();
this.onclick = function(event) {
    if(event.button == 1) {
getBrowser (). addTab ("http://forum.mozilla-russia.org/viewtopic.php?pid=533522#p533522");
    };
   

};

voqabuhe пишет

она просто практически перестала работать

В 38.0.5 cyberfox работала удалил случайно
laugh2.gif а теперь взять негде.

18-07-2015 15:57:00

villa7 пишет

villa7

ай спасибо! ай молдца!:beer:

Подскажите по кнопке CB code 2 link, делала активными ссылки custombutton://... Не могу найти, похоже удалили. Раньше была в по адресу тык

Нашёл кнопку в другом браузере :)

Как добавить в контекстное меню "Копировать текст как BBCode"?
В поиске, только нашел "Копировать ссылку как BBCode"  :/

amid525 пишет

Как добавить в контекстное меню "Копировать текст как BBCode"?
В поиске, только нашел "Копировать ссылку как BBCode"  :/

В меню не видел, а вот просто кнопка  есть Quote+ Bookmarklets and buttons for Firefox and old Opera

amid525
В инициализацию:

Выделить код

Код:

// ПКМ по пункту контекстного меню "Копировать" - копирует выделенный текст как цитату
document.getElementById('context-copy').setAttribute("oncontextmenu", "event.preventDefault(); event.stopPropagation(); document.getElementById('" + this.id + "').copyTextAsBBcode(); hidePopup();");

// Получить выделенный текст из страницы или из буфера обмена, если нет текста получить 'false' ..........
function getSelect() {
  // выделенный текст из страницы ....
  var selection = document.commandDispatcher.focusedWindow.getSelection().toString();

  // выделенный текст из текстового поля ....
  if ( selection == '' ) {
    var theBox = document.commandDispatcher.focusedElement;
    if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { 
      var startPos = theBox.selectionStart;
      var endPos = theBox.selectionEnd;
      var selection = theBox.value.substring(startPos, endPos);  
    }
  };

  // убираем пробелы с обоих концов текста ....
  if ( selection !== '' ) var selection = selection.toString().replace(/^\s+|\s+$/g,"");  

  return ( selection == '') ? false : selection;
};

this.copyTextAsBBcode = function() {
  gClipboard.write('[quote]'+ getSelect() +'[/quote]')
};

(частично потырено у bunda1, за что ему спасибо :))

turbot
ни чего не появилось в конт меню :(

29-07-2015 17:42:33

появилось в

voqabuhe пишет

  В меню не видел, а вот просто кнопка  есть Quote+ Bookmarklets and buttons for Firefox and old Opera

Это не то. Тут просто цитирование.

amid525 пишет

ни чего не появилось в конт меню :(

ПКМ по пункту контекстного меню "Копировать" - копирует выделенный текст как цитату

29-07-2015 17:55:02

amid525 пишет

Это не то. Тут просто цитирование.

А как вам еще надо текст копировать? Как ссылку? Как картинку?

Или меня не так поняли, или я не так попросил. Мне не нужно копировать цитированием. Мне нужно копировать выделенный текст с превращением в ссылку!

amid525
Ссылку на что? На конкретное место на странице, с которого копировали? Не выйдет. Универсально, по крайней мере. На страницу, пожалуйста:

Выделить код

Код:

// ПКМ по пункту контекстного меню "Копировать" - копирует выделенный текст как ссылку на текущую страницу
document.getElementById('context-copy').setAttribute("oncontextmenu", "event.preventDefault(); event.stopPropagation(); document.getElementById('" + this.id + "').copyTextAsBBcode(); hidePopup();");

// Получить выделенный текст из страницы или из буфера обмена, если нет текста получить 'false' ..........
function getSelect() {
  // выделенный текст из страницы ....
  var selection = document.commandDispatcher.focusedWindow.getSelection().toString();

  // выделенный текст из текстового поля ....
  if ( selection == '' ) {
    var theBox = document.commandDispatcher.focusedElement;
    if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { 
      var startPos = theBox.selectionStart;
      var endPos = theBox.selectionEnd;
      var selection = theBox.value.substring(startPos, endPos);  
    }
  };

  // убираем пробелы с обоих концов текста ....
  if ( selection !== '' ) var selection = selection.toString().replace(/^\s+|\s+$/g,"");  

  return ( selection == '') ? false : selection;
};

this.copyTextAsBBcode = function() {
  gClipboard.write('[url=' + content.location.href + ']'+ getSelect() + '[/url]')
};

turbot
так. Но, нельзя отобразить в конт меню эту команду? Т.к не один пользуюсь пк.

amid525
Вставлять в инициализацию отдельной кнопки, не к другим:

Выделить код

Код:

// ЛКМ по пункту контекстного меню "Copy Text as BBCode Link/Quote" - копирует выделенный текст как ссылку на текущую страницу
// ПКМ по пункту контекстного меню "Copy Text as BBCode Link/Quote" - копирует выделенный текст как цитату
if ( document.getElementById("context-copy-bb") ) return;
var menuItem = document.createElement("menuitem"); 

menuItem.id = "context-copy-bb";
menuItem.setAttribute("label", "Copy Text as BBCode Link/Quote");
menuItem.setAttribute("class", "menuitem-iconic");
menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAABkSURBVHjaYvj//z8DNTAD1Q2qrGk4XFnT8B8LLq6saWDAhbEZhM2QBihdQqlBDEiGUWRQaWVNQxoUU+wivGFHikF4w45Sg+BhR6lBcExTgw5TyyBceBgbdBiPQUdoV4xQigEDAOLOHqeJF4QiAAAAAElFTkSuQmCC");
menuItem.setAttribute("oncommand", "document.getElementById('" + this.id + "').copyTextAsBBcodeUrl();");
menuItem.setAttribute("oncontextmenu", "event.preventDefault(); event.stopPropagation(); document.getElementById('" + this.id + "').copyTextAsBBcodeQuote(); hidePopup();");  

document.getElementById("context-copy").parentNode.insertBefore( menuItem, document.getElementById("context-copy") );


document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
  menuItem.hidden = !gContextMenu.isTextSelected;
}, false);

const alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);

// Получить выделенный текст из страницы или из буфера обмена, если нет текста получить 'false' ..........
function getSelect() {
  // выделенный текст из страницы ....
  var selection = document.commandDispatcher.focusedWindow.getSelection().toString();

  // выделенный текст из текстового поля ....
  if ( selection == '' ) {
    var theBox = document.commandDispatcher.focusedElement;
    if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { 
      var startPos = theBox.selectionStart;
      var endPos = theBox.selectionEnd;
      var selection = theBox.value.substring(startPos, endPos);  
    }
  };

  // убираем пробелы с обоих концов текста ....
  if ( selection !== '' ) var selection = selection.toString().replace(/^\s+|\s+$/g,"");  

  return ( selection == '') ? false : selection;
};
this.copyTextAsBBcodeQuote = function() {
  gClipboard.write('[quote]'+ getSelect() +'[/quote]');
  var notification = 'Выделенный текст скопирован как цитата';
  alertsService.showAlertNotification(menuItem.image, menuItem.label, notification, false, "", null, "")
};
this.copyTextAsBBcodeUrl = function() {
  gClipboard.write('[url=' + content.location.href + ']'+ getSelect() + '[/url]');
  var notification = 'Выделенный текст скопирован как ссылка'; 
  alertsService.showAlertNotification(menuItem.image, menuItem.label, notification, false, "", null, "")
};

UPD: чуть поправил

amid525
А вообще,  с такими вопросами надо сюда писать. В этой теме, как я понимаю, обсуждаются уже существующие кнопки.

turbot, спасибо!

Сделайте пожалуйста кнопку "Озвучивание слов и фраз на английском".
Выделяем слово или фразу - нажимаем кнопку - и слышим озвучку голосом.

ps
пока работает так )) - переходим сюда http://translate.google.com/#auto/ru/firefox, и нажимаем значок динамика.

firepox
Поставьте S3.Google Translator (тестовую, по ссылке из этого поста), там это есть:
thumb.png

turbot
Спасибо!

Привет всем.
Вопрос к bunda1, как автору кнопки Autocopy+3,
но может еще кто поможет.
Хотелось бы добавить в кнопке функцию "копировать БЕЗ форматирования".
А то я ради этого целое расширение установил (которое с чем-то конфликтует),
но осталось подозрение, что это в кнопке можно реализовать.

Ultima2m
А вставить без форматирования не устроит?

11-08-2015 16:24:35
Кстати, если кто подскажет насчет

Но! Если текстовое поле не поддерживает richtext (вставку текста с форматированием), то пункт хоть и будет активен, но ничего в это поле не вставит. Как это обойти - не знаю.

- был бы очень благодарен. (В смысле, чтобы в этом случае срабатывало просто "вставить")

turbot пишет

А вставить без форматирования не устроит?

Вставлять приходится в разные программы (ворд, бэт...), так что только копирование поможет.

Ultima2m пишет

Хотелось бы добавить в кнопке функцию "копировать БЕЗ форматирования".
А то я ради этого целое расширение установил (которое с чем-то конфликтует),
но осталось подозрение, что это в кнопке можно реализовать.

Кажется была такая старая кнопка на http://www.smileyfaze.tk/CustomButtons2%20Database.htm или http://odyseus.github.io/CustomButtons/ … abase.html, поискал но не нашел.

Такая проблема. Закинул это в инициализацию, раньше работало. Убирает подсказки при наведении на какое либо меню (ну там, наводишь на крестик - закрыть вкладку показывает). Как сделать так, что бы оно заработало вновь.

без пояснений
/*Спрятать подсказки*/
(function() {
function onPS(e) {
if (e.originalTarget.nodeName != "tooltip" || window.__attributesInspector) return;
var node = e.originalTarget.ownerDocument.tooltipNode;
for (; node && !(node instanceof HTMLAnchorElement); node = node.parentNode);
!node && e.preventDefault();
}
const observer = {
observe: function(win) win.addEventListener("load", this, false),
handleEvent: function(e) {
var doc = e.target;
var win = doc.defaultView;
win.removeEventListener("load", this, false);
if (doc.location.href == "chrome://browser/content/browser.xul" || win.cbttp) return;
win.cbttp = true;
win.addEventListener("popupshowing", onPS, true);
win.addEventListener("unload", function onUL() {
win.removeEventListener("unload", onUL, false);
win.removeEventListener("popupshowing", onPS, true);
}, false)
}
}
addEventListener("popupshowing", onPS, true);
Services.obs.addObserver(observer, "domwindowopened", false);
addDestructor(function() Services.obs.removeObserver(observer, "domwindowopened"));

LittleMontana

в конце не хватает.
Либо

Выделить код

Код:

(function() {

в начале - лишняя.

еще раз спасибо!)

есть способ с помощью кнопок разрешить копирование текста на этом сайте?

Kiril__777 пишет

есть способ с помощью кнопок разрешить копирование текста на этом сайте?

Может стиль подойдёт? Тогда вот http://forum.ru-board.com/topic.cgi?for … rt=4900#13

voqabuhe
да, стиль. спасибо!

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

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

Выделить код

Код:

function wget(){
        var urllink=gContextMenu.linkURL
        var pleerpath="c:\\Program Files\\UnixUtils\\bin\\wget.exe"
        var param="-xc -nc"   // путь к папке куда сохранять прописан во .wgetrc , тут можно его переопределить -P <нужный путь>
        
        startProcess(pleerpath,param,[urllink]);

        function startProcess(path, param, args) {
    var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("URL не найден", path); 
};
        }


... и есть сайты где генерятся списки файлов(*.txt или *.m3u) на странице(сериалов. например экс.юа или фс.то ). Как добавить сюда что бы сначала скачался этот файл(куда угодно хоть в профиль) и передать его wget-у как еще один параметр  -i <путь_где_скачанный_файл>

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

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

Выделить код

Код:

var icomnu = "data:image/vnd.microsoft.icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OK04ODj/ODg4/zg4OK0AAAAAODg4rTg4OP84ODj/ODg4rQAAAAA4ODitODg4/zg4OP84ODitAAAAAAAAAAA8PDz/PDw8/zw8PP88PDz/AAAAADw8PP88PDz/PDw8/zw8PP8AAAAAPDw8/zw8PP88PDz/PDw8/wAAAAAAAAAAQEBA/0BAQP9AQED/QEBA/wAAAABAQED/QUFB/0FBQf9BQUH/AAAAAEFBQf9BQUH/QUFB/0FBQf8AAAAAAAAAAEVFRa1FRUX/RUVF/0VFRa0AAAAARUVFrUVFRf9FRUX/RUVFrQAAAABFRUWtRUVF/0VFRf9FRUWtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk5OrU1NTf9NTU3/Tk5OrQAAAABOTk6tTU1N/01NTf9OTk6tAAAAAE5OTq1NTU3/TU1N/05OTq0AAAAAAAAAAFJSUv9SUlL/UlJS/1JSUv8AAAAAUlJS/1JSUv9SUlL/UlJS/wAAAABSUlL/UlJS/1JSUv9SUlL/AAAAAAAAAABWVlb/VlZW/1ZWVv9WVlb/AAAAAFZWVv9WVlb/VlZW/1ZWVv8AAAAAVlZW/1ZWVv9WVlb/VlZW/wAAAAAAAAAAWlparVpaWv9aWlr/WlparQAAAABaWlqtWlpa/1paWv9aWlqtAAAAAFpaWq1aWlr/Wlpa/1paWq0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiYmKtYmJi/2JiYv9iYmKtAAAAAGJiYq1iYmL/YmJi/2JiYq0AAAAAYmJirWJiYv9iYmL/YmJirQAAAAAAAAAAZ2dn/2dnZ/9nZ2f/Z2dn/wAAAABnZ2f/Z2dn/2dnZ/9nZ2f/AAAAAGdnZ/9nZ2f/Z2dn/2dnZ/8AAAAAAAAAAGtra/9ra2v/a2tr/2tra/8AAAAAa2tr/2tra/9ra2v/a2tr/wAAAABra2v/a2tr/2tra/9ra2v/AAAAAAAAAABwcHCtcHBw/3BwcP9wcHCtAAAAAHBwcK1wcHD/cHBw/3BwcK0AAAAAcHBwrXBwcP9wcHD/cHBwrQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAIQhAACEIQAAhCEAAIQhAAD//wAAhCEAAIQhAACEIQAAhCEAAP//AACEIQAAhCEAAIQhAACEIQAA//8AAA=="; 
   var wgetico = "data:image/vnd.microsoft.icon;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFBQUFxMTE2kWFhZwFhYWcBYWFnAWFhZwFhYWcBYWFnAWFhZwFhYWcBYWFnAWFhZwFhYWcBMTE3ETExNQFBQUADc3N843Nzf/LCws3S0tLeEtLS3hLS0t4S0tLeEtLS3hLS0t4S0tLeEtLS3hLS0t4SwsLN84ODjsOTk5/zY2Nq00NDT/FBQURgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMACYmJqw0NDT/NTU1/wgICC4AAAAAAAAAAAAAAAABAQEFAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAgICCQAAAAAdHR2VNzc3/zU1Nf8JCQkxBgYGBgwMDEIGBgYSAAAAAAAAAAAICAgoCwsLOAoKCjQLCws5BAQEEwAAAAAAAAAAHx8fmzY2Nv81NTX/CAgILwsLCwk3NzfWNDQ05wsLCx0AAAAAKSkpxTU1Nf8xMTH4Nzc3/xQUFF0AAAAAAAAAAB4eHpo2Njb/NTU1/woKCjQAAAAACQkJAjExMcs1NTXnDg4OGQAAAAICAgIKAQEBCAEBAQkAAAADAAAABAAAAAAeHh6aNjY2/zU1Nf8KCgo0AAAAABMTEyc0NDTjLi4uwAgICA0AAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQUAAAAAHh4emjY2Nv82Njb/CAgIMBAQEBU2NjbhLS0twwUFBQUAAAAAAQEBBQAAAAMAAAADAAAABAAAAAMBAQEHAAAAAB8fH5s2Njb/NTU1/wcHBycAAAAAAQEBCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdHR2VNzc3/zQ0NP8SEhJbBwcHJwkJCS8KCgozCgoKNAoKCjIKCgoyCgoKMgoKCjIKCgoyCgoKMgoKCjYGBgYiIiIirjY2Nv8yMjL+NDQ0/zU1Nf80NDT/NDQ0/zQ0NP80NDT/NDQ0/zQ0NP80NDT/NDQ0/zQ0NP80NDT/NDQ0/zMzM/8yMjL/NTU1+TQ0NP80NDT/NDQ0/zQ0NP80NDT/NDQ0/zQ0NP80NDT/NDQ0/zQ0NP80NDT/NDQ0/zQ0NP81NTX/NTU18CgoKFkoKCjOKCgoyygoKMsoKCjMKCgozCgoKMwoKCjMKCgozCgoKMwoKCjMKCgozCgoKMooKCjQKCgorygoKC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//4AAAABAAAAAAAAP/wAADn0AAAGDAAAAgwAACAEAAAh9AAAAgQAAC/8AAAAAAAAAAAAAAAAAAAAAAAA//8AAA=="; 
(function openLinkAsMenu(){

    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-bookmarklink"); 
    var eventTarget = null;
    
    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "openLinkAsMenu";
    menu.setAttribute("label", "Открыть в ...");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", icomnu);
    menu.hidden = true;
    
    contextMenu.insertBefore(menu, document.getElementById("context-sep-open"));
    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);
       
      var lst = [

        {          label:"Wget [ Url download ]",             command:wgeturl, image:wgetico         },
        {          label:"Wget -i [ Загрузить по списку ]",          command:wgetlist, image:wgetico        }
         
        ];
    
     for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("class", "menuitem-iconic");     // +1
        menuItem.setAttribute("image", m.image);          // +2
        menuItem.setAttribute("type", "m.radio");
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Demo-Menu-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
                 document.getElementById("openLinkAsMenu").hidden = false;
         }
      
       function setMenuDisplay(aEvent) {
                 if (gContextMenu.onLink) {
                 document.getElementById("openLinkAsMenu").hidden = false;
        }
                 else
                 document.getElementById("openLinkAsMenu").hidden = true;
    }

// ==========================================================================

    function wgeturl(){
     var url =  gContextMenu.linkURL;
     var file = Services.dirsvc.get('ProfD', Ci.nsIFile);

   file.initWithPath(file.path + "\\Soft\\wget\\wget.cmd");

   var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   process.init(file);
   process.run(false, ["-cN", url], 2);
}

//--------------------------------------------------------------------------------
    function wgetlist(){
     var url =  gContextMenu.linkURL;
     var file = Services.dirsvc.get('ProfD', Ci.nsIFile);

   file.initWithPath(file.path + "\\Soft\\wget\\wget.cmd");
   
      var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   process.init(file);
   process.run(false, ["-cNi", url], 2);
}        

// ================ end ================================
        
})();


... а рядом с wget.exe положил батник wget.cmd (кот. запускает кнопка) и в нем уже выставляю параметры куда-и-как качать.
И оказывается wget сам понимает что в ссылке файл-список и подхватует его. блеск.
скрытый текст

Выделить код

Код:

@echo off
@cd /d "%~dp0"
"%~dp0wget.exe" --content-disposition -P C:\0l0\WgetDl\%RANDOM% %*
pause
@exit


Тянет списками и с экс-а и фс.то. мая довольна.

Была такая кнопка, то есть, добавляет в меню вкладки "Перезагружать вкладку". Время задается в самой кнопке в инициализации. В FF28 и PM работает, а в FF35 и FF38 нет. Можно как-то поправить или может есть рабочая?

foxboy
надобно постить код кнопки либо линк на рабочую кнопку. Шобы те кто может/пожелает помочь не лазали-не-гадали что за кнопка, как оно работает... ;)

картинка 55kb. погадаю
hrustalnyj_shar_01.jpg
Может этот плуг будет полезен. Tab Auto Reload Делает именно то.

В дополнении Tab Mix Plus есть такая функция

Вот есть кнопка

Copy Links

Выделить код

Код:

// Copy links - При нажатии ЛКМ копирует ссылки из выделенного текста, а если ничего не выделено, то и вообще все ссылки, в буфер обмена (≈ расширению Multi Links).
var win = document.commandDispatcher.focusedWindow, doc = win.document;
var sel = doc, winSel = win.getSelection();

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

var str = '', links = sel.getElementsByTagName('a');

    for(var i = 0, lnk; lnk = links[i]; i++) {
        if(lnk.href)str += lnk.href + '\r\n'
        };
    gClipboard.write(str);


... из неё переделал кнопку
Copy image addr

Выделить код

Код:

// скопировть адреса изображений на странице
   var win = document.commandDispatcher.focusedWindow , doc = win.document;
   var str = '', links = doc.getElementsByTagName('img');
    for(var i = 0, lnk; lnk = links[i]; i++) {
        if(lnk.src)str += lnk.src + '\r\n'
        };
        gClipboard.write(str);


... а можно сделать еще одну кнопку для копирования всех "источников" на странице. Тех что лежат в src= и href= ?
А может уже есть, поделитеся.

Всем добрый.Чтоб не плодить сущности спрошу здесь.Нужна кнопка скрывающая панель меню kiss_6kb.1440927334.png поможите пожалста.Спасибо.

Панель меню отключается как и другие панели или в CTR
а кнопку здесь посмотри

Ultima2m пишет

а кнопку здесь посмотри

да,но она не работает на 40 пункты меню не активны kiss_86kb.1440931952.png дико звиняюсьclapping.gif после перезагрузки всё работает kiss_332kb.1440932591.png  :beer:

прошу помощи по кнопке. вроде бы все перерыл, но везде не совсем в ту сторону варианты: нужна замена кнопки Новая вкладка с функциями вставки буфера, а везде зачем то кнопки связанные с адрессной строкой лежат..
главные потребности:
1.  ЛКМ - открыть новую вкладку  ПКМ - открыть содержимое буфера обмена в новой вкладке  СКМ - открыть выделенный текст/ссылку в новой вкладке
2. очень жалельно не использование кода картинки, а приминение стандартного плюсика самой лисы(при смене оформлений и тем код-картнка выбивается жутко). если это не возможно то хотя бы использовать сам + из стандартной темы как картинку.

bunda1 пишет

checkForMiddleClick = function(node, e) {

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

Выделить код

Код:

alert(
    [...document.querySelectorAll('[onclick^="checkForMiddleClick("]')]
        .map(node => node.nodeName + (node.id ? "\t\t#" + node.id : ""))
        .sort().join("\n")
);

Dumby пишет
bunda1 пишет

checkForMiddleClick = function(node, e) {

Мда scratch_one-s_head.gif

Всем добрый.Как в этой кнопке

Выделить код

Код:

/*Initialization Code*/

this.tooltipText = "Left     => Перезагрузить \nMiddle => Закрыть \nRight   => Меню";

this.onclick = function(event) {
    if(event.button == 0) {
// Действие при клике ЛКМ
  var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
                             .getService(Components.interfaces.nsIAppStartup);
  appStartup.quit(appStartup.eForceQuit | appStartup.eRestart);
    }
        else if(event.button == 1 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Действие при клике ПКМ без модификаторов
goQuitApplication();
    }
};

зделать так чтобы Fox закрывался пкм а не колёсиком.Спасибо

oleg953

Выделить код

Код:

//  Настройка функций кликов мыши для кнопки .................
this.onclick = function(e) {
     
    if ( e.button == 0 ) Application.restart(); // ЛКМ
         
    if ( e.button == 1 ) gShowPopup(this); // СКМ 
        
    if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { // ПКМ
         e.preventDefault();
         goQuitApplication();
         }
};
this.tooltipText = "Л: Перезагрузить \nС: CB Меню \nП: Закрыть";
bunda1 пишет

bunda1

спасибо :beer:

https://forum.mozilla-russia.org/viewto … 68#p694168
Появилась такая идея. Подскажите пожалуйста, можно ли так сделать, что бы написанные слова в адресной строке после нажатия кнопки добавлялись в название вкладки?

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

LittleMontana пишет

Прошу помощи с кнопкой

Неплохо бы ссылку на кнопку добавить.

bunda1 пишет

Неплохо бы ссылку на кнопку добавить.

Да, неплохо бы. И, заодно, описание как именно «просто показывать».
Если вдруг такая кнопка не существует, то, на крайний случай,
можно попробовать интервал для кода hydrolizer'а.

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EKL%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAIAAAB2uKNyAAAAl0lEQVR42mNkoAwwAvH////J1AwEg0T/0/vWmXePMfBMmG6RL82wvX+P136wEkXl21FfVFtfMsCkCOv3Pn5CddEXoLhVnOXREG6Gk5cZSdAfx12w6CVCMxCQoh8B0qpdZpozkK+fgUF82yZdT5L1O+r9D/sKYZPlf5TwB3OfQPQjAaAdhWL49COcg4g//PoHOv1Rop8SAACkKJ0R5kMP6wAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5BgBrowser.currentURI.spec%20%3D%3D%20%22about%3Acustomizing%22%20%7C%7C%20%28%28%5Bimg%5D%29%20%3D%3E%20%7B%0A%0A%09var%20interval%20%3D%20500%3B%20//%20ms%0A%0A%09var%20imgEN%20%20%3D%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAIAAAB2uKNyAAAAlElEQVR42mNkoAwwAvH////J1AwEg0T/57XW+5YcQ5VOM10/kxcqDmJLAcVOpm/smAXjkqCfgcF+m3+BJ0H9MHtgANlc6Yr/JgzE268wwak/nwFFPM20guE0OfoVJmjIF9w4iOI1UtwPMkvtZqDXU0L6kYGVxpSjUifg+vN5oYFHtn4GhmcTGE8fxKZ/oNMfJfopAQDmnKYRpM4nUAAAAABJRU5ErkJggg%3D%3D%22%3B%0A%09var%20imgRU%20%20%3D%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAIAAAB2uKNyAAAAjklEQVR42mNkoAwwAvH////J1AwEg0L/CYagTnTJmMkMQdIMT9cx5C5hYFBgmNzHIM0A4zIwlK9jMMevH6KHgST9KHaCFcmQb789w7p8ct2vEMPQFwRikKYf6H7pNQydB7H4BcI9OREsCzUOq/8ZGIpyGR7Awk/6KYyLxXWEwg+qDtUIuNcGUfqjTD8lAABRE34RggBENwAAAABJRU5ErkJggg%3D%3D%22%3B%0A%09var%20imgERR%20%3D%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAIAAAB2uKNyAAAAc0lEQVR42mNkoAwwAvH////J1AwEg0n/nYnWqgXHoJJp2/7P9MQliE3/9nRGr1nIxltNuH1UrRuLYL4KFv1Q7SB5760QK9O2bWPwwhSEOwG7/+EORnYsVkEs+onXjFU/VCWyJ3EI0ib+KbV/oN1Pln5KAACv6I0Rg3TeKQAAAABJRU5ErkJggg%3D%3D%22%3B%0A%0A%09var%20data%20%3D%20%7B67699721%3A%20imgEN%2C%2068748313%3A%20imgRU%7D%3B%0A%0A%09var%20%7Bctypes%7D%20%3D%20Cu.import%28%22resource%3A//gre/modules/ctypes.jsm%22%2C%20%7B%7D%29%3B%0A%09var%20lib%20%3D%20ctypes.open%28%22user32.dll%22%29%3B%0A%09var%20method%20%3D%20lib.declare%28%22GetKeyboardLayout%22%2C%20ctypes.winapi_abi%2C%20ctypes.uint32_t%2C%20ctypes.uint32_t%29%3B%0A%0A%09var%20currentLayout%2C%20layout%3B%0A%09function%20tick%28%29%20%7B%0A%09%09if%20%28%28layout%20%3D%20method%280%29%29%20%3D%3D%20currentLayout%29%20return%3B%0A%09%09currentLayout%20%3D%20layout%3B%20img.src%20%3D%20data%5Blayout%5D%20%7C%7C%20imgERR%3B%0A%09%7D%0A%09tick%28%29%3B%20var%20id%20%3D%20setInterval%28tick%2C%20interval%29%3B%0A%09addDestructor%28%28%29%20%3D%3E%20clearInterval%28id%29%20%7C%7C%20lib.close%28%29%29%3B%0A%0A%09this._handleClick%20%3D%20%28%29%20%3D%3E%20alert%28method%280%29%29%3B%0A%0A%7D%29%28document.getAnonymousNodes%28this%29%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

спасибо
а можно как то изменить иконку когда RU и когда ENG?
Пытался конвертировать собственное изображение в Base64, в итоге, когда меняю, просто пропадает иконка=((

Пользуюсь Edit Bookmark Plus. Нельзя ли сделать так, чтобы при добавлении закладки фокус был на строке названия закладки?

Здравствуйте.

Есть ли такая кнопка открытия конкретной заложенной в нее закладки?

Выделить код

Код:

var url = "http://нужный_адресс";
// --------- в фоновой вкладке
// gBrowser.addTab(url);
// --------- в активной вкладке
getBrowser (). selectedTab = getBrowser (). addTab(url);
jars пишет

Выделить кодКод:var url = "http://нужный_адресс";
// --------- в фоновой вкладке
// gBrowser.addTab(url);
// --------- в активной вкладке
getBrowser (). selectedTab = getBrowser (). addTab(url);

Супер.

Огромное спасибо, все работает.

Только вопросик.


Можно сделать открытие этой ссылки рядом с открытой страницей если открытая страница находится в средине группы вкладок?

№5377

Выделить код

Код:

var url = "http://нужный_адресс";
// ----------- во вкладке рядом с текущей
gBrowser.moveTabTo( gBrowser.addTab( url ), gBrowser.mCurrentTab._tPos +1);
jars пишет

№5377Выделить кодКод:var url = "http://нужный_адресс";
// ----------- во вкладке рядом с текущей
gBrowser.moveTabTo( gBrowser.addTab( url ), gBrowser.mCurrentTab._tPos +1);

Спасибо.

Еще бы если открывало ее как активную :)

То есть с переходом на нее.

Выделить код

Код:

// -------------- в активной вкладке рядом с текущей
var url = "http://нужный_адресс"
tpos = gBrowser.selectedTab._tPos+1;
gBrowser.moveTabTo(getBrowser().selectedTab = getBrowser().addTab(url),tpos);

20-09-2015 17:10:31
И опережая последующий запросс :D

Выделить код

Код:

// Открыть - закрыть страницу в бок.панели
if (document.getElementById("sidebar-title").value) {
   toggleSidebar();
    } else {
   openWebPanel("Облако Bix 16GB", "https://bix.com/"); // Первый - произвольный заголовок для панели, Второе - нужный адресс
}

Прошу помощи с совмещением функций двух кнопок. Существует кнопка (набор кнопок) Save+ (https://forum.mozilla-russia.org/viewto … 40#p493040). В ней есть кнопка сохранения ярлыка страницы с иконкой (иконки для ярлыков хранятся в папке C:\Documents and Settings\Favicon\). Можно ли добавить эту функцию к кнопке "Сохранить как..." что бы сохранять другие файлы с иконкой сайта? Например html,mht,maff.

zhe540 пишет

Прошу помощи с совмещением функций двух кнопок. Существует кнопка (набор кнопок) Save+ (https://forum.mozilla-russia.org/viewto … 40#p493040). В ней есть кнопка сохранения ярлыка страницы с иконкой (иконки для ярлыков хранятся в папке C:\Documents and Settings\Favicon\). Можно ли добавить эту функцию к кнопке "Сохранить как..." что бы сохранять другие файлы с иконкой сайта? Например html,mht,maff.

Нет нельзя, слишком сложно это.

https://forum.mozilla-russia.org/viewto … 01#p688401
turbot, а можно сделать так, чтобы панель закладок появлялась еще если я начал таскать какую-нибудь ссылку мышкой. Это нужно, чтобы добавить закладки в панель перетаскиванием.

Прошу подправить кнопочку.
WinXP sp3 - FF 41.0 - CB 0.0.5.8.1signed - Autocopy+3
В окне Библиотека при попытке открытия папки в меню закладок двойным нажатием ЛКМ , окно библиотеки сразу закрывается. При удалении кнопки -  все работает.

AlexCondor пишет

Прошу подправить кнопочку.
WinXP sp3 - FF 41.0 - CB 0.0.5.8.1signed - Autocopy+3
В окне Библиотека при попытке открытия папки в меню закладок двойным нажатием ЛКМ , окно библиотеки сразу закрывается. При удалении кнопки -  все работает.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EAutocopy+3%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20Autocopy+3%20%u043E%u0442%2024.09.2015.%20...............%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...............%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20cbu.setPrefs%28%22Autocopy%22%2C%20%21cbu.getPrefs%28%22Autocopy%22%29%29%3B%20%0A%20%20%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%7D%3B%20%0A%0A%0A%0A//%20%u041F%u0440%u043E%u0432%u0435%u0440%u0438%u0442%u044C%20%u043D%u0430%u043B%u0438%u0447%u0438%u0435%20%u0441%u0442%u0440%u043E%u043A%20%u0432%20%27about%3Aconfig%27%20%u0438%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u0435%u0441%u043B%u0438%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20...............%0Aif%20%28%20%21cbu.isPref%28%22Autocopy.saveWithDoubleClick%22%29%20%29%20%7B%0A%20%20%20%20%20%5B%22Autocopy%22%2C%20%22Autocopy.reset%22%2C%20%22Autocopy.selectingTextBlink%22%2C%20%22Autocopy.selectWithDoubleClick%22%2C%0A%20%20%20%20%20%20%22Autocopy.copyWithDoubleClick%22%2C%20%22Autocopy.saveWithDoubleClick%22%5D.forEach%28function%28pref%29%20cbu.setPrefs%28pref%2C%20false%29%20%29%3B%0A%7D%3B%0A%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20...............%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0430%u0432%u0442%u043E%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%u043F%u0440%u0438%20%u0432%u044B%u0445%u043E%u0434%u0435%20%u0438%u0437%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%27%2C%20value%3A%20%27Autocopy.reset%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043C%u0438%u0433%u0430%u0435%u0442%20%u043F%u0440%u0438%20%u0430%u0432%u0442%u043E%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0438%27%2C%20value%3A%20%27Autocopy.selectingTextBlink%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0414%u0432%u043E%u0439%u043D%u043E%u0439%20%u043F%u0440%u0430%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%27%2C%20value%3A%20%27Autocopy.copyWithDoubleClick%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0414%u0432%u043E%u0439%u043D%u043E%u0439%20%u043B%u0435%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u0432%u044B%u0434%u0435%u043B%u044F%u0435%u0442%20%u0432%u0441%u0435%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0445%20%u043F%u043E%u043B%u044F%u0445%27%2C%20value%3A%20%27Autocopy.selectWithDoubleClick%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0414%u0432%u043E%u0439%u043D%u043E%u0439%20%u043F%u0440%u0430%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u0441%u043E%u0445%u0440%u0430%u043D%u044F%u0435%u0442%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%27%2C%20value%3A%20%27Autocopy.saveWithDoubleClick%27%20%7D%2C%20%0A%20%20%20%20%7B%20label%3A%20%27%u0421%u0440%u0435%u0434%u043D%u0438%u043C%20%u043A%u043B%u0438%u043A%u043E%u043C%20%u0432%u0441%u0442%u0430%u0432%u043B%u044F%u0442%u044A%20%u0442%u0435%u043A%u0441%u0442%20%u0441%20%u0437%u0430%u043C%u0435%u043D%u043E%u0439%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%27%2C%20value%3A%20%27middlemouse.paste%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%5D%3B%0A%0Avar%20menuPopup%20%3D%20self.appendChild%28%20document.createElement%28%22menupopup%22%29%20%29%3B%0Aarray.forEach%28%28m%29%3D%3E%20%7B%0A%20%20%20%20if%20%28%20%22separator%22%20in%20m%20%29%20%7B%20menuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%20return%20%7D%3B%0A%20%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20mItem.setAttribute%28%22label%22%2C%20m.label%29%3B%0A%20%20%20%20mItem.setAttribute%28%27type%27%2C%20%27checkbox%27%29%3B%0A%20%20%20%20mItem.setAttribute%28%27checked%27%2C%20cbu.getPrefs%28m.value%29%20%29%3B%0A%20%20%20%20mItem.onclick%20%3De%3D%3E%20%7B%20e.stopPropagation%28%29%3B%20cbu.setPrefs%28m.value%2C%20%21cbu.getPrefs%28m.value%29%29%20%7D%3B%20%20%0A%20%20%20%20menuPopup.appendChild%28%20mItem%20%29%3B%0A%7D%29%3B%0A%0A//%20%u0434%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20CB%20%u043C%u0435%u043D%u044E%20....%0AmenuPopup.appendChild%28%20document.createElement%28%22menu%22%29%20%29.setAttribute%28%22label%22%2C%20%22%u041C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%22%29%3B%0AmenuPopup.lastChild.appendChild%28%20document.getElementById%28%22custombuttons-contextpopup%22%29.cloneNode%28true%29%20%29%3B%0AmenuPopup.setAttribute%28%22onpopupshowing%22%2C%20%22document.popupNode%20%3D%20document.getElementById%28%27%22%20+%20_id%20+%20%22%27%29%22%29%3B%0A%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u043D%u0430%u0441%u0442%u0440%u043E%u0435%u043A%20%u0432%20%27about%3Aconfig%27%20...............%0Aconst%20s%20%3D%20%22Autocopy%22%3B%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29.%0A%20%20%20src%20%3D%20cbu.getPrefs%28s%29%0A%20%20%20%3F%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%0A%20%20%20%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%3B%0A%7D%3B%20%20%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28function%28%29%20%7B%20gPrefService.removeObserver%28%20s%2C%20toggleImage%2C%20false%20%29%20%7D%29%3B%0A%0A%0A%0A//%20%u0412%u044B%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043F%u0440%u0438%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0438%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20...............%0Avar%20toggleButton%20%3D%20%7B%0A%20%20%20%20observe%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20cbu.getPrefs%28%22Autocopy.reset%22%29%20%26%26%20data%20%3D%3D%20%22shutdown%22%20%26%26%20cbu.setPrefs%28%22Autocopy%22%2C%20false%29%3B%20%20%0A%20%20%20%20%7D%0A%7D%3B%0AServices.obs.addObserver%28toggleButton%2C%20%22quit-application%22%2C%20false%29%3B%0A//addDestructor%28function%28%29%20%7B%20Services.obs.addObserver%28toggleButton%2C%20%22quit-application%22%2C%20false%20%29%20%7D%29%3B%20%20%0A%0A%0A%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u0438%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%2C%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20...............%0Afunction%20autocopy%28e%29%20%7B%0A%20%20%20if%20%28%20e.button%20%7C%7C%20e.target%20instanceof%20Ci.nsIDOMNSEditableElement%20%29%20return%3B%0A%20%20%20var%20win%20%3D%20e.target.ownerDocument.defaultView%3B%0A%20%20%20if%20%28%20win.top%20%21%3D%20content%20%29%20return%3B%0A%20%20%20%0A%20%20%20if%20%28%20e.type%20%3D%3D%20%27mousedown%27%20%29%20autocopy.lastSelection%20%3D%20e.target.ownerDocument.defaultView.getSelection%28%29.toString%28%29%3B%20%0A%20%20%20%0A%20%20%20if%20%28%20e.type%20%21%3D%3D%20%27mouseup%27%20%29%20return%3B%20%0A%20%20%20%0A%20%20%20var%20selection%20%3D%20e.target.ownerDocument.defaultView.getSelection%28%29.toString%28%29%3B%0A%20%20%20if%20%28%20cbu.getPrefs%28%22Autocopy%22%29%20%26%26%20selection%20%26%26%20selection%20%21%3D%3D%20autocopy.lastSelection%20%29%20%7B%0A%20%20%20%20%20%20%20%20goDoCommand%28%27cmd_copy%27%29%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043C%u0438%u0433%u0430%u0435%u0442%20....%0A%20%20%20%20%20%20%20%20if%20%28%20%21cbu.getPrefs%28%22Autocopy.selectingTextBlink%22%29%20%29%20return%3B%0A%20%20%20%20%20%20%20%20document.activeElement.blur%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20setTimeout%28%28%29%20%3D%3E%20window.content.focus%28%29%2C%20300%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0AaddEventListener%28%22mouseup%22%2C%20autocopy%2C%20false%2C%20gBrowser%20%29%3B%0AaddEventListener%28%22mousedown%22%2C%20autocopy%2C%20false%2C%20gBrowser%20%29%3B%0A%0A%0A%0A//%20C%u0440%u0435%u0434%u043D%u0435%u0439%20%u043A%u043D%u043E%u043F%u043A%u043E%u0439%20%u043C%u044B%u0448%u0438%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0435%20%u043F%u043E%u043B%u044F%20%u0441%20%u0437%u0430%u043C%u0435%u043D%u043E%u0439%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20...............%0Afunction%20middleMousePaste%28e%29%20%7B%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%201%20%26%26%20cbu.getPrefs%28%27middlemouse.paste%27%29%20%29%20%7B%0A%0A%20%20%20%20%20%20%20%20if%20%28%20/input%7Cpassword%7Ctextarea%7Ctextbox%7Csearchbar%7Cfindbar%7Ccbeditor/.test%28%20e.target.localName.toLowerCase%28%29%20%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20document.commandDispatcher.getControllerForCommand%28%22cmd_paste%22%29%20%29%20%7B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20var%20cmd%20%3D%20%22cmd_insertText%22%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20var%20commandDispatcher%20%3D%20%28%20this.document%20%7C%7C%20document%20%29.commandDispatcher%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20var%20controller%20%3D%20commandDispatcher.getControllerForCommand%28cmd%29%3B%0A%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20controller%20%26%26%20controller.isCommandEnabled%28cmd%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20controller%20%3D%20controller.QueryInterface%28Components.interfaces.nsICommandController%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20params%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/command-params%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsICommandParams%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20params.setStringValue%28%22state_data%22%2C%20gClipboard.read%28%29%20%29%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20controller.doCommandWithParams%28cmd%2C%20params%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0AaddEventListener%28%22click%22%2C%20middleMousePaste%2C%20true%2C%20document.documentElement%20%29%3B%0A%0A%0A%0A//%20%u0414%u043E%u043F%u043E%u043B%u043D%u0438%u0442%u0435%u043B%u044C%u043D%u044B%u0435%20%u0432%u043E%u0437%u043C%u043E%u0436%u043D%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0437%u043D%u0430%u0447%u043A%u0430%20%u0438%u0434%u0435%u043D%u0442%u0438%u0444%u0438%u043A%u0430%u0446%u0438%u0438%20%u0441%u0430%u0439%u0442%u0430%20%u0432%20%u0441%u0442%u0440%u043E%u043A%u0435%20%u0430%u0434%u0440%u0435%u0441%u0430%20...............%0AaddEventListener%28%22click%22%2C%20function%28e%29%20%7B%0A%20%20%20e.preventDefault%28%29%3B%0A%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%0A%20%20%20//%20%u041B%u041A%u041C%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u0438%u043D%u0444%u043E%u0440%u043C%u0430%u0446%u0438%u044E%20%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%u0432%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%27%u0420%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u0438%u044F%27%20....%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20%7B%0A%20%20%20%20%20%20%20%20var%20doc%20%3D%20content.document%3B%0A%20%20%20%20%20%20%20%20BrowserPageInfo%28%20doc%2C%20%28%20%28doc.location.protocol%29.slice%280%2C4%29%20%3D%3D%20%22http%22%29%20%3F%20%22permTab%22%20%3A%20%22generalTab%22%20%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20//%20%u041F%u041A%u041C%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u0430%u0434%u0440%u0435%u0441%20....%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%29%20%7B%20%0A%20%20%20%20%20%20%20%20gClipboard.write%28%20content.location%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20//%20%u0437%u043D%u0430%u0447%u043E%u043A%20%u0438%u0434%u0435%u043D%u0442%u0438%u0444%u0438%u043A%u0430%u0446%u0438%u0438%20%u0441%u0430%u0439%u0442%u0430%20%u043C%u0438%u0433%u0430%u0435%u0442%20%u043A%u0440%u0430%u0441%u043D%u044B%u043C%20....%0A%20%20%20%20%20%20%20%20document.getElementById%28%22identity-box%22%29.setAttribute%28%22style%22%2C%20%22background%3A%20red%3B%22%29%3B%0A%20%20%20%20%20%20%20%20setTimeout%28%28%29%20%3D%3E%20document.getElementById%28%22identity-box%22%29.removeAttribute%28%22style%22%29%2C%20300%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%2C%20true%2C%20document.getElementById%28%22identity-box%22%29%20%29%3B%0A%0A%20%20%20%0A%20%20%20%0A//%20%u0414%u043E%u043F%u043E%u043B%u043D%u0438%u0442%u0435%u043B%u044C%u043D%u044B%u0435%20%u0432%u043E%u0437%u043C%u043E%u0436%u043D%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u043A%u043B%u0438%u043A%u0430%20%u043C%u044B%u0448%u0438%2C%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20...............%0Afunction%20handleDblClick%28e%29%20%7B%3B%0A%0A%20%20var%20node%20%3D%20e.target%3B%0A%20%20var%20editor%20%3D%20node.editor%3B%0A%20%20%0A%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0445%20%u043F%u043E%u043B%u044F%u0445%20....%0A%20%20if%20%28%20e.button%20%3D%3D%200%20%26%26%20custombuttons.getPrefs%28%22Autocopy.selectWithDoubleClick%22%29%20%29%20%7B%20%20%20%20%0A%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%0A%20%20%20%20%20%20%20if%20%28%20/input%7Ctextbox%7Ctextarea/.test%28%20node.localName%20%29%20%29%20%21editor%20%3F%20node.select%28%29%20%3A%20editor.selectAll%28%29%3B%0A%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%0A%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20....%20%20%20%20%0A%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20cbu.getPrefs%28%22Autocopy.saveWithDoubleClick%22%29%20%26%26%20node.localName%20%3D%3D%20%27img%27%20%29%20%7B%0A%20%20%20%20%20%20%20saveImageURL%28%20gContextMenu.imageURL%2C%200%2C%200%2C%200%2C%201%2C%20null%2C%20content.document%20%29%3B%0A%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20document.getElementById%28%22contentAreaContextMenu%22%29.hidePopup%28%29%20%7D%2C%2020%29%3B%0A%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%0A%20%20//%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20....%0A%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20cbu.getPrefs%28%22Autocopy.copyWithDoubleClick%22%29%20%26%26%20%21/findbar%7Ctabbrowser/.test%28%20node.localName%20%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%21editor%20%3F%20goDoCommand%28%22cmd_copy%22%29%20%3A%20editor.copy%28%29%3B%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20try%20%7B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20var%20box%20%3D%20%28%20node.textbox%20%7C%7C%20node%20%29.inputField.parentNode%3B%0A%20%20%20%20%20%20%20%20%20%20%20var%20popup%20%3D%20box.ownerDocument.getAnonymousElementByAttribute%28%20box%2C%20%22anonid%22%2C%20%22input-box-contextmenu%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20popup.hidePopup%28%29%2C%2050%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20catch%28e%29%20%7B%20document.getElementById%28%22contentAreaContextMenu%22%29.hidePopup%28%29%20%7D%3B%20%0A%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%0A%7D%3B%0AaddEventListener%28%22dblclick%22%2C%20handleDblClick%2C%20false%2C%20gBrowser%20%29%3B%0A%0A%0A%0A//%20%u041D%u0430%u0431%u043B%u044E%u0434%u0430%u0442%u0435%u043B%u044C%20%u0441%u043B%u0435%u0434%u0438%u0442%20%u0437%u0430%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0435%u043C%20%u043E%u043A%u043E%u043D%20%u0430%u0434%u0440%u0435%u0441%u0430%20%u043A%u043E%u0442%u043E%u0440%u044B%u0445%20%u0443%u043A%u0430%u0437%u0430%u043D%u043D%u044B%20%u0432%20%u043A%u043E%u0434%u0435%20%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0438%u043C%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u0438%20...............%0Avar%20observer%20%3D%20%7B%20%20%0A%20%20%20%20%20%20%20observe%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%20handleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20%20%20%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20%20%20var%20href%20%3D%20doc.location.href%3B%20%0A%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20//%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0442%u044C%20%u0438%20%u0443%u0434%u0430%u043B%u044F%u0442%u044C%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u0438%20%u043A%u043B%u0438%u043A%u0430%20%u0434%u043B%u044F%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%u0430%20Custom%20Buttons%20....%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20href.substring%280%2C%2041%29%20%3D%3D%20%22chrome%3A//custombuttons/content/editor.xul%22%20%29%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.addEventListener%28%22click%22%2C%20middleMousePaste%2C%20true%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.addEventListener%28%22dblclick%22%2C%20handleDblClick%2C%20false%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.addEventListener%28%22unload%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28e.type%2C%20arguments.callee%2C%20false%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22click%22%2C%20middleMousePaste%2C%20true%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22dblclick%22%2C%20handleDblClick%2C%20false%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%0A%7D%3B%0AServices.obs.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0AaddDestructor%28function%28%29%20%7B%20Services.obs.removeObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%20%7D%29%3B%20%0A%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.tooltipText%20%3D%20%22Autocopy%20%5Cn%u041B%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u043E%u0435%20%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%5Cn%u041F%3A%20%u041C%u0435%u043D%u044E%20+%20CB%20%u043C%u0435%u043D%u044E%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Спасибо, работает!

bunda1, можно сделать, что-бы окно-библиотека "История", при клике по адресу само закрывалось?

amid525 пишет

bunda1, можно сделать, что-бы окно-библиотека "История", при клике по адресу само закрывалось?

Выделить код

Код:

function observer(subject) {
   subject.addEventListener("load", function l(e) {
      subject.removeEventListener("load", l);
         
      if ( subject.location == 'chrome://browser/content/places/places.xul' ) {           
           var win = e.target.defaultView;             

           win.addEventListener("click", function c(e) {
              if ( /place:beginTime|place:sort=4&type=3/.test(win.PlacesOrganizer.location) )         
                   e.target.onclick && e.button < 2 && setTimeout(()=> win.close(), 50);

              win.addEventListener("unload", function u() {
                 win.removeEventListener("unload", u);
                 win.removeEventListener("click", c);
              })      
           })         
           }    
   });  
};
Services.ww.registerNotification(observer);
addDestructor(function() Services.ww.unregisterNotification(observer) );

bunda1
так переход по адресу не происходит. Просто окно\библиотека закрывается.
Момент еще, если можно тоже доделать. Если по адресу пкм - открыть в новой вкладке, переход происходит, но окно уже не закрывается.

amid525 пишет

bunda1
Момент еще, если можно тоже доделать. Если по адресу пкм - открыть в новой вкладке, переход происходит, но окно уже не закрывается.

Выделить код

Код:

function observer(subject) {
   subject.addEventListener("load", function l(e) {
      subject.removeEventListener("load", l);
         
      if ( subject.location == 'chrome://browser/content/places/places.xul' ) {           
           var win = e.target.defaultView;             

           win.addEventListener("click", function c(e) {
              if ( /place:beginTime|place:sort=4&type=3/.test(win.PlacesOrganizer.location) )         
                   (e.target.onclick || /open|open/.test(e.target.id)) && e.button < 2 && setTimeout(()=> win.close(), 250);

              win.addEventListener("unload", function u() {
                 win.removeEventListener("unload", u);
                 win.removeEventListener("click", c);
              })      
           })         
           }    
   });  
};
Services.ww.registerNotification(observer);
addDestructor(function() Services.ww.unregisterNotification(observer) );

25-09-2015 21:19:18

amid525 пишет

bunda1
так переход по адресу не происходит. Просто окно\библиотека закрывается.

У меня открывается без проблем, проверял на разных версиях. Может проверь на чистом профиле.

У меня открывается без проблем, проверял на разных версиях. Может проверь на чистом профиле.

Разобрался. Я делал один клик по ссылке. Тогда окно закрывается и перехода небыло..
Если делать два клика - окно закрывается и переход по ссылке.
Как сделать что-бы по одному клику срабатывал переход?

Привет, подмогните с кнопкой. В конт. меню страниц есть пункт(создается расширением) с известным id = "mediasniffer" У него по умолчнию одно действо - в туттипе выводит адресс и по ЛКМ он копирует этот адресс. Хочу повесить на него доп. обработку кликов мыши ЛКМ - ПКМ. Сделал вот такую функцию и она работает правильно, все запускается и "получается" то что нужно:

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

Выделить код

Код:

//    var gid = document.getElementById("mediasniffer");
// gid.addEventListener("click", function(e) {  - пробовал , вроде не оно, не работает вообще. help!

addEventListener("click", function(e) {
    var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
    var gid = document.getElementById("mediasniffer");
 
     if ( e.button == 0 ) {
          var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
        // скачать во wget видео
         var url = ('"' + gid.getAttribute("tooltiptext") + '"');
         var lab = gBrowser.mCurrentTab.label;

       file.initWithPath(file.path + "\\Soft\\wget\\wgetfile.cmd");
         var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
       process.init(file);
       process.run(false, [url, lab], 2);
    }

    if ( e.button == 2 ) {
    // Открыть в Smplayer
         var url = gid.getAttribute("tooltiptext");

   file.initWithPath("C:\\0l0\\MyPROG\\FM\\TC\\SOFT\\MEDIA\\SMplayer\\smplayer.exe");
         var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   process.init(file);
   process.run(false, [url], 1 );
     }
   }, false);


... но понятно что ежели закинуть это в Инициализацию, то работает она глобально для бравзера, всего :) клик в любом месте запускает программы, что конечно не нужно.
Как повесить это все именно на нужный пункт с id = "mediasniffer" scratch_one-s_head.gif

jars
Так пробовал ?

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

Выделить код

Код:

addEventListener("click", function(e) {
    if (e.target.id != "mediasniffer") return;

    // ...

}, false, document.getElementById("contentAreaContextMenu"));

Не пробовал, потому как не додумался :)  Благодарю! Всё работает как должно.

amid525 пишет

Как сделать что-бы по одному клику срабатывал переход?

Выделить код

Код:

function observer(subject) {
   subject.addEventListener("load", function l(e) {
      subject.removeEventListener("load", l);
         
      if ( subject.location == 'chrome://browser/content/places/places.xul' ) {           
           var win = e.target.defaultView;             

           win.addEventListener("click", function c(e) {
              if ( /place:beginTime|place:sort=4&type=3/.test(win.PlacesOrganizer.location) && e.button < 2 ) {        
                   (e.target.onclick || /open/.test(e.target.id)) && setTimeout(()=> win.close(), 250);
                   
                   if ( e.button == 0 ) { 
                        var target = e.originalTarget;                  
                        var tree = target.parentNode;
                        var box = tree.treeBoxObject;
                        var row = box.getRowAt(e.clientX, e.clientY); 
                        var node = tree.view.nodeForTreeIndex(row);
                        
                        gBrowser.selectedTab = gBrowser.addTab(node.uri);
                        }
                   }                   

              win.addEventListener("unload", function u() {
                 win.removeEventListener("unload", u);
                 win.removeEventListener("click", c);
              })      
           })         
           }    
   });  
};
Services.ww.registerNotification(observer);
addDestructor(function() Services.ww.unregisterNotification(observer) );

bunda1
Спасибо!

26-09-2015 21:22:19
bunda1, обнаружил глюк!
С каждым новым открытием адреса из журнала, увеличивается количество дубликатов открываемых вкладок!:rolleyes:

amid525 пишет

bunda1, обнаружил глюк!
С каждым новым открытием адреса из журнала, увеличивается количество дубликатов открываемых вкладок!:rolleyes:

:/

Выделить код

Код:

this.setAttribute('oncommand', "PlacesCommandHook.showPlacesOrganizer('History'); CustomizableUI.hidePanelForNode(this);");


addEventListener("TabOpen", function(e) {
  var newTab = e.target;  
  if ( newTab.label.substring(0, 16) == "custombutton://%") setTimeout(function() { gBrowser.removeTab( newTab ) }, 500);
}, false, gBrowser.tabContainer );


function observer(subject) {
   subject.addEventListener("load", function l(e) {
      subject.removeEventListener("load", l);
         
      if ( subject.location == 'chrome://browser/content/places/places.xul' ) {           
           var win = e.target.defaultView;             

           win.addEventListener("click", function c(e) {
              if ( /place:beginTime|place:sort=4&type=3/.test(win.PlacesOrganizer.location) && e.button < 2 ) {        
                   (e.target.onclick || /open/.test(e.target.id)) && setTimeout(()=> win.close(), 150);
                     
                   if ( e.target.onclick && e.button == 0 ) { 
                        var target = e.originalTarget;                  
                        var tree = target.parentNode;
                        var box = tree.treeBoxObject;
                        var row = box.getRowAt(e.clientX, e.clientY); 
                        var node = tree.view.nodeForTreeIndex(row);
                        
                        gBrowser.selectedTab = gBrowser.addTab(node.uri);
                        }
                   }                   

              win.addEventListener("unload", function u() {
                 win.removeEventListener("unload", u);
                 win.removeEventListener("click", c);
              })      
           })         
           }    
   });  
};
Services.ww.registerNotification(observer);
addDestructor(function() Services.ww.unregisterNotification(observer) );

Все то-же самое. В первый раз нормально, одна вкладка. Второй раз - две одинаковые одновременно, третий - три, и так далее... :/

26-09-2015 22:26:08
мой код в инициализации
this.setAttribute('oncommand', "PlacesCommandHook.showPlacesOrganizer('History'); CustomizableUI.hidePanelForNode(this);");

amid525 пишет

Все то-же самое. В первый раз нормально, одна вкладка. Второй раз - две одинаковые одновременно, третий - три, и так далее... :/

Наверно ты положил мой код в вкладку Код а не в вкладку Инициализация

Хм. Заработал уже тут. В самом начале пробовал в инициализации - ни какой совсем реакции не было. мистика :rolleyes:
Спасибо!

День добрый. Есть кнопочка для включения прокси

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//custombuttons2.com/%22%3E%0A%20%20%3CCb2Ver%3E2.0.7.5%3C/Cb2Ver%3E%0A%20%20%3Cname%3EProxy%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUA/wAAAACIiIjd3d2AgID///9WXziYAAAAAXRSTlMAQObYZgAAAFRJREFUeF4tydERgCAMBNFABUQr8KjAXAcODTD034s5cb/ezJohs6wuMpow3X8MTeH5prBnXTHHEIAN+LHRGSQFBLJcgGfTindml1lO3qcAJRTP2gv/MBEl7nzAMAAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bswitch%28this.PS.getIntPref%28this.pref%29%29%7B%0A%09case%201%3A%20this.PS.setIntPref%28this.pref%2C0%29%3Bbreak%3B%0A%09case%200%3A%20this.PS.setIntPref%28this.pref%2C1%29%3Bbreak%3B%0A%7D%5D%5D%3E%3C/code%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.pref%3D%27network.proxy.type%27%3B%0Athis.onImage%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUA/wCIiIgAAADd3d3///8AAICAAAD/AAAAAP8pkhnQAAAAAXRSTlMAQObYZgAAAF1JREFUeF4tyUERg0AQRNEJDjprAAYFQztYCglYWAlwzi2y053kn17Vj4AK9djJmo3jPP94exqv7zR6prFXvy8D+AG59DGExiJpoKC0gFQ9pmxUzwhNbqsBJ2iq+QNw+RI4rlZUrAAAAABJRU5ErkJggg%3D%3D%27%3B%0Athis.offImage%3Dthis.image%3B%0A%0Athis.setState%3Dfunction%28%29%7B%0A%20var%20state%3Dthis.PS.getIntPref%28this.pref%29%3B%0A%20if%20%28state%3D%3D1%29%7B%0A%20%20this.image%3Dthis.onImage%3B%0A%20%20this.checked%3Dtrue%3B%0A%20%7Delse%7B%0A%20%20this.image%3Dthis.offImage%3B%0A%20%20this.checked%3Dfalse%3B%0A%20%7D%0A%7D%0A%0Athis.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B%0A%0Athis.setAttribute%28%27homepage%27%2C%20%27http%3A//custombuttons2.com/forum/buttons/buttons-database/proxy-button-yan.html%27%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%3C/custombutton%3E

Она включает ручную настройку прокси. А как сделать что-бы включалась URL автоматической настройки?

у меня такая Proxy стоит, переделанная мною тут в ней меняется параметр network.proxy.type с 1 на 0 и обратно. Я сменил на 2 и 5.
в инициализацию

скрытый текст
// Proxy от 11.12.2013.

// Настройка функций кликов мыши для кнопки ................................
this.onclick = function(e) {     
   
   if ( e.button == 0 ) {
        cbu.setPrefs("network.proxy.type", (cbu.getPrefs("network.proxy.type") == 2 ) ? 5 : 2 );
        }
                     
   if ( e.button == 1 ) menuPopup.showPopup( self, -1, -1, "popup", "bottomleft", "topleft");
         
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) {
        e.preventDefault();
        cbu.getPrefs("Proxy.connectionsInTab") ? openConnectionsInTab(): openConnections();
        }
};



// Проверить наличие строк в about:config и создать если не существует ................................
if ( !cbu.isPref("Proxy.reset") ) {
     ["Proxy.reset", "Proxy.connectionsInTab", "Proxy.inContextMenu"].forEach(function( pref ) { cbu.setPrefs( pref, false ) });
};



// Подсказка для кнопки ................................
this.onmouseover = function() {
     var address = Application.prefs.getValue("network.proxy.http", 0);
     var port = Application.prefs.getValue("network.proxy.http_port", 0);
                   
     this.tooltipText = "Proxy \nЛ: Переключить прокси \nС: Mеню кнопки"
                            + "\nП: Открыть настройки прокси \n\nТекущие настройки прокси: "
                            + "\nПорт: "+ port + "\nАдрес: " + address;                                                   
};



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

var menuPopup = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m ) {
   var mItem = document.createElement("menuitem");
   mItem.setAttribute("label", m.label);
   mItem.setAttribute('type', 'checkbox');
   mItem.setAttribute('checked', cbu.getPrefs( m.value ) );
   mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))'); 
   menuPopup.appendChild( mItem );
});
menuPopup.setAttribute("onclick", "event.stopPropagation()");

// добавить стандартное контекстное меню ....
menuPopup.appendChild( document.createElement("menuseparator") );
menuPopup.appendChild( document.createElement("menu") ).setAttribute("label", "Меню кнопки");
var clone = menuPopup.lastChild.appendChild( document.getElementById("custombuttons-contextpopup").cloneNode(true) );
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')");



// Функция открывает настройки прокси в окне ................................
function openConnections() {
   var windows = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getEnumerator(null);
   while( windows.hasMoreElements() ) {
          var win = windows.getNext();
          if ( win.name == 'Proxy') {   
               win.focus();
               return;
               }
   };   
   var win = openDialog("chrome://browser/content/preferences/connection.xul", "Proxy", "centerscreen");   

   // добавить атрибут "prefwindow"
   win.addEventListener("load", function f(e) {
       this.removeEventListener("load", f, true);
       e.target.documentElement.setAttribute("type", "prefwindow");
   }, true);
   
   // закрыть настройки прокси по клику на странице
   gBrowser.addEventListener("click", function c() {
      this.removeEventListener("click", c );
      try { win.close() } catch(e) {};
   });
};



// Функция открывает настройки прокси в вкладке ................................
function openConnectionsInTab() {
   var connections = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("chrome://browser/content/preferences/connection.xul") );
         
   // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут
   connections.addEventListener("pageshow", function c(e) {         
      this.removeEventListener( e.type, c );         
      e.originalTarget.documentElement.setAttribute("type", "prefwindow");
   })   
};



// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ................................
var  s = "network.proxy.type";
function toggleImage() {
    var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
    icon.src = ( cbu.getPrefs(s) == 2 )
    ? self.image
    : '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=';
}; 
toggleImage();
gPrefService.addObserver( s, toggleImage, false );
addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) });



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



// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ................................
(function func() {
  var contextMenu = document.getElementById("contentAreaContextMenu"); 
 
  // создать новый пункт меню
  var menuitem = document.createElement("menuitem");     
  menuitem.setAttribute("label", "Добавить прокси");
  menuitem.setAttribute("class", "menuitem-iconic");
  menuitem.setAttribute("image", self.image );
  addEventListener("command", function(e) { addNewProxy() }, false, menuitem );
 
  // устанавливаем где показывать пункт меню
  addEventListener("popupshowing", function() {
     menuitem.hidden = !cbu.getPrefs("Proxy.inContextMenu") || !gContextMenu.isContentSelected;
  }, false, contextMenu );
  addDestructor(function() { contextMenu.removeChild( menuitem ) });
  contextMenu.appendChild( menuitem ); // как последний пункт меню
 
 
  // добавление прокси
  function addNewProxy( sel, i ) { 
     var selection = document.commandDispatcher.focusedWindow.getSelection().toString();
     var sel = ( sel == undefined ) ? selection : sel.toString();
     sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
     sel = sel.replace(/\s+/g,":"); // заменить пробелы внутри строки
     
     // если порт ...
     if ( sel.length < 5 && isFinite(sel) ) { 
          sel = sel.replace(/:/g, "");
          sel = +sel;  // порт как число
          var lab = 'порт';
          var pref = 'network.proxy.http_port';
          }
     
     // если адрес ...
     if ( sel.length > 4 && !/:/.test(sel) && sel.split(".").length == 4 ) { 
          var lab = 'адрес';
          var pref = 'network.proxy.http';
          }     
     
     // если адрес и порт ...   
     if ( sel.length > 4 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4 ) {
          var lab = 'адрес и порт';
          var array = sel.split(":"); 
          array.forEach(function(sel, i) { addNewProxy( sel, i ) });         
          }     
     
     Application.prefs.setValue( pref, sel ); // переключить настройки прокси     

     if ( lab == undefined || i !== undefined || i == 0 ) return;
     
     // всплывающая подсказка рядом с выделенным текстом ...     
     function showTooltip() {
        var tooltip = gBrowser.appendChild( document.createElement("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.createElement("image") );
        image.setAttribute("src", self.image );
   
        var label = tooltip.appendChild( document.createElement("label") );
        label.setAttribute("value", "Установлен " + lab + " прокси: " + sel );
   
        var focused = document.commandDispatcher.focusedWindow;
        var selection = focused.getSelection().getRangeAt(0).getBoundingClientRect();
        var posX = focused.mozInnerScreenX + selection.left;
        var posY = focused.mozInnerScreenY + selection.bottom - 5;   

        tooltip.showPopup( gBrowser, posX, posY );
        setTimeout(function() { gBrowser.removeChild( tooltip ) }, 2000 );
     };
     showTooltip();   
  };
   
})();

sonyas75
У меня тоже стоит она.

ну вот она и меняет :)
в отжатом -
s_1443362897_7740701_f35f5f3cbb.png
в нажатом -
s_1443362949_2477436_8dcff49517.png

sonyas75
Я знаю, но вы не поняли моего вопроса. Мне надо чтоб было "без прокси" - "URL-прокси". Без лишнего функционала.

Mishania пишет

sonyas75
Я знаю, но вы не поняли моего вопроса. Мне надо чтоб было "без прокси" - "URL-прокси". Без лишнего функционала.

Замени 1 на 2 в cbu.setPrefs("network.proxy.type", (cbu.getPrefs("network.proxy.type") == 1 ) ? 0 : 1 ); в начале кода инициализации.

bunda1
Это я тоже понял. А вот в этой

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//custombuttons2.com/%22%3E%0A%20%20%3CCb2Ver%3E2.0.7.5%3C/Cb2Ver%3E%0A%20%20%3Cname%3EProxy%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUA/wAAAACIiIjd3d2AgID///9WXziYAAAAAXRSTlMAQObYZgAAAFRJREFUeF4tydERgCAMBNFABUQr8KjAXAcODTD034s5cb/ezJohs6wuMpow3X8MTeH5prBnXTHHEIAN+LHRGSQFBLJcgGfTindml1lO3qcAJRTP2gv/MBEl7nzAMAAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bswitch%28this.PS.getIntPref%28this.pref%29%29%7B%0A%09case%201%3A%20this.PS.setIntPref%28this.pref%2C0%29%3Bbreak%3B%0A%09case%200%3A%20this.PS.setIntPref%28this.pref%2C1%29%3Bbreak%3B%0A%7D%5D%5D%3E%3C/code%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.pref%3D%27network.proxy.type%27%3B%0Athis.onImage%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUA/wCIiIgAAADd3d3///8AAICAAAD/AAAAAP8pkhnQAAAAAXRSTlMAQObYZgAAAF1JREFUeF4tyUERg0AQRNEJDjprAAYFQztYCglYWAlwzi2y053kn17Vj4AK9djJmo3jPP94exqv7zR6prFXvy8D+AG59DGExiJpoKC0gFQ9pmxUzwhNbqsBJ2iq+QNw+RI4rlZUrAAAAABJRU5ErkJggg%3D%3D%27%3B%0Athis.offImage%3Dthis.image%3B%0A%0Athis.setState%3Dfunction%28%29%7B%0A%20var%20state%3Dthis.PS.getIntPref%28this.pref%29%3B%0A%20if%20%28state%3D%3D1%29%7B%0A%20%20this.image%3Dthis.onImage%3B%0A%20%20this.checked%3Dtrue%3B%0A%20%7Delse%7B%0A%20%20this.image%3Dthis.offImage%3B%0A%20%20this.checked%3Dfalse%3B%0A%20%7D%0A%7D%0A%0Athis.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B%0A%0Athis.setAttribute%28%27homepage%27%2C%20%27http%3A//custombuttons2.com/forum/buttons/buttons-database/proxy-button-yan.html%27%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%3C/custombutton%3E

нельзя изменить. Понимаю что смысл тот-же, но кнопка по функционалу.

Mishania

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EProxy%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUA/wAAAACIiIjd3d2AgID///9WXziYAAAAAXRSTlMAQObYZgAAAFRJREFUeF4tydERgCAMBNFABUQr8KjAXAcODTD034s5cb/ezJohs6wuMpow3X8MTeH5prBnXTHHEIAN+LHRGSQFBLJcgGfTindml1lO3qcAJRTP2gv/MBEl7nzAMAAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..................%0Athis._handleClick%20%3D%28%29%3D%3E%20cbu.setPrefs%28%22network.proxy.type%22%2C%20%28cbu.getPrefs%28%22network.proxy.type%22%29%20%3D%3D%202%20%29%20%3F%200%20%3A%202%20%29%3B%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0438%u0432%u0430%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u0432%20%27about%3Aconfig%27%20..................%0Avar%20s%20%3D%20%22network.proxy.type%22%3B%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20var%20icon%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0A%20%20%20icon.src%20%3D%20%28cbu.getPrefs%28s%29%20%3D%3D%200%29%0A%20%20%20%3F%20self.image%0A%20%20%20%3A%20%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUA/wCIiIgAAADd3d3///8AAICAAAD/AAAAAP8pkhnQAAAAAXRSTlMAQObYZgAAAF1JREFUeF4tyUERg0AQRNEJDjprAAYFQztYCglYWAlwzi2y053kn17Vj4AK9djJmo3jPP94exqv7zR6prFXvy8D+AG59DGExiJpoKC0gFQ9pmxUzwhNbqsBJ2iq+QNw+RI4rlZUrAAAAABJRU5ErkJggg%3D%3D%27%3B%0A%7D%3B%20%20%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28function%28%29%20gPrefService.removeObserver%28s%2C%20toggleImage%2C%20false%29%20%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Огромное спасибо. Вы опять выручили.

есть кнопка (в готовых брал), которая показывает название вкладки и фавикон сайта. можно ли сделать доп. функционал - при нажатии на название вкладки, которая эта кнопка показывает или на фавикон ЛКМ - копировался адрес в адресной строке (ну или другими словами URL данной страницы).
код кнопки(инициализация):

скрытый текст
const iconSize = 16;
const buttonWidth = 700;
const defaultFavicon = "";


if (gBrowser.currentURI.spec == "about:customizing") return;

const labMarginLeft = 7;
var btnWidth = iconSize + 2*3;
var labWidth = buttonWidth - iconSize - labMarginLeft;
var btnMarginRight = labWidth + labMarginLeft;

var [img, lab] = document.getAnonymousNodes(this);
this.style.cssText = imp('\
    -moz-box-orient: horizontal;\
    -moz-box-pack: start;\
    min-width: ' + btnWidth + 'px;\
    max-width: ' + btnWidth + 'px;\
    margin-right: ' + btnMarginRight + 'px;\
');
lab.style.cssText = imp('\
    display: -moz-box;\
    text-align: start;\
    margin-left: ' + labMarginLeft + 'px;\
    min-width: ' + labWidth + 'px;\
    max-width: ' + labWidth + 'px;\
');
img.style.cssText = imp('\
    display: -moz-box;\
    width: ' + iconSize + 'px;\
    height: ' + iconSize + 'px;\
');
function imp(str) str.replace(/;/g, " !important;");

var mo = new MutationObserver(() => lab.value = self.tooltipText = document.documentElement.getAttribute("title").split('- Mozilla Firefox')[0]);
mo.observe(document.documentElement, {attributes: true, attributeFilter: ["title"]});
mo.mutationCallback(addDestructor(() => mo.disconnect()));

var pl = {}, df = defaultFavicon || PlacesUtils.favicons.defaultFavicon.spec;
pl.onLinkIconAvailable = pl.onLocationChange = () => {
    var icon = gBrowser.selectedBrowser.mIconURL || df
    if (icon.startsWith("http")) icon = "moz-anno:favicon:" + icon;
    img.src = icon;
}
gBrowser.addProgressListener(pl);
pl.onLinkIconAvailable(addDestructor(() => gBrowser.removeProgressListener(pl)));

//addDestructor(() => { for(var node of [self, img, lab]) node.removeAttribute("style") });

/*Спрятать подсказки*/
(function() {
function onPS(e) {
if (e.originalTarget.nodeName != "tooltip" || window.__attributesInspector) return;
var node = e.originalTarget.ownerDocument.tooltipNode;
for (; node && !(node instanceof HTMLAnchorElement); node = node.parentNode);
!node && e.preventDefault();
}
const observer = {
observe: function(win) win.addEventListener("load", this, false),
handleEvent: function(e) {
var doc = e.target;
var win = doc.defaultView;
win.removeEventListener("load", this, false);
if (doc.location.href == "chrome://browser/content/browser.xul" || win.cbttp) return;
win.cbttp = true;
win.addEventListener("popupshowing", onPS, true);
win.addEventListener("unload", function onUL() {
win.removeEventListener("unload", onUL, false);
win.removeEventListener("popupshowing", onPS, true);
}, false)
}
}
addEventListener("popupshowing", onPS, true);
Services.obs.addObserver(observer, "domwindowopened", false);
addDestructor(function() Services.obs.removeObserver(observer, "domwindowopened"));
}) ();


upd:
появилась мысль, не знаю, трудная ли в исполнении...
вот есть эта кнопка - показывает название вкладки, можно ли сделать что бы при наведении на нее показывалась адресная строка - с возможностью ввода адресов, правки и т.п. (ну как обычная адресная строка, только без выпадающего списка)

Есть ли в Mozilla возможность работать с XButton`s мыши ?  У мну одна кнопка XButton на мыше Logitec и сейчас она делает что-то не понятное. То возврат назад по истории посещений, то подъём "вверх" по сайту.
А можно на неё вешать свои действия? лазал по MDN не нашел чета примеров кода совсем, упоминания есть об XButton, а как и что, нипанятна.

30-09-2015 20:14:02
LittleMontana
добавь в любое место

Выделить код

Код:

this.onclick = function(с) {if ( с.button == 0 )  gClipboard.write( content.location );}

по ЛКМ будет копировать адресс.
Есть здесь на форуме кнопка Autocopy+3 там есть возможность для ПКМ по иконе в адр.строке копировать адресс.

спасибо!

Есть вот такая кнопка google-translate от Lex1  https://forum.mozilla-russia.org/viewtopic.php?pid=591530#p591530
Можно ли сделать, чтобы она срабатывала по двойному правому клику?

Добавь в конец:

Выделить код

Код:

addEventListener('dblclick', function(d){
  if ( d.button == 2 ) {
       d.preventDefault();
       d.stopPropagation();
       ujs_google_translate('auto|ru');
       document.getElementById("contentAreaContextMenu").hidePopup(); 
       }        
}, false, gBrowser);

Спасибо.

Помогите пожалуйста с кнопкой. Есть кнопка (набор кнопок) Save+ (https://forum.mozilla-russia.org/viewto … 40#p493040). В ней есть кнопка "Сохранить ярлык страницы как.." Можно ли добавить ее в контекстное меню, чтобы сохранять адресс ссылки при клике на ней правой кнопкой, а при клике просто на странице сохранять адресс страницы?

Доброго времени.
Установил кнопку VT ( Firefox10+ )
Создаёт вертикальную панель слева
Не могу в нее перетащить кнопки.
Что делаю не так?
Скрин

KOMMEHTATOP
Как мне показалось в режиме "изменить" Вы вовсе не на панель кнопки перетаскиваете, а в никуда. В вот при выходе из режима настройки, при нажатии VT то что слева появляется уже на панель похоже. Возможно дело в размерах (панель просто не видно при настройках) ? В коде есть vtWidthCorrection, попробуйте поменять значение на другое.

Coroner пишет

в режиме "изменить

У меня этой панели с лева НЕТ!!!,размер я увеличивал.(-1на100)

KOMMEHTATOP пишет

У меня этой панели с лева НЕТ!!!

Куда же Вы тогда не можете кнопки перетащить ? В чём проблема ? Не можете перетащить или панели нет ?
Да и она похоже что есть. При первом нажатии на VT что появляется ? Просто работает не как надо. Устарел код видимо, хотя на [seamonkey]2.38 кое-как работает.

KOMMEHTATOP
Та кнопка на новых версиях(40+) не работет именно так. Ищи тут, автор делал исправления для новых версий FF.

Coroner пишет

Куда же Вы тогда не можете кнопки перетащить ? В чём проблема ? Не можете перетащить или панели нет ?
Да и она похоже что есть. При первом нажатии на VT что появляется ? Просто работает не как надо. Устарел код видимо, хотя на [seamonkey]2.38 кое-как работает.

Если честно перешел недавно с Opera.Поэтому установив эту кнопку,не пойму что и куда.Панель вроде есть ,но когда перехожу в режим "изменить - панели нет.

KOMMEHTATOP
Попробуйте этот вариант
http://forum.mozilla-russia.org/viewtop … 20#p693420

villa7
Респект.На ура:beer:

KOMMEHTATOP
Все благодарности bunda1, я только ссылку дал.

KOMMEHTATOP пишет

Лучше спросить у знающих - чем лезть не зная.

Вот еще вопрос интересует.Либо кнопку ибо расширение?
Ссылка

KOMMEHTATOP
Вопрос только в удобстве пользования, но кнопка предпочтительней, меньше ресурсов отъедает.

KOMMEHTATOP пишет

Вот еще вопрос интересует.Либо кнопку ибо расширение?

Вы про VT ? Я всё-таки в пользу расширения решил. Удобнее, если оформление под себя подгоняешь. Но расход ресурсов чуть больше.

Про ту-же кнопку спрошу : будучи установленной в [seamonkey] наползает на другие панели. Их несколько, они отсортированы, заголовок вообще убран, в общем всё нестандартно. Можно её верх привязать к рабочей области ? Простое редактирование стиля вроде

style: "-moz-appearance: none; display: -moz-box; height: 50%; position: fixed; min-width: 40px; top:200px"

не решит проблему, так как панели в [seamonkey] могут быть свёрнуты и вновь развёрнуты при помощи grippy. Как бы ей указать появляться относительно рабочей области ?

Доброго времени.
Очень не хватает кнопки  радио.
1.Чтоб можно было редактировать радиостанции.(добавлять свои ссылки)
2.Чтоб была регулировка громкости.
Вот похожее расширение для Opera - Хрома-.
Snimok2.1445586066.jpg или Bezymyannyj-1.1445586699.jpg
Или хотя бы похожее расширение?

у меня с этой №40 чуть отредактированой так kiss_253kb.1445859156.png редакция путь прописать kiss_453kb.1445859259.jpg

KOMMEHTATOP
Советую дабы не нагружать браузер лишними расширениями, и тормозами, установить отдельную прогу, можно выбрать здесь -
http://www.softportal.com/dlcategory-355-1-0-0-0.html
но советую сразу эту
http://www.radiocent.ru/
море радиостанций, запись, добавление своих. А чтобы включать-выключать из браузера вот кнопка. ЛКМ - включить ПКМ-выключить. Путь к проге свой пропишите если что, здесь по умолчанию C:\\Program Files\\Radiocent\\Radiocent.exe

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

Выделить код

Код:

this.onclick = function(event) {
    if(event.button == 0) {
        // Действие при клике ЛКМ


function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("Файл не найден", path); 
};
startProcess("C:\\Program Files\\Radiocent\\Radiocent.exe",[""]);
    }
    
    else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Действие при клике ПКМ без модификаторов
var file = Components.classes["@mozilla.org/file/local;1"]
                     .createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\WINDOWS\\system32\\taskkill.exe");


var process = Components.classes["@mozilla.org/process/util;1"]
                        .createInstance(Components.interfaces.nsIProcess);
process.init(file);


var args = ["/F", "/IM","Radiocent.exe"];
process.run(false, args, args.length)
    }
};
this.oncontextmenu = function(event) {
    if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Блокируем контекстное меню при клике ПКМ без модификаторов
        event.preventDefault();
        event.stopPropagation();
    }
};

villa7
Пользовался в Opera этим расширением
https://chrome.google.com/webstore/deta … _medium=et
Тормозов нет-просто удалял ссылки из радио ,и добавлял свою одну или две. К примеру:http://81.19.85.204/nashe128.mp3 Наше радио

Для     Mozilla Firefox Есть похожее в Элементы яндекса: Радио,нет только громкости,но есть редактор радиостанций.Но элементы яндекс: напичкано лишнего -город,погода,почта,радио и т.д.А мне нужно только радио.
Я поэтому и спросил может кто создал просто кнопку.,где можно добавить ссылку радио.

101.ру портбельная с записью http://rghost.ru/6dQP652mF  kiss_58kb.1445862749.jpg   kiss_70kb.1445862723.jpg и да с кнопкой попутал

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%u043D%u0435%u0448%u043D%u0438%u0435%20win%20%u043F%u0440%u0438%u043B%u043E%u0436%u0435%u043D%u0438%u044F%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMAAwQAKCImDyo4IWkYaBzFQ6xI8FG/V/VCq0jcGGQbkwAQACQAAAAAAAIAAwAAAAAAAAAAAAAAAAEAAAIAAgIAQy4iYp9YOuZUah3/QMJQ/nfxgP97+Yb/f/+L/m/7ev87v0L1BzwIawAAAAAAAgADAAAAAAEAAAIAAAAAQR4Ki7pwNP//tG79aXQg/CGwM/tL3lP+SeJU/krmVf5I5lT8ROZQ/SjIMf8DQgWFAAAAAAACAAMAAAAAMRoKX5hKHP/qoVT69JtU/WVsGP8RmyP/LMAz/ynHM/4ozTP8Jc4w+x/KK/sbxyn7Daoa/wAlA1QAAAEAAgAAA2o5G9GhVyT/z305/N54Nv9eWxTyAnMR6Qp+DvsIig//CpQR/wucE/8KnQ//CpkG/QedAf8FZADWAwIACigYIklrMln7h0VB/6dcJPvBaCz/XC8RlgABAAACDgAlABUANAAfAUsAKABeAz8RlAhfUvkDZnP/CFtw+gcXKklSLEeVlUiB/6VamPykYGD7o1wl/2A4H5YAAAAAAgEBBAAAAAAAAQMEAAAAAAUoVmcHcfT/AIL5+QCK//8BOZ2rXjJRsJtOhf/SgLr9zoK++5hbW/9AKhaGAAAAAAICAQYAAQACAAMDBwAAAAABLlprD4///wqh9/oJsf//Al7M1FsxT6ucUYf/1Iq//Oyd1vzYkMf/X0FVhQAAAAADAgMEAAAAAAACBAQBAAAAAC1aYRSQ//8lpPr6Irj//wtt1t5GJT2DmlCF/82Juvz2reH/8Kbb/eej1P9jR1t+AAAAAAMCAwQBAwUGAAAAAAYkV2wjkv//PLP7+jzE//8VaMXMHhAaP5FLff+4d6b++rno//iz5P/3suP88rLg/2hPYn8AAAAAAQAAAAgPYW1bXeD/PJL0/1DB/fxSy///EkiRlwAAAABqOFzBp16S/+ev2Pz/we///b7s//u86vr7wev/dFxfcgAJYmhxeP//lJH+/juS+/5q0f/+V7n4/AASODwAAAAAHA4YP5NMgP+6fKj9/Mzw/f3H8/7/y/X/7LvU811Ywd54gPv8r6z//puZ/P1Akff5g+L//y5hmZ8AAAAAAgECAwAAAAA1Gy5vmlGG/8iOuP3/1vX/8sfe811YxNZ6g/f5ubb9/a6u+/uvrfz8TZPt/1GFvMcAAQwNAQAAAAAAAAACAQEDAAAAACoVJVh/QW3umWuP7V5fzeSMk/j9zcn//7+//v7Av///o6Pz+yU2XH0AAwYKAQAAAAAAAQEAAAAAAAAAAAEBAQMAAAAADwkHFAcCKUsJGb3VO0vn9lRf5/RdZMzXRkmTmw4OKTUAAAAAAgIDAwABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20................................%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%7D%3B%0A//this.type%20%3D%20%22menu%22%3B%0A%20%0A%20%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20................................%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%20%20%7B%20label%3A%20%22IE%22%2C%20value%3A%20%22c%3A/Program%20files/Internet%20Explorer/iexplore.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAADp//8Aye/+AJXW/AeX0fsekc/8CpPR+QHGspoBxJ6BALeXhADFooQAupqCAMSjhAC+n4MAvp+DA8OjgwG8nYIAuJuCAM7//gB62/4mCq7+oBGn/mwIp/8xCKHzAoBWKhKdRgBVnFACh6xeAJWgVACHlEoAV3cxABZrJwAAfTcAAm4rAAFlJQAA0f/+AFHX/qg0tv6PRq7rAE2RrwGNdEhdx30V4eGWIf/spS3+7acx/+2mLv7kmyb/zYMX5pZSCmqFRAcCeTwGAXI2BQHE//0BRNP9u0au/1+fcWIAtlYAb9qBCv/ooCj+7607/fi2RP/2tUL/+LZC//CtOv7rpS/93ZAa/6RcBo1wNAEAbzMBAbr//gJb3/2wGbT/gpJuOiPUfQj64qIx//O2R/z2u0z+0I81r76AMnK7fjGS8bBE6ve1Qf/uqDL93I0X/5ZPBGd9PgMAsv/+AX3z/oQjwf/Osok/t+aWG//utUj8+8NW/7Z0J3VhLwcAn2EjA3g7DwCOThsz1pk91uKhOebWkCfstWsQwIpHBAqf//4Alf/8SjPW/+uIoon//K4s+/jNYf/iqUjKgywGAJpaHAC5cyQAtG0gAHk2DAB/OAUJjkgID4dECQ2KSQoQjUoGApz9/QCh//wPaPH/tiy98//Uwm/8/9xm/+vCY+XeqU6s5K9SsNyoTq/cpkuv4KhHsdicPa3SkDKqyoQgq7hsDKudUwdcR/7+A0D//wBv8N9iTtr1/0zE4v314n3//+qD//7riv//5oX//+WD///gff/+2nT//dNp//vFV//wrjf+1IUR/6ldB5xraUMCZGZFAJFmLS612qL1MN7//2/Q3P/yymjPrWYnNrh5MkK4di1Bu3swRbJuJTHSmECl+8pc/+moNfrNghP6oVoNa6A6AQGgOgEAmz0CBN2gNsqs9c//Ktj//3K+xPS5ZBk2pVEMAKtlIwOeTxMAbSoEDue1Us/7yl3/5qUw/8x4CuemTwAekUQLAJJGDAOMPQgAs2gXYffPX/+l9+D6K9n//3C+wujIgjRpyII0KrBuLUHUpE/B/9tw/++8T/jkmx//o3kxjXRxYABACgIAQQsCAD0IAQBJEwUB0I4tpv7db/+t+N36Md3//V3M4f/n3Yv1/+x9+/3ogP/zzWT96bVC/9Z8BclFnKwbGrX/AzQAAAA1AQAAMAAAAUIMAgClWRgJzo8xnfnSZf/L+8j/UOn//zzQ9/+12679/tlm+fu5O/vafQuxpGwqETCq5R0iqv8nOwUEADwGBAA3AgMASRMHAahcGgGeUhYBv38tStyjRavc04rdhOHd6j3R//drxc3/jquPrXeKexJSutYSLrn/cC+n+CEpAAAAKgEAACUAAAA4CQAAoU4IAZxLBQKvYxQAdCoGALVbCQ3ErGcYevb9O1Lo/4gv2v61Jdf/vCXI/7QmrPpWSZPnAJyBgQCcgYEAmoCBAKOIggDTrowA0ayLANy6lAPCoYsC2raTAN7YvQC++f4AwPr9ALr2+wuq7fsmpOf9F57a/ACrzfMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20%22Explorer%22%2C%20value%3A%20%22c%3A/windows/explorer.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQEBAQABAQEAAgICAgICAgMAAAAANzc3Q5mZmbTDw8PiwsLC66urq9hvb2+VFhYWHwAAAAgBAQEFAAAAAAAAAAADAwMMAQEBBgAAAAICAgIEAAAAADY2NkPKysr/1tbW/uDg4P/Y2Nj/1dXV/sXFxf+Jh4feBQUFRQAAACgBAQEMCAgIEHRzc9ZdXV3TSkpKvjs7O4YBAgIeMTExQb29vf/DwsL/xcPC/ra0s/6Xlpb9jpCR/5yio/Q0NTVsAAAAIgEBARAWFhYlrqam95KRkf+Xl5f+j4+O8n99fd4KCgk8HyAgW3h8fciWnqD8iZOW/5SanP+vqKf+w6ml/7aysewPEBAUAAAAABgXFyi4rq73kpGR/5eXl/2goqL/oayt/36DhtZ6dnjRh3Jy65VnZf6gVU7/s01A/7U1JP+0JBD/wamm/yMpKSoAAAAAFxYWKbGoqPmjoqL/r7Gx/pqSk/6GSUT+lTw2/5IkHP+SEQX/mgYA/6sZC/+8NyP/wz4q/8k+KP3Pq6X/NTw9RAAAAAATEhMopZ2e+bCvr/+8v7/+rqGi/48bFP+LFAv9igsC/ZoPAf6oEQD/w0Eu/9puXP/fbVn/42ZP++CxqP9HT1FeAAAAAA8QDyaOkIz0tbS0/8HCwf66uLj/nEdC/6A7Mv+ZFAb/qBQB/7gTAP/aZFD/7JSE/++RgP/0jXn777mv/11kZn0AAAAABwcHImluaPXEw8T/wsHB/r/AwfyoZmL+pzwx/6AOAP+2GQH/yx0A/+2Qf//5tqn/+7Sk//6yoPv7yLr/c3h5mAAAAAAAAAAIVVRVgbq7u9DX19f53+Tl/7N+ev6mIxX/sxUA/84dAP/oMxD//r2w///Qw//+0MH//tPC+//YyP+LjI21AAAAAAAAAAAAAAAABQUFASgnJyBweXpprnZx9qQMAP+/HwX81xgA/PFTNfv+4tv7/uDW+//j2P3+5tv9/+bY/6upqNAAAAAAAAAAAAEBAQQBAQECAAAAAAkSEgGWZ2bYrQUA/8ocBP3oHAD//oBm///t5f//3dH//N3R//DXzfzv2dD2raurvgMDAwUAAAAAAAAAAAEBAQADAgIEAAIDAJSDgrSpY1vynGVcy5VrY7OGcm2YbmZkeFdTUV09PT0/KiwsKRkbHRIJCgoEAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAPT8/FRcjJQsACQsAAAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAADAwICBAQDAwQDAwMEAwMDAwICAgICAgIBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%7D%2C%0A%20%20%20%20%20%20%7B%20separator%3A%22%22%20%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20%22Cmd%20Prompt%22%2C%20value%3A%20%22C%3A/windows/system32/cmd.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5eSj/+Xko//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+Xko//l5KP/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD///////////8AAAD/l5KP/5eSj/8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAP//////AAAA/wAAAP8AAAD/AAAA/5eSj/+Xko//AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP+Xko//l5KP/wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD//////wAAAP8AAAD/AAAA/wAAAP8AAAD/l5KP/5eSj/8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/5eSj/+Xko//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+Xko//l5KP/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/l5KP/5eSj//NzMr/zczK/83Myv/NzMr/zczK/83Myv/NzMr/zczK/83Myv/NzMr/zczK/83Myv/NzMr/zczK/5eSj/+Xko//4NnT/+DZ0//g2dP/4NnT/+DZ0//g2dP/4NnT/+DZ0//g2dP/kXhn/+DZ0/+ReGf/4NnT/5F4Z/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEH//6xB//+sQQ%3D%3D%22%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20%22Media%20Player%22%2C%20value%3A%20%22C%3A/Program%20Files/Windows%20Media%20Player/wmplayer.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAACzs7QACgsLDQAAAC4BAQIxAAABMQAAATEAAAIxAAEDMQIAATEFAAAxBQAAMQUAADEFAAAxBgEBMQIAAC4LCgoNs7OzAC0tLQpEPjqSj31t44x4Z92LeGjeinVl3oVtYd6FaVzec3Jv3lt5g95bdn/eWHiB3ld4gN5Vd3/dWnmB4zU9QJIvLi0KMjY4MrOMcvXvllT//ali/v+vZf//r2b/+JdW//9uK/+Jjo3/DMb//ynJ/P8v0v//LNP//yzS/v4iyPf/Upaq9TozMTI0Oj43pnhc+NyCRf/lllf8+adh/f+lWv30oWb9+qN6/by5s/1yzuz9SMzv/SPT/v0u0v39Lsbx/CPC8v89i6P4PTIvNzU8Pzeidl75xm87/9+ETP76iEr/8LyY//fz8P/8/////v/+///++v/48en/lczY/yTB9f8pvOn+ILXj/0OLovk9MzA3OD5AN5tvW/m2XjH/4Gg3/vGylP/9//////7+///////9////+v/8//z99P//5M7/m7G5/x2v4f4eqtf/RYif+T41Mjc5P0E3lGtc+apIIv/Ld1T+++fX///67//lwKj/36yQ//vn2f///e///u7d//rTwP/6r5T/VJy2/hCh0v9Jhpv5PzYzNzk+QTeVa1j5oUAS/9WTdv7/1b///+jU/7+IbP+MOhX/rWJA/8+Vef/3yrP/+cWu//mihf+Yi47+C53Y/0yJo/k/NzM3Oz4+N4Fnavl0PUH/0JB8/vy8nf//0rb/unhc/3snCP+CMRL/gSwM/448Hf/XkHT/9pt//6x7bv4VkJv/TYiN+UA3NzdAPjI3U2K3+RE68v+xiaL+/rqV//zMtv/XmHj/uGQ3/7FYKv+oUSb/vndV/+ajhf/0mIL/p3xR/gyMAP9JhT75QDhCNz48MDdWZLj5M1j//6GXzf7/0rb/++DX//TMs//usor/7bua//rWu///27//98Ch//aeif+Sk13+J6ci/02IRPk/N0A3OzkuN2BuvPlad///f4/w/u7Y0///8eb/+ung//zq3v//8uX//+bS//rRtP//waP/2ZqB/2OvU/5EtTj/W5JU+T01Pjc5Ny03ZXO5+XGI//+Alf3+p7Dw//nz7v////v///33///06v/+7N7//93K/+eznP+CtGj/WsNT/k+5Qv9flln5PDQ8Nzc2LTZrd7T4hZn//5im+/6Wpv7/qrX0/9rd8P/x7/H/9vDr/+3j1v/Kyqr/h8d4/2rRY/9nw13+WcJO/2GWW/g7NDw2NTMsNHR9sfidrv/+o7H9+6q4//ysuv/8rLr+/LS+//ypxcr8qd6d/JTekPyA23f8eNRt/HHRaftk0Fr+Yphc+DoyOzRiYV4TbXKP3ZCc5P+VoOL9maTi/56o4v+hreL/o6zq/5Gtsv+YyY3/lcSQ/4PAev9zvWr/brxm/We6YP9ig1/dZGBkE9/f3wCUlJQwkJCTgouMjn+NjY9/jY2Pf42Nj3+NjZB/jY6Of42PjH+PkI5/j5COf42QjX+Mj4t/kZSQgpWVlTDf398AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20%22Task%20Manager%22%2C%20value%3A%20%22C%3A/windows/system32/taskmgr.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGQkP96eHj/kZCQ/wAAAAAAAAAAAAAAALu8vP+7vLz/tLW1/5ucnP+bnJz/n6Cg/6CgoP8AAAAAAAAAAAAAAAC4ubr/lJSU/6aoqf8AAAAAAAAAAAAAAAAAAAAAyMnJ/8TGxv+5urr/qqur/6CgoP8AAAAAAAAAAAAAAAAAAAAAq6ys/7+/v/+lpaX/AAAAAAAAAAAAAAAAAAAAAAAAAAC5urr/ioqK/5ubnP8AAAAAAAAAAAAAAAAAAAAAAAAAAK6vr//R0dH/q6ur/8XKzP/AwcH/vr+//7u8vP+4ubn/tba2/6qqqv+oqKj/pqam/6SkpP+ioqL/oKCg/7Cztf+trq7/0dHR/6urq//Nz8//zc/P/83Oz//Mzs7/y83N/8rMzP/Hycn/xsnJ/8bJyf/FyMj/xcjI/8THx/+goKD/ra6u/9HR0f+rq6v/ztDQ/62urv8AAAD/AgIC/wAAAP8CAgL/CgoK/xcXF/8YGBj/Ghoa/xMTE//FyMj/oaGh/66vr//R0dH/rKys/8/R0f+rrKz/FxcX/xgYGP8LCwv/EBAQ/yUlJf8rgin/IaYe/0JCQv8rKyv/xMfH/6Ojo/+XvqX/APJH/2HCgv/P0dH/qamp/ycnJ/8aGhr/Dg4O/xUVFf8xWjD/Jbkh/yyfKv84jjb/QkJC/8XIyP+lpaX/q6ys/0dDQv96eHj/0dLS/6Ojo/8O8gn/EKQN/xISEv8aHhr/GtMW/11dXf9ZWVn/Jckh/w/wCv/Hysr/q6ur/8LFx/++vr7/wMLD/9DS0v+ioqL/ICAg/xF3D/8WexT/FbMS/1p1Wf9oaGj/ZmZm/2hoaP9gYGD/x8rK/62urv8AAAAAAAAAAAAAAADR0tP/oKCg/xEREf8XFxf/FqgS/yJpIP91dXX/cnJy/3R0dP92dnb/a2tr/8jKy/+wsbH/AAAAAAAAAAAAAAAA0dLT/6CgoP8SEhL/HR0d/ycnJ/8zMzP/aGho/2BgYP9fX1//XFxc/1VVVf/Jy8v/srOz/wAAAAAAAAAAAAAAANHS0/+goKD/oKCg/6CgoP+ioqL/pKSk/62urv+wsLD/srOz/7W2tv+4ubn/ycvM/7W2tv8AAAAAAAAAAAAAAADM0NP/0dLT/9HS0//R0tP/0NLS/9DR0v/O0ND/zc/P/83Pz//Mzs7/y83N/8rMzP++wsT///+sQf//rEEcB6xBHg+sQR8frEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxB4ACsQeAArEHgAKxB4ACsQQ%3D%3D%22%7D%2C%20%0A%20%20%20%20%20%20%7B%20label%3A%20%22Control%20Panel%22%2C%20value%3A%20%22C%3A/windows/system32/control.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+QkmS9vr7/tLS1/6usrf+foKD/kJGS/5CSk/+PkJJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2t7j/1dTU/+fn6P/o6Oj/1NTU/7Kzs/+QkJD/j5CS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPkJJkpKSk/+Xk5P/08/T/7u7v/93e3v/FxMP/nZyc/4KBgv+PkJJkAAAAAAAAAAAAAAAAnnZKZKl9SP+kdkP/oHNB/55wQP+urq7/8O/v/+ro6P/d3Nv/vby6/5OTk/+db0D/nW9A/51vQP+fd0v/nnZKZK+BRP/01qf/7s6W/+zIjv/sxIj/l5eW/7a2tv/CwsH/vLu7/5mZmf+NiIH/5a5i/+WpXv/lplz/4qRc/552Sv+wgUD/8dGc/9qtYv/Yqlz/1aVX/8ObV/+ljWb/lolz/5KHdP+hh13/uok//8OGLf/DfSb/w3Qi/+KjWP+edEf/s4RB//DSov/br2T/2Kxe/9GbSf/PmEX/zJI+/86ZQ//KlD7/x484/8WMNP/EhzD/w4Ao/8N5I//ipFn/nnRH/7eHQ//x1Kf/3K9m/9OfT//////////////////OlUL/y5ZA/8iROv/HjTb/xIkx/8OELP/DeyX/4qRa/550R/+8jUb/992x/9ekV///////zo8//82NPP/Lizn//////8yUP//Jkzz/////////////////w34n/+KmXP+edEf/vo9G//rku//frV3//////9CTQv8ap///YbDX/2zA9P/NlUH/ypU//8iPOf/HjDT/xIgx/8OBKf/iqWL/nnRH/8CRSP/65L7/4K1d///////XmEj/XrHb/xqn//8ap///zqJY/82YQ//////////////////DhSz/4q1m/550R//ClEn/+ebB/+3Cdv/hrV3//////27B9f8ap///0bR3/9qiTf/bpU3/2aBH/9WaQf/SlTz/0JE4/+27dP+id0r/xJVJ//nmw//txHj/78N2/9+sXP/bpVL/3atc/+KvW//irln/3qlR/9yjS//Zn0X/15tB/9WXPf/xwX7/pHlL/8eYUf/25L//+u3P//vtz//77M3/++nI//rmwv/647z/+eC1//jcr//32an/99aj//bUnf/1zpb/4bJr/6N6Tv+edkpkwplV/76TT/+6j03/topK/7GFSP+tgUf/qHtF/6R3RP+hdEL/nnFB/55xQf+ecUH/nnFB/6F5Tf+edkpk//+sQfAPrEHwD6xB4AesQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%7D%2C%0A%20%20%20%20%20%20%7B%20separator%3A%22%22%20%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20%22Notepad%22%2C%20value%3A%20%22c%3A/windows/notepad.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20%22Calculator%22%2C%20value%3A%20%22C%3A/windows/system32/calc.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/Io//Dmlr/uo9N/7WJSv+vg0j/qn1G/6V4RP+hdEL/nnFB/55xQf+keUz/y7Sa/wAAAAAAAAAAAAAAAAAAAADIoF7/9eLA/+TCj//kwY7/5MOR/+TElP/lx5j/5cic/+bNpf/04cL/9efQ/6R5TP8AAAAAAAAAAAAAAAAAAAAAyJxW//Tfu//gtnb/6+vt/9+0cv/r6+3/37l+/+vr7f/kyJ7/AJLw//bo0f+ecUH/AAAAAAAAAAAAAAAAAAAAAMmeWP/14b//4buD/9+2ef/guYD/4byG/+G+jP/hwZH/5s2p/wCS8f/26dX/nnFB/wAAAAAAAAAAAAAAAAAAAADLoFr/9eTH/+TBj//r6+3/4sCO/+vr7f/iwpT/6+vt/+TMpv8AkvD/9ejS/55xQf8AAAAAAAAAAAAAAAAAAAAAzKJd//jq0//p0Kr/6M2l/+jOpv/nzqf/586o/+fOqP/nz63/8N28//Ljy/+ecUH/AAAAAAAAAAAAAAAAAAAAAM2jX//5793/zalr//Tjxf/NqWv/9OPI/82pa//y4sj/zalr/+/buf/x4cn/oHNC/wAAAAAAAAAAAAAAAAAAAADOpWL/+e/g//blyv/04MH/8+DB//LgwP/x37//8d6///Ddvf/t2bb/8eLK/6J1Q/8AAAAAAAAAAAAAAAAAAAAAz6dk/+bQqv/kyZz/4sWX/+LFlv/hw5X/4MOU/+DBkv/fwJH/3sCQ/+HInv+leET/AAAAAAAAAAAAAAAAAAAAANCoZv/m0Kz//Pjz//369P/9+vT//fn0//z58//8+fP//Pjy//z38f/hyZ//p3tF/wAAAAAAAAAAAAAAAAAAAADRqWn/5tCs//369f/99u//+/Dj//rq1//448r/9t29//XXsv/8+PL/4cqg/6t+Rv8AAAAAAAAAAAAAAAAAAAAA0qtr/+bRrf/9+vb//vr1//z06//77t//+efS//fhxf/227n//Pjz/+LKof+ugkf/AAAAAAAAAAAAAAAAAAAAANKsbf/m0a7//fr1//79+//9+PL//PLn//rs2//45c7/99/B//z59P/iyqP/sYZJ/wAAAAAAAAAAAAAAAAAAAADTrW//5dGv/0iy/P86rf3/Oq39/zqt/f86rf3/Oq39/zqt/f8/r/3/48yl/7WJSv8AAAAAAAAAAAAAAAAAAAAA1rN5//Xu4v/z6tn/8+rb//ft4P/48OP/+O/i//ft3//169r/8ujV//Lo1v/AmmH/AAAAAAAAAAAAAAAAAAAAAOjUtP/Vsnj/0qxt/9Gqaf/Qp2X/zqVh/8yiXf/Kn1r/yJxW/8SZU//HoWX/38qr/wAAAAAAAAAAwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQQ%3D%3D%22%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20%22Virtual%20Keyboard%22%2C%20value%3A%20%22C%3A/windows/system32/OSK.exe%22%2C%20image%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAACAgIDAAAAAC0tLU5EREWrMjMzkUFBQYlJSUmFT09Ph09PT4dKSkqFQkJBiTMzM5FFRUarLS0tTgAAAAACAgIDAgICBAAAAAAkJCRMNzg4lltcXMZ7e33/VlZX/TExMf8vLy//VVZX/X+Agv9dXl/GOzs7liQkJEwAAAAAAgICBAAAAAAAAAAAAAAAAAAAAAAHBgUDDAsLAUNCQ7MZGBj/FhUU/0FAQbMMCwwBBwYGAwAAAAAAAAAAAAAAAAAAAAAMDQ0OBgwNDgcNDhAJDhATBwwOEwAAAABBRUaAMTc6/yYsLv8/QkSAAAAAAAYLDRMIDQ8TBgsNEAYKDQ4MDQ0OYFtZ8Vk/N/FgRT3xX0Q88V9EPPJiRz7yWT41+jsgF/84HRT/WT42+oRrYfKJcGbyiW9m8Y51avFtVkrxXVdV8WFBNf/OIAD/4SUB/9wkAP/dJAD/3SQA/90lAf/iKwb/4ywH/94nAv/jLQj/5S4J/+UuCf/pLgj/0iUA/2JBNf9mRTn+1CAA/uYkAf7hIwD+4iMA/uIkAP7kIAD+4hgA/+AYAP/lHAD+4hkA/t8YAP7gGQD+5SEB/tMfAP5oRjr+ZUQ4/8cdAP/XIAH/0x8A/9MgAf/XGwD/wTQc/6RgVP+oYVX/pk09/6dXSf+nYlb/pVpN/8wkB//KHAD/ZkU6/2REOP/AHQD/zyAB/8sfAP/LIQP/zhQA/7xdTP/K3eH/197h/6empf+9w8X/1eDi/8PKzP+/LxX/wxkA/2VGO/9kRDj/ux0A/8kgAf/GHwD/xiID/8kVAP/BXUv/z9LV/+Tc2f+4qKL/xby4/+Db2v/Tycn/vy8V/78ZAP9lRjv/ZEU4/78fAP/NIgX/yiEE/8ojBf/IFQD/tU8+/6yxs/+7t7//nIqT/6Capf+7trz/tKuo/7ssEf++GwD/ZUY6/2VFOP/HLQD/1jQB/9QxAP/JOAv/oHlv/52HgP+NgYX/cWaW/4eDpv+Afqr/eGiS/5WGgf+hiIL/l2JT/2NEOP9lRjj/0z8A/+RIAv/jRAD/0E4S/9PR0f/t7Or/x8PO/52Yuf/07+P/39vc/5yYvf/c19n/6+/x/7qknf9eQTb/Z0g6/+ZTAP/5YAP/+FsA/+RjFv/Bv7//09XV/8HBzv+Wlbj/1NXL/9TT1v+Zlr7/xcXK/93h5P+3oJn/YUQ4/2BCNP/aUAD/7l4C/+taAP/fXQv/q4x8/7Cajv+pi4P/gmWJ/5KFof+Qgqf/iWiE/6yQgP+zn5b/pHVe/14/Mv9mX1z/YEI0/2hIOv9mRzn/Zkc4/2RGN/9jRjj/Y0U2/2BCPP9XP0L/VT5B/15COv9hRTj/YEU6/1s/Mv9mXl3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%22%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20%22Character%20table%22%2C%20value%3A%20%22C%3A/windows/system32/charmap.exe%22%2C%20image%3A%20%22data%3Aimage/png%3Bbase64%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%3D%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0Avar%20menuPopup%20%3D%20self.appendChild%28%20document.createElement%28%22menupopup%22%29%20%29%3B%0Aarray.forEach%28function%28%20m%20%29%20%7B%0A%20%20%20%20%20%20if%20%28%20%22separator%22%20in%20m%20%29%20%7B%20menuPopup.appendChild%28%20document.createElement%28%22menuseparator%22%29%20%29%3B%20return%20%7D%3B%0A%20%20%20%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22label%22%2C%20m.label%29%3B%20%20%20%20%20%0A%20%20%20%20%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22image%22%2C%20m.image%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22value%22%2C%20m.value%29%3B%0A%20%20%20%20%20%20mItem.addEventListener%28%22command%22%2C%20function%28e%29%20%7B%20startProcess%28%20m.value%20%29%20%7D%2C%20false%29%3B%0A%20%20%20%20%20%20menuPopup.appendChild%28mItem%29%3B%0A%7D%29%3B%0A%0AmenuPopup.setAttribute%28%22onclick%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%0A%0A%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u044F%20%u0437%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u0442%20win%20%u043F%u0440%u0438%u043B%u043E%u0436%u0435%u043D%u0438%u044F%2C%20%u0432%u044B%u0431%u043E%u0440%20%u0437%u0430%u0432%u044B%u0441%u0438%u0442%20%u043E%u0442%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430%20%27value%27%20%u0432%20%u043C%u0430%u0441%u0441%u0438%u0432%u0435%20................................%0Afunction%20startProcess%28%20path%20%29%20%7B%0A%20%20%20%20%20%20var%20file%20%3D%20Cc%5B%27@mozilla.org/file/local%3B1%27%5D.createInstance%28Ci.nsILocalFile%29%3B%0A%20%20%20%20%20%20file.initWithPath%28%20path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%20%29%3B%20%0A%20%20%20%20%20%20file.launch%28%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5Bnull%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E/*CODE*/


инициализация
скрытый текст

Выделить код

Код:

// Настройка функций кликов мыши ................................
this.onclick = function(e) {
     if ( e.button == 0 )  menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
};
//this.type = "menu";
 
 

// Создать меню ................................
var array = [ { label: "Плеер", value: "c:/Program files/DAUM/PotPlayer/PotPlayerMini.exe", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAADp//8Aye/+AJXW/AeX0fsekc/8CpPR+QHGspoBxJ6BALeXhADFooQAupqCAMSjhAC+n4MAvp+DA8OjgwG8nYIAuJuCAM7//gB62/4mCq7+oBGn/mwIp/8xCKHzAoBWKhKdRgBVnFACh6xeAJWgVACHlEoAV3cxABZrJwAAfTcAAm4rAAFlJQAA0f/+AFHX/qg0tv6PRq7rAE2RrwGNdEhdx30V4eGWIf/spS3+7acx/+2mLv7kmyb/zYMX5pZSCmqFRAcCeTwGAXI2BQHE//0BRNP9u0au/1+fcWIAtlYAb9qBCv/ooCj+7607/fi2RP/2tUL/+LZC//CtOv7rpS/93ZAa/6RcBo1wNAEAbzMBAbr//gJb3/2wGbT/gpJuOiPUfQj64qIx//O2R/z2u0z+0I81r76AMnK7fjGS8bBE6ve1Qf/uqDL93I0X/5ZPBGd9PgMAsv/+AX3z/oQjwf/Osok/t+aWG//utUj8+8NW/7Z0J3VhLwcAn2EjA3g7DwCOThsz1pk91uKhOebWkCfstWsQwIpHBAqf//4Alf/8SjPW/+uIoon//K4s+/jNYf/iqUjKgywGAJpaHAC5cyQAtG0gAHk2DAB/OAUJjkgID4dECQ2KSQoQjUoGApz9/QCh//wPaPH/tiy98//Uwm/8/9xm/+vCY+XeqU6s5K9SsNyoTq/cpkuv4KhHsdicPa3SkDKqyoQgq7hsDKudUwdcR/7+A0D//wBv8N9iTtr1/0zE4v314n3//+qD//7riv//5oX//+WD///gff/+2nT//dNp//vFV//wrjf+1IUR/6ldB5xraUMCZGZFAJFmLS612qL1MN7//2/Q3P/yymjPrWYnNrh5MkK4di1Bu3swRbJuJTHSmECl+8pc/+moNfrNghP6oVoNa6A6AQGgOgEAmz0CBN2gNsqs9c//Ktj//3K+xPS5ZBk2pVEMAKtlIwOeTxMAbSoEDue1Us/7yl3/5qUw/8x4CuemTwAekUQLAJJGDAOMPQgAs2gXYffPX/+l9+D6K9n//3C+wujIgjRpyII0KrBuLUHUpE/B/9tw/++8T/jkmx//o3kxjXRxYABACgIAQQsCAD0IAQBJEwUB0I4tpv7db/+t+N36Md3//V3M4f/n3Yv1/+x9+/3ogP/zzWT96bVC/9Z8BclFnKwbGrX/AzQAAAA1AQAAMAAAAUIMAgClWRgJzo8xnfnSZf/L+8j/UOn//zzQ9/+12679/tlm+fu5O/vafQuxpGwqETCq5R0iqv8nOwUEADwGBAA3AgMASRMHAahcGgGeUhYBv38tStyjRavc04rdhOHd6j3R//drxc3/jquPrXeKexJSutYSLrn/cC+n+CEpAAAAKgEAACUAAAA4CQAAoU4IAZxLBQKvYxQAdCoGALVbCQ3ErGcYevb9O1Lo/4gv2v61Jdf/vCXI/7QmrPpWSZPnAJyBgQCcgYEAmoCBAKOIggDTrowA0ayLANy6lAPCoYsC2raTAN7YvQC++f4AwPr9ALr2+wuq7fsmpOf9F57a/ACrzfMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
      { label: "Explorer", value: "c:/windows/explorer.exe", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQEBAQABAQEAAgICAgICAgMAAAAANzc3Q5mZmbTDw8PiwsLC66urq9hvb2+VFhYWHwAAAAgBAQEFAAAAAAAAAAADAwMMAQEBBgAAAAICAgIEAAAAADY2NkPKysr/1tbW/uDg4P/Y2Nj/1dXV/sXFxf+Jh4feBQUFRQAAACgBAQEMCAgIEHRzc9ZdXV3TSkpKvjs7O4YBAgIeMTExQb29vf/DwsL/xcPC/ra0s/6Xlpb9jpCR/5yio/Q0NTVsAAAAIgEBARAWFhYlrqam95KRkf+Xl5f+j4+O8n99fd4KCgk8HyAgW3h8fciWnqD8iZOW/5SanP+vqKf+w6ml/7aysewPEBAUAAAAABgXFyi4rq73kpGR/5eXl/2goqL/oayt/36DhtZ6dnjRh3Jy65VnZf6gVU7/s01A/7U1JP+0JBD/wamm/yMpKSoAAAAAFxYWKbGoqPmjoqL/r7Gx/pqSk/6GSUT+lTw2/5IkHP+SEQX/mgYA/6sZC/+8NyP/wz4q/8k+KP3Pq6X/NTw9RAAAAAATEhMopZ2e+bCvr/+8v7/+rqGi/48bFP+LFAv9igsC/ZoPAf6oEQD/w0Eu/9puXP/fbVn/42ZP++CxqP9HT1FeAAAAAA8QDyaOkIz0tbS0/8HCwf66uLj/nEdC/6A7Mv+ZFAb/qBQB/7gTAP/aZFD/7JSE/++RgP/0jXn777mv/11kZn0AAAAABwcHImluaPXEw8T/wsHB/r/AwfyoZmL+pzwx/6AOAP+2GQH/yx0A/+2Qf//5tqn/+7Sk//6yoPv7yLr/c3h5mAAAAAAAAAAIVVRVgbq7u9DX19f53+Tl/7N+ev6mIxX/sxUA/84dAP/oMxD//r2w///Qw//+0MH//tPC+//YyP+LjI21AAAAAAAAAAAAAAAABQUFASgnJyBweXpprnZx9qQMAP+/HwX81xgA/PFTNfv+4tv7/uDW+//j2P3+5tv9/+bY/6upqNAAAAAAAAAAAAEBAQQBAQECAAAAAAkSEgGWZ2bYrQUA/8ocBP3oHAD//oBm///t5f//3dH//N3R//DXzfzv2dD2raurvgMDAwUAAAAAAAAAAAEBAQADAgIEAAIDAJSDgrSpY1vynGVcy5VrY7OGcm2YbmZkeFdTUV09PT0/KiwsKRkbHRIJCgoEAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAPT8/FRcjJQsACQsAAAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAADAwICBAQDAwQDAwMEAwMDAwICAgICAgIBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
      { separator:"" },
      { label: "GPU-Z", value: "C:/Program Files/GPU-Z 0.8.3 RePack by loginvovchyk.exe", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5eSj/+Xko//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+Xko//l5KP/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD///////////8AAAD/l5KP/5eSj/8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAP//////AAAA/wAAAP8AAAD/AAAA/5eSj/+Xko//AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP+Xko//l5KP/wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD//////wAAAP8AAAD/AAAA/wAAAP8AAAD/l5KP/5eSj/8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/5eSj/+Xko//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+Xko//l5KP/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/l5KP/5eSj//NzMr/zczK/83Myv/NzMr/zczK/83Myv/NzMr/zczK/83Myv/NzMr/zczK/83Myv/NzMr/zczK/5eSj/+Xko//4NnT/+DZ0//g2dP/4NnT/+DZ0//g2dP/4NnT/+DZ0//g2dP/kXhn/+DZ0/+ReGf/4NnT/5F4Z/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/5eSj/+Xko//l5KP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEH//6xB//+sQQ=="},
       { label: "101.RU", value: "C:/CyberfoxPortable/101.RU/101.RU.exe",  image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAACzs7QACgsLDQAAAC4BAQIxAAABMQAAATEAAAIxAAEDMQIAATEFAAAxBQAAMQUAADEFAAAxBgEBMQIAAC4LCgoNs7OzAC0tLQpEPjqSj31t44x4Z92LeGjeinVl3oVtYd6FaVzec3Jv3lt5g95bdn/eWHiB3ld4gN5Vd3/dWnmB4zU9QJIvLi0KMjY4MrOMcvXvllT//ali/v+vZf//r2b/+JdW//9uK/+Jjo3/DMb//ynJ/P8v0v//LNP//yzS/v4iyPf/Upaq9TozMTI0Oj43pnhc+NyCRf/lllf8+adh/f+lWv30oWb9+qN6/by5s/1yzuz9SMzv/SPT/v0u0v39Lsbx/CPC8v89i6P4PTIvNzU8Pzeidl75xm87/9+ETP76iEr/8LyY//fz8P/8/////v/+///++v/48en/lczY/yTB9f8pvOn+ILXj/0OLovk9MzA3OD5AN5tvW/m2XjH/4Gg3/vGylP/9//////7+///////9////+v/8//z99P//5M7/m7G5/x2v4f4eqtf/RYif+T41Mjc5P0E3lGtc+apIIv/Ld1T+++fX///67//lwKj/36yQ//vn2f///e///u7d//rTwP/6r5T/VJy2/hCh0v9Jhpv5PzYzNzk+QTeVa1j5oUAS/9WTdv7/1b///+jU/7+IbP+MOhX/rWJA/8+Vef/3yrP/+cWu//mihf+Yi47+C53Y/0yJo/k/NzM3Oz4+N4Fnavl0PUH/0JB8/vy8nf//0rb/unhc/3snCP+CMRL/gSwM/448Hf/XkHT/9pt//6x7bv4VkJv/TYiN+UA3NzdAPjI3U2K3+RE68v+xiaL+/rqV//zMtv/XmHj/uGQ3/7FYKv+oUSb/vndV/+ajhf/0mIL/p3xR/gyMAP9JhT75QDhCNz48MDdWZLj5M1j//6GXzf7/0rb/++DX//TMs//usor/7bua//rWu///27//98Ch//aeif+Sk13+J6ci/02IRPk/N0A3OzkuN2BuvPlad///f4/w/u7Y0///8eb/+ung//zq3v//8uX//+bS//rRtP//waP/2ZqB/2OvU/5EtTj/W5JU+T01Pjc5Ny03ZXO5+XGI//+Alf3+p7Dw//nz7v////v///33///06v/+7N7//93K/+eznP+CtGj/WsNT/k+5Qv9flln5PDQ8Nzc2LTZrd7T4hZn//5im+/6Wpv7/qrX0/9rd8P/x7/H/9vDr/+3j1v/Kyqr/h8d4/2rRY/9nw13+WcJO/2GWW/g7NDw2NTMsNHR9sfidrv/+o7H9+6q4//ysuv/8rLr+/LS+//ypxcr8qd6d/JTekPyA23f8eNRt/HHRaftk0Fr+Yphc+DoyOzRiYV4TbXKP3ZCc5P+VoOL9maTi/56o4v+hreL/o6zq/5Gtsv+YyY3/lcSQ/4PAev9zvWr/brxm/We6YP9ig1/dZGBkE9/f3wCUlJQwkJCTgouMjn+NjY9/jY2Pf42Nj3+NjZB/jY6Of42PjH+PkI5/j5COf42QjX+Mj4t/kZSQgpWVlTDf398AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
      { label: "Task Manager", value: "C:/windows/system32/taskmgr.exe", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGQkP96eHj/kZCQ/wAAAAAAAAAAAAAAALu8vP+7vLz/tLW1/5ucnP+bnJz/n6Cg/6CgoP8AAAAAAAAAAAAAAAC4ubr/lJSU/6aoqf8AAAAAAAAAAAAAAAAAAAAAyMnJ/8TGxv+5urr/qqur/6CgoP8AAAAAAAAAAAAAAAAAAAAAq6ys/7+/v/+lpaX/AAAAAAAAAAAAAAAAAAAAAAAAAAC5urr/ioqK/5ubnP8AAAAAAAAAAAAAAAAAAAAAAAAAAK6vr//R0dH/q6ur/8XKzP/AwcH/vr+//7u8vP+4ubn/tba2/6qqqv+oqKj/pqam/6SkpP+ioqL/oKCg/7Cztf+trq7/0dHR/6urq//Nz8//zc/P/83Oz//Mzs7/y83N/8rMzP/Hycn/xsnJ/8bJyf/FyMj/xcjI/8THx/+goKD/ra6u/9HR0f+rq6v/ztDQ/62urv8AAAD/AgIC/wAAAP8CAgL/CgoK/xcXF/8YGBj/Ghoa/xMTE//FyMj/oaGh/66vr//R0dH/rKys/8/R0f+rrKz/FxcX/xgYGP8LCwv/EBAQ/yUlJf8rgin/IaYe/0JCQv8rKyv/xMfH/6Ojo/+XvqX/APJH/2HCgv/P0dH/qamp/ycnJ/8aGhr/Dg4O/xUVFf8xWjD/Jbkh/yyfKv84jjb/QkJC/8XIyP+lpaX/q6ys/0dDQv96eHj/0dLS/6Ojo/8O8gn/EKQN/xISEv8aHhr/GtMW/11dXf9ZWVn/Jckh/w/wCv/Hysr/q6ur/8LFx/++vr7/wMLD/9DS0v+ioqL/ICAg/xF3D/8WexT/FbMS/1p1Wf9oaGj/ZmZm/2hoaP9gYGD/x8rK/62urv8AAAAAAAAAAAAAAADR0tP/oKCg/xEREf8XFxf/FqgS/yJpIP91dXX/cnJy/3R0dP92dnb/a2tr/8jKy/+wsbH/AAAAAAAAAAAAAAAA0dLT/6CgoP8SEhL/HR0d/ycnJ/8zMzP/aGho/2BgYP9fX1//XFxc/1VVVf/Jy8v/srOz/wAAAAAAAAAAAAAAANHS0/+goKD/oKCg/6CgoP+ioqL/pKSk/62urv+wsLD/srOz/7W2tv+4ubn/ycvM/7W2tv8AAAAAAAAAAAAAAADM0NP/0dLT/9HS0//R0tP/0NLS/9DR0v/O0ND/zc/P/83Pz//Mzs7/y83N/8rMzP++wsT///+sQf//rEEcB6xBHg+sQR8frEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxB4ACsQeAArEHgAKxB4ACsQQ=="}, 
      { label: "Firefox ESR", value: "D:/core/firefox.exe", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+QkmS9vr7/tLS1/6usrf+foKD/kJGS/5CSk/+PkJJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2t7j/1dTU/+fn6P/o6Oj/1NTU/7Kzs/+QkJD/j5CS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPkJJkpKSk/+Xk5P/08/T/7u7v/93e3v/FxMP/nZyc/4KBgv+PkJJkAAAAAAAAAAAAAAAAnnZKZKl9SP+kdkP/oHNB/55wQP+urq7/8O/v/+ro6P/d3Nv/vby6/5OTk/+db0D/nW9A/51vQP+fd0v/nnZKZK+BRP/01qf/7s6W/+zIjv/sxIj/l5eW/7a2tv/CwsH/vLu7/5mZmf+NiIH/5a5i/+WpXv/lplz/4qRc/552Sv+wgUD/8dGc/9qtYv/Yqlz/1aVX/8ObV/+ljWb/lolz/5KHdP+hh13/uok//8OGLf/DfSb/w3Qi/+KjWP+edEf/s4RB//DSov/br2T/2Kxe/9GbSf/PmEX/zJI+/86ZQ//KlD7/x484/8WMNP/EhzD/w4Ao/8N5I//ipFn/nnRH/7eHQ//x1Kf/3K9m/9OfT//////////////////OlUL/y5ZA/8iROv/HjTb/xIkx/8OELP/DeyX/4qRa/550R/+8jUb/992x/9ekV///////zo8//82NPP/Lizn//////8yUP//Jkzz/////////////////w34n/+KmXP+edEf/vo9G//rku//frV3//////9CTQv8ap///YbDX/2zA9P/NlUH/ypU//8iPOf/HjDT/xIgx/8OBKf/iqWL/nnRH/8CRSP/65L7/4K1d///////XmEj/XrHb/xqn//8ap///zqJY/82YQ//////////////////DhSz/4q1m/550R//ClEn/+ebB/+3Cdv/hrV3//////27B9f8ap///0bR3/9qiTf/bpU3/2aBH/9WaQf/SlTz/0JE4/+27dP+id0r/xJVJ//nmw//txHj/78N2/9+sXP/bpVL/3atc/+KvW//irln/3qlR/9yjS//Zn0X/15tB/9WXPf/xwX7/pHlL/8eYUf/25L//+u3P//vtz//77M3/++nI//rmwv/647z/+eC1//jcr//32an/99aj//bUnf/1zpb/4bJr/6N6Tv+edkpkwplV/76TT/+6j03/topK/7GFSP+tgUf/qHtF/6R3RP+hdEL/nnFB/55xQf+ecUH/nnFB/6F5Tf+edkpk//+sQfAPrEHwD6xB4AesQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ=="},
      { separator:"" },
      { label: "cpu-z", value: "C:/Program Files/cpu-z_1.73-32bits-ru/cpuz_x32_ru.exe", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
      { label: "Bandicam", value: "C:/Program files/Bandicam/bdcam.exe", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/Io//Dmlr/uo9N/7WJSv+vg0j/qn1G/6V4RP+hdEL/nnFB/55xQf+keUz/y7Sa/wAAAAAAAAAAAAAAAAAAAADIoF7/9eLA/+TCj//kwY7/5MOR/+TElP/lx5j/5cic/+bNpf/04cL/9efQ/6R5TP8AAAAAAAAAAAAAAAAAAAAAyJxW//Tfu//gtnb/6+vt/9+0cv/r6+3/37l+/+vr7f/kyJ7/AJLw//bo0f+ecUH/AAAAAAAAAAAAAAAAAAAAAMmeWP/14b//4buD/9+2ef/guYD/4byG/+G+jP/hwZH/5s2p/wCS8f/26dX/nnFB/wAAAAAAAAAAAAAAAAAAAADLoFr/9eTH/+TBj//r6+3/4sCO/+vr7f/iwpT/6+vt/+TMpv8AkvD/9ejS/55xQf8AAAAAAAAAAAAAAAAAAAAAzKJd//jq0//p0Kr/6M2l/+jOpv/nzqf/586o/+fOqP/nz63/8N28//Ljy/+ecUH/AAAAAAAAAAAAAAAAAAAAAM2jX//5793/zalr//Tjxf/NqWv/9OPI/82pa//y4sj/zalr/+/buf/x4cn/oHNC/wAAAAAAAAAAAAAAAAAAAADOpWL/+e/g//blyv/04MH/8+DB//LgwP/x37//8d6///Ddvf/t2bb/8eLK/6J1Q/8AAAAAAAAAAAAAAAAAAAAAz6dk/+bQqv/kyZz/4sWX/+LFlv/hw5X/4MOU/+DBkv/fwJH/3sCQ/+HInv+leET/AAAAAAAAAAAAAAAAAAAAANCoZv/m0Kz//Pjz//369P/9+vT//fn0//z58//8+fP//Pjy//z38f/hyZ//p3tF/wAAAAAAAAAAAAAAAAAAAADRqWn/5tCs//369f/99u//+/Dj//rq1//448r/9t29//XXsv/8+PL/4cqg/6t+Rv8AAAAAAAAAAAAAAAAAAAAA0qtr/+bRrf/9+vb//vr1//z06//77t//+efS//fhxf/227n//Pjz/+LKof+ugkf/AAAAAAAAAAAAAAAAAAAAANKsbf/m0a7//fr1//79+//9+PL//PLn//rs2//45c7/99/B//z59P/iyqP/sYZJ/wAAAAAAAAAAAAAAAAAAAADTrW//5dGv/0iy/P86rf3/Oq39/zqt/f86rf3/Oq39/zqt/f8/r/3/48yl/7WJSv8AAAAAAAAAAAAAAAAAAAAA1rN5//Xu4v/z6tn/8+rb//ft4P/48OP/+O/i//ft3//169r/8ujV//Lo1v/AmmH/AAAAAAAAAAAAAAAAAAAAAOjUtP/Vsnj/0qxt/9Gqaf/Qp2X/zqVh/8yiXf/Kn1r/yJxW/8SZU//HoWX/38qr/wAAAAAAAAAAwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQcADrEHAA6xBwAOsQQ=="},
      { label: "ВиртКлав", value: "C:/CyberfoxPortable/ВиртКлав/ВиртКлав.exe", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAACAgIDAAAAAC0tLU5EREWrMjMzkUFBQYlJSUmFT09Ph09PT4dKSkqFQkJBiTMzM5FFRUarLS0tTgAAAAACAgIDAgICBAAAAAAkJCRMNzg4lltcXMZ7e33/VlZX/TExMf8vLy//VVZX/X+Agv9dXl/GOzs7liQkJEwAAAAAAgICBAAAAAAAAAAAAAAAAAAAAAAHBgUDDAsLAUNCQ7MZGBj/FhUU/0FAQbMMCwwBBwYGAwAAAAAAAAAAAAAAAAAAAAAMDQ0OBgwNDgcNDhAJDhATBwwOEwAAAABBRUaAMTc6/yYsLv8/QkSAAAAAAAYLDRMIDQ8TBgsNEAYKDQ4MDQ0OYFtZ8Vk/N/FgRT3xX0Q88V9EPPJiRz7yWT41+jsgF/84HRT/WT42+oRrYfKJcGbyiW9m8Y51avFtVkrxXVdV8WFBNf/OIAD/4SUB/9wkAP/dJAD/3SQA/90lAf/iKwb/4ywH/94nAv/jLQj/5S4J/+UuCf/pLgj/0iUA/2JBNf9mRTn+1CAA/uYkAf7hIwD+4iMA/uIkAP7kIAD+4hgA/+AYAP/lHAD+4hkA/t8YAP7gGQD+5SEB/tMfAP5oRjr+ZUQ4/8cdAP/XIAH/0x8A/9MgAf/XGwD/wTQc/6RgVP+oYVX/pk09/6dXSf+nYlb/pVpN/8wkB//KHAD/ZkU6/2REOP/AHQD/zyAB/8sfAP/LIQP/zhQA/7xdTP/K3eH/197h/6empf+9w8X/1eDi/8PKzP+/LxX/wxkA/2VGO/9kRDj/ux0A/8kgAf/GHwD/xiID/8kVAP/BXUv/z9LV/+Tc2f+4qKL/xby4/+Db2v/Tycn/vy8V/78ZAP9lRjv/ZEU4/78fAP/NIgX/yiEE/8ojBf/IFQD/tU8+/6yxs/+7t7//nIqT/6Capf+7trz/tKuo/7ssEf++GwD/ZUY6/2VFOP/HLQD/1jQB/9QxAP/JOAv/oHlv/52HgP+NgYX/cWaW/4eDpv+Afqr/eGiS/5WGgf+hiIL/l2JT/2NEOP9lRjj/0z8A/+RIAv/jRAD/0E4S/9PR0f/t7Or/x8PO/52Yuf/07+P/39vc/5yYvf/c19n/6+/x/7qknf9eQTb/Z0g6/+ZTAP/5YAP/+FsA/+RjFv/Bv7//09XV/8HBzv+Wlbj/1NXL/9TT1v+Zlr7/xcXK/93h5P+3oJn/YUQ4/2BCNP/aUAD/7l4C/+taAP/fXQv/q4x8/7Cajv+pi4P/gmWJ/5KFof+Qgqf/iWiE/6yQgP+zn5b/pHVe/14/Mv9mX1z/YEI0/2hIOv9mRzn/Zkc4/2RGN/9jRjj/Y0U2/2BCPP9XP0L/VT5B/15COv9hRTj/YEU6/1s/Mv9mXl3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="},
      { label: "Днс", value: "D:/порташки/DnsJumper/DnsJumper.exe", image: "data:image/png;base64,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"}
            ];
            
var menuPopup = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m ) {
      if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
      var mItem = document.createElement("menuitem");
      mItem.setAttribute("label", m.label);     
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.setAttribute("image", m.image);
      mItem.setAttribute("value", m.value);
      mItem.addEventListener("command", function(e) { startProcess( m.value ) }, false);
      menuPopup.appendChild(mItem);
});

menuPopup.setAttribute("onclick", "event.stopPropagation()");



// Функция запускает win приложения, выбор завысит от параметра 'value' в массиве ................................
function startProcess( path ) {
      var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
      file.initWithPath( path.replace(/\//g,'\\\\') ); 
      file.launch();
};/*Initialization Code*/


так правильно.

oleg953
Реально спасибо за подробное,рабочее решение кнопки.
Я подобрал все таки похожее решение ,но Расширение Ummy Radio-остаюсь на нем пока.

Доброго времени.
Firefox 41.0.2 (15.10.2015)
Установил кнопку ТoggleToolbars (Firefox)
Для скрытия панели закладок-при нажатии одним кликом левой кнопки мыши не чего не срабатывает.

Наверное нужно раскомментировать (//) нужные панели в коде.

Ultima2m пишет

(//)

Вот раскомментировал -панель закладок(убрал //): Не работает.

скрытый текст
toggleToolbars([
//    "toolbar-menubar",      // панель меню
//    "aios-toolbar",          // All-in-One Sidebar (AiOS)
      "PersonalToolbar",      // панель закладок
//    "TabsToolbar",          // панель вкладок
    "nav-bar",              // панель навігації
//    "FindToolbar",          // стрічка пошуку
    "addon-bar",           // панель додатків (стрічка стану)
    "Моя панель закладок",
    "Панель кнопок 1",
    "Панель кнопок 2",
    "Панель кнопок 3"
//    ,"Панель кнопок 4"

Скрин -что делаю не так?
1.1446026206.gif

KOMMEHTATOP пишет

Вот раскомментировал - Не работает.

Если стоит Classic Theme Restorer, то он может менять названия панелей.

Ultima2m пишет

Если стоит Classic Theme Restorer, то он может менять названия панелей

У меня стандартная, Speed Start 1.8.6.
Скрин вообше на чистой ,из расширений только СВ.
Экспериментировал  (убирая //) -не реагирует.
У вас эта кнопка работает?

Может работает только на  Firefox 10 +.?

P.S.
Вот нашел на :http://forum.ru-board.com/topic.cgi?for … art=340#19
Немного повозиться придётся.:)

KOMMEHTATOP пишет

Вот раскомментировал -панель закладок(убрал //): Не работает.

А если так:

Выделить код

Код:

var bar = document.getElementById("PersonalToolbar");
setToolbarVisibility(bar, bar.collapsed);

bunda1
Все полетело,от души !:beer:

P.S.
Уважаемый bunda1
До пишите этот код в посте ТoggleToolbars (Firefox) в  теме Готовые кнопки для Custom Buttons ПЖЛ.

скрытый текст
var bar = document.getElementById("PersonalToolbar");
setToolbarVisibility(bar, bar.collapsed);

Уж больно нужная кнопка.

KOMMEHTATOP пишет

До пишите этот код в посте ТoggleToolbars (Firefox) в  теме Готовые кнопки для Custom Buttons ПЖЛ.

В теме Готовые кнопки для Custom Buttons не получится, потому что автор заблокировал тему :(

bunda1 пишет

В теме Готовые кнопки для Custom Buttons не получится, потому что автор заблокировал тему :(

Плохо что заблокировали.
Так как я также Экспериментировал с Вертикальной панелью,хорошо люди добрые навели на просторы форума
на правильно исправленный код в вашем посту-и все заработало.(для меня признаюсь если код был в теме готовые
кнопки -было проще для нас простых обывателей. )
P.S.
Может найдется у модератора форума свободное время ,и создаст новую тему с готовыми кнопками.

Нет-ли в природе кнопочки, отслеживающей адрес открытой страницы и в соответствии с настройками блокирующей работу ту или иной кнопки СВ ?
То есть что-то вроде "если url =https://forum.mozilla-russia.org то custom-buttons38 = disabled". С запоминанием адресов.
Или некий универсальный встраиваемый код, несложно прикручиваемый к любой кнопочке ?

Coroner пишет

Или некий универсальный встраиваемый код, несложно прикручиваемый к любой кнопочке ?

А если в начале кода нужной кнопки просто написать:

Выделить код

Код:

if (content.location.href == 'нужный_url') return

Конечно нужно чтоб это было обёрнуто в функцию, иначе будет давать ощибку.

rbfyec
У меня не срабатывает. Саму проверку сделал, и по полному адресу и по его части, но почему-то не работает сам return.
Но для конкретно взятой кнопки этот код использовать можно, если вместо return вставить отключение функционала кнопки или изменение принципа её работы.

Coroner пишет

rbfyec
У меня не срабатывает. Саму проверку сделал, и по полному адресу и по его части, но почему-то не работает сам.
Но для конкретно взятой кнопки этот код использовать можно, если вместо return вставить отключение функционала кнопки или изменение принципа её работы.

Так вот return как раз и прерывает работу функции. Т. е. если в самом начале функции проверить адрес и условие окажется верно, то весь дальнейший код просто не будет выполняться.

Я так думаю ©

rbfyec пишет

Я так думаю ©

:)
Я теперь тоже так думаю. :) Вроде работает, но ещё потестировать надо. Был невнимателен, код кнопки сложнее чем показался, пришлось понатыкать по нему несколько return. Точнее несколько проверок. Хотя если вникнуть получше, то, вероятно, и одной обойтись можно будет. Только проверку по части адреса причесать ещё надо.

Спасибо за идею !

Помогите пожалуйста добавить в конекстное меню кнопку "Сохранить ярлык страницы как.." из набора кнопок Save+ (https://forum.mozilla-russia.org/viewto … 40#p493040).

Доброго времени.
Подскажите есть в природе кнопочки подобные этим расширениям?
Cache Disabler 1.1.0
Private Tab 0.1.8.1

KOMMEHTATOP

KOMMEHTATOP пишет

Private Tab 0.1.8.1

https://forum.mozilla-russia.org/viewto … 25#p697725

KOMMEHTATOP пишет

Cache Disabler 1.1.0

Это отключение кэша ? Такой не встречал, есть для очистки кэша и flash cookies. Но мне кажется такую сваять нетрудно. Можно попробовать.

UDP :

Ну как-то примерно так. За страшенный код прошу прощения :angel:

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

Выделить код

Код:

/*Initialization Code*/
var c = "browser.cache.disk.enable";
var val = true;

this.onclick = function(e) {
    if ( e.button == 0 ) {
         custombuttons.setPrefs(c, !custombuttons.getPrefs(c));
         }
};

function toggleIcon() { 
pref = Application.prefs.get(c);
   var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
   icon.src = (pref.value == val) 
   ? self.image 
   : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAf9JREFUOE990s1LVFEcxvGn2riUMHIYpcFep1KHUnPE8oXSsoG0TVBZjIuobBNEL7OIIaJFBGGLtgPRIkISeiFidBVtok3t+wMi2lUQhk/fc+8dUykHPpwz55zfc8+956zxIUnGb/zC8l9FCwzMq7hsOIx9Q2hDgA+iH93IL6rzgL54P/aoDnIr9iKHZqRXBoSwfUlQty64qAWPI0e/nfHH2L1awGEmjyYheX3wI9kV5Oj3Ml7FrtUChpkcQ6e6XNC831AcDNDv19j/AiZZUGLrJR/QtIfRq4++R2E1cZu2U599XM/dwvwOVXj/EibDR5z1aRbc0XfYdxMvaV8nXtCWcRU3cAXtSGs2BIyQ/NY3k+2GwlDwFE8Sof8qCXtGewpZatIaiY+xR20c35wvMTGFh//wgLFbKERPnnOKmugYBxG+cIey7tO7KD28ykphh4NoVpXCbCiOA0aToxuiPaEJdmJfw/Ulwv/L2B49vcNNcXEcMI4zOIsJ3eeV7Is4h2LS8q19HrkooFAr/hsQQoIj+gSzE3sIec6/D6P0T6ILKU1BNfHtiq3lHjjaQXiNrL46oxm2O+Mt9MNcDxr13htZn5Cn+RNb7zYWtOqnt3JpWnQM8iY00U8xtpm5Rv1wg9ZBgbxzUYYbZm9TmYB6FmtJQNhyPU8tewNrGpSpBfwBp2K7FWnMf0EAAAAASUVORK5CYII=';
};

toggleIcon();
gPrefService.addObserver( c, toggleIcon, false );
addDestructor(function() { gPrefService.removeObserver( c, toggleIcon, false ) });

Coroner
От души за отклик.

скрытый текст
/*Initialization Code*/
var c = "browser.cache.disk.enable";
var val = true;

this.onclick = function(e) {
    if ( e.button == 0 ) {
         custombuttons.setPrefs(c, !custombuttons.getPrefs(c));
         }
};

function toggleIcon() {
pref = Application.prefs.get(c);
   var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
   icon.src = (pref.value == val)
   ? self.image
   : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAf9JREFUOE990s1LVFEcxvGn2riUMHIYpcFep1KHUnPE8oXSsoG0TVBZjIuobBNEL7OIIaJFBGGLtgPRIkISeiFidBVtok3t+wMi2lUQhk/fc+8dUykHPpwz55zfc8+956zxIUnGb/zC8l9FCwzMq7hsOIx9Q2hDgA+iH93IL6rzgL54P/aoDnIr9iKHZqRXBoSwfUlQty64qAWPI0e/nfHH2L1awGEmjyYheX3wI9kV5Oj3Ml7FrtUChpkcQ6e6XNC831AcDNDv19j/AiZZUGLrJR/QtIfRq4++R2E1cZu2U599XM/dwvwOVXj/EibDR5z1aRbc0XfYdxMvaV8nXtCWcRU3cAXtSGs2BIyQ/NY3k+2GwlDwFE8Sof8qCXtGewpZatIaiY+xR20c35wvMTGFh//wgLFbKERPnnOKmugYBxG+cIey7tO7KD28ykphh4NoVpXCbCiOA0aToxuiPaEJdmJfw/Ulwv/L2B49vcNNcXEcMI4zOIsJ3eeV7Is4h2LS8q19HrkooFAr/hsQQoIj+gSzE3sIec6/D6P0T6ILKU1BNfHtiq3lHjjaQXiNrL46oxm2O+Mt9MNcDxr13htZn5Cn+RNb7zYWtOqnt3JpWnQM8iY00U8xtpm5Rv1wg9ZBgbxzUYYbZm9TmYB6FmtJQNhyPU8tewNrGpSpBfwBp2K7FWnMf0EAAAAASUVORK5CYII=';
};

toggleIcon();
gPrefService.addObserver( c, toggleIcon, false );
addDestructor(function() { gPrefService.removeObserver( c, toggleIcon, false ) });


Тест показал успех!

На 42 версии [firefox] перестала работать кнопка, которая раньше открывала окно настроек. Вот её исходники:
Код:

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

Выделить код

Код:

/* ----------------------------------------------------------------------------
    Options Button
    by LouCypher (aka Zoolcar9)
    Original code is Options Dialog Options extension for Firefox
    http://loucypher.wordpress.com/projects/extensions/#options-dialog-options
   ---------------------------------------------------------------------------- */

this.openPrefs();


Инициализация:
скрытый текст

Выделить код

Код:

var brand = document.getElementById("bundle_brand");
var appName = brand.getString("brandShortName");
this.tooltipText = appName + " " + this.label;

var appInfo = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
var is20 = (appInfo.version >= "2.0") && (appInfo.version != "2.0b1");

this.openPrefs = function(aEvent) {
  if(aEvent) var paneID = aEvent.target.id;

  var features = "chrome,titlebar,toolbar,centerscreen,minimizable,resizable";

  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
    .getService(Components.interfaces.nsIWindowMediator);

  var win = wm.getMostRecentWindow("Browser:Preferences");
  if(win) {
    win.focus();
    if(paneID) {
      var pane = win.document.getElementById(paneID);
      win.document.documentElement.showPane(pane);
    }
  } else
    openDialog("chrome://browser/content/preferences/preferences.xul",
               "Preferences", features, paneID);
}

var cloneCBcontext = {
  cloneItems: function(aNode, aID, aSeparate) {
    var menupopup = document.getElementById(aID).cloneNode(true);
    var menuitems = menupopup.childNodes.length;
    for(var i = 0; i < menuitems; i++)
      aNode.appendChild(menupopup.firstChild);
    if(aSeparate)
      aNode.appendChild(document.createElement("menuseparator"));
  },
  makeMenu: function(aNode) {
    var m = aNode.appendChild(document.createElement("menu"));
    m.setAttribute("label", "Custom Button");
    m.setAttribute("oncommand", "event.stopPropagation()");
    var mp = m.appendChild(document.createElement("menupopup"));
    cloneCBcontext.cloneItems(mp, "custombuttons-contextpopup");
    aNode.insertBefore(document.createElement("menuseparator"), m);
  }
}

function addItem(aNode, aID, aLabel) {
  mItem = aNode.appendChild(document.createElement("menuitem"));
  mItem.id = aID;
  mItem.setAttribute("label", aLabel);
}

var panes = is20?
  ["Main", "Tabs", "Content", "Applications", "Privacy", "Security", "Advanced"]:
  ["General", "Privacy", "Content", "Tabs", "Downloads", "Advanced"];

const popupID = "cbContext-prefsButton";

var test = document.getElementById(popupID);
if(test) test.parentNode.removeChild(test);

var main = document.getElementById("mainPopupSet");
var cPopup = main.appendChild(document.createElement("popup"));
cPopup.id = popupID;
cPopup.setAttribute("oncommand",
  "event.stopPropagation(); document.popupNode.openPrefs(event);")

for(var i = 0; i < panes.length; i++) {
  addItem(cPopup, "pane" + panes[i], panes[i]);
}

cloneCBcontext.makeMenu(cPopup);

this.setAttribute("context", popupID);


Что нужно прописать сейчас, чтобы открывалась новая вкладка с настройками?

1fesFFFF
Положить просто во вкладку Код без Инициализации.

Выделить код

Код:

openPreferences();

Вот попалась кнопочка :
Отключение-включение  WebRTC

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%3Cname%3EWebRTC%20ON/OFF%3C/name%3E%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJNQTFRFR0dH////lJSUhISER0dHbtlzhoaGh4eHiIiIioqKi4uLjIyMjY2Nj4+PkJCQkZGRkpKSk5OTlJSUl5eXn5+fz8/P1tbW2NjY2tra29vb3Nzc3t7e4ODg4uLi4+Pj5eXl5ubm5+fn6Ojo6enp6+vr7Ozs7e3t8fHx8vLy8/Pz9vb29/f3+fn5+/v7/f39/v7+////DXu3NgAAAAR0Uk5TAACZ5cNwQT4AAACaSURBVBgZBcExTsNAFAXA+Y4tkaQIKS1okOi4/2FSUSBEhSggYLB3HzNVAKmh0jNSt4lMf/kpanSeZvD8jV3GmmbgWhTDaQYcE0mGADw8YewDSGttbfscZQz61iX9fphefke0bWtJ69fp9Gm39pt1XdZta+3m8P6l6jzNeL3D2/qhSh14dEmyhZFcHVwWQBXsswAMIAuAKgDAP60zTjfSoH4UAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%3Cmode%3E0%3C/mode%3E%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20s%3D%27media.peerconnection.enabled%27%3Bvar%20pref%3DApplication.prefs.get%28s%29%3Bthis.onclick%3Dfunction%28e%29%7Bif%28e.button%3D%3D0%29%7Bpref.value%3D%28pref.value%3D%3Dtrue%29%3Ffalse%3Atrue%3BBrowserReload%28%29%3B%7D%7D%3Bfunction%20toggleImage%28%29%7Bvar%20icon%3Dself.ownerDocument.getAnonymousElementByAttribute%28self%2C%22class%22%2C%22toolbarbutton-icon%22%29%3Bicon.src%3D%28pref.value%3D%3Dtrue%29%3Fself.image%3A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAI1QTFRF4lpS////lJSUhoaGh4eHiIiIioqKi4uLjIyMjY2NkZGRkpKSk5OTlJSUwUdBz8/P1k9J1tbW2NjY2tra29vb3Nzc3t7e39/f4ODg4uLi4+Pj5eXl5ubm5+fn6Ojo6enp6+vr7Ozs7e3t8fHx8vLy8/Pz9PT09fX19vb29/f3+/v7/Pz8/f39/v7+////frFrRgAAAAN0Uk5TAACZc6XvPgAAAJdJREFUGNNNzrEKwkAURNH71piQKMFSRWLl//9OWsXOLojG7Nsdm0Sc7sDADLaEHbDDDNtIiBKGNmO2XZ8A4AaZIdhiOghPQrOYW4aWoD/vyW0AQO7pyGHqGAoB2R3Z/vPevqwAPHqSUsqli1Wa6imOU4ye6uYx/n5cz8A9PjHDKrjQS5KgAI1U9HFeNwMotZj5x89z4y9fln1GV8ZmHdIAAAAASUVORK5CYII%3D%27%3B%7D%3BtoggleImage%28%29%3BgPrefService.addObserver%28s%2CtoggleImage%2Cfalse%29%3BaddDestructor%28function%28%29%7BgPrefService.removeObserver%28s%2CtoggleImage%2Cfalse%29%7D%29%3B%5D%5D%3E%3C/initcode%3E%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%3Cattributes/%3E%3C/custombutton%3E

использую дополнение Smart pause for youtube, единственное, что раздражает - невозможность отлючения\включения функционала дополнения посредством вывода соответствующей кнопки на какую либо панель, то есть включать авто паузу и отключать можно лишь в меню дополнений.
прошу помочь с кнопкой, которая включает\выключает автопаузу, при нажатии на неё для данного дополнения.  http://puu.sh/lpKZY/4e4c16c481.png

LittleMontana

LittleMontana пишет

панель, то есть включать авто паузу и отключать можно лишь в меню дополнений.

есть переключатель в контекстном меню на странице

скрытый текст
bef18aff94e1.jpg

Ох, точно. Не заметил, так как обычно не пользуюсь данным меню во время просмотра youtube. Спасибо!

Можно ли сделать, чтобы открывался кукименеджер с куками текущей вкладки.

Кнопка открывает менеджер.

Выделить код

Код:

var wm = Components. classes["@mozilla.org/appshell/window-mediator;1"].
     getService (Components. interfaces. nsIWindowMediator);
var win = wm. getMostRecentWindow ("Browser:Cookies");
if (win)
    win. focus ();
else
    openDialog ("chrome://browser/content/preferences/cookies.xul", "_blank", "resizable,dialog=yes,centerscreen", null);

foxboy

Выделить код

Код:

var win = Services.wm.getMostRecentWindow("Browser:Cookies");
win && win.close();
var win = openDialog ("chrome://browser/content/preferences/cookies.xul", "_blank", "resizable,dialog=yes,centerscreen", null);

win.addEventListener("load", function s(e) {
   win.removeEventListener("load", s, false); 
     
   var host = content.location.host, arr = host.split('.');
   if ( arr.length > 2 ) host = arr[1]  + "." +  arr[2];
   
   var filter = win.document.getElementById("filter");
   filter.value = host;
   setTimeout(function() filter.doCommand(), 0);
}, false);

bunda1

Все отлично, спасибо!

Возможно ли сделать кнопку для расширения или вообще заменить его кнопкой?

https://addons.mozilla.org/en-US/firefox/addon/cookie-watcher/

Насчёт кнопки:

Baron_ пишет

Extensions Options Menu
Позволяет перейти к настройкам любого дополнения не открывая about:addons

Можно ли добавить в кнопку следующую функциональность:
1. Добавить возможность создания списка "скрытых" расширений, который бы содержал расширения, которые юзер не хотел бы видеть в меню по ЛКМ.
2. Добавить клик по средней кнопке - СКМ (или длинный клик по левой кнопке - ДЛКМ), который бы открывал бы список "скрытых" расширений
3. Показывать в меню все расширения, в том числе отключённые (другим цветом или как-то по-другому помеченных)
4. Расширить возможности по кликам на меню:
4.1 Длинный левый клик (или по средней кнопке) на менюитем - отключить включенное расширение/включить отключённое расширение.
4.2 По правому клику - добавить менюитем: "Скрыть расширение" для не скрытых расширений или "Раскрыть расширение" для скрытых. Этот менюитем фактически создаёт и управляет списком "скрытых" расширений.
При большом кол-ве расширений предложенная функциональность будет очень удобна юзеру.

Для Отключения кэша использую код

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

Выделить код

Код:

/*Initialization Code*/
var c = "browser.cache.disk.enable";
var val = true;

this.onclick = function(e) {
    if ( e.button == 0 ) {
         custombuttons.setPrefs(c, !custombuttons.getPrefs(c));
         }
};

function toggleIcon() { 
pref = Application.prefs.get(c);
   var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
   icon.src = (pref.value == val) 
   ? self.image 
   : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAf9JREFUOE990s1LVFEcxvGn2riUMHIYpcFep1KHUnPE8oXSsoG0TVBZjIuobBNEL7OIIaJFBGGLtgPRIkISeiFidBVtok3t+wMi2lUQhk/fc+8dUykHPpwz55zfc8+956zxIUnGb/zC8l9FCwzMq7hsOIx9Q2hDgA+iH93IL6rzgL54P/aoDnIr9iKHZqRXBoSwfUlQty64qAWPI0e/nfHH2L1awGEmjyYheX3wI9kV5Oj3Ml7FrtUChpkcQ6e6XNC831AcDNDv19j/AiZZUGLrJR/QtIfRq4++R2E1cZu2U599XM/dwvwOVXj/EibDR5z1aRbc0XfYdxMvaV8nXtCWcRU3cAXtSGs2BIyQ/NY3k+2GwlDwFE8Sof8qCXtGewpZatIaiY+xR20c35wvMTGFh//wgLFbKERPnnOKmugYBxG+cIey7tO7KD28ykphh4NoVpXCbCiOA0aToxuiPaEJdmJfw/Ulwv/L2B49vcNNcXEcMI4zOIsJ3eeV7Is4h2LS8q19HrkooFAr/hsQQoIj+gSzE3sIec6/D6P0T6ILKU1BNfHtiq3lHjjaQXiNrL46oxm2O+Mt9MNcDxr13htZn5Cn+RNb7zYWtOqnt3JpWnQM8iY00U8xtpm5Rv1wg9ZBgbxzUYYbZm9TmYB6FmtJQNhyPU8tewNrGpSpBfwBp2K7FWnMf0EAAAAASUVORK5CYII=';
};

toggleIcon();
gPrefService.addObserver( c, toggleIcon, false );
addDestructor(function() { gPrefService.removeObserver( c, toggleIcon, false ) });


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

KOMMEHTATOP пишет

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

Поместить код во вкладку Инициализация.

KOMMEHTATOP пишет

/*Initialization Code*/

voqabuhe
Хитро-не знал!
Респект.

Подскажите, почему две кнопки создается при добавлении?

tom911 пишет

Подскажите, почему две кнопки создается при добавлении?

А ты при втором запросе на установку кнопки нажми - отмена.

bunda1 пишет
tom911 пишет

Подскажите, почему две кнопки создается при добавлении?

А ты при втором запросе на установку кнопки нажми - отмена.

Спасибо, попробую! Уважаемый автор, у вас есть кнопка CB drag and go. Если там возможность сохранения изображения в заданный каталог? Если есть, то что добавить в инициализацию кнопки для этого?

У кого нибудь сохраняет эта кнопка? У меня полный молчок. http://forum.mozilla-russia.org/viewtop … 82#p630282
А вообще есть ли такая кнопка чтобы сохраняла страницу, и потом можно было её просмотреть без соединения с интернетом? Кэш у меня отсутствует напрочь, так надо, чтобы без лишних вопросов.

villa7 пишет

У кого нибудь сохраняет эта кнопка? У меня полный молчок. http://forum.mozilla-russia.org/viewtop … 82#p630282
А вообще есть ли такая кнопка чтобы сохраняла страницу, и потом можно было её просмотреть без соединения с интернетом? Кэш у меня отсутствует напрочь, так надо, чтобы без лишних вопросов.

У меня сохраняет скриншот (ФФ-28):
По короткому ЛКМ - начало страницы (независимо от того, какая часть страницы на экране, что плохо), по длинному ЛКМ - всю страницу

difabor
Я имел ввиду на 42 [firefox]

villa7
Save snapshot to html

Скрин всей страницы штатными средствами.

скрытый текст
s-6384.png

Сохраняется в папку загрузки.

villa7 пишет

difabor
Я имел ввиду на 42 [firefox]

Тут я ничего сказать не могу, увы :(
Я боюсь переступать 28 [firefox]...

oleg.sgh
Да, я знаю, спасибо.

oleg.sgh пишет

Скрин всей страницы штатными средствами.
Сохраняется в папку загрузки.

Странно, но я в инспекторе на FF43 такую возможность не вижу.

bunda1

Странно, но я в инспекторе на FF43 такую возможность не вижу.

Есть. Настройки инспектора, поставить галку.

А нет ли кнопки переключающей параметр в about:config. Нужно быстро отключать/включать на некоторых сайтах browser.display.background_color.
Просто изменил этот параметр с белого на чёрный, чтобы не моргал при загрузке браузера белым цветом, по глазам бьет, особенно ночью, а он некоторые сайты задевает. Раньше спасал стиль

Выделить код

Код:

browser{background:#000000 !important;}

но после установки Fast Dial не могу убрать это бельмо. Или может кто знает как стилем изменить цвет.

oleg.sgh пишет

Есть. Настройки инспектора, поставить галку.

Да есть, я проглядел, но большие страницы не сохраняет.

12-12-2015 12:25:47

villa7 пишет

А нет ли кнопки переключающей параметр в about:config.

Нет.

Снова прошу кнопку "Цитата" преимущественно для forum.ru-board.com
Знаю что есть вариант Лекса, им пользовался, так же мне другие пользователи ресурса давали этот код. но я сейчас остановился на 2х вариантах: один не захватывает ник в конструкцию <b></ b>, а другой лишнее <quote>< / quote> в конце.
[ заменил на < чтобы форум пропустил сообщение.
Спасибо

bunda1

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

Выделить код

Код:

var win = Services.wm.getMostRecentWindow("Browser:Cookies");
win && win.close();
var win = openDialog ("chrome://browser/content/preferences/cookies.xul", "_blank", "resizable,dialog=yes,centerscreen", null);

win.addEventListener("load", function s(e) {
   win.removeEventListener("load", s, false); 
     
   var host = content.location.host, arr = host.split('.');
   if ( arr.length > 2 ) host = arr[1]  + "." +  arr[2];
   
   var filter = win.document.getElementById("filter");
   filter.value = host;
   setTimeout(function() filter.doCommand(), 0);
}, false);


Можно в этой кнопке сделать: ЛКМ - открыть куки текущей вкладки, ПКМ - открыть кукименеджер.

foxboy пишет

Можно в этой кнопке сделать: ЛКМ - открыть куки текущей вкладки, ПКМ - открыть кукименеджер.

Выделить код

Код:

this.onclick =e=> {
   
   if ( e.button == 0 ) {
        var win = Services.wm.getMostRecentWindow("Browser:Cookies");
        win && win.close();
        var win = openDialog("chrome://browser/content/preferences/cookies.xul", "", "resizable,dialog=yes,centerscreen", null);
        
        win.addEventListener("load", function s() {
           win.removeEventListener("load", s); 
     
           var host = content.location.host, arr = host.split('.');
           if ( arr.length > 2 ) host = arr[1]  + "." +  arr[2];
   
           var filter = win.document.getElementById("filter");
           filter.value = host;
           setTimeout(function() filter.doCommand(), 0);
        });
        }

   if ( e.button == 1 ) gShowPopup(this);

   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) {
        e.preventDefault();  
        var win = Services.wm.getMostRecentWindow("Browser:Permissions");
        win && win.close(); 
        openDialog("chrome://browser/content/preferences/permissions.xul", "", "centerscreen, resizable=1", 
                  { blockVisible: 1, sessionVisible: 1, allowVisible: 1, prefilledHost: content.location.host, permissionType: "cookie", windowTitle: "Управление cookies", introText: "" });
        }
};


this.tooltipText = "Л: Открыть куки текущей вкладки \nС: CB Меню \nП: Открыть кукименеджер";

Неужели никто не поделится кодом? :|

Kiril__777
Код Lex1 прекрасно работает и здесь, и на ru-board. И вообще непонятно, что Вы ещё хотите, какие Вам давали коды, которые криво работают.
P.S. Я на эту кнопку повесил сочетание Ctrl+Alt+Q, работает.

xrun1
Хорошо спасибо :)

Что-то стал дурить Custom Buttons. Я не спец в скриптах. Где-то нашел простой скрипт для запуска программы и вывел запуск клавиатуры:

Код:
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); 
file.initWithPath("C:\\windows\\system32\\Osk.exe");
file.launch();

Инициализация пустая.

Работал нормально до последнего времени. А сейчас при нажатии выдает "Не удалось запустить экранную клавиатуру". Я недавно перешел на Win10x64 и версия FF поменялась до 43.0.2. Кто из них виноват и как подправить?
Что еще, после ряда "танцев" при том же коде вдруг начинает работать.  После обновления FF снова перестает.

DroG пишет

Что-то стал дурить Custom Buttons. Я не спец в скриптах. Где-то нашел простой скрипт для запуска программы и вывел запуск клавиатуры:
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); 
file.initWithPath("C:\\windows\\system32\\Osk.exe");
file.launch();

Да есть такое и не понятно почему. Может скопируй osk.exe в другое место, измени сответствено код и попробуй запускать.

Здравствуйте, есть кнопка

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0418%u043D%u0434%u0438%u043A%u0430%u0446%u0438%u044F%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0440%u0430%u0441%u043A%u043B%u0430%u0434%u043A%u0438%20%u0444%u043E%u043D%u043E%u043C%20%u043F%u043E%u043B%u044F%20%u0432%u0432%u043E%u0434%u0430%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAjUlEQVR42p2SQRLAMARFuZX7r9xKh6mMKtLUJtr4T74EAUDgDmG2FYnKPIfuoepy8ReA/meWfwAXW35qIYoXYOqa8yh+AHYWKnEL8NxtdWKrk26n8XwE2IlHgFvw0DIifAD1uwR450rgsBYQj10BIvgFyJ6rji2gGlh3ggg3QDftCbBmAPZW6qvyLtMtXHnJyXkUQIobAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20BGcolorEN%3D%22%23f5f5ff%22%3B//%u0446%u0432%u0435%u0442%20%u0444%u043E%u043D%u0430%20%u043F%u043E%u043B%u044F%20%u0432%u0432%u043E%u0434%u0430%20%u043F%u0440%u0438%20%u043B%u0430%u0442%u0438%u043D%u0441%u043A%u043E%u0439%20%u0440%u0430%u0441%u043A%u043B%u0430%u0434%u043A%u0435%0Avar%20BGcolorRU%3D%22%23fff5f5%22%3B//%u0446%u0432%u0435%u0442%20%u0444%u043E%u043D%u0430%20%u043F%u043E%u043B%u044F%20%u0432%u0432%u043E%u0434%u0430%20%u043F%u0440%u0438%20%u0440%u0443%u0441%u0441%u043A%u043E%u0439%20%u0440%u0430%u0441%u043A%u043B%u0430%u0434%u043A%u0435%20%0A%0Avar%20bgorig%3B%0Avar%20trgt%3B%0A%0Afunction%20blurry%28e%29%7B%0Atrgt.style.background%3Dbgorig%3B%0Atrgt.removeEventListener%28%22keyup%22%2C%20checkKeyb%2C%20true%29%3B%0Atrgt.removeEventListener%28%22blur%22%2C%20blurry%2C%20true%29%3B%0A%7D%3B%0A%0Afunction%20checkKeyb%28e%29%7B%0Avar%20fkey%3De.keyCode%3B%0Aif%20%28fkey%3D%3D16%20%7C%7C%20fkey%3D%3D17%20%7C%7C%20fkey%3D%3D18%29%7B%20//%20%u043F%u0440%u043E%u0432%u0435%u0440%u043A%u0430%20%u043D%u0430%u0436%u0430%u0442%u0438%u0439%20alt%20ctrl%20shift%20%u0434%u043B%u044F%20%u043F%u0440%u043E%u0432%u0435%u0440%u043A%u0438%20%u0441%u0442%u0430%u0442%u0443%u0441%u0430%20%u043F%u0440%u0438%20%u0441%u043C%u0435%u043D%u0435%20%u0440%u0430%u0441%u043A%u043B%u0430%u0434%u043A%u0438%20%u0435%u0441%u043B%u0438%20%u043D%u0430%u0434%u043E%20%u0434%u043E%u0430%u0432%u044C%u0442%u0435%20%u0441%u0432%u043E%u0438%20%u043A%u043E%u0434%u044B%0Avar%20curlang%3Dkb.getLangNameAbr%28%29%3B%0Aif%20%28curlang%3D%3D%27ru%27%29%7Btrgt.style.backgroundColor%3DBGcolorRU%3B%7D%0Aif%20%28curlang%3D%3D%27en%27%29%7Btrgt.style.backgroundColor%3DBGcolorEN%3B%7D%09%0A%7D%3B%0A%7D%3B%0A%0Afunction%20checkNode%28e%29%20%7B%0A%09var%20trg%20%3D%20e.originalTarget%3B%0A%09var%20ln%20%3D%20trg.localName%3B%0A%09if%28ln%20%26%26%20%28ln%20%3D%3D%20%22input%22%20%7C%7C%20ln%20%3D%3D%20%22textarea%22%29%29%7B%0Abgorig%3Dtrg.style.backgroundColor%3B%0Atrgt%3Dtrg%3B%0Atrg.addEventListener%28%22blur%22%2C%20blurry%2C%20true%29%3B%0Avar%20curlang%3Dkb.getLangNameAbr%28%29%3B%0Aif%20%28curlang%3D%3D%27ru%27%29%7Btrg.style.backgroundColor%3DBGcolorRU%3B%7D%0Aif%20%28curlang%3D%3D%27en%27%29%7Btrg.style.backgroundColor%3DBGcolorEN%3B%7D%09%0Atrg.addEventListener%28%22keyup%22%2C%20checkKeyb%2C%20true%29%3B%0A%7D%0A%7D%0A%0A//----------------code%20by%20Infocatcher---------------------------------------%0Avar%20kb%20%3D%20%7B%0AGetKeyboardLayout%3A%20null%2C%0AGetLocaleInfoW%3A%20null%2C%0Ainit%3A%20function%28%29%0A%7B%0Athis.init%20%3D%20function%28%29%20%7B%7D%3B%0AComponents.utils.import%28%22resource%3A//gre/modules/ctypes.jsm%22%2C%20this%29%3B%0Alet%20ctypes%20%3D%20this.ctypes%3B%0Alet%20a%20%3D%20Cc%5B%22@mozilla.org/xre/app-info%3B1%22%5D.getService%28Ci.nsIXULRuntime%29%3B%0Alet%20abi%20%3D%20a.XPCOMABI.indexOf%28%22x86_64%22%29%20%3D%3D%20-1%20%3F%20ctypes.winapi_abi%20%3A%20ctypes.default_abi%3B%0Athis.GetKeyboardLayout%20%3D%20ctypes.open%28%22user32.dll%22%29.declare%28%22GetKeyboardLayout%22%2C%20abi%2C%20ctypes.uintptr_t%2C%20ctypes.uint32_t%29%3B%0Athis.GetLocaleInfoW%20%3D%20ctypes.open%28%22kernel32.dll%22%29.declare%28%22GetLocaleInfoW%22%2C%20abi%2C%20ctypes.int32_t%2C%20ctypes.uint32_t%2C%20ctypes.uint32_t%2C%20ctypes.jschar.ptr%2C%20ctypes.int32_t%29%3B%0A%7D%2C%0AgetLangNameAbr%3A%20function%28%29%0A%7B%0Athis.init%28%29%3B%0Atry%0A%7B%0Alet%20ctypes%20%3D%20this.ctypes%3B%0Alet%20lcid%20%3D%20ctypes.UInt64.lo%28ctypes.UInt64%28%220x%22%20+%20this.GetKeyboardLayout%280%29.toString%2816%29%29%29%20%26%200xFFFF%3B%0Alet%20bufferLength%20%3D%20this.GetLocaleInfoW%28lcid%2C%2089%2C%20ctypes.jschar.ptr%280%29%2C%200%29%3B%0Aif%20%28bufferLength%20%3D%3D%200%29%0Areturn%3B%0A%20%0Alet%20buffer%20%3D%20ctypes.jschar.array%28bufferLength%29%28%29%3B%0Aif%20%28this.GetLocaleInfoW%28lcid%2C%2089%2C%20ctypes.cast%28buffer.address%28%29%2C%20ctypes.jschar.ptr%29%2C%20bufferLength%29%20%21%3D%200%29%0Areturn%20buffer.readString%28%29%3B%0A%7D%0Acatch%28e%29%7B%7D%3B%0A%7D%0A%7D%3B%0A//-------------------------------------------------------%0A%0A//%20Windows%20watcher%2C%20based%20on%20code%20from%0A//%20https%3A//github.com/Infocatcher/Custom_Buttons/tree/master/CB_Editor_Toggle_on_Top%0A%20%0Aconst%20watcherId%20%3D%20%22customButtonsWindowsWatcher_%22%20+%20this.id%3B%0Avar%20%7BApplication%2C%20Components%7D%20%3D%20window%3B%20//%20Prevent%20garbage%20collection%20in%20Firefox%203.6%20and%20older%0Avar%20watcher%20%3D%20Application.storage.get%28watcherId%2C%20null%29%3B%0Aif%28%21watcher%29%20%7B%0Awatcher%20%3D%20%7B%0AREASON_STARTUP%3A%201%2C%0AREASON_SHUTDOWN%3A%202%2C%0AREASON_WINDOW_LOADED%3A%203%2C%0AREASON_WINDOW_CLOSED%3A%204%2C%0A%20%0Aget%20obs%28%29%20%7B%0Adelete%20this.obs%3B%0Areturn%20this.obs%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A.getService%28Components.interfaces.nsIObserverService%29%3B%0A%7D%2C%0Aget%20ww%28%29%20%7B%0Adelete%20this.ww%3B%0Areturn%20this.ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%7D%2C%0Aget%20wm%28%29%20%7B%0Adelete%20this.wm%3B%0Areturn%20this.wm%20%3D%20Components.classes%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D%0A.getService%28Components.interfaces.nsIWindowMediator%29%3B%0A%7D%2C%0Ainit%3A%20function%28reason%29%20%7B%0Athis.obs.addObserver%28this%2C%20%22quit-application-granted%22%2C%20false%29%3B%0Avar%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0Awhile%28ws.hasMoreElements%28%29%29%0Athis.initWindow%28ws.getNext%28%29%2C%20reason%29%3B%0Athis.ww.registerNotification%28this%29%3B%0A%7D%2C%0Adestroy%3A%20function%28reason%29%20%7B%0Athis.obs.removeObserver%28this%2C%20%22quit-application-granted%22%29%3B%0Avar%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0Awhile%28ws.hasMoreElements%28%29%29%0Athis.destroyWindow%28ws.getNext%28%29%2C%20reason%29%3B%0Athis.ww.unregisterNotification%28this%29%3B%0A%7D%2C%0AinitWindow%3A%20function%28window%2C%20reason%29%20%7B%0A//%20Do%20something%20with%20window%0Awindow.addEventListener%28%22focus%22%2C%20checkNode%2C%20true%29%3B%0A%7D%2C%0AdestroyWindow%3A%20function%28window%2C%20reason%29%20%7B%0Aif%28reason%20%3D%3D%20this.REASON_WINDOW_CLOSED%29%0Awindow.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20//%20Window%20can%20be%20closed%20before%20%22load%22%20event%0A//%20Cleanup%0Awindow.removeEventListener%28%22focus%22%2C%20checkNode%2C%20true%29%3B%0A%7D%2C%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0Aif%28topic%20%3D%3D%20%22quit-application-granted%22%29%0Athis.destroy%28%29%3B%0Aelse%20if%28topic%20%3D%3D%20%22domwindowopened%22%29%0Asubject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0Aelse%20if%28topic%20%3D%3D%20%22domwindowclosed%22%29%0Athis.destroyWindow%28subject%2C%20this.REASON_WINDOW_CLOSED%29%3B%0A%7D%2C%0AhandleEvent%3A%20function%28e%29%20%7B%0Aswitch%28e.type%29%20%7B%0Acase%20%22load%22%3A%20this.loadHandler%28e%29%3B%20break%3B%0A%7D%0A%7D%2C%0AloadHandler%3A%20function%28e%29%20%7B%0Avar%20window%20%3D%20e.currentTarget%3B%0Awindow.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0Athis.initWindow%28window%2C%20this.REASON_WINDOW_LOADED%29%3B%0A%7D%0A%7D%3B%0AApplication.storage.set%28watcherId%2C%20watcher%29%3B%0Awatcher.init%28watcher.REASON_STARTUP%29%3B%0A%7D%0Afunction%20destructor%28reason%29%20%7B%0Aif%28reason%20%3D%3D%20%22update%22%20%7C%7C%20reason%20%3D%3D%20%22delete%22%29%20%7B%0Awatcher.destroy%28watcher.REASON_SHUTDOWN%29%3B%0AApplication.storage.set%28watcherId%2C%20null%29%3B%0A%7D%0A%7D%0Aif%28%0Atypeof%20addDestructor%20%3D%3D%20%22function%22%20//%20Custom%20Buttons%200.0.5.6pre4+%0A%26%26%20addDestructor%20%21%3D%20%28%22addDestructor%22%20in%20window%20%26%26%20window.addDestructor%29%0A%29%0AaddDestructor%28destructor%2C%20this%29%3B%0Aelse%0Athis.onDestroy%20%3D%20destructor%3B%20%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5Bokkamas_knife%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Нужна для индикации языка ввода.  Перестала работать с тёмным полем для ввода на FF42, а может и раньше обновлял с 33 сразу на 42.
Без картинок не объяснить.
45dad624c51467d5d61664142b5436c6.png
Буквы видны.
516216520aabf5a23b2b91d2013ae649.png
Тёмный фон поля ввода, буквы печатаются белым и не видны. Попробовать можно например тут (не расцените как рекламу ресурса.)
Возможно как-то исправить? Отключать на сайте по нажатию.

Mishania
Есть похожая кнопка:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EKL%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAIAAAB2uKNyAAAAl0lEQVR42mNkoAwwAvH////J1AwEg0T/0/vWmXePMfBMmG6RL82wvX+P136wEkXl21FfVFtfMsCkCOv3Pn5CddEXoLhVnOXREG6Gk5cZSdAfx12w6CVCMxCQoh8B0qpdZpozkK+fgUF82yZdT5L1O+r9D/sKYZPlf5TwB3OfQPQjAaAdhWL49COcg4g//PoHOv1Rop8SAACkKJ0R5kMP6wAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5BgBrowser.currentURI.spec%20%3D%3D%20%22about%3Acustomizing%22%20%7C%7C%20%28%28%5Bimg%5D%29%20%3D%3E%20%7B%0A%0A%09var%20interval%20%3D%20500%3B%20//%20ms%0A%0A%09var%20imgEN%20%20%3D%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAIAAAB2uKNyAAAAlElEQVR42mNkoAwwAvH////J1AwEg0T/57XW+5YcQ5VOM10/kxcqDmJLAcVOpm/smAXjkqCfgcF+m3+BJ0H9MHtgANlc6Yr/JgzE268wwak/nwFFPM20guE0OfoVJmjIF9w4iOI1UtwPMkvtZqDXU0L6kYGVxpSjUifg+vN5oYFHtn4GhmcTGE8fxKZ/oNMfJfopAQDmnKYRpM4nUAAAAABJRU5ErkJggg%3D%3D%22%3B%0A%09var%20imgRU%20%20%3D%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAIAAAB2uKNyAAAAjklEQVR42mNkoAwwAvH////J1AwEg0L/CYagTnTJmMkMQdIMT9cx5C5hYFBgmNzHIM0A4zIwlK9jMMevH6KHgST9KHaCFcmQb789w7p8ct2vEMPQFwRikKYf6H7pNQydB7H4BcI9OREsCzUOq/8ZGIpyGR7Awk/6KYyLxXWEwg+qDtUIuNcGUfqjTD8lAABRE34RggBENwAAAABJRU5ErkJggg%3D%3D%22%3B%0A%09var%20imgERR%20%3D%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAIAAAB2uKNyAAAAc0lEQVR42mNkoAwwAvH////J1AwEg0n/nYnWqgXHoJJp2/7P9MQliE3/9nRGr1nIxltNuH1UrRuLYL4KFv1Q7SB5760QK9O2bWPwwhSEOwG7/+EORnYsVkEs+onXjFU/VCWyJ3EI0ib+KbV/oN1Pln5KAACv6I0Rg3TeKQAAAABJRU5ErkJggg%3D%3D%22%3B%0A%0A%09var%20data%20%3D%20%7B67699721%3A%20imgEN%2C%2068748313%3A%20imgRU%7D%3B%0A%0A%09var%20%7Bctypes%7D%20%3D%20Cu.import%28%22resource%3A//gre/modules/ctypes.jsm%22%2C%20%7B%7D%29%3B%0A%09var%20lib%20%3D%20ctypes.open%28%22user32.dll%22%29%3B%0A%09var%20method%20%3D%20lib.declare%28%22GetKeyboardLayout%22%2C%20ctypes.winapi_abi%2C%20ctypes.uint32_t%2C%20ctypes.uint32_t%29%3B%0A%0A%09var%20currentLayout%2C%20layout%3B%0A%09function%20tick%28%29%20%7B%0A%09%09if%20%28%28layout%20%3D%20method%280%29%29%20%3D%3D%20currentLayout%29%20return%3B%0A%09%09currentLayout%20%3D%20layout%3B%20img.src%20%3D%20data%5Blayout%5D%20%7C%7C%20imgERR%3B%0A%09%7D%0A%09tick%28%29%3B%20var%20id%20%3D%20setInterval%28tick%2C%20interval%29%3B%0A%09addDestructor%28%28%29%20%3D%3E%20clearInterval%28id%29%20%7C%7C%20lib.close%28%29%29%3B%0A%0A%09//this._handleClick%20%3D%20%28%29%20%3D%3E%20alert%28method%280%29%29%3B%0A%0A%7D%29%28document.getAnonymousNodes%28this%29%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Их в одну объединить и вообще отлично будет. А так у меня рядом с часами тоже пишется какой язык включен, все понты как раз в цвете заключаются. :blush:

Mishania пишет

bunda1
Их в одну объединить и вообще отлично будет. А так у меня рядом с часами тоже пишется какой язык включен, все понты как раз в цвете заключаются. :blush:

А ты замени изображения imgEN, imgRU, imgERR в коде инициализации кнопки на цветные и все дела.

bunda1
Мы наверно не поняли друг друга. Предложенная мной кнопка изменяет цвет подсветки текстового поля, ваша меняет индикатор ru-en. Индикатор я могу посмотреть в системном трее, а к подсветке я привык. Но если к моей кнопки прикрутить вашу, то получится совсем красиво.
Но я так понимаю что исправить неудобства с цветом букв в моей кнопке не представляется возможным, так может можно добавить возможность вкл-вкл по нажатию?
"Моя кнопка" значит не "сделана мной", а "найдена мной где-то на форуме". :)

Mishania
ну тогда нужно изменить стиль сайта http://hdout.tv/

bunda1
А ведь верно, включаю "ночной режим" и всё прекрасно отображает.

Есть у кого актуальная кнопка с таким описанием?

*на форуме forum.mozilla-russia.org если в сообщении в секции код попадается такое:
custombutton://%3C%3F... - то бишь текст ссылки для установки СВ кнопки
то превращает его в ссылку и показывает иконку этой кнопки

У меня уже не работает

скрытый текст
addEventListener(
    "DOMContentLoaded",
    function(e) {
        var doc = e.target;
        var win = doc.defaultView;
        if(win != win.top) // Ignore frames
            return;

if (doc.location.host=="forum.mozilla-russia.org"){
var boxes = [];
var pres = doc.getElementsByTagName("pre");

for(var i = 0, l = pres.length; i < l; ++i) {
        var pre = pres[i];
        if(pre.parentNode.parentNode.parentNode.className == "codebox")
            boxes.push(pre);
    }
for(var i = 0, l = boxes.length; i < l; ++i) {
        var box = boxes[i];
        if(box.hasAttribute("data-highlight-js-parsed"))
            continue;
        box.setAttribute("data-highlight-js-parsed", "true");

        // Special "codes"
        var tc = box.textContent;
        if(
            /^custombutton:\/\/\S+%3C\/custombutton%3E\s*$/.test(tc)
            || /^data:[\w-]+\/[\w-]+;base64,\S+\s*$/.test(tc)
        ) {
            tc = tc.replace(/\s+$/, "");
            var a = doc.createElement("a");
            a.href = tc;

            var icon;
            if(/^data:image\//.test(tc))
                icon = tc;
            else if(
                /^custombutton:\/\//.test(tc)
                && /%3Cimage%3E%3C%21%5BCDATA%5B(data%3A\S+)%5D%5D%3E%3C\/image%3E/.test(tc)
            )
                try { icon = decodeURIComponent(RegExp.$1); } catch(e) {}
            if(icon) {
                var img = doc.createElement("img");
                img.src = icon;
                img.alt = "";
                var s = img.style;
                s.marginRight = "4px";
                s.verticalAlign = "middle";
                a.appendChild(img);
            }

            a.appendChild(doc.createTextNode(tc));
            var s = a.style;
            s.background = "none";
            s.margin = s.padding = 0;

            box.innerHTML = "";
            box.appendChild(a);
            continue;
        }
    }

  }
},
    true,
    document.getElementById("appcontent")
);


Спасибо

Kiril__777 пишет

У меня уже не работает

Проверил на FF44, работает.

Есть две разные кнопки для добавления в закладки
1 - PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.toolbarFolderId);
2 - PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title);
Вторая мне кажется удобней, но в первой есть замечательный пункт "удалить закладку". Можно их как-то объеденить?
PS. Маленько покопался и получился у меня вот такой монстр. Ка бы его сделать по уму? Чтоб осталась ЛКМ - открыть в боковой панели, а СКМ - объеденённая из двух кодов "добавить в закладки".

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

Выделить код

Код:

this.tooltipText = "L=Bookmarks Manager";

this. onclick = function (event)
{  
    if (event. button == 0) toggleSidebar('viewBookmarksSidebar');
    if (event. button == 2) PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.toolbarFolderId);
    if (event. button == 1) PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title);
    
};

bunda1
Точно, у меня этот код был не правильно использован

Mishania пишет

Вторая мне кажется удобней

А что там удобней?

04-01-2016 13:44:12
А если так:

Выделить код

Код:

this.onclick =e=> {
   e.button == 0 && toggleSidebar('viewBookmarksSidebar');
      
   if ( e.button == 1 ) {
        PlacesCommandHook.bookmarkPage(gBrowser, undefined, true);

        var panel = document.getElementById("editBookmarkPanel");
        addEventListener("popupshown", function c() {
            removeEventListener("popupshown", c);
                        
            panel.moveTo(e.screenX, e.screenY);
            document.getElementById('editBMPanel_foldersExpander').click();
        });
        }
};
this.tooltipText = "Л: Переключить боковую панель \nС: Добавить закладку \nП: CB Меню";

bunda1
Не появлется "дбавить в закладки".
Спасибо за вашу работу, благодаря вам использование браузера намного приятней, у меня наверно штук 10 кнопок сделаных вами. С праздниками вас!

А что там удобней?

Появляется окошко не в углу, а посредине экрана, возможность добавить описание, краткое имя, галочка "загружать в боковой панели". Из минусов - не появлется "удалить закладку" если такая уже существует. Мне бы хотя-бы в моей поделке сделать чтоб меню кнопки открывалось по ктрл+пкм, или шифт+пкм и нормально. Раньше помнится были ссылки на примеры, а теперь всё куда-то делось.

Mishania пишет

bunda1
Не появлется "дбавить в закладки".

Упс

Выделить код

Код:

this.onclick =e=> {
   e.button == 0 && toggleSidebar('viewBookmarksSidebar');
      
   if ( e.button == 1 ) {
        PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.toolbarFolderId);

        var panel = document.getElementById("editBookmarkPanel");
        addEventListener("popupshown", function c() {
           removeEventListener("popupshown", c);
                        
           panel.moveTo(e.screenX, e.screenY);
           document.getElementById('editBMPanel_foldersExpander').click();
        });
        }
};
this.tooltipText = "Л: Переключить боковую панель \nС: Добавить закладку \nП: CB Меню";

04-01-2016 21:13:53

Mishania пишет

Мне бы хотя-бы в моей поделке сделать чтоб меню кнопки открывалось по ктрл+пкм, или шифт+пкм и нормально.

Выделить код

Код:

this.onclick =e=> { 
   e.button == 0 && toggleSidebar('viewBookmarksSidebar');
   
   e.button == 1 && PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title);

   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
        e.preventDefault();  
        PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.toolbarFolderId);
        }
};

this.tooltipText = "Л: Переключить боковую панель \nС: Добавить закладку \nП: Добавить закладку";

04-01-2016 21:20:57

Mishania пишет

Из минусов - не появлется "удалить закладку" если такая уже существует

можно при нажатии СКМ автоматически удалить уже существующии закладки:

Выделить код

Код:

this.onclick =e=> { 
   e.button == 0 && toggleSidebar('viewBookmarksSidebar');
   
   if ( e.button == 1 ) {
        BookmarkingUI._itemIds.forEach((id,i)=> setTimeout(()=> PlacesUtils.bookmarks.removeItem(id), 10*i) );
        
        PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title);
        }
};

this.tooltipText = "Л: Переключить боковую панель \nС: Добавить закладку \nП: Добавить закладку";
Mishania пишет

Чтоб осталась ЛКМ - открыть в боковой панели, а СКМ - объеденённая из двух кодов "добавить в закладки".

:/

Выделить код

Код:

this.onclick =e=> { 
   e.button == 0 && toggleSidebar('viewBookmarksSidebar');
   
   if ( e.button == 1 ) {
        PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title);

        function observer(subject) {
           Services.ww.unregisterNotification(observer);

           subject.addEventListener("load", function c(e) {
              subject.removeEventListener("load", c);
              
              var doc = e.target;              
              doc.getElementById('editBMPanel_foldersExpander').click();
              
              if ( BookmarkingUI.status == 0 ) return;
                        
              var but = doc.createElement("button");
              but.setAttribute("label", "Удалить существующие закладки");
              doc.getElementById('bookmarkproperties').appendChild(but);
              but.onclick =()=> {
                 but.remove();
                 BookmarkingUI._itemIds.forEach((id,i)=> setTimeout(()=> PlacesUtils.bookmarks.removeItem(id), 10*i) );
              }; 
           });
        };
        Services.ww.registerNotification(observer);
        }
};

this.tooltipText = "Л: Переключить боковую панель \nС: Добавить закладку \nП: CB Меню";

bunda1
:( Теперь даже не знаю что выбирать. Пока пусть все три побалтаются, к какой привыкну та и останется. Спасибо вам большое.

Уважаемый Infocatcher,
у меня к Вам вопросы по закладкам:
Ваша кнопка перебирая в назначенном фолдере закладки (menuitem'ы) и подфолдеры получает Title закладок и их URL, а также Title подфолдеров.
1. А как получить Description закладки (если он есть) и другие реквизиты закладки (метки,краткое имя (shotnname), открывать ли в сайдбаре) ) а также Description фолдера (если он есть)?
2. Кроме того: сами закладки - это менюитемы (menuitem[0],menuitem[1]...menuitem[length-1]),  а вот подфолдеры - уже  не менюитемы (поскольку они подменю), но какое ключевое слово для них вместо menuitem[0],menuitem[1]... - я не знаю...
Вопрос 1 к Вашей кнопке отношения не имеет, конечно, но я надеюсь, раз  Title и URLы Вы извлекали, то сможете просветить меня как извлекаются остальные реквизиты...
Спасибо
-------------------------------------
К сожалению тема [CB]Bookmarks Folder | Форум Mozilla Россия глючит. Поэтому я этот свой коммент продублировал в этой

Плотно я занялся  браузерам и опять с просьбой.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ELinkification%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANtJREFUeNrskz0Lg0AMhpN6i6B/z0lcnOyki47iqDg4SHVxESd/nOAHCIKcvdCDtmg7uJVmuASeNx/k7pBzDmfsAiftBwowcdR1fbs7540VlmVdv3Esy5KgaZqwrisRRVGgaRoSPcSHHNM05bZtQ1VVBDVNA1VVd8ed5xmmaaJY5rBhGKDrOhA+iiKM45g/d5MmuuZ5DkEQYBiGXOawvu+pqvCu6/JlWcDzvP2FMUYaEcscMUGRZZnj+z7ouk7CcRwhSZKXHRxxFE/ZMIzdLbdtS7fwieP/L8AmwABkrYI7KtvK5gAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*//*%0A%20%20%20%20Linkification%0A%20%20%20%20Original%20script%20by%20Misha%20Splurov%0A%20%20%20%20http%3A//userscripts.org/scripts/show/67744%0A*/%0A%0A//%20%28c%29%20http%3A//data.iana.org/TLD/tlds-alpha-by-domain.txt%0Avar%20domains%20%3D%20%5B%0A%20%20%22ac%22%2C%20%22ad%22%2C%20%22ae%22%2C%20%22aero%22%2C%20%22af%22%2C%20%22ag%22%2C%20%22ai%22%2C%20%22al%22%2C%20%22am%22%2C%20%22an%22%2C%20%22ao%22%2C%20%22aq%22%2C%0A%20%20%22ar%22%2C%20%22arpa%22%2C%20%22as%22%2C%20%22asia%22%2C%20%22at%22%2C%20%22au%22%2C%20%22aw%22%2C%20%22ax%22%2C%20%22az%22%2C%20%22ba%22%2C%20%22bb%22%2C%20%22bd%22%2C%0A%20%20%22be%22%2C%20%22bf%22%2C%20%22bg%22%2C%20%22bh%22%2C%20%22bi%22%2C%20%22biz%22%2C%20%22bj%22%2C%20%22bm%22%2C%20%22bn%22%2C%20%22bo%22%2C%20%22br%22%2C%20%22bs%22%2C%0A%20%20%22bt%22%2C%20%22bv%22%2C%20%22bw%22%2C%20%22by%22%2C%20%22bz%22%2C%20%22ca%22%2C%20%22cat%22%2C%20%22cc%22%2C%20%22cd%22%2C%20%22cf%22%2C%20%22cg%22%2C%20%22ch%22%2C%0A%20%20%22ci%22%2C%20%22ck%22%2C%20%22cl%22%2C%20%22cm%22%2C%20%22cn%22%2C%20%22co%22%2C%20%22com%22%2C%20%22coop%22%2C%20%22cr%22%2C%20%22cu%22%2C%20%22cv%22%2C%20%22cx%22%2C%0A%20%20%22cy%22%2C%20%22cz%22%2C%20%22de%22%2C%20%22dj%22%2C%20%22dk%22%2C%20%22dm%22%2C%20%22do%22%2C%20%22dz%22%2C%20%22ec%22%2C%20%22edu%22%2C%20%22ee%22%2C%20%22eg%22%2C%0A%20%20%22er%22%2C%20%22es%22%2C%20%22et%22%2C%20%22eu%22%2C%20%22fi%22%2C%20%22fj%22%2C%20%22fk%22%2C%20%22fm%22%2C%20%22fo%22%2C%20%22fr%22%2C%20%22ga%22%2C%20%22gb%22%2C%0A%20%20%22gd%22%2C%20%22ge%22%2C%20%22gf%22%2C%20%22gg%22%2C%20%22gh%22%2C%20%22gi%22%2C%20%22gl%22%2C%20%22gm%22%2C%20%22gn%22%2C%20%22gov%22%2C%20%22gp%22%2C%20%22gq%22%2C%0A%20%20%22gr%22%2C%20%22gs%22%2C%20%22gt%22%2C%20%22gu%22%2C%20%22gw%22%2C%20%22gy%22%2C%20%22hk%22%2C%20%22hm%22%2C%20%22hn%22%2C%20%22hr%22%2C%20%22ht%22%2C%20%22hu%22%2C%0A%20%20%22id%22%2C%20%22ie%22%2C%20%22il%22%2C%20%22im%22%2C%20%22in%22%2C%20%22info%22%2C%20%22int%22%2C%20%22io%22%2C%20%22iq%22%2C%20%22ir%22%2C%20%22is%22%2C%20%22it%22%2C%0A%20%20%22je%22%2C%20%22jm%22%2C%20%22jo%22%2C%20%22jobs%22%2C%20%22jp%22%2C%20%22ke%22%2C%20%22kg%22%2C%20%22kh%22%2C%20%22ki%22%2C%20%22km%22%2C%20%22kn%22%2C%20%22kp%22%2C%0A%20%20%22kr%22%2C%20%22kw%22%2C%20%22ky%22%2C%20%22kz%22%2C%20%22la%22%2C%20%22lb%22%2C%20%22lc%22%2C%20%22li%22%2C%20%22lk%22%2C%20%22lr%22%2C%20%22ls%22%2C%20%22lt%22%2C%0A%20%20%22lu%22%2C%20%22lv%22%2C%20%22ly%22%2C%20%22ma%22%2C%20%22mc%22%2C%20%22md%22%2C%20%22me%22%2C%20%22mg%22%2C%20%22mh%22%2C%20%22mil%22%2C%20%22mk%22%2C%20%22ml%22%2C%0A%20%20%22mm%22%2C%20%22mn%22%2C%20%22mo%22%2C%20%22mobi%22%2C%20%22mp%22%2C%20%22mq%22%2C%20%22mr%22%2C%20%22ms%22%2C%20%22mt%22%2C%20%22mu%22%2C%20%22museum%22%2C%0A%20%20%22mv%22%2C%20%22mw%22%2C%20%22mx%22%2C%20%22my%22%2C%20%22mz%22%2C%20%22na%22%2C%20%22name%22%2C%20%22nc%22%2C%20%22ne%22%2C%20%22net%22%2C%20%22nf%22%2C%20%22ng%22%2C%0A%20%20%22ni%22%2C%20%22nl%22%2C%20%22no%22%2C%20%22np%22%2C%20%22nr%22%2C%20%22nu%22%2C%20%22nz%22%2C%20%22om%22%2C%20%22org%22%2C%20%22pa%22%2C%20%22pe%22%2C%20%22pf%22%2C%0A%20%20%22pg%22%2C%20%22ph%22%2C%20%22pk%22%2C%20%22pl%22%2C%20%22pm%22%2C%20%22pn%22%2C%20%22pr%22%2C%20%22pro%22%2C%20%22ps%22%2C%20%22pt%22%2C%20%22pw%22%2C%20%22py%22%2C%0A%20%20%22qa%22%2C%20%22re%22%2C%20%22ro%22%2C%20%22rs%22%2C%20%22ru%22%2C%20%22rw%22%2C%20%22sa%22%2C%20%22sb%22%2C%20%22sc%22%2C%20%22sd%22%2C%20%22se%22%2C%20%22sg%22%2C%0A%20%20%22sh%22%2C%20%22si%22%2C%20%22sj%22%2C%20%22sk%22%2C%20%22sl%22%2C%20%22sm%22%2C%20%22sn%22%2C%20%22so%22%2C%20%22sr%22%2C%20%22st%22%2C%20%22su%22%2C%20%22sv%22%2C%0A%20%20%22sy%22%2C%20%22sz%22%2C%20%22tc%22%2C%20%22td%22%2C%20%22tel%22%2C%20%22tf%22%2C%20%22tg%22%2C%20%22th%22%2C%20%22tj%22%2C%20%22tk%22%2C%20%22tl%22%2C%20%22tm%22%2C%0A%20%20%22tn%22%2C%20%22to%22%2C%20%22tp%22%2C%20%22tr%22%2C%20%22travel%22%2C%20%22tt%22%2C%20%22tv%22%2C%20%22tw%22%2C%20%22tz%22%2C%20%22ua%22%2C%20%22ug%22%2C%20%22uk%22%2C%0A%20%20%22us%22%2C%20%22uy%22%2C%20%22uz%22%2C%20%22va%22%2C%20%22vc%22%2C%20%22ve%22%2C%20%22vg%22%2C%20%22vi%22%2C%20%22vn%22%2C%20%22vu%22%2C%20%22wf%22%2C%20%22ws%22%2C%0A%20%20%22ye%22%2C%20%22yt%22%2C%20%22yu%22%2C%20%22za%22%2C%20%22zm%22%2C%20%22zw%22%0A%5D%3B%0A%0A//%20%28c%29%20http%3A//yellow5.us/firefox/linkification/%0Avar%20tagsForSkip%20%3D%20%5B%0A%20%20%22a%22%2C%20%22applet%22%2C%20%22area%22%2C%20%22embed%22%2C%20%22frame%22%2C%20%22frameset%22%2C%20%22head%22%2C%20%22iframe%22%2C%0A%20%20%22img%22%2C%20%22map%22%2C%20%22meta%22%2C%20%22noscript%22%2C%20%22object%22%2C%20%22option%22%2C%20%22param%22%2C%20%22script%22%2C%0A%20%20%22select%22%2C%20%22style%22%2C%20%22textarea%22%2C%20%22title%22%0A%5D%3B%0A%0Avar%20inArray%20%3D%20function%28value%2C%20items%29%20%7B%0A%20%20for%20%28var%20i%20%3D%200%3B%20items%5Bi%5D%20%26%26%20value%20%21%3D%20items%5Bi%5D%3B%20i++%29%3B%0A%20%20return%20value%20%3D%3D%20items%5Bi%5D%3B%0A%7D%0A%0Avar%20urlsRegExp%20%3D%20/%28%5E%7C%5B%5Cs%28%29%5C%5B%5C%5D_%3A%7E+@*%22%27%3E%5D%29%28%28%3F%3Ahttps%3F%7Cftp%7Circ%29%3A%5C/%5C/%29%3F%28%5B-a-z%5Cd%3B%3A%26%3D+%24%2C%25_.%21%7E*%27%28%29%5D+@%29%3F%28%28%3F%3A%28%3F%3A25%5B0-5%5D%7C2%5B0-4%5D%5Cd%7C%5B01%5D%3F%5Cd%5Cd%3F%29%5C.%29%7B3%7D%28%3F%3A25%5B0-5%5D%7C2%5B0-4%5D%5Cd%7C%5B01%5D%3F%5Cd%5Cd%3F%29%7C%28%3F%3A%28www%7Circ%7Cftp%29%5C.%29%3F%28%3F%3A%28%3F%3A%5Ba-z%5Cd%5D%7C%5Ba-z%5Cd%5D%5Ba-z%5Cd-%5D*%5Ba-z%5Cd%5D%29%5C.%29+%28%5Ba-z%5D%7B2%2C6%7D%29%29%28%3A%5Cd+%29%3F%28%5C/%28%3F%3A%5B-%5Cw.%21%7E*%27%28%29%25%3A@%26%3D+%24%2C%3B%5C/%5D*%5B%5Cw%7E*%25@%26%3D+%24%5C/%5D%29%3F%28%3F%3A%5C%3F%28%3F%3A%5B-%5Cw%3B%5C/%3F%3A@%26%3D+%24%2C.%21%7E*%27%28%29%25%5C%5B%5C%5D%7C%5D*%5B%5Cw%5C/@%26%3D+%24%7E*%25%5D%29%3F%29%3F%28%3F%3A%23%28%3F%3A%5B-%5Cw%3B%5C/%3F%3A@%26%3D+%24%2C.%21%7E*%27%28%29%25%5D*%5B%5Cw%5C/@%26%3D+%24%7E*%25%5D%29%3F%29%3F%7C%5Cb%29/i%0A%0Avar%20linksCounter%20%3D%200%3B%0A%0Avar%20current%20%3D%20content.document.body%3B%0Awhile%20%28current%29%20%7B%0A%20%20if%20%28current.nodeName%20%3D%3D%20%22%23text%22%20%26%26%20%28match%20%3D%20current.nodeValue.match%28urlsRegExp%29%29%20%26%26%20inArray%28match%5B6%5D%2C%20domains%29%29%20%7B%0A%20%20%20%20var%20url%3B%0A%20%20%20%20if%20%28match%5B3%5D%20%26%26%20%21%20match%5B2%5D%20%26%26%20%21%20match%5B5%5D%20%26%26%20%21%20match%5B8%5D%20%26%26%20%28match%5B3%5D.indexOf%28%22%3A%22%29%20%3D%3D%20-1%20%7C%7C%20match%5B3%5D.indexOf%28%22mailto%3A%22%29%20%3D%3D%200%29%29%20%7B%0A%20%20%20%20%20%20url%20%3D%20%28match%5B3%5D.indexOf%28%22mailto%3A%22%29%20%3D%3D%20-1%20%3F%20%22mailto%3A%22%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20+%20match%5B3%5D%0A%20%20%20%20%20%20%20%20%20%20+%20match%5B4%5D%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%20%7B%0A%20%20%20%20%20%20url%20%3D%20%28match%5B2%5D%20%3F%20match%5B2%5D%20%3A%20%28%21%20match%5B5%5D%20%7C%7C%20match%5B5%5D%20%3D%3D%20%22www%22%20%3F%20%22http%22%20%3A%20match%5B5%5D%29%20+%20%22%3A//%22%29%0A%20%20%20%20%20%20%20%20%20%20+%20%28match%5B3%5D%20%3F%20match%5B3%5D%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20+%20match%5B4%5D%0A%20%20%20%20%20%20%20%20%20%20+%20%28match%5B7%5D%20%3F%20match%5B7%5D%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20+%20%28match%5B8%5D%20%3F%20match%5B8%5D%20%3A%20%22%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28url%29%20%7B%0A%20%20%20%20%20%20var%20range%20%3D%20content.document.createRange%28%29%3B%0A%20%20%20%20%20%20range.setStart%28current%2C%20match.index%20+%20match%5B1%5D.length%29%3B%0A%20%20%20%20%20%20range.setEnd%28current%2C%20match.index%20+%20match%5B0%5D.length%29%3B%0A%20%20%20%20%20%20var%20a%20%3D%20content.document.createElement%28%22a%22%29%3B%0A%20%20%20%20%20%20a.setAttribute%28%22href%22%2C%20url%29%3B%0A%20%20%20%20%20%20a.setAttribute%28%22target%22%2C%20%22_blank%22%29%3B%0A%20%20%20%20%20%20a.setAttribute%28%22class%22%2C%20%22linkified%22%29%3B%0A%20%20%20%20%20%20a.appendChild%28range.extractContents%28%29%29%3B%0A%20%20%20%20%20%20range.insertNode%28a%29%3B%0A%20%20%20%20%20%20range.detach%28%29%3B%0A%20%20%20%20%20%20linksCounter++%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20if%20%28current.tagName%20%26%26%20%21inArray%28current.tagName.toLowerCase%28%29%2C%20tagsForSkip%29%20%26%26%20current.firstChild%29%20%7B%0A%20%20%20%20current%20%3D%20current.firstChild%3B%0A%20%20%7D%0A%20%20else%20if%20%28current.nextSibling%29%20%7B%0A%20%20%20%20current%20%3D%20current.nextSibling%3B%0A%20%20%7D%0A%20%20else%20%7B%0A%20%20%20%20do%20%7B%0A%20%20%20%20%20%20current%20%3D%20current.parentNode%3B%0A%20%20%20%20%7D%20while%20%28%21current.nextSibling%20%26%26%20current.parentNode%29%3B%0A%20%20%20%20current%20%3D%20current.nextSibling%3B%0A%20%20%7D%0A%7D%0A%0A/*%0Aif%20%28linksCounter%20%3E%200%29%20%7B%0A%20%20var%20style%20%3D%20content.document.createElement%28%22style%22%29%3B%0A%20%20style.type%20%3D%20%22text/css%22%3B%0A%20%20style.appendChild%28content.document.createTextNode%28%22a.linkified%3Abefore%20%7Bcontent%3A%20%22%7E%22%3B%20color%3A%20%23e00%3B%7D%22%29%29%3B%0A%20%20content.document.getElementsByTagName%28%22head%22%29%5B0%5D.appendChild%28style%29%3B%0A%7D%0A*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Кнопка по нажатию делает текстовые ссылки кликабельными. А как сделать чтоб была всегда включена? Пробовал в инициализацию код перенести - не помогает.

Mishania
А если не кнопка,а скрипт ?

VORON
Как раз хочу кнопку вместо этого скрипта попробовать :)

где данная тема теперь находится?
Информация об обновлениях кнопок(стабильные релизы) | Форум Mozilla Россия

firepox пишет

где данная тема теперь находится?
Информация об обновлениях кнопок(стабильные релизы) | Форум Mozilla Россия

Автор okkamas_knife эту тему удалил :/

понятно, и тем самым испортил себе карму...:angry:

bunda1 пишет

firepox пишет: где данная тема теперь находится?
Информация об обновлениях кнопок(стабильные релизы) | Форум Mozilla Россия

Автор okkamas_knife эту тему удалил hmm.png

Так  восстановите, положительный опыт  ведь уже есть.

Возможно, кто то знает в чем причина.
добавляю кнопки в эту область, но иногда они пропадают - приходиться снова их добавлять, бесит.
а вот те, что на скрине, не пропадают.
в чем закономерность, почему так?

3UxTrPs.png

voqabuhe пишет

Так  восстановите, положительный опыт  ведь уже есть.

Думаю не нужно, как нибудь обойдёмся.

где узнавать о новых версиях  кнопок?

firepox пишет

добавляю кнопки в эту область, но иногда они пропадают - приходиться снова их добавлять, бесит.

Что значит пропадает, удаляются на совсем или переходят в настройку панелей(Customize)?

19-01-2016 23:50:48

firepox пишет

где узнавать о новых версиях  кнопок?

Про свои кнопки я сообщу в теме кнопки если для кнопки есть отдельная тема или в теме Custom Buttons | Форум Mozilla Россия

переходят в настройку панелей(Customize)

Привет всем!

Очень хочется иметь кнопочку, при нажатии на которую, ОТКРЫТАЯ страница https://site.com/w12345 открывается как https://XX.site.com/Zw12345
На данный момент приходится вручную подставлять XX. и Z

https://site.com/ должно подменяться на https://XX.site.com/Z или типа того)

Спасибо!

p.s.
* w12345 - у каждой страницы свой номер
* XX - не меняется
* Z - не меняется

У меня есть 100 рублей на webmoney, готов отдать за помощь :)

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

Имеется кнопка для очистки поля адреса и поиска прокруткой колесика мышки.

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

Выделить код

Код:

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


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

Uxapb пишет

любого поля для ввода текста

Есть такое дополнение. Не помню только название.

Есть код:

Выделить код

Код:

---------------------------------------------------------------------------
     Открывать любую новую вкладку справа от текущей
   --------------------------------------------------------------------------- */ 
// Открывать любую новую вкладку справа от текущей, от 24.10.2014. ................................ 
addEventListener("TabOpen", function(e) {
   var newTab = e.target;
   var lab = newTab.label;
   var tabpos = gBrowser.selectedTab._tPos;
   var newTabLab = gBrowser.mStringBundle.getString("tabs.emptyTabTitle");

   if ( tabpos == 0 && lab == newTabLab ) return;                     // если восстановление сессии
   if ( tabpos == 0 && lab == '' ) return;                            // если восстановление сессии с Bookmarks Tab     
   if ( new Error().stack.indexOf("openContainer") !== -1 ) return;   // если открыть всё во вкладках из папки закладок  
   if ( /handleLinkClick/.test(new Error().stack) ) return;           // если открыть ссылку по СКМ 

   gBrowser.moveTabTo( e.target, tabpos + 1 );
   
   // автоматически закрывать "custombutton" вкладку
   if ( lab.startsWith("custombutton://%") ) setTimeout(function() gBrowser.removeTab( newTab ), 0);

}, false, gBrowser.tabContainer );

В 44 лисе перестал работать. Как исправить?

KOT040188, https://addons.mozilla.org/ru/firefox/a … s/reviews/

ecool, и как эту версию установить, если она не проверена?

KOT040188
xpinstall.signatures.required;false

Всем спасибо.

Подскажите, пожалуйста, а вот это нельзя сотворить с помощью СВ?
http://forum.mozilla-russia.org/viewtop … 84#p706384

Разобрался как в этой кнопке делать свои категории. Сложновато. А может есть более простая в редактировании кнопка для вставки символов, слов и словосочетаний с категориями? И ещё подскажите есть ли кнопка добавляющая в контестное меню изображений пункт сохранить? И ещё, возможно ли сделать две кнопки: первая по нажатию показывает выподающее из неё окно с загруженным любым адресом, вторая оповещает о новых письмах загружая их заголовки и по нажатию открывает страницу почты?

KOT040188 пишет

Разобрался как в этой кнопке делать свои категории. Сложновато. А может есть более простая в редактировании кнопка для вставки символов, слов и словосочетаний с категориями?

А если так:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0412%u0441%u0442%u0430%u0432%u043A%u0430%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u0435%20%u043F%u043E%u043B%u0435%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEADQ0AAAEAIAAAAwAAFgAAACgAAAANAAAAGgAAAAEAIAAAAAAA2AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAAVwAAACMAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAPAAAAEoAAAAMAAAAQgAAAOQAAACiAAAAAgAAABcAAABKAAAAVwAAADsAAAAHAAAAGwAAANcAAAC7AAAAFwAAAAsAAACHAAAA8QAAAJ0AAACeAAAA/QAAAP8AAADvAAAAhAAAAL8AAADrAAAAXwAAAAQAAAAAAAAABgAAAJMAAAD/AAAA7AAAAKUAAACHAAAAvQAAAPcAAAD/AAAAYQAAAAAAAAAAAAAAAwAAAAsAAACXAAAA9gAAAF8AAAAAAAAAAQAAAAwAAACOAAAA+QAAAGAAAAAAAAAAAwAAAAAAAAA1AAAA5gAAAK8AAAACAAAABgAAAA4AAAAAAAAAJQAAAOAAAAC1AAAADwAAAAAAAAAAAAAASwAAAPMAAACIAAAAAAAAAAkAAAAAAAAABgAAAAMAAAC8AAAAzgAAACQAAAAAAAAAAAAAAEAAAADuAAAAnAAAAAAAAAALAAAACgAAAAMAAAARAAAAzwAAAMEAAAAXAAAAAAAAAAAAAAAUAAAArwAAAOMAAAA8AAAAAAAAAAgAAAAAAAAAYQAAAP8AAAB+AAAAAgAAAAAAAAAEAAAAAQAAAHwAAAD/AAAAzAAAAG4AAABZAAAAggAAAOMAAAD/AAAASgAAAAAAAAAFAAAAAAAAAFIAAADlAAAAygAAAMYAAAD/AAAA+AAAAP8AAAC8AAAA3AAAAMoAAAApAAAAAAAAADoAAADjAAAAyQAAACEAAAAuAAAAeAAAAH8AAABqAAAAIQAAAD8AAADqAAAAvQAAAB4AAAA4AAAAhQAAADoAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAWQAAAIUAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20...........%0Athis._handleClick%20%3D%28%29%3D%3E%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0430%u0435%u043C%20%u0438%u0437%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%27%u0421%u043F%u0440%u0430%u0432%u043A%u0430%27%20%u043C%u0430%u0441%u0441%u0438%u0432%20%u0441%20%u0434%u043E%u043C%u0435%u043D%u0430%u043C%u0438%20..............%0Avar%20sep%20%3D%20%22%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%22%3B%0Avar%20array%20%3D%20self.Help.split%28sep%29.filter%28%28host%29%3D%3E%20/%5CS/.test%28host%29%29.map%28%28host%29%3D%3E%20host.trim%28%29%29%3B%20%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20...........%0Avar%20menuPopup%20%3D%20self.appendChild%28%20document.createElement%28%22menupopup%22%29%20%29%3B%0Aarray.forEach%28%28symbol%29%3D%3E%20%7B%20%0A%20%20%20%20%20var%20menuItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20menuItem.setAttribute%28%22label%22%2C%20symbol%20%29%3B%0A%20%20%20%20%20menuItem.style.fontSize%20%3D%20%2216px%22%3B%20//%20%u0440%u0430%u0437%u043C%u0435%u0440%20%u0448%u0440%u0438%u0444%u0442%u0430%0A%20%20%20%20%20menuItem.addEventListener%28%22command%22%2C%20insertText%2C%20false%29%3B%20%0A%20%20%20%20%20menuPopup.appendChild%28menuItem%29%3B%0A%7D%29%3B%0AmenuPopup.setAttribute%28%22onclick%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%0A%0A//%20%u0421%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u0435%20%u043F%u043E%u043B%u0435%20............%0Afunction%20insertText%28%29%20%7B%20%0A%20%20%20var%20text%20%3D%20this.label%3B%0A%20%20%20var%20cmd%20%3D%20%22cmd_insertText%22%3B%0A%20%20%20var%20controller%20%3D%20document.commandDispatcher.getControllerForCommand%28cmd%29%3B%0A%20%20%20if%20%28%20controller%20%26%26%20controller.isCommandEnabled%28cmd%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20var%20controller%20%3D%20controller.QueryInterface%28Ci.nsICommandController%29%3B%0A%20%20%20%20%20%20%20%20var%20params%20%3D%20Cc%5B%22@mozilla.org/embedcomp/command-params%3B1%22%5D.createInstance%28Ci.nsICommandParams%29%3B%0A%20%20%20%20%20%20%20%20params.setStringValue%28%22state_data%22%2C%20text%29%3B%0A%20%20%20%20%20%20%20%20controller.doCommandWithParams%28cmd%2C%20params%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A%28%28%29%3D%3E%20%7B%20%7D%29%28%29%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A%28function%20%28%29%20%7B%20%7D%29%28%29%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Atry%20%7B%20%7D%20catch%28e%29%20%7B%20%20%7D%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0AsetTimeout%28%28%29%3D%3E%20%7B%20%u0437%u0434%u0435%u0441%u044C%3D%3E%3C%3D%u0437%u0434%u0435%u0441%u044C%20%7D%2C%20500%29%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A.getAttribute%28%27%u0437%u0434%u0435%u0441%u044C%3D%3E%3C%3D%u0437%u0434%u0435%u0441%u044C%27%29%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Adocument.getElementById%28%27%u0437%u0434%u0435%u0441%u044C%3D%3E%3C%3D%u0437%u0434%u0435%u0441%u044C%27%29%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Adocument.getAnonymousElementByAttribute%28tab%2C%20%22class%22%2C%20%22tab-icon-image%22%29%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A%u0420%u0430%u0437%u043E%u0431%u0440%u0430%u043B%u0441%u044F%20%u043A%u0430%u043A%20%u0432%20%u044D%u0442%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u0434%u0435%u043B%u0430%u0442%u044C%20%u0441%u0432%u043E%u0438%20%u043A%u0430%u0442%u0435%u0433%u043E%u0440%u0438%u0438.%20%u0421%u043B%u043E%u0436%u043D%u043E%u0432%u0430%u0442%u043E.%0A%u0410%20%u043C%u043E%u0436%u0435%u0442%20%u0435%u0441%u0442%u044C%20%u0431%u043E%u043B%u0435%u0435%20%u043F%u0440%u043E%u0441%u0442%u0430%u044F%20%u0432%20%u0440%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0438%20%u043A%u043D%u043E%u043F%u043A%u0430%20%u0434%u043B%u044F%20%u0432%u0441%u0442%u0430%u0432%u043A%u0438%20%u0441%u0438%u043C%u0432%u043E%u043B%u043E%u0432%2C%20%u0441%u043B%u043E%u0432%20%u0438%20%u0441%u043B%u043E%u0432%u043E%u0441%u043E%u0447%u0435%u0442%u0430%u043D%u0438%u0439%20%u0441%20%u043A%u0430%u0442%u0435%u0433%u043E%u0440%u0438%u044F%u043C%u0438%3F%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A123456%0A098765%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0A%20%20%20%20%u0424%u043E%u0440%u0443%u043C%u044B%0A%20%20%20%20%20%BB%20%u0421ustom%20Buttons%0A%20%20%20%20%20%BB%20%u041E%u0431%u0441%u0443%u0436%u0434%u0435%u043D%u0438%u0435%20%u043A%u043D%u043E%u043F%u043E%u043A%20CB%0A%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Свой текст складывай в вкладку Справка

04-02-2016 22:13:04

KOT040188 пишет

И ещё подскажите есть ли кнопка добавляющая в контестное меню изображений пункт сохранить?

Куда сохранить?

bunda1
Что-то не задалось с категориями:
%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-2016_02_04_22_17_33.png

KOT040188 пишет

Что-то не задалось с категориями:

Там нет категорий зато кнопка более простая.

bunda1 пишет

Куда сохранить?

Через диалог…

04-02-2016 22:23:13

bunda1 пишет

Там нет категорий зато кнопка более простая.

Ну я же писал, что категории нужны…

KOT040188 пишет

Через диалог…

В контекстном меню изображений уже есть пункт сохранить через диалог - Save Image As… или Сохранить изображение как…

04-02-2016 22:31:14

KOT040188 пишет

Ну я же писал, что категории нужны…

Такую кнопку не знаю.

bunda1 пишет

В контекстном меню изображений уже есть пункт сохранить через диалог

Что, правда?! Вот я слоупок… Ну а если в определённую папку?

KOT040188 пишет

Ну а если в определённую папку?

Ну а если двойным правым кликом мыши сохранить изображение без запроса в указанную папку - var path = 'C:\\qwerty';

Выделить код

Код:

// Двойным правым кликом мыши сохранить изображение без запроса в указанную папку ..............    
addEventListener("dblclick", (e, targ = e.target)=> {
  if ( e.button == 2 && targ.localName == 'img' ) {    

       var path = 'C:\\qwerty';
       
       var {get} = Application.prefs, run = get("browser.download.folderList"), dwnPath = get("browser.download.dir"), p, r;
       if ( dwnPath ) p = dwnPath.value, dwnPath.value = path;
       else Application.prefs.setValue("browser.download.dir", path);
       r = run.value, run.value = 2;
       saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
       run.value = r; if (dwnPath) dwnPath.value = p;
       
       setTimeout(()=> document.getElementById("contentAreaContextMenu").hidePopup(), 20);
       }  
}, true, gBrowser );
bunda1 пишет

Ну а если двойным правым кликом мыши сохранить изображение без запроса в указанную папку

А если изображения является ссылкой? Мне надо в меню.

KOT040188 пишет

Мне надо в меню.

Выделить код

Код:

// Сохранять изображение без запроса в указанную папку ..............    
((contextMenu, viewimage) => {
   var path = 'C:\\qwerty';
   var arr = path.split("\\");
   var menuItem = contextMenu.insertBefore(document.createElement("menuitem"), viewimage);
   menuItem.setAttribute("label", "Сохранить в указанную папку: " + arr[arr.length-1]);
   addDestructor(()=> menuItem.remove() );
   addEventListener("popupshowing", e=> menuItem.hidden = viewimage.hidden, false, contextMenu); 
   menuItem.onclick =()=> {
      var {get} = Application.prefs, run = get("browser.download.folderList"),
           dwnPath = get("browser.download.dir"), p, r;
      if ( dwnPath ) p = dwnPath.value, dwnPath.value = path;
      else Application.prefs.setValue("browser.download.dir", path);
      r = run.value, run.value = 2;
      saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
      run.value = r; if (dwnPath) dwnPath.value = p;
   }
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-viewimageinfo"));

bunda1
У меня linux. Поменял путь на /home/kot/ -стал выводится запрос…
Добавляю в эту кнопку такую конструкцию:

Выделить код

Код:

[
       "Смайлики"
         "ヅ",
        ],

и она перестаёт работать. Почему?

05-02-2016 15:11:50

KOT040188 пишет

И ещё, возможно ли сделать две кнопки: первая по нажатию показывает выподающее из неё окно с загруженным любым адресом, вторая оповещает о новых письмах загружая их заголовки и по нажатию открывает страницу почты?

Возможно ли такое?

KOT040188 пишет

и она перестаёт работать. Почему?

там нужна ,

05-02-2016 15:14:56
"Смайлики", "ヅ"

05-02-2016 15:15:54

KOT040188 пишет

Возможно ли такое?

А вот не знаю :/

bunda1 пишет

там нужна ,

Вот спасибо, в упор не видел…

У меня linux. Поменял путь на /home/kot/ -стал выводится запрос…

Так а с этим что делать?

KOT040188 пишет

Так а с этим что делать?

Отключи в настройках Firefox Всегда выдавать запрос на сохранение файлов

bunda1 пишет

Отключи в настройках Firefox Всегда выдавать запрос на сохранение файлов

А по другому никак? Тогда flashgot перестанет работать…

KOT040188 пишет

А по другому никак?

Выделить код

Код:

// Сохранять изображение без запроса в указанную папку из контекстного меню, от 06.02.2016. ...............   
((contextMenu, viewimage) => {

   var path = '/home/kot/';    // путь к папке для сохранения изображений

   var menuItem = contextMenu.insertBefore(document.createElement("menuitem"), viewimage);
   menuItem.setAttribute("label", "Сохранить в папку: " + path.split("\/")[path.split("\/").length-2] ); //path.slice(path.indexOf("\\")+1)
   addDestructor(()=> menuItem.remove() );
   addEventListener("popupshowing", e=> menuItem.hidden = viewimage.hidden, false, contextMenu); 
   
   menuItem.onclick =()=> {
      var run = cbu.getPrefs("browser.download.folderList"),
          use = cbu.getPrefs("browser.download.useDownloadDir"),
          dir = gPrefService.getComplexValue("browser.download.dir", Ci.nsISupportsString).data;
      
      cbu.setPrefs("browser.download.folderList", 2);
      cbu.setPrefs("browser.download.useDownloadDir", true);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", path) );
      
      saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
      
      cbu.setPrefs("browser.download.folderList", run);
      cbu.setPrefs("browser.download.useDownloadDir", use);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", dir) );     
   }
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-viewimageinfo"));

bunda1
Спасибо.

KOT040188 пишет

bunda1
Спасибо.

немного подправил Сегодня 21:01:52

Ну я переписал на всякий случай, хотя и так работало…

bunda1 А можете сделать  с сохранением функции  "Всегда выдавать запрос на сохранение файлов" только для жестов с путем к папке для сохранения изображений?

tom911 пишет

bunda1 А можно замутить  с сохранением функции  "Всегда выдавать запрос на сохранение файлов" только для жестов ?

Ты про FireGestures?

Есть ваш вот такой код

скрытый текст
if ( direction == "L" ) {
                      // сохранить ссылку или изображение без запроса на место сохранения в папке загрузки или на диск C:
                      var path = путь сохранения
var {get} = Application.prefs, run = get("browser.download.folderList"), dwnPath = get("browser.download.dir"), p, r;
if ( dwnPath ) p = dwnPath.value, dwnPath.value = path;
else Application.prefs.setValue("browser.download.dir", path);
r = run.value, run.value = 2;
saveImageURL( img, 0, 0, 0, 1, null, content.document );
run.value = r; if (dwnPath) dwnPath.value = p;
                      }
                     
                 return;     
                 }

но он не работает с функцией "Всегда выдавать запрос на сохранение файлов". Хотелось чтобы он заработал с  этой функцией.

tom911 пишет

Хотелось чтобы он заработал с  этой функцией.

Выделить код

Код:

var path = 'C:\\qwerty';
   
                      var run = cbu.getPrefs("browser.download.folderList"),
                      use = cbu.getPrefs("browser.download.useDownloadDir"),
                      dir = gPrefService.getComplexValue("browser.download.dir", Ci.nsISupportsString).data;
      
                      cbu.setPrefs("browser.download.folderList", 2);
                      cbu.setPrefs("browser.download.useDownloadDir", true);
                      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", path) );
      
                      saveImageURL(img, 0, 0, 0, 1, null, content.document);
      
                      cbu.setPrefs("browser.download.folderList", run);
                      cbu.setPrefs("browser.download.useDownloadDir", use);
                      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", dir) );

bunda1
Спасибо огромное! Мне бы ваши умения!

Помогите с кнопкой быстрой замены текста RU > EN

firepox пишет

Помогите с кнопкой быстрой замены текста RU > EN

Преобразование из латиницы в кириллицу и наоборот

bunda1
Заметил что перестала работать кнопка Добавлять новые СВ кнопки справа от этой кнопки. FF42.

Mishania пишет

bunda1
Заметил что перестала работать кнопка Добавлять новые СВ кнопки справа от этой кнопки. FF42.

У меня без проблем работает на FF24 и FF45, не понятно в чём тут дело. На какой панели у тебя кнопка? Может попробуй переместить кнопку на другое место, поэкспериментируй с этим.

bunda1
Обычно кнопка находится на "Puzzle панеле", пробовал на стандартные панели ff - всё равно не работает. Если кнопка рабочая, значит буду копать что мешает. Если найду - отпишусь.
PS/ Сделал новый профиль, установил всё что стояло на старом и кнопка работает.

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

bunda1 пишет

KOT040188 пишет: А по другому никак?Выделить кодКод:// Сохранять изображение без запроса в указанную папку из контекстного меню, от 06.02.2016. ...............   
((contextMenu, viewimage) => {
var path = '/home/kot/';    // путь к папке для сохранения изображений

   var menuItem = contextMenu.insertBefore(document.createElement("menuitem"), viewimage);
   menuItem.setAttribute("label", "Сохранить в папку: " + path.split("\/")[path.split("\/").length-2] ); //path.slice(path.indexOf("\\")+1)
   addDestructor(()=> menuItem.remove() );
   addEventListener("popupshowing", e=> menuItem.hidden = viewimage.hidden, false, contextMenu);
   
   menuItem.onclick =()=> {
      var run = cbu.getPrefs("browser.download.folderList"),
          use = cbu.getPrefs("browser.download.useDownloadDir"),
          dir = gPrefService.getComplexValue("browser.download.dir", Ci.nsISupportsString).data;
     
      cbu.setPrefs("browser.download.folderList", 2);
      cbu.setPrefs("browser.download.useDownloadDir", true);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", path) );
     
      saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
     
      cbu.setPrefs("browser.download.folderList", run);
      cbu.setPrefs("browser.download.useDownloadDir", use);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", dir) );     
   }
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-viewimageinfo"));


А почему когда прописываешь свой путь к папке сохранения в контекстном меню отображается "сохранить в папке:undefined"?

tom911 пишет

А почему когда прописываешь свой путь к папке сохранения в контекстном меню отображается "сохранить в папке:undefined"?

Потому что там для linux, для win будет так:

Выделить код

Код:

// Сохранять изображение без запроса в указанную папку из контекстного меню, от 06.02.2016. ...............   
((contextMenu, viewimage) => {

   var path = 'C:\\qwerty';    // путь к папке для сохранения изображений

   var menuItem = contextMenu.insertBefore(document.createElement("menuitem"), viewimage);
   menuItem.setAttribute("label", "Сохранить в папку: " + path.slice(path.indexOf("\\")+1));
   addDestructor(()=> menuItem.remove() );
   addEventListener("popupshowing", e=> menuItem.hidden = viewimage.hidden, false, contextMenu); 
   
   menuItem.onclick =()=> {
      var run = cbu.getPrefs("browser.download.folderList"),
          use = cbu.getPrefs("browser.download.useDownloadDir"),
          dir = gPrefService.getComplexValue("browser.download.dir", Ci.nsISupportsString).data;
      
      cbu.setPrefs("browser.download.folderList", 2);
      cbu.setPrefs("browser.download.useDownloadDir", true);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", path) );
      
      saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
      
      cbu.setPrefs("browser.download.folderList", run);
      cbu.setPrefs("browser.download.useDownloadDir", use);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", dir) );     
   }
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-viewimageinfo"));

bunda1 В который раз спасибо:D

Помогите
Перестала работать кнопка google-translate от Lex1  https://forum.mozilla-russia.org/viewtopic.php?pid=591530#p591530
Настолько привык к этой кнопке, что все другое не нравится.
Версия браузера 44.01

Vvld пишет

Перестала работать кнопка google-translate от Lex1  https://forum.mozilla-russia.org/viewtopic.php?pid=591530#p591530
Настолько привык к этой кнопке, что все другое не нравится.
Версия браузера 44.01

№8996 или уже исправленное custombuttons@xsms.org.7z

voqabuhe
Спасибо.
Кнопка работает.
Появилась другая беда - утилита APS верещит, вроде бы как DOS-атака. Отключаю кнопку - утилита молчит. Да и сам FF предупреждает.
Что там внутри .xpi ?

Vvld пишет

Появилась другая беда - утилита APS верещит, вроде бы как DOS-атака. Отключаю кнопку - утилита молчит.

А что такое эта  твая APS?  Но если она "верещит" на CB, то её надо в топку :sick:

Vvld пишет

Да и сам FF предупреждает.

Скрин в студию.

Vvld пишет

Что там внутри .xpi ?

Откуда же я знаю, что там у тебя в .xpi.  Я выкладывал 7z архив  вот с этой распакованной уже версией CB Download custombuttons-0.0.5.9pre1-20140622.xpi (119.6 kB)  custombuttons - Browse Files at SourceForge.net, в которую, как уже выше указывал, внёс изменения от Dumby №8996
Проделай это сам, может тогда тебя досить перестанет. :D

voqabuhe
Спасибо
Я уже сам разобрался
В custombuttons файлы .js
На версию 0.0.5.8 Aps не реагировала, а вот с версией 0.0.5.9 ругается.
Какой-то .js что-то приглашает извне. разбираться не буду.
Во избежании недоразумений перейду на братана FF, так будет лучше.

Есть код:

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 24.10.2014. ................................ 
addEventListener("TabOpen", function(e) {
   var newTab = e.target;
   var lab = newTab.label;
   var tabpos = gBrowser.selectedTab._tPos;
   var newTabLab = gBrowser.mStringBundle.getString("tabs.emptyTabTitle");

   if ( tabpos == 0 && lab == newTabLab ) return;                     // если восстановление сессии
   if ( tabpos == 0 && lab == '' ) return;                            // если восстановление сессии с Bookmarks Tab     
   if ( new Error().stack.indexOf("openContainer") !== -1 ) return;   // если открыть всё во вкладках из папки закладок  
   if ( /handleLinkClick/.test(new Error().stack) ) return;           // если открыть ссылку по СКМ 

   gBrowser.moveTabTo( e.target, tabpos + 1 );
   
   // автоматически закрывать "custombutton" вкладку
   if ( lab.startsWith("custombutton://%") ) setTimeout(function() gBrowser.removeTab( newTab ), 0);

}, false, gBrowser.tabContainer );

На первой слева вкладке почему-то не работает. Как это починить не сломав ничего другого. И ещё, открытие нескольких ссылок подряд со странице идёт так: первая ссылка справа от вкладки, вторая ссылка справа от уже открытой вкладки и т.д. Вкладки открываются в фоне. Но открытие закладок из избранного открытого во вкладке происходит иначе: каждая закладка открывается рядом с избранным и фокус переходит на на них. Как изменить поведение открытия закладок на поведение открытия ссылок?

KOT040188
Может это подойдет...

oleg.sgh
Спасибо, этот код работает на первой вкладке. Но он ломает особенность открытия ссылок со страницы в лисе по умолчанию:

KOT040188 пишет

И ещё, открытие нескольких ссылок подряд со странице идёт так: первая ссылка справа от вкладки, вторая ссылка справа от уже открытой вкладки и т.д

Мне бы всё-таки поправить мою кнопку.

KOT040188 пишет

Как изменить поведение открытия закладок на поведение открытия ссылок?

Переключи в about:config browser.tabs.loadBookmarksInBackground

bunda1
Спасибо, это решило вопрос переключением на открываему вклалку, но последовательность открытиия подряд нескольких ссылок по прежнему не соответствует схеме открытия ссылок со страницы. В общем осталось поправить две проблемы: схему открытия закладок из избранного и fvd и неработающий код на первой слева вкладке.

KOT040188 пишет

bunda1
Спасибо, это решило вопрос переключением на открываему вклалку, но последовательность открытиия подряд нескольких ссылок по прежнему не соответствует схеме открытия ссылок со страницы. В общем осталось поправить две проблемы: схему открытия закладок из избранного и fvd и неработающий код на первой слева вкладке.

А как должно быть с ссылками и избранным?

KOT040188 пишет

И ещё, открытие нескольких ссылок подряд со странице идёт так: первая ссылка справа от вкладки, вторая ссылка справа от уже открытой вкладки и т.д

Обыкновенное стандартное лисье поведение. Сколько раз ещё процитировать?

KOT040188 пишет

Обыкновенное стандартное лисье поведение.

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей ............
addEventListener("TabOpen", (e)=> {
   var newTab = e.target,
       tabpos = gBrowser.selectedTab._tPos,
       err = new Error().stack; 

   // если восстановление сессии, открыть ссылки или открыть всё во вкладках из папки закладок 
   if ( /ssi_restore|openContainer|openLinkIn/.test(err) ) return;  

   /undoCloseTab/.test(err)
   ? setTimeout(()=> gBrowser.moveTabTo(newTab, tabpos + 1), 50) // если восстановление вкладки
   : gBrowser.moveTabTo(newTab, tabpos + 1);

}, false, gBrowser.tabContainer );

bunda1
Закладки из библиотеки стали открываться справа в конце…:(

KOT040188 пишет

bunda1
Закладки из библиотеки стали открываться справа в конце…:(

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей ............
addEventListener("TabOpen", (e)=> {
   var newTab = e.target,
       tabpos = gBrowser.selectedTab._tPos,
       err = new Error().stack; 

   // если восстановление сессии, открыть ссылки или открыть всё во вкладках из папки закладок 
   if ( /ssi_restore|openContainer|handleLinkClick|nsContextMenu/.test(err) ) return;  

   /undoCloseTab/.test(err)
   ? setTimeout(()=> gBrowser.moveTabTo(newTab, tabpos + 1), 50) // если восстановление вкладки
   : gBrowser.moveTabTo(newTab, tabpos + 1);

}, false, gBrowser.tabContainer );

bunda1
Спасибо, этот код работает на первой слева вкладке! А вот порядок открытия закладок из библиотеки и из fvd остался прежним.

KOT040188 пишет

Спасибо, этот код работает на первой слева вкладке! А вот порядок открытия закладок из библиотеки и из fvd остался прежним.

Ну тогда не знаю :/ мне на FF44 код открывает закладки из библиотеки рядом с текущей вкладкой как и должно быть.

bunda1 пишет

код открывает закладки из библиотеки рядом с текущей вкладкой как и должно быть.

Так и у меня рядом. Вы так и не поняли про порядок открытия? Как мне ещё объяснить?

KOT040188 пишет

Как мне ещё объяснить?

Другими словами и лаконично. Может просто напиши что надо открывать сразу справа от текущей вкладки а что оставить как есть.

Нашёл ссылку где описывается схема http://opennet.ru/openforum/vsluhforumID3/47886.html:

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

Так открываются ссылки со страницы. Я хочу так же открывать закладки из библиотеки и fvd. Раньше в официальной вики картинку видел, но теперь не найду ссылку.

KOT040188 пишет

Так открываются ссылки со страницы. Я хочу так же открывать закладки из библиотеки и fvd. Раньше в официальной вики картинку видел, но теперь не найду ссылку.

Понятно, я пока не знаю как такое сделать.

bunda1 пишет

Понятно, я пока не знаю как такое сделать.

Понятно, спасибо за терпение.

Как в выбор форматов сохранения страниц по "Save Page As..." (Text Files, Web Page...) добавить Microsoft Word, установленный на компьютере?

bunda1 пишет

Понятно, я пока не знаю как такое сделать.

Может так

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

Выделить код

Код:

...
   if ( /ssi_restore|openContainer|handleLinkClick|nsContextMenu/.test(err) ) return;  

   var places = "chrome://browser/content/places/places.xul";
   if (gBrowser.currentURI.spec == places && err.includes(places)) {
      var tab = gBrowser._lastRelatedTab || gBrowser.selectedTab;
      gBrowser.moveTabTo(newTab, tab._tPos + 1);
      gBrowser._lastRelatedTab = newTab;
      return;
   }
   ...

Dumby пишет

Может так

Вроде работает если открыть библиотеку в вкладке. Спасибо :)


KOT040188

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей ............
addEventListener("TabOpen", (e)=> {
   var newTab = e.target,
       tabpos = gBrowser.selectedTab._tPos,
       err = new Error().stack; 

   // если восстановление сессии, открыть ссылки или открыть всё во вкладках из папки закладок 
  if ( /ssi_restore|openContainer|handleLinkClick|nsContextMenu/.test(err) ) return;  

   var places = "chrome://browser/content/places/places.xul";
   if (gBrowser.currentURI.spec == places && err.includes(places)) {
      var tab = gBrowser._lastRelatedTab || gBrowser.selectedTab;
      gBrowser.moveTabTo(newTab, tab._tPos + 1);
      gBrowser._lastRelatedTab = newTab;
      return;
   }  

   /undoCloseTab/.test(err)
   ? setTimeout(()=> gBrowser.moveTabTo(newTab, tabpos + 1), 50) // если восстановление вкладки
   : gBrowser.moveTabTo(newTab, tabpos + 1);

}, false, gBrowser.tabContainer );

+ Открывать библиотеку в вкладке

Dumby
bunda1
Спасибо работает!:) А для fvd как запилить?

KOT040188 пишет

А для fvd как запилить?

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей ............
addEventListener("TabOpen", (e)=> {
   var newTab = e.target,
       tabpos = gBrowser.selectedTab._tPos,
       err = new Error().stack; 

   // если восстановление сессии, открыть ссылки или открыть всё во вкладках из папки закладок 
  if ( /ssi_restore|openContainer|handleLinkClick|nsContextMenu/.test(err) ) return;  

   var places = "chrome://browser/content/places/places.xul";
   if ( err.includes("fvd.speeddial") || (gBrowser.currentURI.spec == places && err.includes(places))) {
      var tab = gBrowser._lastRelatedTab || gBrowser.selectedTab;
      gBrowser.moveTabTo(newTab, tab._tPos + 1);
      gBrowser._lastRelatedTab = newTab;
      return;
   }  

   /undoCloseTab/.test(err)
   ? setTimeout(()=> gBrowser.moveTabTo(newTab, tabpos + 1), 50) // если восстановление вкладки
   : gBrowser.moveTabTo(newTab, tabpos + 1);

}, false, gBrowser.tabContainer );
bunda1 пишет

gBrowser.mCurrentTab.label == 'FVD Speed Dial' ||

Смотри,

скрытый текст
если из fvd-вкладки открыть несколько других вкладок,
а затем, не сходя с fvd-вкладки, открыть вкладку из закладок,

то эта вкладка откроется после последней вкладки,
которая была открыта из fvd-вкладки, а не после самой fvd-вкладки.

Я не знаю противоречит ли это концепции кнопки.
Если да, то лучше что-то типа err.includes("fvd.speeddial") ||

Dumby пишет

Я не знаю противоречит ли это концепции кнопки.
Если да, то лучше что-то типа err.includes("fvd.speeddial") ||

Спасибо, наверно это противоречит концепции кнопки, поэтому положил в код err.includes("fvd.speeddial").

bunda1 Dumby
Большое  спасибо, теперь всё идеально! :)

Этот код заставляет восстанавливать закрытые вкладки после текущей. Это удобно :)

А можно ли сделать так, что при наборе текста выскакивала полноценная панель поиска и не пряталась сама по себе? Можно ли сделать добавление закладки через звёздочку в последнюю выбранную папку, а не неподшитые закладки? А во всплывпющей из звёхдочки панели выбор папки был сразу развёрнут?

KOT040188 пишет

А можно ли сделать так, что при наборе текста выскакивала полноценная панель поиска и не пряталась сама по себе? Можно ли сделать добавление закладки через звёздочку в последнюю выбранную папку, а не неподшитые закладки? А во всплывпющей из звёхдочки панели выбор папки был сразу развёрнут?
                    Отредактировано KOT040188 (20-02-2016 03:13:19)

Может кто поможет?

Здравствуйте, есть кнопка "Открыть страницу или выделенную ссылку в другом браузере" как сделать чтоб при наведении на кнопку открывалось меню той кнопки?

Выделить код

Код:

// Настройка функций кликов мыши .................
this.onclick = function(e) {      
     if ( e.button == 0 ) menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft"); 
};




// Объявляем настройки и переменные для этой вкладки .................
var autoClose = true;  // true => автоматически закрывать меню
var dropmarker = false; // true => добавлять дропмаркер у кнопки

const pref = Application.prefs;
if ( dropmarker ) this.type = "menu";
const alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);



// Проверить наличие строки в about:config и если не существует записать пути к браузерам по умолчанию .................
const allPath = "C:\\Program Files\\Internet Explorer\\iexplore.exe,C:\\Documents and Settings\\Администратор\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe,C:\\Program Files\\Opera\\Opera.exe,C:\\Program Files\\Maxthon\\Bin\\Maxthon.exe,C:\\Program Files\\SeaMonkey\\seamonkey.exe";
if ( !pref.getValue("CB.OpenWith.pathToBrowser", 0) ) {
     pref.setValue("CB.OpenWith.pathToBrowser", allPath );
     pref.setValue("CB.OpenWith.removeMenuitem", "");
     };



// Создать меню для кнопки .................
var array = [
       { label: "Internet Explorer", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAABf2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjarZExS0JhFIaf71q0mA1dovFCFg0WogRJLeoggcNNHFRa9Ko3w/TjerOCfkKD0FItWf2BhqgpaI9agiCIfkMQtITchq9wKSLohQPPeZdz3nNAOy9KWdeA9YbrZFIJI5cvGEOPDDAKAEWrJeOmmeZHvT0gAO5nilLW+Zv8Ti5fAKEDuq14GtBLihcBfdOVLggT0K3VYhlEGQg52UwSRAcI2Iq7QKCk+AwItC3bBXENhBvlWgPECzBfrrQs0KYB25KOC1oHCObyBUOt1uxCbAJ8u32vtA+XVzB+0/eCRzCyABd3fe91GQGIsftWNRoBQPiTMPjsea+TMLQHvY7nvR97Xu8EfE9wvWZtOO3PuwgtCr/1Kpvq1Q9Azf2eVX4AwnD6ANkdSN/CwSFMVWFkBUw/ZGNo0bmvUrcCYLiVSSUM02lWa/UK/yy3suUCJJty26nZq64Rl7JeCRlLDWs2ZETC4Rgf5HRpEzoTj48AAAAgY0hSTQAAbZYAAHOMAAD2MgAAgUIAAHBtAADjXwAAMXgAABN0+ysqDQAAAv5JREFUeNqk0n1MTWEcB/Dvee655957dDv3VjepuUJohRHd0YSsoVHG2IwhsxUbxlrYbOafsmHzOsbGGNPQojEvxai8TBSSNKu8leqme+q+nvfjr27hT9+/nu3ZPvs9z+9L6bqO/wnBf4YeOlAU9e+tKZKl2QgHBVCyIHkQ+uVNcpBxWxabNq+ZacwzEZipoSeMBMwOZ0bs9KxCLjFlvslqiw3JDEVEj2fdmLKW3VM/pcmdqv3mM+1Zj1cf/BugYtJyShLmrdprjIwmKgzwiiymj+1FafZ1JHubUP7chWMP1doXVZWLaKiWPwD7jCVH47PWF+m0BbqZg0BsyJvWhsN5N+D97Efx/TWo64xFgvAdntd3rwgd1SfDf8DEOLNts5YVCZoRMEdhgFdRkN2M0hX1eHytoamwPDfIjx47h6ME8BJBYlrmhj7leyAMEGfajhBhYTTb4Fds2Jh0Sy/NC1GPGv3dW845D7p73vTTbvUQFuVnqAYruvvb4bXPnBMGBEtsujugQLNw2JrdgeO5nVRl20Tsbt7jMBaMKo+XZKKIAVkUBfh4QAoy0E1xKfTwylirRuyYn9qDM8su4cmXWdhavx+qRtGsCaCtAFFtRj0gQTdYoPkHIfX/ZIYBWQ86ooSIslVX0VrrUdYf6qkWuBKFYzTC2UyIYAiEoCDwfsUgCSKlen1E+drCDwN9XQ1HM7tz4ro6sMl9g/T1HrinVJ0/PTCyV8mzl9pX7ipWewNEDXyFroiNYWAu+/TOxhhDzsG6bXgfnULG7ys7ZXh31uVvqKnQNMicK32Jde3OwpDEMgNN3ZDe1kFueVAT7sHdYlPF1PiElVk/SmGwTgI7ORUxC8xgWEAngKgD3i+Ar9UDX9sH8A/O10ovr+WEJ1g8wby86ELXid7QRbgyl2+PdkoG8WMSApwdEk1D9KmQ3YPAj08Qay7fk19dzwcQHC4SoYySoLSPbq+ulNVmRuEXrrZMckXDMYXIVCRE3oOB1vq+/pe3y0Lfmo8A8ADA7wEATrdVy5ywgXEAAAAASUVORK5CYII=" },
       { label: "Google Chrome", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAABf2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjarZExS0JhFIaf71q0mA1dovFCFg0WogRJLeoggcNNHFRa9Ko3w/TjerOCfkKD0FItWf2BhqgpaI9agiCIfkMQtITchq9wKSLohQPPeZdz3nNAOy9KWdeA9YbrZFIJI5cvGEOPDDAKAEWrJeOmmeZHvT0gAO5nilLW+Zv8Ti5fAKEDuq14GtBLihcBfdOVLggT0K3VYhlEGQg52UwSRAcI2Iq7QKCk+AwItC3bBXENhBvlWgPECzBfrrQs0KYB25KOC1oHCObyBUOt1uxCbAJ8u32vtA+XVzB+0/eCRzCyABd3fe91GQGIsftWNRoBQPiTMPjsea+TMLQHvY7nvR97Xu8EfE9wvWZtOO3PuwgtCr/1Kpvq1Q9Azf2eVX4AwnD6ANkdSN/CwSFMVWFkBUw/ZGNo0bmvUrcCYLiVSSUM02lWa/UK/yy3suUCJJty26nZq64Rl7JeCRlLDWs2ZETC4Rgf5HRpEzoTj48AAAAgY0hSTQAAbZYAAHOMAAD2MgAAgUIAAHBtAADjXwAAMXgAABN0+ysqDQAAAzZJREFUeNpsk01oHAUYhp+Z2dnd7Mxmt7vJmqTJttk03QRCq6BSa4xYzMEg9mBEeymIRvSg3oqCBIUKgoI3vVjxoqAoBSvF4kG0jdg/WluLqZqkSdls9n9ndmdmZ3Z+PLQqVD94b9/7nN5H4D8nk5SS2cmwsW9YFHYhIBRcf33Z6f+57tf+BBMI/vkW/i2KqPSkn+1LvHUwFjmUQU4RQNf36NCl5Fr6d2b3+KdG903dt2+AewcgGt393OT4h++66gFD70BYRZRCmI5DrdmgYzcQ0LmGv37Ukp/e9NtnwUcCkGQ5Pf3CvScnd07te7iuElcGSI3k8dUUoqrSm8iAHcJum2xzmsmc7M4uIX/VDXxdAsjv3/nG7PMPzlcFuMvIMjqwi48CmffS2/lCjFF0NSLZLEVfoFYtM+LZSWG7HPul5X0jiZKUuv/JiQ/kISuxe2+Slf5BTlYVygcfZWThcS7kZji+uYNu6hLzr6excgHXSy1iYS93qRN8JsZT6lRPOpI1TYO4otKfdzgliiSmp5jcBsNjEMrfw5ViHxPZEPMv5Xjl2A4ee7E3NZIU9oQSaTUTT8WoN6pUmx3iEYF20+HzC5Acg9IaBCZEe8cIpApoBWKixwN7FZJxvV+URNHOjg7R0i3WbpTRcMiN1tn48irXTkDlIrB6kbmJP1B6LXBMfMelZYFhB1Zo62ZlRSuapt/1YtVyDTFa4O7ZUaQfv+Xc6Stk+xye2LPBkadCoK2CrYHvstUM7LWic11yHbfhicz0ZOSxtmESBAGu4KLXdGbjBY69ajO3XyDc2QR9HVcrIylhPvm6debET/r7EuDXC1p5MJ95puMZotG20C8bzCkui4dlFFmHxk2C1gauXkKO9rBeDLsLb6+83LL8ZQnAdbwVvWT4g/n+A/WWxXTI4uiCh2iWCbQtvHYFr2MR7h2g0lI4dOTy4q9r1sfArSUCdDT7dG1V76SH4vc11FA05VhMZEQEKYwYSYDUx6mldvPwa2cXzy0b7/yPTISAceARZUSZCfeFJ2fGldRDw7FAa3ar35+v/HbmansJ+AH4HejeCfgbIgIyEAeU2+4aQJtbCnq3EwD8NQCjhmvoeRBJAQAAAABJRU5ErkJggg==" },
       { label: "Opera", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAADNklEQVQ4jV2RS2hcVRzGf+fcO5OZTBJokiYZW0gEMQljUWuxlRH7IBmkVrEBd6JCqLoJ1kWqXYgL0Y2gRRfaheDCnTZxoZE2EAQfFEkrYRRTNU0ymslkHkm1mcmde865fxfRjd/+9z34lIgwPz9PeWNDtcTjurq97RKJBMP796f7e/v2ARQ2SsXFYnG9vrMj3a2tnnEu6ujokGw2ixIRcrkcs7OzHkq5k5l7Hp08fmLyYHf3g6ZYbBNjie3tbuSr1fl3vv/u3enFXz5HRGcymSifz6MBtFIacB+cHnv7y6ef+epYe/uJ0rX57dLQ3S9v3Hdg4s8fr29mlXpkajQ3/cnI6EUgUrsCEfEeOnqUF4eGz8q5V8WceaG5cuy4LF26lBMRRITlK1eO/Hr/Qbtz8rFQnhyT1wcG3hgYHEREPA244T17+s73D7zmbt5E1tbi9Zi/mM7l5hCJY21y38jI1aC35wcpFGKNwop7yY+dO9zWNliPIqebwONdXaf6tjY7m7Vq0/xRgM7O3xNtbRYRRKkophRef//PQWEVu7VlUrVqfCwWeyoQQXvAITjiSiWoVDDFNXQqVVMAIgoRALyurvLtep2dMFRVYxjS+nBSa3wf6Kw30s1aFYUQ3P4b0bq5y+/CACrREmw5R9w5AmNoEelLAj5AwxrXsBZxjsBFCCj+L0HVAN9aAmtJGusE8B3wm7HLSWtxxkjgHB1BkNyNVfw3wW5vJ6uAMobQOUJrCocArYBvwvDrsnNUjNEVoFEu7/3XQFC7Zerr633rQDEMZQO4bu1cBPga+NbZGQeLd4bh0CbAjRuDUq8naW21EkVaAcWFhQNloNWYxC0oXRP5rAXQgPeXSPMjmLwVhlQ9z/60ujqwNjV1SilltO8HtZmZkRv5/ANKKdseCbNwvgJVHzwfcCmtvSX44lOln39C8WGohcsTExcfXloa9uJxc/XChbNKKXp937+MemUhch/f63lawCEijI6OAnh4Hj1w+llYfBPMeyDvg7wFdhxW7oDn0BrAy2QyRFG0e+P4+DjZbNalEgm/LjItMNej1F09fqwTUBVrt4xEy2egmlLKD8LQptNplFL8A026qgDDLrhmAAAAAElFTkSuQmCC" },
       { label: "Maxthon", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfWBw8BAS1q932nAAAAB3RJTUUH1gcPAQIYwmgJNwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFHUSfHk+qG1OvH1OtHWC7I0SeIUehJ0+nI0+oKUynI1KqIVGsIlauJlKpJ1WsK1CqKlKoKlSqKVetKletLVSrLVWrL1yvIVixI121I163JFmyJluyJF61Ll2xLF60M1esNlarNVqwOFqyO1q0ImG6IWO9JWG5JmC4LGC2KWW5L2W5LWm9N2++PmO2P2O2O2m5Hm7JI23GJmjAJW/HKmzDL23AI3TNLnDFKHTKK3XKLnnOI3jRI3nTJnrSKX7VLH/SMHXJOn3MQmK6Q2a5R2u6SWq9T3u/U3a3T2/AV3fHL4HVMYbXOYjXeJ2sfJypbaW8eai8QYbRVYrMXo3PXpTSXZrVa4vGbI7IaJfPYpXSZZzWbprTb5vVcpzVd5/UaKvHba/Kbqrbd63EeKzCcavbc6nYea3becPjeMTkg6OwgqWzhJ3OgqDQhKTUgqrahK/di6fVgbLGgbLHjLfKgLHfhLDeirTekbPBmLvJkbffpLjBq77Fg8nmiczom8jnmcnpvsjNr8fmqsnnv+T0yNXa1trb29zcxuPvyeDjyuPmzODizODjyODpyeTuzebwz+fwyu7yzer3ze7yz+/yx/b9xvj+yPj+yfj+y/j+2OHj2ebr3ubq0Ofx0ujx0unx0+ny1+vz2ezz2O302uz03u713+/11Pr+3PDy2vv+2/v+/8D/4Obn4vDz4PD24fD25fD25PL34/L65/P44/v+6fT46vT57vf68Pj68P3/9/n69fr89fv99/z9+Pv9+v7/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNJ5gQAAAKt0Uk5T//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8Atyo9bAAAAQNJREFUeNpjWAUCHROWrVw+E8xkAOLuaVPrS0qbduxpgwhMmpZob2NtZmhasHs2SKBrSqitl4+3nYWRevjGBqDA9FQrx6CIkEAHbQ3ZnJ5VDJ0zLA127d21bdPahXMZRSdWM0yuMzbcu3/v9i3rFs/jYK+sYFiRb26ya6+7m470wrkC8nHFDJvzVFm2bdfcuoFpwRwG/ugihjWNapKbtqhsWMozv49VKS2ZYfU+fbm167SWLBbr71XwqM1iWLUzm5tZXEJGiouNUzkyAeiO1vVhvHxCwoIiik7B6b4gp89alOuiq+fs6hmV4Q/xXEt7c1lsTEpNvB/Ut6tWVZUXJgVkgpkAR0RyCIGXtksAAAAASUVORK5CYII=" },
       { label: "SeaMonkey", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAABAXYNFBQcVxERCUQCAgEf////Avz8/urz8/nG6+vypP//fOMAAAAAAAAAAAAAAAAB////AAAAAAAAAAAAERGRXB0dDJAPDwgT/f3/AP39/gD9/f8A/f3+APz8/wD9/f775ub1jvHxCX3//2b7AAAAAAH///8AAAAAABMTkHwjIxKDAwMBAP39/wD8/P4A/f3+AP39/wAgIRAAV28/ABcgEwC0pM0AoY/Dt/Ly2E///5n7AgAAAAANDZBSHh4Pgv7+/wD4+PwA+Pj8APn5/AD5+f0A/v7/AF54RAAXIBQA1OoAAOXZ6QAGBgNJBwckjAAAAAACAQGACBUVCZL//wAB+fn8APn5/QD4+PwA+Pj9APj4/AA4PiAA/g4OANLp/gD//fsAVFssAPv7/gABAQJsAQGILwILCw5QCQkDG/j4/AD4+P0A+Pj8APn5/QD5+fwA+Pj9AB80IgDn9AEA6PQAAP///wAWJxkAMDAWAP///wIFBQJpAgoKBkICAgMADg4LAA0NCAAKCgcA/Pz/APj4/QACAgAAECYbANzuAADq9QAA/f8BAAEAAAAXHREABgYDABAQDEIESUk4IT0+MQAAAAEA9vb1AO/u7gD5+foA8fH7AB4nCQDW8QYA+v0AAAoE/wAKBQAA+P0AADw5KgA0LzsA5+bsIATm5wgA1NQBAAEB/wDz8wUABAQVACYmBwAcHQIA+ikAAP/yAQAIBP8AEwf9AA8H/wAOBwIAwb4SAAEBBgD5+QMBBMPC6uXOzRMA+/v/APn5/wD9/QAAAQEAAG19EAD5HgoAFQv/APX4+wARCP8AHA4BANHF+gDOzvUABAT1APn57uQC+fnnwPLy/QD19f8A+/sAAP7+AAA2OgYACDgJABgL/wAHAPsAKxX/ACgUAADm3P0Ano/0AAgIAAAICAEA/v71wAQAAOWt/PzqjAEBFxMCAgAAJSYDADlvEQASCf0AHw79AAoGAQAA9wEAwaj4ALeu9wAAAAAACAgBAAAA+gDs7NubAf///wABAalkBQU2my0uCgA/dxMAJRL+AAz2/QDU0fwA49j7ANHP+wABAQAABQUAAAQEAQAFBQAA5+fWpd/fQFwB////AAAAAABodNrDHEMjPNy08wC9svcABAQBAAUFAAAFBQEABAQAAAUFAQAFBQAABAQAAOrq3sba2sRG//909QHh8P9GxeH+ffr9APy2isvAwsANdgwMEgoEBAAABQUBAAUFAAAEBAEABQUBAP7+9v/p6dyf3t7Dbf//gPYAAAAAAdbq/3AkFQDHBQAAyQAAAAABAYoaExMsZwwMFEcGBgUgAwMAAQIC/uv5+fLD4uLYmvr6ac8AAAAAAAAAAAAAAAB08Ygz9inangAAAABJRU5ErkJggg==" },
            ];       

// получить массив с ненужными пунктами меню и восстановливать меню при обнавлении кнопки
var hideItems = pref.getValue("CB.OpenWith.removeMenuitem", 0).split(","); 
addDestructor(function(reason) { if (reason == 'update') pref.setValue("CB.OpenWith.removeMenuitem", "") }); 

var menuPopup = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m, i ) {
      if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
      var mItem = document.createElement("menuitem");
      mItem.setAttribute("label", m.label);
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.setAttribute("image", m.image );
      mItem.setAttribute("value", i++ );
      mItem.hidden = hideItems.indexOf(m.label) !== -1; // прятать ненужные пункты меню      

      menuPopup.appendChild( mItem );
});
menuPopup.addEventListener("click", setMenuClick, false);



// Настройка функций кликов мыши для пунктов меню .................
function setMenuClick(e) {
   var mItem = e.target;
   var value = mItem.getAttribute("value");
   var label = mItem.getAttribute("label");
   var image = mItem.getAttribute("image");

   // ЛКМ запускает другой браузер ....
   if ( e.button == 0) openWith( value );

   // СКМ удаляет пункты меню и записывает выбор в 'about:config' ....
   if ( e.button == 1 ) {
        e.preventDefault();
                
        mItem.hidden = true;
        pref.setValue("CB.OpenWith.removeMenuitem", pref.getValue("CB.OpenWith.removeMenuitem", 0) + label +',' );
        }
     
   // ПКМ устанавливает новый путь к нужному браузеру ....
   if ( e.button == 2 ) {
        e.preventDefault();
        
        menuPopup.hidePopup();        
        setPathToBrowser( value, image, label );
        }
};



// Получить выделенную ссылку, иначе отдаст 'false' .................
function getSelectLink() {
   var links = window.content.document.links;
   if ( !(document.commandDispatcher.focusedWindow.getSelection() == '') ) {
        for ( i=0; i<links.length; ++i ) {
              if ( window.content.getSelection().containsNode(links[i], true) ) {
                   var link = links[i]; 
                   }
              }
        
        return ( link == undefined ) ? false : link; 
        }
   else { return false };
};



// Открыть страницу или ссылку в другом браузере, аргумент 'value' определяет нужный элемент массива с путями .................
function openWith( value ) {
   
   // получить адрес ссылки или страницы, в 'Punycode' если это .рф домен ....
   var loc = content.document.location;
   var link = getSelectLink();
   var loc = link ? link : loc;
   var url = ( loc.host.slice(-3) == '.рф') ? Services.io.newURI( loc.href, null, null).asciiSpec : loc;  

   var path = pref.getValue("CB.OpenWith.pathToBrowser", 0);
   var pathToBrowser = path.split(",")[value]; // получить путь из 'about:config'

   var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
   file.initWithPath( pathToBrowser );
   if ( !file.exists() ) {
        alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", pathToBrowser, 'Файл не существует', false, "", null, ""); 
        return;
        }
   var process  = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   try {
       var args = [url];
       process.init( file );
       process.run( false, args, args.length );
       }
   catch(e) { alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", pathToBrowser, 'Не удалось выполнить', false, "", null, "") };
};



// Установить новый путь к  браузеру, и записать выбор в 'about:config' .................
function setPathToBrowser( value, image, label ) {

   var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
   fp.init( window, "Укажите путь к нужному браузеру!", fp.modeOpen );
   fp.appendFilters( fp.filterApps );

   if ( fp.show() == fp.returnCancel ) return;
   else
       {
       // получить из 'about:config' массив с путями к браузерам          
       var arr = pref.getValue("CB.OpenWith.pathToBrowser", 0).split(",");
              
       // заменить нужный элемент массива на новый путь и записать
       var newPath = fp.file.path;
       arr[value] = newPath;       
       pref.setValue("CB.OpenWith.pathToBrowser", arr.toString() );       

       alertsService.showAlertNotification( image, "Путь к браузеру: " + label, newPath, false, "", null, "");
       }
};



// Автоматически закрывать меню при ухода курсора с меню .................
if ( autoClose ) {
     menuPopup.setAttribute("onmouseleave", "this.mo = false; setTimeout(function(mp) { if ( !mp.mo ) mp.hidePopup() }, 800, this)");
     menuPopup.setAttribute("onmouseover", "this.mo = true");
};



// Подсказка кнопки .................
this.tooltipText = "Открыть страницу или выделенную ссылку в другом браузере" +"\n"+"\n"+
                   "Функции кликов мыши для пунктов меню" +"\n"+
                   "Л: Открыть страницу или ссылку" +"\n"+
                   "С: Удалить пункт меню" +"\n"+
                   "П: Изменить путь к нужному браузеру";
broker пишет

Здравствуйте, есть кнопка "Открыть страницу или выделенную ссылку в другом браузере" как сделать чтоб при наведении на кнопку открывалось меню той кнопки?

Выделить код

Код:

self.onmouseleave =()=> self.mo = true;
self.onmouseover =()=> { self.mo = false; setTimeout(()=> !self.mo && menuPopup.showPopup(self, -1, -1, "popup", "bottomleft", "topleft"), 800) };

В инициализацию кнопки.

bunda1
Спасибо,:D:beer: все работает.
Может есть такая кнопка https://forum.mozilla-russia.org/viewto … 01#p708701

День добрый. А можно кнопочку поправить, в 43 [firefox] не показывает загруженное в боковой панели.

bunda1
А есть у меня ещё кнопка с таким кодом

Выделить код

Код:

this._handleClick =()=> openWebPanel("Downloads", "about:downloads");

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

Mishania пишет

bunda1
Может можно сделать чтоб закрывалось тоже по кнопке и тогда предыдущая совсем не нужна.

Выделить код

Код:

this._handleClick =()=> document.getElementById('sidebar-box').getAttribute('sidebarcommand') ? toggleSidebar() : openWebPanel("Downloads", "about:downloads");

bunda1
Спасибо, вы как всегда помогли.

KOT040188 пишет

А можно ли сделать так, что при наборе текста выскакивала полноценная панель поиска и не пряталась сама по себе? Можно ли сделать добавление закладки через звёздочку в последнюю выбранную папку, а не неподшитые закладки? А во всплывпющей из звёхдочки панели выбор папки был сразу развёрнут?

Ну ведь можно же как-то?

KOT040188 пишет

А можно ли сделать так, что при наборе текста выскакивала полноценная панель поиска и не пряталась сама по себе?

В инициализацию:

Выделить код

Код:

function onFind() { gFindBar.onFindCommand() };
messageManager.addMessageListener("Findbar:Keypress", onFind);
addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onFind));

02-03-2016 20:03:54

KOT040188 пишет

А во всплывпющей из звёхдочки панели выбор папки был сразу развёрнут?

В инициализацию:

Выделить код

Код:

addEventListener("popupshown", ()=> {
   document.getElementById('editBMPanel_foldersExpander').click();
}, true, document.getElementById("editBookmarkPanel"));

bunda1
Спасибо :) А сделать добавление закладки через звёздочку в последнюю выбранную папку, нельзя?

KOT040188 пишет

bunda1
А сделать добавление закладки через звёздочку в последнюю выбранную папку, нельзя?

Наверно можно и не сложно, но я не знаю что за функция Firefox добаляет закладки через звёздочку :/

Ув.разработчики подскажите пожалуйста код для закрытия вкладки по двойному клику правой кнопкой в любом месте на открытой странице.

Stakhovsky пишет

Ув.разработчики подскажите пожалуйста код для закрытия вкладки по двойному клику правой кнопкой в любом месте на открытой странице.

В инициализацию:

Выделить код

Код:

addEventListener("dblclick", e=> e.button > 1 && gBrowser.removeCurrentTab(), false, gBrowser);

Большое спасибо.

bunda1 пишет

Наверно можно и не сложно, но я не знаю что за функция Firefox добаляет закладки через звёздочку :/

Жаль :(

bunda1 пишет

я не знаю что за функция Firefox добаляет закладки через звёздочку :/

:/ BookmarkingUI.onCommand

Dumby
А не могли бы подсказать код? :blush:

bunda1 пишет
Stakhovsky пишет

Ув.разработчики подскажите пожалуйста код для закрытия вкладки по двойному клику правой кнопкой в любом месте на открытой странице.

В инициализацию:

Выделить код

Код:

addEventListener("dblclick", e=> e.button > 1 && gBrowser.removeCurrentTab(), false, gBrowser);

bunda1, после закрытия вкладки, на следующей остается открытым контекстное меню, можно ли это поправить?

Stakhovsky пишет

bunda1, после закрытия вкладки, на следующей остается открытым контекстное меню, можно ли это поправить?

Выделить код

Код:

addEventListener("dblclick", e=> {
   e.button > 1 && gBrowser.removeCurrentTab();
   setTimeout(()=> document.getElementById("contentAreaContextMenu").hidePopup(), 20);
}, false, gBrowser);

03-03-2016 08:27:29

Dumby пишет
bunda1 пишет

я не знаю что за функция Firefox добаляет закладки через звёздочку :/

BookmarkingUI.onCommand

Dumby, насчёт BookmarkingUI.onComman я конешно был курсе, но эта команда запускает PlacesCommandHook.bookmarkCurrentPage а та PlacesCommandHook.bookmarkPage а та:

Выделить код

Код:

function () {
"use strict";

    let result = aTask;
    if (aTask && typeof(aTask) == "function") {
      if (aTask.isAsyncFunction) {
        throw new TypeError(
          "Cannot use an async function in place of a promise. " +
          "You should either invoke the async function first " +
          "or use 'Task.spawn' instead of 'Task.async' to start " +
          "the Task and return its promise.");
      }

      try {
        // Let's call into the function ourselves.
        result = aTask.apply(this, arguments);
      } catch (ex) {
        if (ex instanceof Task.Result) {
          return Promise.resolve(ex.value);
        }
        return Promise.reject(ex);
      }
    }

    if (isGenerator(result)) {
      // This is an iterator resulting from calling a generator function.
      return new TaskImpl(result).deferred.promise;
    }

    // Just propagate the given value to the caller as a resolved promise.
    return Promise.resolve(result);

А с этим кодом я уже не знаю что делать, не понятно как он добавляет закладку.

Спасибо.

bunda1 пишет

Dumby, насчёт BookmarkingUI.onComman я конешно был курсе, но ...

Ну, вот так бы сразу и сказал. :)

скрытый текст
Мне и самому не нравится такое отображение в DOM Inspector'е.

Но, если интересно, то открой
chrome://browser/content/browser.js
поиск:
var PlacesCommandHook = {

Я, кстати, не смог понять что хочет Кот.
Как думаешь, это что-то типа такого (набросок), или нет?

Выделить код

Код:

(({panel}, prefName) => {

    cbu.isPref(prefName, PlacesUtils.unfiledBookmarksFolderId);
    addDestructor(reason => reason == "delete" && Services.prefs.clearUserPref(prefName));

    var popupshownFolderId = Services.prefs.getIntPref(prefName);
    var handler = e => {
        if (e.target != panel) return;
        var id = PlacesUtils.bookmarks.getFolderIdForItem(StarUI._itemId);
        if (e.type == "popupshown") {
            popupshownFolderId = id;
            return;
        }
        if (StarUI._actionOnHide || popupshownFolderId == id) return;
        Services.prefs.setIntPref(prefName, id);
    }
    for(var type of ["popupshown", "popuphiding"]) addEventListener(type, handler, false, panel);

    var src = BookmarkingUI.onCommand.toString();
    var res = src.replace("e(isBookmarked", `$&, isBookmarked || Services.prefs.getIntPref("${prefName}")`);
    var func = eval(`(${res})`).bind(BookmarkingUI);

    addEventListener("command", e => {
        e.stopPropagation();
        func(e);
    }, true, document.getElementById("bookmarks-menu-button"));

})(StarUI, "CB.lastEditBookmarkPanelFolderId");

Dumby пишет

Я, кстати, не смог понять что хочет Кот.

Красивый код. Мне показалось, что Кот пишет про папку закладок в которую добавляли закладки не только нажатием звёздочки. Ну ладно там видно будет.

KOT040188 пишет

сделать добавление закладки через звёздочку в последнюю выбранную папку

По умолчанию добавляет в неподшитые, а я хочу в ту которую выбирал в прошлый раз. Не знаю как ещё проще объяснить.

Dumby пишет

Я, кстати, не смог понять что хочет Кот.

Как я понял, он хочет чтобы было как в Add Bookmark Here²

Remember the last selected folder when you bookmark a page.

KOT040188, так?

KOT040188 пишет

По умолчанию добавляет в неподшитые, а я хочу в ту которую выбирал в прошлый раз.

Попробуй:

Выделить код

Код:

(({panel}, prefName) => {

    cbu.isPref(prefName, PlacesUtils.unfiledBookmarksFolderId);
    addDestructor(reason => reason == "delete" && Services.prefs.clearUserPref(prefName));

    var popupshownFolderId = Services.prefs.getIntPref(prefName);
    var handler = e => {
        if (e.target != panel) return;
        var id = PlacesUtils.bookmarks.getFolderIdForItem(StarUI._itemId);
        if (e.type == "popupshown") {
            popupshownFolderId = id;
            return;
        }
        if (StarUI._actionOnHide || popupshownFolderId == id) return;
        Services.prefs.setIntPref(prefName, id);
    }
    for(var type of ["popupshown", "popuphiding"]) addEventListener(type, handler, false, panel);

    var src = BookmarkingUI.onCommand.toString();
    var res = src.replace("e(isBookmarked", `$&, isBookmarked || Services.prefs.getIntPref("${prefName}")`);
    var func = eval(`(${res})`).bind(BookmarkingUI);

    addEventListener("command", e => {
        e.stopPropagation();
        func(e);
    }, true, document.getElementById("bookmarks-menu-button"));

})(StarUI, "CB.lastEditBookmarkPanelFolderId");

voqabuhe
Да.

bunda1 пишет

Попробуй:

В [nightly] не работает.

bunda1 пишет

Попробуй:

Спасибо, работает. И выбор папки развёрнут. Бонусом ещё и меню выскакивает после первого нажатия. Может так и лучше…

voqabuhe пишет

В [nightly] не работает.

Может

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

Выделить код

Код:

//var res = src.replace("e(isBookmarked", `$&, isBookmarked || Services.prefs.getIntPref("${prefName}")`);
    var showPopup = true;
    var res = src.replace("true", `${showPopup || "isBookmarked"}, isBookmarked ? undefined : Services.prefs.getIntPref("${prefName}")`);


bunda1
Я тебе насоветовал искать PlacesCommandHook в
chrome://browser/content/browser.js
а в Nightly он переехал в
chrome://browser/content/browser-places.js

Dumby пишет

в Nightly он переехал в
chrome://browser/content/browser-places.js

..в 45b9 уже там обнаружил.

скрытый текст
Как плохо, что browser.js не оптимизируется, 18 строчек ломаются..

Dumby пишет

Я тебе насоветовал искать PlacesCommandHook в
chrome://browser/content/browser.js
а в Nightly он переехал в
chrome://browser/content/browser-places.js

Спасибо :)

Dumby пишет

Может

Спасибо, теперь работает. Только почему-то вот такого у меня нет?

KOT040188 пишет

И выбор папки развёрнут.

bunda1
А на жест этот код можно прикрутить? И ещё, как сделать что бы закладки добавлялись вверх списка?

voqabuhe
Я извинясь, ввёл всех в заблуждение. Нажал отключить расширение Add Bookmark Here, а он гад не отключился при перезапуске, может потому, что обновлялся при этом. Я ещё удивился какой bunda1 похожий на расширение код написал :D Меню этот код не разворачивает, тут поведение стандартное. Посмотрю, будет ли удобно…
Для развёрнутой папки этот код:

Выделить код

Код:

addEventListener("popupshown", ()=> {
   document.getElementById('editBMPanel_foldersExpander').click();
}, true, document.getElementById("editBookmarkPanel"));
KOT040188 пишет

Для развёрнутой папки этот код:

:) Ага так разворачиваются, спасибо.  В Add Bookmark Here ещё очень полезная штука есть, изменять размер окна выбора папок, растягиванием мышкой. Глянь может и этот код вытащишь.:)

voqabuhe
Не ко мне вопрос;)

KOT040188 пишет

Не ко мне вопрос;)

Ясно. Тогда может как всегда bunda1 или Dumby помогут. ;)

voqabuhe пишет

В Add Bookmark Here ещё очень полезная штука есть, изменять размер окна выбора папок, растягиванием мышкой.

Присоединяюсь к просьбе. Или это лучше увеличить стилем?

По поводу кода:

Выделить код

Код:

function onFind() { gFindBar.onFindCommand() };
messageManager.addMessageListener("Findbar:Keypress", onFind);
addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onFind));

При нажатии буквы выскакивает панель с этой буквой, но она выделена. Как убрать выделение?

bunda1
А можешь сделать чтобы после закрытия вкладки контекстное меню само закрывалось?

voqabuhe пишет

А можешь сделать чтобы после закрытия вкладки контекстное меню само закрывалось?

Выделить код

Код:

addEventListener("dblclick", e=>{ e.button > 1 && gBrowser.removeCurrentTab(), document.getElementById("contentAreaContextMenu").hidePopup() }, false, gBrowser);

bunda1
Не помогло, меню остаётся.

voqabuhe пишет

bunda1
Не помогло, меню остаётся.

Выделить код

Код:

addEventListener("dblclick", e=>{ e.button > 1 && gBrowser.removeCurrentTab(), setTimeout(()=> document.getElementById("contentAreaContextMenu").hidePopup(), 50) }, false, gBrowser);

bunda1
Во, теперь исчезает. Спасибо.

bunda1
Попользовался кнопкой, как же хорошо стало. Вроде мелочь лишний раз клацнуть, но когда приходилось делать это постоянно, начинало раздражать. :dumb:
Вобщем ещё раз спасибо, за спокойствие. :beer:

KOT040188 пишет

По поводу кода:

Выделить код

Код:

function onFind() { gFindBar.onFindCommand() };
messageManager.addMessageListener("Findbar:Keypress", onFind);
addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onFind));

При нажатии буквы выскакивает панель с этой буквой, но она выделена. Как убрать выделение?

Выделить код

Код:

function onFind() { gFindBar.onFindCommand(); setTimeout(()=> gFindBar._findField.selectionStart = 2, 0) };
messageManager.addMessageListener("Findbar:Keypress", onFind);
addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onFind));

bunda1
Спасибо. А как насчёт этого:

voqabuhe пишет

В Add Bookmark Here ещё очень полезная штука есть, изменять размер окна выбора папок, растягиванием мышкой.

Или это увеличить стилем?

KOT040188 пишет

увеличить стилем?

Лучше стилем, в Add Bookmark там довольно большой код.

KOT040188 пишет

изменять размер окна выбора папок, растягиванием мышкой

Выделить код

Код:

#editBMPanel_folderTree {
  resize: both!important;
  overflow: hidden!important;
}

turbot
Это вместо стиля?

KOT040188
Это стиль.

turbot пишет

Это стиль

Темы малость не та. Я-то думал, что стилем растягивание сделать нельзя…:)

KOT040188
Я тоже думал нельзя. Оказалось - зя. Просто resize, оказывается, без overflow не работает. :)

А изменение сохранится после перезапуска лисы?

Нет.

Ну тогда не пойдёт. Прошлый стиль гарантирует стабильность, а если надо поменять высоту я это и в стиле сделаю.

turbot пишет

Нет.

А если по клику запомнить параметры этого диалогового окна в about:config?
То есть:
1. Редактируем - меняем размеры окна.
2. По клику на кнопки "ОК" или "Отмена" этого окна запоминаем параметры его в about:config
3. При вызове этого окна используем эти параметры.
Такой код трудно написать?

difabor
Можно-то, можно, но у меня не выходит.

скрытый текст
Мой гомункулус

Выделить код

Код:

var s = "CB.BTH",
    bt = document.getElementById('editBMPanel_folderTree'),
    mo = new MutationObserver(() => cbu.setPrefs(s, cbu.getPrefs(s)) = bt.getAttribute('height'));

cbu.isPref(s, 200);

mo.observe(bt, {attributes: true, attributeFilter: ['height']});
mo.mutationCallback(addDestructor(() => mo.disconnect()));

addEventListener('popupshowing', function() {
    bt.getAttribute('height') = cbu.getPrefs(s);
}, false, document.getElementById('editBookmarkPanel'));

ругается на "invalid assignment left-hand side". И я даже догадываюсь, о чем это он, но как сделать правильно - не знаю. :(


Может кто, крепкий духом, отважится заглянуть под спойлер и укажет, как надо. :)

А ещё с этим стилем не работает панель прокрутки, хотя сама прокрутка работает.

turbot пишет

Может кто, крепкий духом, отважится заглянуть под спойлер и укажет, как надо.

Может так:

Выделить код

Код:

// Ctrl + колесиком мыши на диалоге добавления вкладки звездочки редактировать высоту поля выбора вкладок, от 16.03.2016. ...........
addEventListener('popupshown', (e, panel = e.target)=> {
   document.getElementById('editBMPanel_foldersExpander').click();

   var tree = document.getElementById('editBMPanel_folderTree');
   var s = 'CB.treeHeight';
   cbu.isPref(s, 150);
   tree.height = cbu.getPrefs(s) + 'px';
      
   panel.onwheel =e=> {
      if ( !e.ctrlKey ) return;
      
      var step = 2,
          i = cbu.getPrefs(s),
          i = e.deltaY > 0 ? i + step : i - step;
      cbu.setPrefs(s, i);

      setTimeout(()=> tree.height = i + 'px', 0);
   };               
}, true, document.getElementById('editBookmarkPanel'));
bunda1 пишет

Может так:

У меня чего-то не растягивает.  Это из-за [nightly] ?

voqabuhe пишет
bunda1 пишет

Может так:

Это из-за [nightly] ?

Я проверил на [nightly] и код работает. Может ты не нажимал на ctrl при прокрутке.

bunda1
Не совсем то. Надо же, как я понял, отслеживать атрибут height и wight у editBMPanel_folderTree, которые изменяются при растягивании мышкой, записывать в конфиг и брать из него обратно, при открытии панели.

Я своего гомункулуса довел до вменяемого состояния:

Выделить код

Код:

var tree = document.getElementById('editBMPanel_folderTree'),
    h = 'CB.treeHeight',
    w = 'CB.treeWidth',
    mo = new MutationObserver(()=> {cbu.setPrefs(h, tree.height); cbu.setPrefs(w, tree.width)});
//     mo = new MutationObserver(()=> {setTimeout(cbu.setPrefs(h, tree.height),1000); setTimeout(cbu.setPrefs(w, tree.width),1000)});


tree.setAttribute('style', 'resize: both !important; overflow: hidden !important;');

cbu.isPref(h, 150);
cbu.isPref(w, 150);

mo.observe(tree, {attributes: true, attributeFilter: ['height', 'width']});
mo.mutationCallback(addDestructor(() => mo.disconnect()));

addEventListener('popupshown', function() {
  tree.height = cbu.getPrefs(h);
  tree.width = cbu.getPrefs(w);
  document.getElementById('editBMPanel_foldersExpander').click();
}, false, document.getElementById('editBookmarkPanel'));

Но! При изменении размеров, панель сильно дергается. Если выставить таймауты (заком. строка) для записи в конфиг, то ситуация исправляется, но кнопка не инициализируется после рестарта, пока ее не отредактируешь. Где тут собака, я не понял... :(

UPD: Черт, что-то теперь и так и так, до редактирования, не инициализируется.

turbot пишет

но кнопка не инициализируется после рестарта, пока ее не отредактируешь.

Проблема в:

Выделить код

Код:

var tree = document.getElementById('editBMPanel_folderTree');

после рестарта/старта его не существует он создаётся при открытие диалога звёздочки.

bunda1 пишет

Я проверил на [nightly] и код работает. Может ты не нажимал на ctrl при прокрутке.

А да работает. Это у меня просто Volumouse перехватывает, на те же клавиши настроен.

17-03-2016 02:12:19

turbot пишет

Я своего гомункулуса довел до вменяемого состояния:

А он в паре со стилем должен работать? И после него вариант от  bunda1 отказался работать, пришлось резервным prefs.js воспользоваться.

bunda1
А, ясно. Хм, и как тогда быть? Все в листенер запихивать? И обсервер? Так можно?

17-03-2016 02:16:38
Проверил. Так сбрасывает значения значения в конфиге, при открытии попапа.

voqabuhe пишет

А он в паре со стилем должен работать?

Там он ужо.

Выделить код

Код:

tree.setAttribute('style', 'resize: both !important; overflow: hidden !important;');

17-03-2016 02:20:30

voqabuhe пишет

пришлось резервным prefs.js воспользоваться

EULA: Прочитав эти строки, вы отказались от каких либо претензий к автору. :P

turbot пишет

bunda1
А, ясно. Хм, и как тогда быть? Все в листенер запихивать? И обсервер? Так можно?

Все в листенер запихивать, а обсервер не нужен, можно использовать popuphidden который срабатывает только если закрыть диалог звёздочки:

Выделить код

Код:

addEventListener('popupshown', ()=> {
   document.getElementById('editBMPanel_foldersExpander').click();

   var tree = document.getElementById('editBMPanel_folderTree');
   tree.setAttribute('style', 'resize: both !important; overflow: hidden !important;');
    
   var h = 'CB.treeHeight', w = 'CB.treeWidth';
   cbu.isPref(h, 150); cbu.isPref(w, 150);
    
   tree.height = cbu.getPrefs(h);
   tree.width = cbu.getPrefs(w);
   
   addEventListener('popuphidden', function c() {
      removeEventListener('popuphidden', c);           
      cbu.setPrefs(h, tree.height); cbu.setPrefs(w, tree.width);
   });   
}, true, document.getElementById('editBookmarkPanel'));

bunda1
О, как просто! А я себе мозг сломал, с обсерверами разбираясь. Спасибо. :beer:

Тоже забрал, спасибо! Edit Bookmark Plus благополучно удален...
Раз уж начали копаться в содержимом аддонов, можно я и это подсуну под горячую руку )))
https://forum.mozilla-russia.org/viewto … 83#p676083

bunda1
Ещё немного пристану с закладками.:) Можешь сделать чтобы вот этот код №1114 срабатывал по двойному ЛКМ по вкладке?

voqabuhe пишет

bunda1
Ещё немного пристану с закладками.:) Можешь сделать чтобы вот этот код №1114 срабатывал по двойному ЛКМ по вкладке?

Наверно не смогу, это код от Dumby.

bunda1 пишет

Наверно не смогу, это код от Dumby.

Понятно, тогда только остаётся надеется, что Dumby заметит и очередной раз поможет.:)

del. Невнимательно прочел, что требуется. :)

bunda1
Есть вопрос касательно замечательной кнопки Блокнот в вкладке

Методом тыка заменил в Help <TEXTAREA></TEXTAREA> на <textarea rows="50"></textarea> и теперь в этой вкладке работает букмарклет Preview для предпросмотра от Lex1

Есть ли у этой вкладки адрес? Хочу применить к ней стиль, что бы панель закладок на ней всегда была раскрыта.

ifln

скрытый текст
Адрес - это содержимое вкладки справка в base64:

Выделить код

Код:

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document url("data:text/html;base64,PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz48dGl0bGU+Tm90ZXBhZDwvdGl0bGU+CjxURVhUQVJFQSBpZD0ndGEnPjwvVEVYVEFSRUE+Cgo8c3R5bGU+Cmh0bWwgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNudG50YmcpOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KdGV4dGFyZWEgewogIGJhY2tncm91bmQ6IHZhcigtLWRya2hkcmJnKTsKICBvdmVyZmxvdy15OiBhdXRvOwogIHBvc2l0aW9uOiBmaXhlZDsKICByZXNpemU6IG5vbmU7CiAgdG9wOiAwOwogIGxlZnQ6MDsKICBib3R0b206MDsKICByaWdodDowOwogIHdpZHRoOiBjYWxjKDEwMCUgLSA4MHB4KTsKICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDYwcHgpOwogIG1hcmdpbjogYXV0bzsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgYm9yZGVyOiAuNXB4IHNvbGlkIHZhcigtLWhkcmJyZHIpOwogIGNvbG9yOiB2YXIoLS1sZ2h0dHh0Y2xyKTsKICBmb250OiA2MDAgMTRweCAiSGFjayI7Cn0KdGV4dGFyZWE6Zm9jdXMgewogIGJvcmRlci1jb2xvcjogdmFyKC0tZnJtZmNzYnJkcik7Cn0KPC9zdHlsZT4=") {

}

И у вас он отличатся будет, ибо я правил содержимое справки.
Но можно проще:

Выделить код

Код:

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document url-prefix("data:text/html;base64") {

}

Или еще проще:
thumb2.jpg
- вписать стиль в тег <style></style> в содержимое справки.

ifln пишет

bunda1
Есть вопрос касательно замечательной кнопки Блокнот в вкладке

Методом тыка заменил в Help <TEXTAREA></TEXTAREA> на <textarea rows="50"></textarea> и теперь в этой вкладке работает букмарклет Preview для предпросмотра от Lex1

Есть ли у этой вкладки адрес? Хочу применить к ней стиль, что бы панель закладок на ней всегда была раскрыта.

bunda1,
а как сделать, чтобы блокнот открывался бы в сайдбаре?

difabor

скрытый текст
Сделать закладку, изменить и:
screenshot%2525202016-03-21%252520001.png
- проще всего. :D

turbot пишет

difabor

скрытый текст
Сделать закладку, изменить и:
https://lh3.googleusercontent.com/-OqcP … 520001.png
- проще всего. :D

У меня почему-то этот чекбокс не открывает закладку в сайдбаре.
Я забыл как открывать в сайдбаре... :(

difabor пишет

У меня почему-то этот чекбокс не открывает закладку в сайдбаре.

У меня открывает. Нажимать надо не кнопку, а именно созданную закладку. На всяк уточнил. :)

turbot пишет
difabor пишет

У меня почему-то этот чекбокс не открывает закладку в сайдбаре.

У меня открывает. Нажимать надо не кнопку, а именно созданную закладку. На всяк уточнил. :)

У меня тоже раньше открывало, но где-то полгода (или больше) как не открывает.
Что-то я такое установил, что не открывает...

Нашёл как открывать в сайдбаре:
window.openWebPanel('Название (Блокнот, напр)',notepad); Второй параметр - УРЛ, в данном случае - notepad

difabor
Хм, а не проще найти виновное расширение/кнопку? :rolleyes:

turbot, спасибо.
Добавил в стиль для панели закладок исключение :not([stylish-url^="data:text/html;base64"])

turbot пишет

difabor
Хм, а не проще найти виновное расширение/кнопку? :rolleyes:

Кнопку я уже нашёл :)
Она содержит массу разных кусочков с листенерами.
Догадываюсь даже - какой именно: открывать закладки в фоновых вкладках.
Но как определять - есть ли у закладки включённый чекбокс или нет - пока не знаю :(

Как бы в Custom Buttons • View topic - Style Toggler   Style Toggler организовать прокрутку колесом? Отличная кнопка,  вот только в стрелочки не удобно выцеливать для прокрутки. ИМХО.
Настройки надо тщательнее изучать, а потом вопросы задавать.:dumb: Это я сам себе.:)

А можно как-то в кнопке вызывать функцию, объявленную в другой кнопке?
Допустим в кнопке есть функция

Выделить код

Код:

function myFunction(){ alert( 1 ) }
myFunction()

А я хочу чтобы myFunction можно было вызывать и из другой кнопки тоже.

Существует ли кнопка, открывающая исходный код страницы с уже включенным поиском?

rbfyec пишет

А можно как-то в кнопке вызывать функцию, объявленную в другой кнопке?

Прямо вот так – нельзя.
Можно сделать глобальную функцию или добавить узлу кнопки новый метод.

Выделить код

Код:

// В первой кнопке
this.myFunction1 = function() {
    alert(1);
};
window.myFunction2 = function() { // Тут надо задать уникальное имя, а то конфликты будут
    alert(2);
};
Выделить код

Код:

// Во второй кнопке
document.getElementById("custombuttons-button1").myFunction1();
myFunction2();

Infocatcher, а нельзя ли создать типа библиотеки функций, которую можно импортировать?
В своё время Вы мне показали как вызвать md5 через импорт. Можно ли как-то создать "приватные" импортируемые модули?
И ещё: вызов document.getElementById("custombuttons-button1").myFunction1(); намного "тяжелее" для процессора/памяти или разница несущественна?

difabor пишет

а нельзя ли создать типа библиотеки функций, которую можно импортировать?

В расширении можно... Из кнопок не особо удобно.

difabor пишет

Можно ли как-то создать "приватные" импортируемые модули?

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

difabor пишет

И ещё: вызов document.getElementById("custombuttons-button1").myFunction1(); намного "тяжелее" для процессора/памяти или разница несущественна?

По сравнению с чем?
Если будет вызываться много раз, лучше сохранить ссылку на кнопку, чтобы не искать ее заново:

Выделить код

Код:

var button = document.getElementById("custombuttons-button1");
button.myFunction1();
Infocatcher пишет
rbfyec пишет

А можно как-то в кнопке вызывать функцию, объявленную в другой кнопке?

Прямо вот так – нельзя.
Можно сделать глобальную функцию или добавить узлу кнопки новый метод.

Спасибо Infocatcher. Я сделал, работает.
Наверно второй вариант предпочтительнее, меньше чревато конфликтами?

Infocatcher пишет
difabor пишет

И ещё: вызов document.getElementById("custombuttons-button1").myFunction1(); намного "тяжелее" для процессора/памяти или разница несущественна?

По сравнению с чем?
Если будет вызываться много раз, лучше сохранить ссылку на кнопку, чтобы не искать ее заново:

Выделить код

Код:

var button = document.getElementById("custombuttons-button1");
button.myFunction1();

Спасибо!
Через document.getElementById("custombuttons-button1") можно вызывать любые функции из custombuttons-button1 или только такие, которые в custombuttons-button1 определялись через this?
Если я в custombuttons-button1 определил:

Выделить код

Код:

var MyFunctions = {
   fun1: function(p1,p2) {...},
   fun2: function(...) {...},
   ...
   funN: function(){...}
}

то я могу их вызывать в другой кнопке

Выделить код

Код:

var button = document.getElementById("custombuttons-button1");
button.MyFunctions.fun1(10,20); //и т.д.?

Должен ли я определить MyFunctions в custombuttons-button1 как this.MyFunctions?

rbfyec пишет

Наверно второй вариант предпочтительнее, меньше чревато конфликтами?

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

difabor пишет

Должен ли я определить MyFunctions в custombuttons-button1 как this.MyFunctions?

Да, видно будет только то, что было добавлено в свойства объекта кнопки.
То есть видны только все this.something = ...

ifln пишет

bunda1
Есть вопрос касательно замечательной кнопки Блокнот в вкладке

Методом тыка заменил в Help <TEXTAREA></TEXTAREA> на <textarea rows="50"></textarea> и теперь в этой вкладке работает букмарклет Preview для предпросмотра от Lex1

Есть ли у этой вкладки адрес? Хочу применить к ней стиль, что бы панель закладок на ней всегда была раскрыта.

Хочу спросить по поводу этого букмарклета Preview. Для его корректной работы (не с кнопкой Блокнот в вкладке, а вообще) надо там что то переделать? И как его использовать?
Чем он лучше кнопки Предварительный просмотр на форумах?

А то я пробую его на форуме - ссылки отображаются просто текстом с тегами, они некликабельны.

beggrr пишет

Чем он лучше кнопки Предварительный просмотр на форумах?

Ничем. Поддерживает только основные теги. Просто на некоторых сайтах нет предпросмотра. А в Блокноте в вкладке, где удобно составлять большие тексты, другого выбора нет.

ifln
ясно, спасибо

Здравствуйте, нуждаюсь в кнопке открыть и закрыть Панель Меню, а так же кнопке открыть закрыт панель дополнений (если можно, чтобы эта панель открывалась наверху браузера под вкладками). Спасибо!

Артик пишет

Здравствуйте, нуждаюсь в кнопке открыть и закрыть Панель Меню

№8004.

voqabuhe пишет

№8004.

сенк ю :D

Вопрос о кнопке Блокнот в вкладке.
Сейчас вставляю текст в блокнот, перехожу на другую вкладку и копирую очередной кусок текста. Возвращаюсь в блокнот чтобы добавить текст, а содержимое уже перезаписано. Приходится жать CTRL+Z и потом вставлять текст.
Как сделать, чтобы содержимое блокнота автоматически не обновлялось?

ifln пишет

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

Кнопка Блокнот в вкладке такое делать не может, это у тебя какое то расширение шалит.

bunda1 пишет

это у тебя какое то расширение шалит.

Кнопка Quote+ от Lex1 хулиганила.
Удалил ее с панели, вернул с перезагрузками - все работает нормально.
Удалил-вернул с перезагрузками Блокнот в вкладке - опять содержимое блокнота перезаписывается. :)
Может поведение кнопок зависеть от очередности их выставления на панель?

Не, по прежнему конфликтуют. Даже при обычном копировании, когда не жму на Quote+.

Разобрался.
Конфликт происходит только если Блокнот в вкладке был открыт СКМ. Если открывать ЛКМ - все нормально.

ifln пишет

Разобрался.
Конфликт происходит только если Блокнот в вкладке был открыт СКМ. Если открывать ЛКМ - все нормально.

Ну а если так:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0411%u043B%u043E%u043A%u043D%u043E%u0442%20%u0432%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28notepad%29%3B%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20%7B%20%20%0A%20%20%20%20%20%20%20%20//%20%u0437%u0430%u043F%u043E%u043C%u043D%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%20%u0438%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20var%20clip%20%3D%20gClipboard.read%28%29%3B%0A%20%20%20%20%20%20%20%20window.content.focus%28%29%3B%0A%20%20%20%20%20%20%20%20goDoCommand%28%22cmd_copy%22%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%0A%0A%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%u0438%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%0A%20%20%20%20%20%20%20%20var%20browser%20%3D%20gBrowser.getBrowserForTab%28gBrowser.selectedTab%20%3D%20gBrowser.addTab%28notepad%29%29%3B%20%0A%20%20%20%20%20%20%20%20browser.addEventListener%28%22pageshow%22%2C%20function%20c%28e%29%20%7B%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20this.removeEventListener%28e.type%2C%20c%29%3B%20%20%20%20%20%20%20%20%20%20%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20content.document.getElementsByTagName%28%22textarea%22%29%5B0%5D.value%20%3D%20gClipboard.read%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20clip%20%26%26%20gClipboard.write%28clip%29%3B%20//%20%u0432%u0435%u0440%u043D%u0443%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u0431%u0443%u0444%u0435%u0440%20%u043E%u0431%u043C%u0435%u043D%u0430%20%0A%20%20%20%20%20%20%20%20%20%20%20%7D%2C%2050%29%3B%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%0A%0A//%20%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%u0432%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%u043F%u043E%u0441%u043B%u0435%20%u043E%u0431%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Aif%20%28%20content.window.location%20%3D%3D%20notepad%20%29%20%7B%0A%20%20%20%20%20var%20val%20%3D%20content.document.getElementsByTagName%28%22textarea%22%29%5B0%5D.value%3B%0A%20%20%20%20%20loadURI%28notepad%29%3B%0A%20%20%20%20%20setTimeout%28%28%29%3D%3E%20content.document.getElementsByTagName%28%22textarea%22%29%5B0%5D.value%20%3D%20val%2C%20500%29%3B%20%20%20%20%20%0A%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20%0A//%20%u041E%u0447%u0438%u0441%u0442%u0438%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%u043D%u0443%u044E%20%u0441%u0442%u0440%u043E%u043A%u0443%20%u0432%20%u043A%u043B%u0430%u0434%u043A%u0435%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20...........%0AaddEventListener%28%22TabAttrModified%22%2C%20%28%29%3D%3E%20content.location%20%3D%3D%20notepad%20%26%26%20gURLBar.reset%28%29%20%29%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0430%u0435%u043C%20%u0430%u0434%u0440%u0435%u0441%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20%u043A%u0430%u043A%20base64%20%u0438%u0437%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u043F%u0440%u0430%u0432%u043A%u0430%20%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u043C%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u0434%u043B%u044F%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20...........%0Avar%20notepad%20%3D%20%22data%3Atext/html%3Bbase64%2C%22%20+%20window.btoa%28%20self.Help.replace%28%27selfImage%27%2C%20self.image%29%20%29%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Athis.tooltipText%20%3D%20%22%u0411%u043B%u043E%u043A%u043D%u043E%u0442%20%u0432%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%5Cn%u041B%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%5Cn%u0421%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%u0441%20%u0442%u0435%u043A%u0441%u0442%u043E%u043C%28%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u043C%20%u0438%u043B%u0438%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%29%20%5Cn%u041F%3A%20CB%20%u043C%u0435%u043D%u044E%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%3Cmeta%20http-equiv%3D%22Content-Type%22%20content%3D%22text/html%3B%20charset%3Dutf-8%22/%3E%3Ctitle%3ENotepad%3C/title%3E%0A%3Chead%3E%0A%20%3Clink%20rel%3D%22shortcut%20icon%22%20href%3D%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22type%3D%22image/x-icon%22%3E%0A%3C/head%3E%0A%0A%3CTEXTAREA%3E%3C/TEXTAREA%3E%0A%3Cstyle%3E%0A%0Ahtml%20%7B%0A%20%20background-color%3A%20black%3B%0A%20%20overflow%3A%20hidden%3B%0A%7D%0Atextarea%20%7B%0A%20%20background%3A%20%23383838%3B%0A%20%20overflow-y%3A%20auto%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20border-radius%3A%202px%3B%0A%20%20border%3A%202px%20inset%20white%3B%0A%20%20color%3A%20white%3B%0A%7D%0A%3C/style%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
bunda1 пишет

Ну а если так:

Отлично все работает.
:beer:

Как можно открыть новую вкладку и вставить свой html код?
Через data:text/html не получится, кода довольно много.

А, и еще один вопрос. Вот кусочек кода.

Выделить код

Код:

...... тут какой то код
<div class="word-sub-header">
      <div class="title-block">
        <h2>
          Definition of <i>copper</i>
        </h2>
      </div>
              <div class="popularity-block"></div>
...... и дальше какой то код

Как составить регулярку, чтобы она захватила от первого <div class= до первого </div> учитывая все переносы и любые сивмолы?

hartumov пишет

Как можно открыть новую вкладку и вставить свой html код?
Через data:text/html не получится, кода довольно много.

Может установи Блокнот в вкладке и положи свой html код в вкладку Справка и открывай.

hartumov пишет

Как можно открыть новую вкладку и вставить свой html код?
Через data:text/html не получится, кода довольно много.

А, и еще один вопрос. Вот кусочек кода.

Выделить код

Код:

...... тут какой то код
<div class="word-sub-header">
      <div class="title-block">
        <h2>
          Definition of <i>copper</i>
        </h2>
      </div>
              <div class="popularity-block"></div>
...... и дальше какой то код

Как составить регулярку, чтобы она захватила от первого <div class= до первого </div> учитывая все переносы и любые сивмолы?

Выделить код

Код:

var trytext = ' ...... тут какой то код\n<div class=\"word-sub-header\"\n      <div class=\"title-block\">\n        <h2>\n          Definition of <i>copper</i>\n        </h2>\n      </div>\n              <div class=\"popularity-block\"></div>\n...... и дальше какой то код';
var div0 = trytext.split("</div>")[0].split("<div class=");//"<div class="
var div1 = div0.shift();
alert(div0.join("<div class="));

Если же Вам нужно присутствие первого <div class=, то ещё проще: вместо удаления 0-го элемента шифтом var div1 = div0.shift(); сделайте его очистку: div0[0]='';

Что-то в ночнушках Compact Menu перестала работать. Ругается на TypeError: nodes[0] is null. Причем, еще и после попытки открытия/переинициализации меню гамбургера перестает работать.
И с этим вариантом такая же история. - вру, этот работает.

Опять вру, оба работают. Причина в том, что если добавить в ids (nodes) несуществующие id (от аддонов, которые отключены), то оба варианта перестают работать. Можно это как-то поправить?

turbot пишет

[s]
Опять вру, оба работают. Причина в том, что если добавить в ids (nodes) несуществующие id (от аддонов, которые отключены), то оба варианта перестают работать. Можно это как-то поправить?

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECompact%20Menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBEAAAEAIACsBAAAFgAAACgAAAAQAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMSAAcROg8hOGEvQV1hL0JdOQ4iOBIABxH7+/uBqKioqv7+/oAAAAAAAAAAAAAAAAAAAAAAAAAAAREABhB6PEx23HZ32+uLe/7rfGv/63tr/+uKev7vv7/tp52g10BAQP6vr6+z////fwAAAAAAAAAAAAAAAR0CEB3AaHK/629j/+FbVP/bUU7/10xK/9ZLSv/sp6X/26mm/0BAQP9AQED/QEBA/9jY2KH///9/AAAAAA8ABQ+6X22+1UpK/8Y2P/+8KDX/tB0v/6sZKf+uGCz/1pae/0BAQP9AQED/QEBA/0BAQP9AQED+8fHxkQAAAAJ0M0hzxz1G/7AYLv+lDCX/ng0b/5APD/+FFgL/1Zid/3BfYf9AQED/QEBA/0BAQP9AQED/QEBA/25ubtgPAAUPt0dc2KULJf+pFCb/tygu/7w1L/+FGAH/nSsW/8OSjf+gf3//qIKB/9aTlf/Vi5P/0YSR/9yosuzw7/CHMAobMLw2Sf60Iyz/xD41/9NSPv/cYUT/0188/+VwSf/IWzj/WhID/0kFAP9zGhT/yEM4/7grL/+9Okn+Nw0fNFYoOVLAOT3/zEg6/9xhRP/qdUv/64RR/+uNVf/rk1f/65NX/9t1Q/9mGQD/YhcE/9NeP//RTz3/xEA//1wsPVlWKDhR01dI/+BnRv/rf0//65JX/+ugXP/rqV7/661g/+utYf/McDH/gS4C/4UyD//CXjX/5G5I/9hdSf9dLD5YMAoaMOp+Zf7rgE//65dZ/+upX//rtGP/671n/+vBaP/rslz/rk4K/51CBf/rjUf/64RI/+uBTf/rhGf+NQweNA4ABg7Tdm3X65NY/+uqX//rumX/68Rq/+vMbf/r0G//68pn/+u+X//cgTD/67hi/+uuYf/rmlr/2Hxv2REABhAAAAACdTlIceudYP/rrV7/66xW/+vMbf/r03D/69Zw/+vVcP/r1HD/68tr/9x+Pv/rkUz/66xo/3Y7SXMAAAACAAAAAA8ABQ+2Z2O70WIX/+uEIf/rvVb/68JY/+vPbf/rsUn/68FX/+uVRf+dNBL/zGw0/8h7dL0PAAUPAAAAAAAAAAAAAAABHAEPHL5qWrzrr0r/69CA/+vQgf/r3qv/696r/+vNgP/rrnb/rEgo/6VXW70dAg8cAAAAAQAAAAAAAAAAAAAAAAAAAAEPAAUPdztFceiUcNjrz47+69yw/+vUmf/ryIT+03pe2XIzRHMPAAUPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPAAUPMgscMlcpOlNYKTlUMwscMg8ABQ8AAAACAAAAAAAAAAAAAAAAAAAAAP//rEHwA6xBwAGsQYAArEGAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEGAAaxBgAGsQcADrEHwD6xB%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28gBrowser.currentURI.spec%20%3D%3D%20%22about%3Acustomizing%22%29%20return%3B%0A%0Avar%20mmb%20%3D%20document.getElementById%28%22main-menubar%22%29%3B%0Ammb.collapsed%20%3D%20true%3B%0AaddDestructor%28%28%29%20%3D%3E%20mmb.collapsed%20%3D%20false%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%20%28event.target%20%26%26%20event.target%20%21%3D%20this%29%20return%3B%0Aif%20%28%21event.target%20%26%26%20this.lastChild%20%26%26%20this.lastChild.state%20%3D%3D%20%22open%22%29%20%7B%0A%09this.lastChild.hidePopup%28%29%3B%20return%3B%0A%7D%0Avar%20ids%20%3D%20%5B%0A%09%22file-menu%22%2C%0A%09%22edit-menu%22%2C%0A%09%22view-menu%22%2C%0A%09%22bookmarksMenu%22%2C%0A%09%22history-menu%22%2C%0A%09%22tools-menu%22%2C%0A%09%22helpMenu%22%0A%5D%3B%0Avar%20menus%20%3D%20ids.map%28id%20%3D%3E%20document.getElementById%28id%29%29.filter%28id%3D%3E%20%7Breturn%20%28id%20%21%3D%3D%20null%29%7D%29%3B%0Avar%20menubar%20%3D%20menus%5B0%5D.parentNode%3B%0Avar%20order%20%3D%20Array.slice%28menubar.childNodes%29%3B%0A%0Afunction%20appendMenus%28parent%29%20%7B%0A%09var%20nodes%20%3D%20parent%20%3D%3D%20menubar%20%3F%20order%20%3A%20menus%3B%0A%09for%28var%20node%20of%20nodes%29%20parent.appendChild%28node%29%3B%0A%09if%20%28ids.indexOf%28%22bookmarksMenu%22%29%20%3D%3D%20-1%29%20return%3B%0A%09for%28var%20menu%20of%20parent.getElementsByTagName%28%22menu%22%29%29%20%7B%0A%09%09if%20%28%21menu._placesView%29%20continue%3B%0A%09%09menu._placesView.uninit%28%29%3B%0A%09%09delete%20menu._placesView%3B%0A%09%7D%0A%7D%0Athis.textContent%20%3D%20%22%22%3B%0Avar%20popup%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Apopup.position%20%3D%20%22after_start%22%3B%0Apopup.id%20%3D%20%22cb-compact-menu-menupopup%22%3B%0Apopup.setAttribute%28%22context%22%2C%20%22toolbar-context-menu%22%29%3B%0Apopup.__defineGetter__%28%22parentNode%22%2C%20%28%29%20%3D%3E%20null%29%3B%0A%0Apopup.addEventListener%28%22popuphidden%22%2C%20function%20onPH%28e%29%20%7B%0A%09if%20%28e.originalTarget%20%21%3D%20this%29%20return%3B%0A%09popup.removeEventListener%28%22popuphidden%22%2C%20onPH%2C%20false%29%3B%0A%09appendMenus%28menubar%29%3B%0A%7D%2C%20false%29%3B%0A%0AappendMenus%28popup%29%3B%0Apopup.openPopup%28this%29%3B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Спасибо. Так без проблем работает.

difabor
Спасибо. Сделано.

bunda1, мы видимо не поняли друг друга.
Мне надо не редактировать html код, а просто вставить его в страницу в новой вкладке. Чтобы он отобразился дивами, спанами, таблицами и пр.
Мне люди подсказали как сделать  это через innerHTML.

День добрый. На ff42 пользовался кнопочкой GrabScroll, обновился до ff45 и работать перестала. Можно поправить?

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGrabScroll%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAACUklEQVQ4jaWUzUsbQRjGn8nHhE1J0ICuEbOY2s0HBETxHoJHlVw8+Be4YtCTh5CLNESSowFzkMXiCtVeIpqWEA8t9FoW91a855TkD8jx6WUVSWtQOvCc5sdveGfed4Axi6Tn9vb2Q7PZfE/SM44dK2k0GrFIJFKPRCL1RqMRe7OMpHAcZ0LX9T0hxL0Q4l7X9T3HcSZIireI/NlsdkNK2QFgA7CllJ1sNrtB0v9aiUJynuQqSWMkq+6eMrYckn6S80KInwAeADwoivJLCPFbSnkvpXR8Pt8PV+b/q0ySHsdxJnK53BrJBIDvAO4A3MVisU9er7c9PT39eXJy8ksgEGiTTORyuTX3zjxPEtM051KplCGlvHZFX5eXl89qtdrHcrlcrVar5UqlcrS0tHQO4BvJhJTyOpVKGaZpzpH0oNVqxVVVPRJCdADcuKJmJpM5IKmSfOdGzWQyBwCaLnMjhOioqlpptVpx2La9kM/na4qiXAC4cqGrZDK5TzL0rPxQMpncf84oinKRz+drtm0vgKSv1+stFovFHU3T6i5kpdPpXZJTJENuptLp9C4Ai2RC07R6sVjc6fV6iyR9j6f5hsOhZlnWpisyw+HwcTweLz9POBw+BmCSTFiWtTkcDrUnycjzh1zRCYBTAOcjOQVwQjLhsi93OcnZfzTiaGZfFIzI/IVCYT0ajV4CaANoR6PRy0KhsP7qEXkss9/vz5RKpa1gMHgYDAYPS6XSVr/fn3nT0LoyT7fb1Q3D2DYMY7vb7er/8yd5B4PBymAwWCHpHcf+AbaLjoOEBHabAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/**%0A%20*%20%20Button%20based%20on%20a%20script%20created%20for%20userChrome.js%20extension.%20http%3A//userchromejs.mozdev.org/%0A%20*%20%20Author%3A%20Alice0775%20https%3A//github.com/alice0775%0A%20*%20%20Source%3A%20https%3A//github.com/alice0775/userChrome.js/blob/master/GrabScroll_Fx29.uc.xul%0A%20*/%0Aconst%20_UID%20%3D%20%22grab_scroll%22%20+%20%28self.id%29.split%28%22custombuttons%22%29%5B1%5D%3B%0A%0Aconst%20_LTN%20%3D%20%22listeners_%22%20+%20_UID%3B%0A%0Aconst%20PREF_BRANCH%20%3D%20%22extensions.custombuttons.GrabScroll.Id%22%20+%20%28self.id%29.split%28%22-button%22%29%5B1%5D%20+%20%22.%22%3B%0A%0Aif%20%28%21%28%22Services%22%20in%20window%29%29%0A%09Cu.import%28%22resource%3A//gre/modules/Services.jsm%22%29%3B%0A%0A//START//%20Default%20preferences%20management%0AbtnPref.root%20%3D%20PREF_BRANCH%3B%0A%0AbtnPref.defaults%20%3D%20%7B%0A%09%22GrabScrollEnabled%22%20%3A%20true%2C%0A%09%22MouseButton%22%20%3A%200%2C%0A%09%22MoveRate%22%20%3A%20-1%2C%0A%09%22Timer%22%20%3A%20500%2C%0A%09%22InertiaEnabled%22%20%3A%20false%2C%0A%09%22InertiaThreshold%22%20%3A%2020%2C%0A%09%22InertiaRate%22%20%3A%2050%2C%0A%09%22NotClicableLink%22%20%3A%20true%2C%0A%09%22NotImage%22%20%3A%20false%2C%0A%09%22Tolerance%22%20%3A%203%2C%0A%09%22ToleranceWhenNoHScroll%22%20%3A%205%0A%7D%3B%0A%0Alet%28branch%20%3D%20Services.prefs.getDefaultBranch%28btnPref.root%29%29%20%7B%0A%09for%20%28let%5Bkey%2C%20val%5Din%20Iterator%28btnPref.defaults%29%29%20%7B%0A%09%09switch%20%28typeof%20val%29%20%7B%0A%09%09case%20%22boolean%22%3A%0A%09%09%09branch.setBoolPref%28key%2C%20val%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22number%22%3A%0A%09%09%09branch.setIntPref%28key%2C%20val%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22string%22%3A%20%7B%0A%09%09%09%09let%20str%20%3D%20Cc%5B%22@mozilla.org/supports-string%3B1%22%5D%0A%09%09%09%09%09.createInstance%28Ci.nsISupportsString%29%3B%0A%09%09%09%09str.data%20%3D%20val%3B%0A%09%09%09%09branch.setComplexValue%28%28key%29%2C%20Ci.nsISupportsString%2C%20str%29%3B%0A%09%09%09%7D%0A%09%09%09break%3B%0A%09%09%7D%0A%09%7D%0A%7D%3B%0A%0AbtnPref.observe%20%3D%20function%20%28aPrefs%2C%20aCallback%29%20%7B%0A%09let%20%7B%0A%09%09root%0A%09%7D%0A%09%09%20%3D%20btnPref%3B%0A%09function%20observe%28subject%2C%20topic%2C%20data%29%20%7B%0A%09%09if%20%28topic%20%21%3D%3D%20%22nsPref%3Achanged%22%29%0A%09%09%09return%3B%0A%09%09let%20pref%20%3D%20data.slice%28root.length%29%3B%0A%09%09if%20%28aPrefs.indexOf%28pref%29%20%3D%3D%3D%20-1%29%0A%09%09%09return%3B%0A%09%09aCallback%28pref%29%3B%0A%09%7D%0A%09Services.prefs.addObserver%28root%2C%20observe%2C%20false%29%3B%0A%09unload%28function%20%28%29Services.prefs.removeObserver%28root%2C%20observe%29%29%3B%0A%7D%3B%0A%0Afunction%20btnPref%28aKey%29%20%7B%0A%09let%20%7B%0A%09%09branch%2C%0A%09%09defaults%0A%09%7D%0A%09%09%20%3D%20btnPref%3B%0A%09if%20%28%21branch%29%0A%09%09branch%20%3D%20Services.prefs.getBranch%28btnPref.root%29%3B%0A%09switch%20%28typeof%20defaults%5BaKey%5D%29%20%7B%0A%09case%20%22boolean%22%3A%0A%09%09return%20branch.getBoolPref%28aKey%29%3B%0A%09%09break%3B%0A%09case%20%22number%22%3A%0A%09%09return%20branch.getIntPref%28aKey%29%3B%0A%09%09break%3B%0A%09case%20%22string%22%3A%0A%09%09return%20branch.getComplexValue%28aKey%2C%20Ci.nsISupportsString%29.data%3B%0A%09%09break%3B%0A%09%7D%0A%09return%20null%3B%0A%7D%0A%0Afunction%20unload%28aCallback%2C%20aContainer%29%20%7B%0A%09let%20unloaders%20%3D%20unload.unloaders%3B%0A%09if%20%28unloaders%20%3D%3D%3D%20null%29%0A%09%09unloaders%20%3D%20unload.unloaders%20%3D%20%5B%5D%3B%0A%09if%20%28aCallback%20%3D%3D%3D%20null%29%20%7B%0A%09%09unloaders.slice%28%29.forEach%28function%20%28unloader%29unloader%28%29%29%3B%0A%09%09%09unloaders.length%20%3D%200%3B%0A%09%7D%0A%09if%20%28aContainer%20%21%3D%3D%20null%29%20%7B%0A%09%09aContainer.addEventListener%28%22unload%22%2C%20removeUnloader%2C%20false%29%3B%0A%09%09let%20origCallback%20%3D%20aCallback%3B%0A%09%09callback%20%3D%20function%20%28%29%20%7B%0A%09%09%09aContainer.removeEventListener%28%22unload%22%2C%20removeUnloader%2C%20false%29%3B%0A%09%09%09origCallback%28%29%3B%0A%09%09%7D%0A%09%09return%20null%3B%0A%09%7D%0A%09function%20unloader%28%29%20%7B%0A%09%09try%20%7B%0A%09%09%09callback%28%29%3B%0A%09%09%7D%20catch%20%28err%29%20%7B%0A%09%09%09Components.utils.reportError%28err%29%3B%0A%09%09%7D%0A%09%7D%0A%09unloaders.push%28unloader%29%3B%0A%09function%20removeUnloader%28%29%20%7B%0A%09%09let%20index%20%3D%20unloaders.indexOf%28unloader%29%3B%0A%09%09if%20%28index%20%21%3D%3D%20-1%29%0A%09%09%09unloaders.splice%28index%2C%201%29%3B%0A%09%7D%0A%09return%20removeUnloader%3B%0A%7D%0A//END//%20Default%20preferences%20management%0A%0Avar%20GrabScroll%20%3D%20%7B%0A%09mStatus%20%3A%200%2C%20//0%3AIdle%2C%201%3A%20during%20mousedown%2C%202%3A%20during%20mousemove%2C%203%3A%20mouseup%20After%20scrolling%0A%09mLastX%20%3A%200%2C%0A%09mLastY%20%3A%200%2C%0A%09_target%20%3A%20null%2C%20//%20Element%20the%20mouse%20is%20pointing%0A%09_target2%20%3A%20null%2C%20//%20Element%20the%20mouse%20is%20pointing%0A%09_isImage%20%3A%20false%2C%0A%09_timer%20%3A%200%2C%20//%20Save%20time%20when%20mouseup%20to%20determine%20the%20threshold.%0A%09_mtimer%20%3A%20false%2C%0A%09cScroll%20%3A%20false%2C%0A%09cSpeedX%20%3A%200%2C%0A%09cSpeedY%20%3A%200%2C%0A%09_doc%20%3A%20null%2C%0A%09_MOVERATEpZoom%20%3A%201%2C%0A%09_window%20%3A%20null%2C%0A%09initGrabScroll%20%3A%20function%20%28%29%20%7B%0A%09%09if%20%28GrabScroll.activeBrowser%28%29.mPanelContainer%29%20%7B%0A%09%09%09this._window%20%3D%20GrabScroll.activeBrowser%28%29.mPanelContainer%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09this._window%20%3D%20document.getElementById%28%27content%27%29%3B%0A%09%09%7D%0A%09%09this._window.setCapture%28%29%3B%0A%09%09if%20%28%21window%5B_LTN%5D%29%20%7B%0A%09%09%09this._window.addEventListener%28%22mousedown%22%2C%20this%2C%20true%29%3B%0A%09%09%09this._window.addEventListener%28%22click%22%2C%20this%2C%20true%29%3B%0A%09%09%09this._window.addEventListener%28%22mouseup%22%2C%20this%2C%20true%29%3B%0A%09%09%09gBrowser.addEventListener%28%27pagehide%27%2C%20this%2C%20false%29%3B%0A%09%09%09window%5B_LTN%5D%20%3D%20true%3B%0A%09%09%7D%0A%09%7D%2C%0A%09uninitGrabScroll%20%3A%20function%20%28%29%20%7B%0A%09%09if%20%28this._window%29%20%7B%0A%09%09%09this._window.removeEventListener%28%22mousedown%22%2C%20this%2C%20true%29%3B%0A%09%09%09this._window.removeEventListener%28%22click%22%2C%20this%2C%20true%29%3B%0A%09%09%09this._window.removeEventListener%28%22mouseup%22%2C%20this%2C%20true%29%3B%0A%09%09%09gBrowser.removeEventListener%28%27pagehide%27%2C%20this%2C%20false%29%3B%0A%09%09%09this.mStatus%20%3D%3D%3D%200%3B%0A%09%09%09this._window.removeEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%09%09%7D%0A%09%09delete%20window%5B_LTN%5D%3B%0A%09%7D%2C%0A%09activeBrowser%20%3A%20function%20%28%29%20%7B%0A%09%09return%20%28%27SplitBrowser%27%20in%20window%20%3F%20SplitBrowser.activeBrowser%20%3A%20null%29%0A%09%09%20%7C%7C%20gBrowser%3B%0A%09%7D%2C%0A%09handleEvent%20%3A%20function%20%28event%29%20%7B%0A%09%09event%20%3D%20new%20XPCNativeWrapper%28event%29%3B%0A%09%09switch%20%28event.type%29%20%7B%0A%09%09case%20%22mousedown%22%3A%0A%09%09%09if%20%28this.cScroll%29%20%7B%0A%09%09%09%09clearTimeout%28this.cScroll%29%3B%0A%09%09%09%09this.cSpeedX%20%3D%20this.cSpeedY%20%3D%200%3B%0A%09%09%09%7D%0A%09%09%09if%20%28btnPref%28%22GrabScrollEnabled%22%29%20%26%26%0A%09%09%09%09%21event.shiftKey%20%26%26%20%21event.ctrlKey%20%26%26%20%21event.altKey%29%20%7B%0A%09%09%09%09this.grabStart%28event%29%3B%0A%09%09%09%7D%20else%20if%20%28%21btnPref%28%22GrabScrollEnabled%22%29%20%26%26%0A%09%09%09%09event.shiftKey%20%26%26%20%21event.ctrlKey%20%26%26%20%21event.altKey%29%20%7B%0A%09%09%09%09this.grabStart%28event%29%3B%0A%09%09%09%7D%0A%09%09%09break%3B%0A%09%09case%20%22mousemove%22%3A%0A%09%09%09this.mousemove%28event%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22click%22%3A%0A%09%09%09this.click%28event%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22mouseup%22%3A%0A%09%09%09this.mouseup%28event%29%3B%0A%09%09%09break%3B%0A%09%09case%20%27pagehide%27%3A%0A%09%09%09this._doc%20%3D%20null%3B%0A%09%09%09this._target%20%3D%20null%3B%0A%09%09%09this._target2%20%3D%20null%3B%0A%09%09%09this._isImage%20%3D%20null%3B%0A%09%09%09this.NS%20%3D%20this.EW%20%3D%20this.NSEW%20%3D%20null%3B%0A%09%09%09break%3B%0A%09%09%7D%0A%09%7D%2C%0A%09grabStart%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28this.mStatus%20%3D%3D%3D%203%29%0A%09%09%09this.mStatus%20%3D%200%3B%0A%09%09//%20Do%20not%20start%20GrabScroll%20if%20you%20fire%20the%20mouse%20down%20continuously.%0A%09%09if%20%28btnPref%28%22MouseButton%22%29%20%3D%3D%3D%200%29%20%7B%0A%09%09%09if%20%28Math.abs%28this.mLastX%20-%20event.screenX%29%20%3C%205%20%26%26%0A%09%09%09%09Math.abs%28this.mLastY%20-%20event.screenY%29%20%3C%205%29%0A%09%09%09%09return%0A%09%09%7D%0A%09%09var%20doc%20%3D%20event.originalTarget.ownerDocument%3B%0A%09%09if%20%28%21doc%29%0A%09%09%09return%3B%0A%09%09if%20%28doc.contentType%20%3D%3D%3D%20%27application/vnd.mozilla.xul+xml%27%29%0A%09%09%09return%3B%0A%09%09this._doc%20%3D%20doc%3B%0A%09%09if%20%28event.button%20%3D%3D%3D%20btnPref%28%22MouseButton%22%29%20%26%26%20this.mStatus%20%3D%3D%3D%200%29%20%7B%0A%09%09%09this._target%20%3D%20event.originalTarget%3B%0A%09%09%09if%20%28/%5E%28html%7Cbody%29%24/.test%28this._target.localName.toLowerCase%28%29%29%20%7C%7C%20this._target.clientHeight%20%3E%2030000%29%0A%09%09%09%09this._target2%20%3D%20null%3B%0A%09%09%09else%20if%20%28/div/.test%28this._target.localName.toLowerCase%28%29%29%20%26%26%20this._target.clientHeight%20%3E%201000%29%0A%09%09%09%09this._target2%20%3D%20null%3B%0A%09%09%09else%0A%09%09%09%09this._target2%20%3D%20this._target%3B%0A%09%09%09//%20Editable%20element%20does%20not%20start%20GrabScroll%0A%09%09%09if%20%28this.isParentEditableNode%28this._target%29%29%0A%09%09%09%09return%3B%0A%09%09%09//%20Draggable%20element%20does%20not%20start%20GrabScroll%0A%09%09%09if%20%28this.isParentDraggableNode%28this._target%29%29%0A%09%09%09%09return%3B%0A%09%09%09//%20Factors%20to%20be%20steamed%20does%20not%20start%20the%20GrabScroll%0A%09%09%09if%20%28this.isIgnore%28this._target%29%29%0A%09%09%09%09return%3B%0A%09%09%09//%20Video%20control%20does%20not%20start%20the%20GrabScroll%0A%09%09%09if%20%28this.isVideoControl%28event.target%29%29%0A%09%09%09%09return%3B%0A%09%09%09//%20Clickable%20links%20does%20not%20start%20GrabScroll%0A%09%09%09if%20%28this.isParentClickableNode%28this._target%29%29%20%7B%0A%09%09%09%09if%20%28btnPref%28%22NotClicableLink%22%29%29%0A%09%09%09%09%09return%3B%0A%09%09%09%09//%20Blocking%20of%20DragStart%20on%20links%0A%09%09%09%09if%20%28%21%28%27linkDragSelection%27%20in%20window%29%29%0A%09%09%09%09%09event.preventDefault%28%29%3B%0A%09%09%09%7D%0A%09%09%09//%20On%20images%0A%09%09%09this._isImage%20%3D%20this.isImage%28event%29%3B%0A%09%09%09if%20%28this._isImage%29%20%7B%0A%09%09%09%09//%20Images%20does%20not%20start%20the%20GrabScroll%0A%09%09%09%09if%20%28btnPref%28%22NotImage%22%29%29%0A%09%09%09%09%09return%3B%0A%09%09%09%09//%20DragStart%20block%20on%20images%0A%09%09%09%09event.preventDefault%28%29%3B%0A%09%09%09%7D%0A%09%09%09//Compativility%20with%20ResizeTa%0A%09%09%09var%20target%20%3D%20this._target%3B%0A%09%09%09while%20%28target%29%20%7B%0A%09%09%09%09if%20%28%22getAttribute%22%20in%20target%20%26%26%20target.getAttribute%28%22draggable%22%29%20%3D%3D%3D%20%22true%22%29%0A%09%09%09%09%09return%3B%0A%09%09%09%09try%20%7B%0A%09%09%09%09%09var%20style%20%3D%20this._doc.defaultView.getComputedStyle%28target%2C%20null%29%3B%0A%09%09%09%09%09if%20%28/resize%7Cmove%7Call-scroll%7Ccrosshair/.test%28style.getPropertyValue%28%22cursor%22%29%29%29%0A%09%09%09%09%09%09return%3B%0A%09%09%09%09%09else%20if%20%28/resize%7Cmove%7Call-scroll%7Ccrosshair/.test%28style.getPropertyValue%28%22auto%22%29%29%29%0A%09%09%09%09%09%09break%3B%0A%09%09%09%09%7D%20catch%20%28e%29%20%7B%7D%0A%09%09%09%09target%20%3D%20target.parentNode%3B%0A%09%09%09%7D%0A%09%09%09if%20%28btnPref%28%22MouseButton%22%29%20%3E%200%29%20%7B%0A%09%09%09%09event.preventDefault%28%29%3B%0A%09%09%09%09event.stopPropagation%28%29%3B%0A%09%09%09%7D%0A%09%09%09this._timer%20%3D%20new%20Date%28%29.getTime%28%29%3B%0A%09%09%09this.mLastX%20%3D%20event.screenX%3B%0A%09%09%09this.mLastY%20%3D%20event.screenY%3B%0A%09%09%09this.mStatus%20%3D%201%3B%0A%09%09%09this._MOVERATEpZoom%20%3D%20btnPref%28%22MoveRate%22%29%20/%20%28ZoomManager.useFullZoom%20%3F%20ZoomManager.zoom%20%3A%201%29%3B%0A%09%09%09%5Bthis.NS%2C%20this.EW%2C%20this.NSEW%5D%20%3D%20this.getScrollView%28event%29%3B%0A%09%09%09this._window.addEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09adjustedTimer%20%3A%20function%20%28%29%20%7B%0A%09%09var%20magTimer%20%3D%20btnPref%28%22Timer%22%29%3B%0A%09%09return%20magTimer%3B%0A%09%7D%2C%0A%09grabFinish%20%3A%20function%20%28%29%20%7B%0A%09%09this._window.removeEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%09%09var%20selCon%20%3D%20this.getSelconForDoc%28this._doc%29%3B%0A%09%09if%20%28selCon%29%0A%09%09%09selCon.setDisplaySelection%28selCon.SELECTION_ON%29%3B%0A%09%7D%2C%0A%09mousemove%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28this.mStatus%20%3D%3D%3D%202%20%7C%7C%20this.mStatus%20%3D%3D%3D%201%29%20%7B%0A%09%09%09var%20x%20%3D%20event.screenX%3B%0A%09%09%09var%20y%20%3D%20event.screenY%3B%0A%09%09%09var%20doc%20%3D%20event.originalTarget.ownerDocument%3B%0A%09%09%09if%20%28this.mStatus%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%09if%20%28%21this._isImage%20%26%26%0A%09%09%09%09%09%28new%20Date%28%29.getTime%28%29%20-%20this._timer%29%20%3E%20this.adjustedTimer%28%29%29%20%7B%0A%09%09%09%09%09this.grabFinish%28%29%3B%0A%09%09%09%09%09this.mStatus%20%3D%200%3B%0A%09%09%09%09%09return%3B%0A%09%09%09%09%7D%0A%09%09%09%09if%20%28Math.abs%28x%20-%20this.mLastX%29%20%3C%20btnPref%28%22ToleranceWhenNoHScroll%22%29%29%0A%09%09%09%09%09var%20movingh%20%3D%20Math.abs%28x%20-%20this.mLastX%29%20%3E%20Math.abs%28y%20-%20this.mLastY%29%20*%2050%3B%0A%09%09%09%09if%20%28%21this._isImage%20%26%26%20btnPref%28%22MouseButton%22%29%20%3D%3D%3D%200%20%26%26%20this.isText%28event%29%20%26%26%20movingh%20%26%26%20%21this.EW%29%20%7B%0A%09%09%09%09%09this.grabFinish%28%29%3B%0A%09%09%09%09%09this.mStatus%20%3D%200%3B%0A%09%09%09%09%09return%3B%0A%09%09%09%09%7D%0A%09%09%09%09if%20%28Math.abs%28x%20-%20this.mLastX%29%20+%20Math.abs%28y%20-%20this.mLastY%29%20%3C%20btnPref%28%22Tolerance%22%29%29%0A%09%09%09%09%09return%3B%0A%09%09%09%09if%20%28btnPref%28%22MouseButton%22%29%20%3D%3D%3D%200%29%20%7B%0A%09%09%09%09%09var%20selCon%20%3D%20this.getSelconForDoc%28this._doc%29%3B%0A%09%09%09%09%09if%20%28selCon%29%20%7B%0A%09%09%09%09%09%09var%20selection%20%3D%20selCon.getSelection%28selCon.SELECTION_NORMAL%29%3B%0A%09%09%09%09%09%09selection.removeAllRanges%28%29%3B%0A%09%09%09%09%09%09selCon.setDisplaySelection%28selCon.SELECTION_OFF%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09if%20%28%22ucjsMouseGestures%22%20in%20window%29%20%7B%0A%09%09%09%09%09%09ucjsMouseGestures._isMouseDownR%20%3D%20false%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%09this.mLastX%20%3D%20x%20-%20%28x%20-%20this.mLastX%29%20/%2010%3B%0A%09%09%09%09this.mLastY%20%3D%20y%20-%20%28y%20-%20this.mLastY%29%20/%2010%3B%0A%09%09%09%09this.mStatus%20%3D%202%3B%0A%09%09%09%7D%0A%09%09%09if%20%28this._mtimer%29%0A%09%09%09%09return%3B%0A%09%09%09this.cSpeedX%20%3D%20this._MOVERATEpZoom%20*%20%28x%20-%20this.mLastX%29%3B%0A%09%09%09this.cSpeedY%20%3D%20this._MOVERATEpZoom%20*%20%28y%20-%20this.mLastY%29%3B%0A%09%09%09this.scroll%28event%29%3B%0A%09%09%09this.mLastX%20%3D%20x%3B%0A%09%09%09this.mLastY%20%3D%20y%3B%0A%09%09%7D%0A%09%7D%2C%0A%09getSelconForDoc%20%3A%20function%20getSelconForDoc%28doc%29%20%7B%0A%09%09if%20%28%21doc%29%0A%09%09%09return%20null%3B%0A%09%09var%20aFrame%20%3D%20doc.defaultView%3B%0A%09%09if%20%28%21aFrame%29%0A%09%09%09return%20null%3B%0A%09%09var%20docShell%20%3D%20this.getDocShellForFrame%28aFrame%29%3B%0A%09%09var%20selCon%20%3D%20docShell%0A%09%09%09.QueryInterface%28Ci.nsIInterfaceRequestor%29%0A%09%09%09.getInterface%28Ci.nsISelectionDisplay%29%0A%09%09%09.QueryInterface%28Ci.nsISelectionController%29%3B%0A%09%09return%20selCon%3B%0A%09%7D%2C%0A%09getDocShellForFrame%20%3A%20function%20getDocShellForFrame%28aFrame%29%20%7B%0A%09%09return%20aFrame%0A%09%09.QueryInterface%28Ci.nsIInterfaceRequestor%29%0A%09%09.getInterface%28Ci.nsIWebNavigation%29%0A%09%09.QueryInterface%28Ci.nsIDocShell%29%3B%0A%09%7D%2C%0A%09click%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28event.button%20%3D%3D%3D%20btnPref%28%22MouseButton%22%29%20%26%26%20this.mStatus%20%3D%3D%3D%202%29%20%7B%0A%09%09%09event.preventDefault%28%29%3B%0A%09%09%09event.stopPropagation%28%29%3B%0A%09%09%7D%0A%09%09if%20%28event.button%20%3D%3D%3D%200%20%26%26%20this.mStatus%20%3E%3D%202%20%26%26%20this._doc%20instanceof%20Ci.nsIImageDocument%29%20%7B%0A%09%09%09event.preventDefault%28%29%3B%0A%09%09%09event.stopPropagation%28%29%3B%0A%09%09%7D%0A%09%09this.grabFinish%28%29%3B%0A%09%09this.mStatus%20%3D%200%3B%0A%09%7D%2C%0A%09mouseup%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28event.button%20%3D%3D%3D%20btnPref%28%22MouseButton%22%29%20%26%26%20this.mStatus%20%3E%201%29%20%7B%0A%09%09%09event.preventDefault%28%29%3B%0A%09%09%09event.stopPropagation%28%29%3B%0A%09%09%09this.grabFinish%28%29%3B%0A%09%09%09if%20%28this.mStatus%20%3D%3D%3D%202%29%0A%09%09%09%09this.mStatus%20%3D%203%3B%0A%09%09%09if%20%28btnPref%28%22InertiaEnabled%22%29%20%26%26%0A%09%09%09%09%28Math.abs%28this.cSpeedX%29%20%3E%20btnPref%28%22InertiaThreshold%22%29%20%7C%7C%20Math.abs%28this.cSpeedY%29%20%3E%20btnPref%28%22InertiaThreshold%22%29%29%29%20%7B%0A%09%09%09%09if%20%28this.cScroll%29%0A%09%09%09%09%09clearTimeout%28this.cScroll%29%3B%0A%09%09%09%09var%20v%20%3D%20btnPref%28%22InertiaRate%22%29%3B%0A%09%09%09%09if%20%28this.cSpeedX%20%3E%200%29%0A%09%09%09%09%09this.cSpeedX%20%3D%20Math.min%28this.cSpeedX%2C%20v%29%3B%0A%09%09%09%09else%0A%09%09%09%09%09this.cSpeedX%20%3D%20Math.max%28this.cSpeedX%2C%20-v%29%3B%0A%09%09%09%09if%20%28this.cSpeedY%20%3E%200%29%0A%09%09%09%09%09this.cSpeedY%20%3D%20Math.min%28this.cSpeedY%2C%20v%29%3B%0A%09%09%09%09else%0A%09%09%09%09%09this.cSpeedY%20%3D%20Math.max%28this.cSpeedY%2C%20-v%29%3B%0A%09%09%09%09this.scroll2%28event%29%3B%0A%09%09%09%09scrolling%28event%2C%20this%29%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20if%20%28event.button%20%3D%3D%3D%20btnPref%28%22MouseButton%22%29%20%26%26%20this.mStatus%20%3D%3D%3D%201%29%20%7B%0A%09%09%09this.grabFinish%28%29%3B%0A%09%09%09this.mStatus%20%3D%200%3B%0A%09%09%7D%0A%09%7D%2C%0A%09scroll2%20%3A%20function%20%28event%29%20%7B%0A%09%09var%20ay%20%3D%20Math.abs%28this.cSpeedY%29%3B%0A%09%09var%20ax%20%3D%20Math.abs%28this.cSpeedX%29%3B%0A%09%09if%20%28ay%20%3C%201%20%26%26%20ax%20%3C%201%29%20%7B%0A%09%09%09clearTimeout%28this.cScroll%29%3B%0A%09%09%09return%3B%0A%09%09%7D%0A%09%09this.scroll%28event%29%3B%0A%09%09if%20%28ax%20%3E%3D%20100%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%20100%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%2020%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%2010%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%205%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%201%29%0A%09%09%09this.cSpeedX%20%3D%200%3B%0A%09%09if%20%28ay%20%3E%3D%20100%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%20100%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%2020%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%2010%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%205%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%201%29%0A%09%09%09this.cSpeedY%20%3D%200%3B%0A%09%7D%2C%0A%09scroll%20%3A%20function%20%28event%29%20%7B%0A%09%09this._mtimer%20%3D%20true%3B%0A%09%09if%20%28this.NS%20%26%26%20this.NS%20%3D%3D%3D%20this.EW%29%20%7B%0A%09%09%09if%20%28%22scrollBy%22%20in%20this.NS%29%20%7B%0A%09%09%09%09this.NS.scrollBy%28this.cSpeedX%2C%20this.cSpeedY%29%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09this.NS.scrollLeft%20+%3D%20this.cSpeedX%3B%0A%09%09%09%09this.NS.scrollTop%20+%3D%20this.cSpeedY%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20%7B%0A%09%09%09if%20%28this.NS%29%20%7B%0A%09%09%09%09if%20%28%22scrollBy%22%20in%20this.NS%29%20%7B%0A%09%09%09%09%09this.NS.scrollBy%280%2C%20this.cSpeedY%29%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09this.NS.scrollTop%20+%3D%20this.cSpeedY%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09if%20%28this.EW%29%20%7B%0A%09%09%09%09if%20%28%22scrollBy%22%20in%20this.EW%29%20%7B%0A%09%09%09%09%09this.EW.scrollBy%28this.cSpeedX%2C%200%29%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09this.EW.scrollLeft%20+%3D%20this.cSpeedX%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09setTimeout%28function%20%28self%29%20%7B%0A%09%09%09self._mtimer%20%3D%20false%3B%0A%09%09%7D%2C%2020%2C%20this%29%3B%0A%09%7D%2C%0A%09isText%20%3A%20function%20%28event%29%20%7B%0A%09%09return%20event.explicitOriginalTarget.nodeType%20%3D%3D%3D%20document.TEXT_NODE%3B%0A%09%7D%2C%0A%09isImage%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28event.target%20instanceof%20Ci.nsIImageLoadingContent%29%0A%09%09%09return%20event.target%3B%0A%09%09else%0A%09%09%09return%20null%3B%0A%09%7D%2C%0A%09isIgnore%20%3A%20function%20%28aNode%29%20%7B%0A%09%09while%20%28aNode%29%20%7B%0A%09%09%09var%20name%20%3D%20aNode.nodeName.toLowerCase%28%29%3B%0A%09%09%09if%20%28name%20%3D%3D%3D%20%22html%22%29%0A%09%09%09%09return%20false%3B%0A%09%09%09if%20%28/%28scrollbar%7Cselect%7Coption%7Cembed%7Cobject%7Ctree%7Capplet%7Cstatusbar%29/.test%28name%29%29%0A%09%09%09%09return%20true%3B%0A%09%09%09aNode%20%3D%20aNode.parentNode%3B%0A%09%09%7D%0A%09%09return%20false%3B%0A%09%7D%2C%0A%09isParentClickableNode%20%3A%20function%20%28aNode%29%20%7B%0A%09%09if%20%28%21aNode%29%0A%09%09%09return%20null%3B%0A%09%09var%20d%20%3D%20aNode.ownerDocument%3B%0A%09%09try%20%7B%0A%09%09%09var%20xpathResult%20%3D%20d.evaluate%28%0A%09%09%09%09%09/*%27ancestor-or-self%3A%3A*%5B%28%28local-name%28%29%20%3D%20%22a%22%20or%20local-name%28%29%20%3D%20%22A%22%29%20and%20@href%29%20or%20local-name%28%29%20%3D%20%22button%22%20or%20local-name%28%29%20%3D%20%22BUTTON%22%20or%20%28%28local-name%28%29%20%3D%20%22input%22%20or%20local-name%28%29%20%3D%20%22INPUT%22%29%20and%20%28@type%20%3D%20%22SUBMIT%22%20or%20@type%20%3D%20%22submit%22%20or%20@type%20%3D%20%22BUTTON%22%20or%20@type%20%3D%20%22button%22%20or%20@type%20%3D%20%22IMAGE%22%20or%20@type%20%3D%20%22image%22%29%29%5D%27%2C*/%0A%09%09%09%09%09%27ancestor-or-self%3A%3A*%5B%28%28local-name%28%29%20%3D%20%22a%22%20or%20local-name%28%29%20%3D%20%22A%22%29%29%20or%20local-name%28%29%20%3D%20%22button%22%20or%20local-name%28%29%20%3D%20%22BUTTON%22%20or%20%28%28local-name%28%29%20%3D%20%22input%22%20or%20local-name%28%29%20%3D%20%22INPUT%22%29%20and%20%28@type%20%3D%20%22SUBMIT%22%20or%20@type%20%3D%20%22submit%22%20or%20@type%20%3D%20%22BUTTON%22%20or%20@type%20%3D%20%22button%22%20or%20@type%20%3D%20%22IMAGE%22%20or%20@type%20%3D%20%22image%22%29%29%5D%27%2C%0A%09%09%09%09%09aNode%2C%0A%09%09%09%09%09this.NSResolver%2C%0A%09%09%09%09%09XPathResult.FIRST_ORDERED_NODE_TYPE%2C%0A%09%09%09%09%09null%29%3B%0A%09%09%7D%20catch%20%28e%29%20%7B%0A%09%09%09return%20null%3B%0A%09%09%7D%0A%09%09return%20xpathResult.singleNodeValue%3B%0A%09%7D%2C%0A%09NSResolver%20%3A%20%7B%0A%09%09lookupNamespaceURI%20%3A%20function%20%28aPrefix%29%20%7B%0A%09%09%09switch%20%28aPrefix%29%20%7B%0A%09%09%09case%20%27xul%27%3A%0A%09%09%09%09return%20%27http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%27%3B%0A%09%09%09case%20%27html%27%3A%0A%09%09%09case%20%27xhtml%27%3A%0A%09%09%09%09return%20%27http%3A//www.w3.org/1999/xhtml%27%3B%0A%09%09%09case%20%27xlink%27%3A%0A%09%09%09%09return%20%27http%3A//www.w3.org/1999/xlink%27%3B%0A%09%09%09default%3A%0A%09%09%09%09return%20%27%27%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%2C%0A%09isParentEditableNode%20%3A%20function%20%28node%29%20%7B%0A%09%09try%20%7B%0A%09%09%09if%20%28node.ownerDocument.designMode%20%3D%3D%3D%20%27on%27%29%0A%09%09%09%09return%20node%3B%0A%09%09%7D%20catch%20%28e%29%20%7B%7D%0A%0A%09%09while%20%28node%20%26%26%20node.parentNode%29%20%7B%0A%09%09%09try%20%7B%0A%09%09%09%09if%20%28%21%28node%20instanceof%20Ci.nsIDOMNSEditableElement%29%29%0A%09%09%09%09%09throw%200%3B%0A%09%09%09%09node.QueryInterface%28Ci.nsIDOMNSEditableElement%29%3B%0A%09%09%09%09return%20node%3B%0A%09%09%09%7D%20catch%20%28e%29%20%7B%7D%0A%09%09%09node%20%3D%20node.parentNode%3B%0A%09%09%7D%0A%09%09return%20null%3B%0A%09%7D%2C%0A%09isParentDraggableNode%20%3A%20function%20%28node%29%20%7B%0A%09%09while%20%28node%20%26%26%20node.parentNode%29%20%7B%0A%09%09%09if%20%28node.getAttribute%28%27draggable%27%29%20%3D%3D%3D%20%27true%27%29%0A%09%09%09%09return%20node%3B%0A%09%09%09node%20%3D%20node.parentNode%3B%0A%09%09%7D%0A%09%09return%20null%3B%0A%09%7D%2C%0A%09isVideoControl%20%3A%20function%20%28node%29%20%7B%0A%09%09if%20%28/%5E%28audio%7Cvideo%29%24/i.test%28node.localName%29%29%20%7B%0A%09%09%09return%20true%3B%0A%09%09%09var%20i%20%3D%200%3B%0A%09%09%09while%20%28i%20%3C%20node.childNodes.length%29%20%7B%0A%09%09%09%09var%20child%20%3D%20node.childNodes%5Bi%5D%3B%0A%09%09%09%09if%20%28child.hasAttribute%28%27controls%27%29%20%26%26%20child.getAttribute%28%27controls%27%29%20%3D%3D%3D%20%27controls%27%29%20%7B%0A%09%09%09%09%09return%20true%3B%0A%09%09%09%09%7D%0A%09%09%09%09i++%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09return%20false%3B%0A%09%7D%2C%0A%09button%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Mouse%20button%20%28L%20M%20R%29%3A%20%22%2C%20%22LMR%22.substr%28btnPref%28%22MouseButton%22%29%2C%201%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09switch%20%28value.toUpperCase%28%29%29%20%7B%0A%09%09case%20%22M%22%3A%0A%09%09%09value%20%3D%201%3B%0A%09%09%09break%3B%0A%09%09case%20%22R%22%3A%0A%09%09%09value%20%3D%202%3B%0A%09%09%09break%3B%0A%09%09default%3A%0A%09%09case%20%22L%22%3A%0A%09%09%09value%20%3D%200%3B%0A%09%09%09break%3B%0A%09%09%7D%0A%09%09sIP%28%22MouseButton%22%2C%20value%29%3B%0A%09%7D%2C%0A%09threshold%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Stop%20GrabScroll%20if%20mouse%20button%20is%20pressed%20longer%20than%20this%20time%20%28In%20milliseconds%29.%22%2C%20btnPref%28%22Timer%22%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09let%20timer%20%3D%20parseInt%28value%2C%2010%29%3B%0A%09%09if%20%28timer%20%3C%3D%200%20%7C%7C%20%21timer%29%0A%09%09%09timer%20%3D%201000%3B%0A%09%09sIP%28%22Timer%22%2C%20timer%29%3B%0A%09%7D%2C%0A%09moverate%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Drag%20direction%20and%20speed%3A%5Cn%20Negative%20or%20positive%20values.%22%2C%20btnPref%28%22MoveRate%22%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09let%20moveRate%20%3D%20parseInt%28value%2C%2010%29%3B%0A%09%09if%20%28%21moveRate%29%0A%09%09%09moveRate%20%3D%20-1%3B%0A%09%09sIP%28%22MoveRate%22%2C%20moveRate%29%3B%0A%09%7D%2C%0A%09inertiaToggle%20%3A%20function%20%28%29%20%7B%0A%09%09let%20inertia%20%3D%20%21btnPref%28%22InertiaEnabled%22%29%3B%0A%09%09sBP%28%22InertiaEnabled%22%2C%20inertia%29%3B%0A%09%7D%2C%0A%09inertiaThreshold%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Kinetic%20scroll%20threshold%3A%20%22%2C%20btnPref%28%22InertiaThreshold%22%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09let%20inertiaThreshold%20%3D%20parseInt%28value%2C%2010%29%3B%0A%09%09if%20%28%21inertiaThreshold%29%0A%09%09%09inertiaThreshold%20%3D%2020%3B%0A%09%09sIP%28%22InertiaThreshold%22%2C%20inertiaThreshold%29%3B%0A%09%7D%2C%0A%09inertiarate%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Kinetic%20scroll%20speed%3A%20%22%2C%20btnPref%28%22InertiaRate%22%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09let%20inertiaRate%20%3D%20parseInt%28value%2C%2010%29%3B%0A%09%09if%20%28%21inertiaRate%29%0A%09%09%09inertiaRate%20%3D%2050%3B%0A%09%09sIP%28%22InertiaRate%22%2C%20inertiaRate%29%3B%0A%09%7D%2C%0A%09clickable%20%3A%20function%20%28%29%20%7B%0A%09%09let%20notClicableLink%20%3D%20%21btnPref%28%22NotClicableLink%22%29%3B%0A%09%09sBP%28%22NotClicableLink%22%2C%20notClicableLink%29%3B%0A%09%7D%2C%0A%09getScrollView%20%3A%20function%20%28event%29%20%7B%0A%09%09var%20NS%2C%0A%09%09EW%2C%0A%09%09NSEW%3B%0A%09%09NS%20%3D%20EW%20%3D%20NSEW%20%3D%20null%3B%0A%09%09var%20_scrollingView%20%3D%20null%3B%0A%09%09var%20overflowx%2C%0A%09%09overflowy%2C%0A%09%09ox%2C%0A%09%09oy%3B%0A%09%09var%20scw%2C%0A%09%09sch%2C%0A%09%09horz%2C%0A%09%09vert%3B%0A%09%09var%20doc%2C%0A%09%09style%3B%0A%09%09var%20borderTop%3B%0A%09%09var%20borderBottom%3B%0A%09%09var%20borderLeft%3B%0A%09%09var%20borderRight%3B%0A%09%09if%20%28event.originalTarget.ownerDocument.contentType%20%3D%3D%3D%20%22application/xml%22%29%20%7B%0A%09%09%09_scrollingView%20%3D%20event.originalTarget.ownerDocument.defaultView%3B%0A%09%09%09if%20%28_scrollingView.scrollMaxX%20%3E%200%29%20%7B%0A%09%09%09%09if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%09%09%09%09%09NSEW%20%3D%20_scrollingView%3B%0A%09%09%09%09%09NS%20%3D%20_scrollingView%3B%0A%09%09%09%09%7D%0A%09%09%09%09EW%20%3D%20_scrollingView%3B%0A%09%09%09%7D%20else%20if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%09%09%09%09NS%20%3D%20_scrollingView%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20%7B%0A%09%09%09for%20%28_scrollingView%20%3D%20event.originalTarget%3B%20_scrollingView%3B%20_scrollingView%20%3D%20_scrollingView.parentNode%29%20%7B%0A%09%09%09%09if%20%28_scrollingView%20instanceof%20HTMLElement%29%20%7B%0A%09%09%09%09%09if%20%28_scrollingView.localName.toUpperCase%28%29%20%3D%3D%3D%20%22HTML%22%20%7C%7C%0A%09%09%09%09%09%09_scrollingView.localName.toUpperCase%28%29%20%3D%3D%3D%20%22BODY%22%29%20%7B%0A%09%09%09%09%09%09_scrollingView%20%3D%20_scrollingView.ownerDocument.defaultView%3B%0A%09%09%09%09%09%09if%20%28_scrollingView.scrollMaxX%20%3E%200%20%26%26%0A%09%09%09%09%09%09%09_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%09%09%09%09%09%09%09NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%09%09%09%09%09%09%09EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%09%09%09%09%09%09%09NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09if%20%28_scrollingView.scrollMaxX%20%3E%200%29%20%7B%0A%09%09%09%09%09%09%09EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%09%09%09%09%09%09%09NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09if%20%28_scrollingView.frameElement%20%26%26%20%21NS%20%26%26%20%21EW%20%26%26%20%21NSEW%29%20%7B%0A%09%09%09%09%09%09%09return%20this.getScrollView%28%7B%0A%09%09%09%09%09%09%09%09originalTarget%20%3A%20_scrollingView.frameElement%0A%09%09%09%09%09%09%09%7D%29%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09if%20%28_scrollingView.localName.toLowerCase%28%29%20%3D%3D%3D%20%22select%22%29%20%7B%0A%09%09%09%09%09%09_scrollingView.parentNode.focus%28%29%3B%0A%09%09%09%09%09%09return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09overflowx%20%3D%20%22%22%3B%0A%09%09%09%09%09overflowy%20%3D%20%22%22%3B%0A%09%09%09%09%09ox%20%3D%20true%3B%0A%09%09%09%09%09oy%20%3D%20true%3B%0A%09%09%09%09%09try%20%7B%0A%09%09%09%09%09%09doc%20%3D%20_scrollingView.ownerDocument%3B%0A%09%09%09%09%09%09style%20%3D%20doc.defaultView.getComputedStyle%28_scrollingView%2C%20%22%22%29%3B%0A%09%09%09%09%09%09overflowx%20%3D%20style.getPropertyValue%28%22overflow-x%22%29%3B%0A%09%09%09%09%09%09ox%20%3D%20overflowx%20%21%3D%3D%20%22hidden%22%20%26%26%20overflowx%20%21%3D%3D%20%22visible%22%3B%0A%09%09%09%09%09%09overflowy%20%3D%20style.getPropertyValue%28%22overflow-y%22%29%3B%0A%09%09%09%09%09%09oy%20%3D%20overflowy%20%21%3D%3D%20%22hidden%22%20%26%26%20overflowy%20%21%3D%3D%20%22visible%22%3B%0A%09%09%09%09%09%7D%20catch%20%28ex%29%20%7B%7D%0A%09%09%09%09%09borderTop%20%3D%200%3B%0A%09%09%09%09%09borderBottom%20%3D%200%3B%0A%09%09%09%09%09borderLeft%20%3D%200%3B%0A%09%09%09%09%09borderRight%20%3D%200%3B%0A%09%09%09%09%09if%20%28/%5E%28table%7Ctd%7Cth%29%24/i.test%28_scrollingView.localName%29%29%20%7B%0A%09%09%09%09%09%09try%20%7B%0A%09%09%09%09%09%09%09doc%20%3D%20_scrollingView.ownerDocument%3B%0A%09%09%09%09%09%09%09style%20%3D%20doc.defaultView.getComputedStyle%28_scrollingView%2C%20%22%22%29%3B%0A%09%09%09%09%09%09%09borderTop%20%3D%20style.getPropertyValue%28%22border-top-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%09%09%09%09%09%09%09borderBottom%20%3D%20style.getPropertyValue%28%22border-bottom-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%09%09%09%09%09%09%09borderLeft%20%3D%20style.getPropertyValue%28%22border-left-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%09%09%09%09%09%09%09borderRight%20%3D%20style.getPropertyValue%28%22border-right-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%09%09%09%09%09%09%7D%20catch%20%28ex%29%20%7B%7D%0A%09%09%09%09%09%7D%0A%09%09%09%09%09scw%20%3D%20_scrollingView.clientWidth%3B%0A%09%09%09%09%09horz%20%3D%20ox%20%26%26%20scw%20%21%3D%3D%200%20%26%26%0A%09%09%09%09%09%09scw%20+%20borderLeft%20+%20borderRight%20%3C%20_scrollingView.scrollWidth%3B%0A%09%09%09%09%09sch%20%3D%20_scrollingView.clientHeight%3B%0A%09%09%09%09%09vert%20%3D%20oy%20%26%26%20sch%20%21%3D%3D%200%20%26%26%0A%09%09%09%09%09%09sch%20+%20borderTop%20+%20borderBottom%20%3C%20_scrollingView.scrollHeight%3B%0A%09%09%09%09%09if%20%28horz%20%26%26%20vert%29%20%7B%0A%09%09%09%09%09%09NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%09%09%09%09%09%09EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%09%09%09%09%09%09NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09if%20%28horz%29%20%7B%0A%09%09%09%09%09%09EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09if%20%28vert%29%20%7B%0A%09%09%09%09%09%09NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%20//%20for%0A%09%09%7D%0A%09%09return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%09%7D%0A%7D%3B%0A%0Afunction%20scrolling%28aEvt%2C%20aSelf%29%20%7B%0A%09let%20Start%20%3D%20new%20Date%28%29.getTime%28%29%3B%0A%09aSelf.scroll2%28aEvt%29%3B%0A%09aSelf.cScroll%20%3D%20setTimeout%28arguments.callee%2C%0A%09%09%09Math.max%2825%20-%20%28%28new%20Date%28%29%29.getTime%28%29%20-%20Start%29%2C%200%29%2C%20aEvt%2C%20aSelf%29%3B%0A%7D%0A%0Aif%20%28btnPref%28%22GrabScrollEnabled%22%29%29%0A%09GrabScroll.initGrabScroll%28%29%3B%0Athis.onDestroy%20%3D%20function%20%28aReason%29%20%7B%0A%09%28aReason%20%3D%3D%3D%20%22update%22%20%7C%7C%20aReason%20%3D%3D%3D%20%22delete%22%29%20%26%26%20GrabScroll.uninitGrabScroll%28%29%3B%0A%7D%3B%0A%0Afunction%20sBP%28aKey%2C%20aVal%2C%20aBranch%29%20%7B%20//Set%20Boolean%20Pref%0A%09Services.prefs.setBoolPref%28%28%21aBranch%29%20%3F%20PREF_BRANCH%20+%20aKey%20%3A%20aKey%2C%20aVal%29%3B%0A%7D%0A%0Afunction%20sIP%28aKey%2C%20aVal%2C%20aBranch%29%20%7B%20//Set%20Integer%20Pref%0A%09Services.prefs.setIntPref%28%28%21aBranch%29%20%3F%20PREF_BRANCH%20+%20aKey%20%3A%20aKey%2C%20aVal%29%3B%0A%7D%0A%0Afunction%20gBP%28aKey%2C%20aBranch%29%20%7B%20//Get%20Boolean%20Pref%0A%09return%20Services.prefs.getBoolPref%28%28%21aBranch%29%20%3F%20PREF_BRANCH%20+%20aKey%20%3A%20aKey%29%3B%0A%7D%0A%0Athis.toggleGrabScroll%20%3D%20function%20%28%29%20%7B%0A%09let%20state%20%3D%20btnPref%28%22GrabScrollEnabled%22%29%3B%0A%09sBP%28%22GrabScrollEnabled%22%2C%20%21state%29%3B%0A%09notifyme%28null%2C%20%22GrabScroll%20%22%20+%20%28btnPref%28%22GrabScrollEnabled%22%29%20%3F%20%22ENABLED%22%20%3A%20%22DISABLED%22%29%2C%20%22%22%29%3B%0A%09self.init%28%29%3B%0A%7D%3B%0A%0Afunction%20%24XML%28aXML%29%20%7B%20//%20Return%20parsed%20XML%0A%09aXML%20%3D%20aXML.replace%28/%3E%5Cs+%3C/g%2C%20%22%3E%3C%22%29%3B%20//%20Linearize%20XML%0A%09return%20%28new%20DOMParser%29.parseFromString%28aXML%2C%20%22application/xml%22%29.documentElement%3B%0A%7D%0A%0Afunction%20notifyme%28aImg%2C%20aTitle%2C%20aMsg%29%20%7B%20//%20Notification%20function%0A%09let%20notFeature%20%3D%20gBP%28%22notification.feature.enabled%22%2C%20true%29%3B%0A%09try%20%7B%0A%09%09let%20ASrv%20%3D%20Cc%5B%27@mozilla.org/alerts-service%3B1%27%5D.getService%28Ci.nsIAlertsService%29%3B%0A%09%09if%20%28%21notFeature%29%20%7B%0A%09%09%09sBP%28%22notification.feature.enabled%22%2C%20true%2C%20true%29%3B%0A%09%09%09setTimeout%28function%20%28%29%20%7B%0A%09%09%09%09ASrv.showAlertNotification%28aImg%2C%20aTitle%2C%20aMsg%2C%20false%2C%20%22%22%2C%20null%29%3B%0A%09%09%09%09sBP%28%22notification.feature.enabled%22%2C%20false%2C%20true%29%3B%0A%09%09%09%7D%2C%20100%29%3B%0A%09%09%7D%20else%0A%09%09%09ASrv.showAlertNotification%28aImg%2C%20aTitle%2C%20aMsg%2C%20false%2C%20%22%22%2C%20null%29%3B%0A%09%7D%20catch%20%28aEr%29%20%7B%0A%09%09let%20win%20%3D%20Components.classes%5B%27@mozilla.org/embedcomp/window-watcher%3B1%27%5D.%0A%09%09%09getService%28Components.interfaces.nsIWindowWatcher%29.%0A%09%09%09openWindow%28null%2C%20%27chrome%3A//global/content/alerts/alert.xul%27%2C%0A%09%09%09%09%27_blank%27%2C%20%27chrome%2Ctitlebar%3Dno%2Cpopup%3Dyes%27%2C%20null%29%3B%0A%09%09win.arguments%20%3D%20%5BaImg%2C%20aTitle%2C%20aMsg%2C%20false%2C%20%27%27%5D%3B%0A%09%7D%0A%7D%0A%0Athis.onclick%20%3D%20function%20%28aEvt%29%20%7B%0A%09if%20%28aEvt.button%20%3D%3D%3D%201%20%26%26%20%21aEvt.shiftKey%20%26%26%20%21aEvt.ctrlKey%20%26%26%20%21aEvt.altKey%29%20%7B%0A%09%09self.appendChild%28%24XML%28%0A%09%09%09%09%22%3Cmenupopup%20xmlns%3D%5C%22%22%20+%20xulns%20+%20%22%5C%22%20id%3D%5C%22%22%20+%20_UID%20+%20%22-mpop%5C%22%22%20+%0A%09%09%09%09%22%20onpopuphiding%3D%5C%22this.parentNode.init%28%29%3B%5C%22%3E%22%20+%0A%09%09%09%09%22%3Cmenuitem%20label%3D%5C%22Button%20to%20start%20the%20GrabScroll%5C%22%22%20+%0A%09%09%09%09%22%20oncommand%3D%5C%22this.parentNode.parentNode.cmds%28%27button%27%29%3Bevent.stopPropagation%28%29%3B%5C%22%22%20+%0A%09%09%09%09%22%20tooltiptext%3D%5C%22Choose%20the%20mouse%20button%20with%20which%20to%20start%20the%20GrabScroll.%5C%22/%3E%22%20+%0A%09%09%09%09%22%3Cmenuseparator/%3E%22%20+%0A%09%09%09%09%22%3Cmenuitem%20label%3D%5C%22GrabScroll%20start%20threshold%5C%22%22%20+%0A%09%09%09%09%22%20oncommand%3D%5C%22this.parentNode.parentNode.cmds%28%27threshold%27%29%3Bevent.stopPropagation%28%29%3B%5C%22%22%20+%0A%09%09%09%09%22%20tooltiptext%3D%5C%22Time%20in%20milliseconds%20after%20which%20the%20GrabScroll%20is%20canceled%20if%20the%20cursor%20is%20not%20moved.%5C%22/%3E%22%20+%0A%09%09%09%09%22%3Cmenuitem%20label%3D%5C%22GrabScroll%20speed%20%26amp%3B%20direction%5C%22%22%20+%0A%09%09%09%09%22%20oncommand%3D%5C%22this.parentNode.parentNode.cmds%28%27moverate%27%29%3Bevent.stopPropagation%28%29%3B%5C%22%22%20+%0A%09%09%09%09%22%20tooltiptext%3D%5C%22Drag%20direction%20and%20speed.%20With%20a%20negative%20value%2C%20the%20page%20content%20moves%20in%20the%20same%20direction%20as%20the%20cursor.%5C%22/%3E%22%20+%0A%09%09%09%09%22%3Cmenuseparator/%3E%22%20+%0A%09%09%09%09%22%3Cmenuitem%20label%3D%5C%22Scroll%20inertia%5C%22%22%20+%0A%09%09%09%09%22%20oncommand%3D%5C%22this.parentNode.parentNode.cmds%28%27inertiaToggle%27%29%3Bevent.stopPropagation%28%29%3B%5C%22%22%20+%0A%09%09%09%09%22%20checked%3D%5C%22%22%20+%20btnPref%28%22InertiaEnabled%22%29%20+%20%22%5C%22%22%20+%0A%09%09%09%09%22%20type%3D%5C%22checkbox%5C%22%20/%3E%22%20+%0A%09%09%09%09%22%3Cmenuitem%20label%3D%5C%22Scroll%20inertia%20threshold%5C%22%22%20+%0A%09%09%09%09%22%20oncommand%3D%5C%22this.parentNode.parentNode.cmds%28%27inertiaThreshold%27%29%3Bevent.stopPropagation%28%29%3B%5C%22/%3E%22%20+%0A%09%09%09%09%22%3Cmenuitem%20label%3D%5C%22Scroll%20inertia%20speed%5C%22%22%20+%0A%09%09%09%09%22%20oncommand%3D%5C%22this.parentNode.parentNode.cmds%28%27inertiarate%27%29%3Bevent.stopPropagation%28%29%3B%5C%22/%3E%22%20+%0A%09%09%09%09%22%3Cmenuseparator/%3E%22%20+%0A%09%09%09%09%22%3Cmenuitem%20label%3D%5C%22Cancel%20GrabScroll%20on%20images%5C%22%22%20+%0A%09%09%09%09%22%20oncommand%3D%5C%22this.parentNode.parentNode.cmds%28%27NotImage%27%29%3Bevent.stopPropagation%28%29%3B%5C%22%22%20+%0A%09%09%09%09%22%20tooltiptext%3D%5C%22Do%20not%20start%20GrabScroll%20if%20cursor%20is%20over%20an%20image.%5C%22%22%20+%0A%09%09%09%09%22%20checked%3D%5C%22%22%20+%20btnPref%28%22NotImage%22%29%20+%20%22%5C%22%22%20+%0A%09%09%09%09%22%20type%3D%5C%22checkbox%5C%22%20/%3E%22%20+%0A%09%09%09%09%22%3Cmenuitem%20label%3D%5C%22Cancel%20GrabScroll%20on%20links%5C%22%22%20+%0A%09%09%09%09%22%20oncommand%3D%5C%22this.parentNode.parentNode.cmds%28%27clickable%27%29%3Bevent.stopPropagation%28%29%3B%5C%22%22%20+%0A%09%09%09%09%22%20tooltiptext%3D%5C%22Do%20not%20start%20GrabScroll%20if%20cursor%20is%20over%20a%20clickable%20link.%5C%22%22%20+%0A%09%09%09%09%22%20checked%3D%5C%22%22%20+%20btnPref%28%22NotClicableLink%22%29%20+%20%22%5C%22%22%20+%0A%09%09%09%09%22%20type%3D%5C%22checkbox%5C%22%20/%3E%22%20+%0A%09%09%09%09%22%3C/menupopup%3E%22%29%29%3B%0A%09%09document.getElementById%28_UID%20+%20%22-mpop%22%29.openPopup%28self%2C%20%22after_start%22%2C%20null%2C%20null%2C%20false%2C%20null%2C%20null%29%3B%0A%09%7D%0A%7D%3B%0A%0Athis.cmds%20%3D%20function%20%28aCmd%29%20%7B%0A%09switch%20%28aCmd%29%20%7B%0A%09case%20%22button%22%3A%0A%09%09GrabScroll.button%28%29%3B%0A%09%09break%3B%0A%09case%20%22threshold%22%3A%0A%09%09GrabScroll.threshold%28%29%3B%0A%09%09break%3B%0A%09case%20%22moverate%22%3A%0A%09%09GrabScroll.moverate%28%29%3B%0A%09%09break%3B%0A%09case%20%22inertiaToggle%22%3A%0A%09%09GrabScroll.inertiaToggle%28%29%3B%0A%09%09break%3B%0A%09case%20%22inertiaThreshold%22%3A%0A%09%09GrabScroll.inertiaThreshold%28%29%3B%0A%09%09break%3B%0A%09case%20%22inertiarate%22%3A%0A%09%09GrabScroll.inertiarate%28%29%3B%0A%09%09break%3B%0A%09case%20%22clickable%22%3A%0A%09%09GrabScroll.clickable%28%29%3B%0A%09%09break%3B%0A%09case%20%22NotImage%22%3A%0A%09%09sBP%28%22NotImage%22%2C%20%21btnPref%28%22NotImage%22%29%29%3B%0A%09%09break%3B%0A%09%7D%0A%7D%3B%0A%0Athis.style.opacity%20%3D%20btnPref%28%22GrabScrollEnabled%22%29%20%3F%20%221%22%20%3A%20%22.50%22%3B%0A%0Athis.tooltipText%20%3D%20%22%5Cn%5Ct%22%20+%20%28self.label%20%7C%7C%20self.name%29%20+%20%22%5Cn%5Cn%22%20+%0A%09%22%5CtL%3D%20Enable/Disable%20GrabScroll%5Ct%5Cn%22%20+%0A%09%22%5CtM%3D%20Open%20Options%20menu%5Ct%5Cn%5Cn%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.toggleGrabScroll%28%29%3B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Mishania
Поправил:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGrabScroll%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAACUklEQVQ4jaWUzUsbQRjGn8nHhE1J0ICuEbOY2s0HBETxHoJHlVw8+Be4YtCTh5CLNESSowFzkMXiCtVeIpqWEA8t9FoW91a855TkD8jx6WUVSWtQOvCc5sdveGfed4Axi6Tn9vb2Q7PZfE/SM44dK2k0GrFIJFKPRCL1RqMRe7OMpHAcZ0LX9T0hxL0Q4l7X9T3HcSZIireI/NlsdkNK2QFgA7CllJ1sNrtB0v9aiUJynuQqSWMkq+6eMrYckn6S80KInwAeADwoivJLCPFbSnkvpXR8Pt8PV+b/q0ySHsdxJnK53BrJBIDvAO4A3MVisU9er7c9PT39eXJy8ksgEGiTTORyuTX3zjxPEtM051KplCGlvHZFX5eXl89qtdrHcrlcrVar5UqlcrS0tHQO4BvJhJTyOpVKGaZpzpH0oNVqxVVVPRJCdADcuKJmJpM5IKmSfOdGzWQyBwCaLnMjhOioqlpptVpx2La9kM/na4qiXAC4cqGrZDK5TzL0rPxQMpncf84oinKRz+drtm0vgKSv1+stFovFHU3T6i5kpdPpXZJTJENuptLp9C4Ai2RC07R6sVjc6fV6iyR9j6f5hsOhZlnWpisyw+HwcTweLz9POBw+BmCSTFiWtTkcDrUnycjzh1zRCYBTAOcjOQVwQjLhsi93OcnZfzTiaGZfFIzI/IVCYT0ajV4CaANoR6PRy0KhsP7qEXkss9/vz5RKpa1gMHgYDAYPS6XSVr/fn3nT0LoyT7fb1Q3D2DYMY7vb7er/8yd5B4PBymAwWCHpHcf+AbaLjoOEBHabAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/**%0A%20*%20%20Button%20based%20on%20a%20script%20created%20for%20userChrome.js%20extension.%20http%3A//userchromejs.mozdev.org/%0A%20*%20%20Author%3A%20Alice0775%20https%3A//github.com/alice0775%0A%20*%20%20Source%3A%20https%3A//github.com/alice0775/userChrome.js/blob/master/GrabScroll_Fx29.uc.xul%0A%20*/%0Avar%20_UID%20%3D%20%22grab_scroll%22%20+%20%28self.id%29.split%28%22custombuttons%22%29%5B1%5D%3B%0A%0Avar%20_LTN%20%3D%20%22listeners_%22%20+%20_UID%3B%0A%0Avar%20PREF_BRANCH%20%3D%20%22extensions.custombuttons.GrabScroll.Id%22%20+%20%28self.id%29.split%28%22-button%22%29%5B1%5D%20+%20%22.%22%3B%0A%0Aif%20%28%21%28%22Services%22%20in%20window%29%29%0A%09Cu.import%28%22resource%3A//gre/modules/Services.jsm%22%29%3B%0A%0A//START//%20Default%20preferences%20management%0AbtnPref.root%20%3D%20PREF_BRANCH%3B%0A%0AbtnPref.defaults%20%3D%20%7B%0A%09%22GrabScrollEnabled%22%20%3A%20true%2C%0A%09%22MouseButton%22%20%3A%200%2C%0A%09%22MoveRate%22%20%3A%20-1%2C%0A%09%22Timer%22%20%3A%20500%2C%0A%09%22InertiaEnabled%22%20%3A%20false%2C%0A%09%22InertiaThreshold%22%20%3A%2020%2C%0A%09%22InertiaRate%22%20%3A%2050%2C%0A%09%22NotClicableLink%22%20%3A%20true%2C%0A%09%22NotImage%22%20%3A%20false%2C%0A%09%22Tolerance%22%20%3A%203%2C%0A%09%22ToleranceWhenNoHScroll%22%20%3A%205%0A%7D%3B%0A%0Avar%20branch%20%3D%20Services.prefs.getDefaultBranch%28btnPref.root%29%3B%0Afor%20%28var%5Bkey%2C%20val%5Din%20Iterator%28btnPref.defaults%29%29%20%7B%0A%09switch%20%28typeof%20val%29%20%7B%0A%09%09case%20%22boolean%22%3A%0A%09%09%09branch.setBoolPref%28key%2C%20val%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22number%22%3A%0A%09%09%09branch.setIntPref%28key%2C%20val%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22string%22%3A%20%7B%0A%09%09%09var%20str%20%3D%20Cc%5B%22@mozilla.org/supports-string%3B1%22%5D%0A%09%09%09.createInstance%28Ci.nsISupportsString%29%3B%0A%09%09%09str.data%20%3D%20val%3B%0A%09%09%09branch.setComplexValue%28%28key%29%2C%20Ci.nsISupportsString%2C%20str%29%3B%0A%09%09%7D%0A%09%09%09break%3B%0A%09%7D%0A%7D%3B%0A%0AbtnPref.observe%20%3D%20function%20%28aPrefs%2C%20aCallback%29%20%7B%0A%09var%20%7B%0A%09%09root%0A%09%7D%0A%09%09%20%3D%20btnPref%3B%0A%09function%20observe%28subject%2C%20topic%2C%20data%29%20%7B%0A%09%09if%20%28topic%20%21%3D%3D%20%22nsPref%3Achanged%22%29%0A%09%09%09return%3B%0A%09%09var%20pref%20%3D%20data.slice%28root.length%29%3B%0A%09%09if%20%28aPrefs.indexOf%28pref%29%20%3D%3D%3D%20-1%29%0A%09%09%09return%3B%0A%09%09aCallback%28pref%29%3B%0A%09%7D%0A%09Services.prefs.addObserver%28root%2C%20observe%2C%20false%29%3B%0A%09unload%28function%20%28%29Services.prefs.removeObserver%28root%2C%20observe%29%29%3B%0A%7D%3B%0A%0Afunction%20btnPref%28aKey%29%20%7B%0A%09var%20%7B%0A%09%09branch%2C%0A%09%09defaults%0A%09%7D%0A%09%09%20%3D%20btnPref%3B%0A%09if%20%28%21branch%29%0A%09%09branch%20%3D%20Services.prefs.getBranch%28btnPref.root%29%3B%0A%09switch%20%28typeof%20defaults%5BaKey%5D%29%20%7B%0A%09case%20%22boolean%22%3A%0A%09%09return%20branch.getBoolPref%28aKey%29%3B%0A%09%09break%3B%0A%09case%20%22number%22%3A%0A%09%09return%20branch.getIntPref%28aKey%29%3B%0A%09%09break%3B%0A%09case%20%22string%22%3A%0A%09%09return%20branch.getComplexValue%28aKey%2C%20Ci.nsISupportsString%29.data%3B%0A%09%09break%3B%0A%09%7D%0A%09return%20null%3B%0A%7D%0A%0Afunction%20unload%28aCallback%2C%20aContainer%29%20%7B%0A%09var%20unloaders%20%3D%20unload.unloaders%3B%0A%09if%20%28unloaders%20%3D%3D%3D%20null%29%0A%09%09unloaders%20%3D%20unload.unloaders%20%3D%20%5B%5D%3B%0A%09if%20%28aCallback%20%3D%3D%3D%20null%29%20%7B%0A%09%09unloaders.slice%28%29.forEach%28function%20%28unloader%29unloader%28%29%29%3B%0A%09%09%09unloaders.length%20%3D%200%3B%0A%09%7D%0A%09if%20%28aContainer%20%21%3D%3D%20null%29%20%7B%0A%09%09aContainer.addEventListener%28%22unload%22%2C%20removeUnloader%2C%20false%29%3B%0A%09%09var%20origCallback%20%3D%20aCallback%3B%0A%09%09callback%20%3D%20function%20%28%29%20%7B%0A%09%09%09aContainer.removeEventListener%28%22unload%22%2C%20removeUnloader%2C%20false%29%3B%0A%09%09%09origCallback%28%29%3B%0A%09%09%7D%0A%09%09return%20null%3B%0A%09%7D%0A%09function%20unloader%28%29%20%7B%0A%09%09try%20%7B%0A%09%09%09callback%28%29%3B%0A%09%09%7D%20catch%20%28err%29%20%7B%0A%09%09%09Components.utils.reportError%28err%29%3B%0A%09%09%7D%0A%09%7D%0A%09unloaders.push%28unloader%29%3B%0A%09function%20removeUnloader%28%29%20%7B%0A%09%09var%20index%20%3D%20unloaders.indexOf%28unloader%29%3B%0A%09%09if%20%28index%20%21%3D%3D%20-1%29%0A%09%09%09unloaders.splice%28index%2C%201%29%3B%0A%09%7D%0A%09return%20removeUnloader%3B%0A%7D%0A//END//%20Default%20preferences%20management%0A%0Avar%20GrabScroll%20%3D%20%7B%0A%09mStatus%20%3A%200%2C%20//0%3AIdle%2C%201%3A%20during%20mousedown%2C%202%3A%20during%20mousemove%2C%203%3A%20mouseup%20After%20scrolling%0A%09mLastX%20%3A%200%2C%0A%09mLastY%20%3A%200%2C%0A%09_target%20%3A%20null%2C%20//%20Element%20the%20mouse%20is%20pointing%0A%09_target2%20%3A%20null%2C%20//%20Element%20the%20mouse%20is%20pointing%0A%09_isImage%20%3A%20false%2C%0A%09_timer%20%3A%200%2C%20//%20Save%20time%20when%20mouseup%20to%20determine%20the%20threshold.%0A%09_mtimer%20%3A%20false%2C%0A%09cScroll%20%3A%20false%2C%0A%09cSpeedX%20%3A%200%2C%0A%09cSpeedY%20%3A%200%2C%0A%09_doc%20%3A%20null%2C%0A%09_MOVERATEpZoom%20%3A%201%2C%0A%09_window%20%3A%20null%2C%0A%09initGrabScroll%20%3A%20function%20%28%29%20%7B%0A%09%09if%20%28GrabScroll.activeBrowser%28%29.mPanelContainer%29%20%7B%0A%09%09%09this._window%20%3D%20GrabScroll.activeBrowser%28%29.mPanelContainer%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09this._window%20%3D%20document.getElementById%28%27content%27%29%3B%0A%09%09%7D%0A%09%09this._window.setCapture%28%29%3B%0A%09%09if%20%28%21window%5B_LTN%5D%29%20%7B%0A%09%09%09this._window.addEventListener%28%22mousedown%22%2C%20this%2C%20true%29%3B%0A%09%09%09this._window.addEventListener%28%22click%22%2C%20this%2C%20true%29%3B%0A%09%09%09this._window.addEventListener%28%22mouseup%22%2C%20this%2C%20true%29%3B%0A%09%09%09gBrowser.addEventListener%28%27pagehide%27%2C%20this%2C%20false%29%3B%0A%09%09%09window%5B_LTN%5D%20%3D%20true%3B%0A%09%09%7D%0A%09%7D%2C%0A%09uninitGrabScroll%20%3A%20function%20%28%29%20%7B%0A%09%09if%20%28this._window%29%20%7B%0A%09%09%09this._window.removeEventListener%28%22mousedown%22%2C%20this%2C%20true%29%3B%0A%09%09%09this._window.removeEventListener%28%22click%22%2C%20this%2C%20true%29%3B%0A%09%09%09this._window.removeEventListener%28%22mouseup%22%2C%20this%2C%20true%29%3B%0A%09%09%09gBrowser.removeEventListener%28%27pagehide%27%2C%20this%2C%20false%29%3B%0A%09%09%09this.mStatus%20%3D%3D%3D%200%3B%0A%09%09%09this._window.removeEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%09%09%7D%0A%09%09delete%20window%5B_LTN%5D%3B%0A%09%7D%2C%0A%09activeBrowser%20%3A%20function%20%28%29%20%7B%0A%09%09return%20%28%27SplitBrowser%27%20in%20window%20%3F%20SplitBrowser.activeBrowser%20%3A%20null%29%0A%09%09%20%7C%7C%20gBrowser%3B%0A%09%7D%2C%0A%09handleEvent%20%3A%20function%20%28event%29%20%7B%0A%09%09event%20%3D%20new%20XPCNativeWrapper%28event%29%3B%0A%09%09switch%20%28event.type%29%20%7B%0A%09%09case%20%22mousedown%22%3A%0A%09%09%09if%20%28this.cScroll%29%20%7B%0A%09%09%09%09clearTimeout%28this.cScroll%29%3B%0A%09%09%09%09this.cSpeedX%20%3D%20this.cSpeedY%20%3D%200%3B%0A%09%09%09%7D%0A%09%09%09if%20%28btnPref%28%22GrabScrollEnabled%22%29%20%26%26%0A%09%09%09%09%21event.shiftKey%20%26%26%20%21event.ctrlKey%20%26%26%20%21event.altKey%29%20%7B%0A%09%09%09%09this.grabStart%28event%29%3B%0A%09%09%09%7D%20else%20if%20%28%21btnPref%28%22GrabScrollEnabled%22%29%20%26%26%0A%09%09%09%09event.shiftKey%20%26%26%20%21event.ctrlKey%20%26%26%20%21event.altKey%29%20%7B%0A%09%09%09%09this.grabStart%28event%29%3B%0A%09%09%09%7D%0A%09%09%09break%3B%0A%09%09case%20%22mousemove%22%3A%0A%09%09%09this.mousemove%28event%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22click%22%3A%0A%09%09%09this.click%28event%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22mouseup%22%3A%0A%09%09%09this.mouseup%28event%29%3B%0A%09%09%09break%3B%0A%09%09case%20%27pagehide%27%3A%0A%09%09%09this._doc%20%3D%20null%3B%0A%09%09%09this._target%20%3D%20null%3B%0A%09%09%09this._target2%20%3D%20null%3B%0A%09%09%09this._isImage%20%3D%20null%3B%0A%09%09%09this.NS%20%3D%20this.EW%20%3D%20this.NSEW%20%3D%20null%3B%0A%09%09%09break%3B%0A%09%09%7D%0A%09%7D%2C%0A%09grabStart%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28this.mStatus%20%3D%3D%3D%203%29%0A%09%09%09this.mStatus%20%3D%200%3B%0A%09%09//%20Do%20not%20start%20GrabScroll%20if%20you%20fire%20the%20mouse%20down%20continuously.%0A%09%09if%20%28btnPref%28%22MouseButton%22%29%20%3D%3D%3D%200%29%20%7B%0A%09%09%09if%20%28Math.abs%28this.mLastX%20-%20event.screenX%29%20%3C%205%20%26%26%0A%09%09%09%09Math.abs%28this.mLastY%20-%20event.screenY%29%20%3C%205%29%0A%09%09%09%09return%0A%09%09%7D%0A%09%09var%20doc%20%3D%20event.originalTarget.ownerDocument%3B%0A%09%09if%20%28%21doc%29%0A%09%09%09return%3B%0A%09%09if%20%28doc.contentType%20%3D%3D%3D%20%27application/vnd.mozilla.xul+xml%27%29%0A%09%09%09return%3B%0A%09%09this._doc%20%3D%20doc%3B%0A%09%09if%20%28event.button%20%3D%3D%3D%20btnPref%28%22MouseButton%22%29%20%26%26%20this.mStatus%20%3D%3D%3D%200%29%20%7B%0A%09%09%09this._target%20%3D%20event.originalTarget%3B%0A%09%09%09if%20%28/%5E%28html%7Cbody%29%24/.test%28this._target.localName.toLowerCase%28%29%29%20%7C%7C%20this._target.clientHeight%20%3E%2030000%29%0A%09%09%09%09this._target2%20%3D%20null%3B%0A%09%09%09else%20if%20%28/div/.test%28this._target.localName.toLowerCase%28%29%29%20%26%26%20this._target.clientHeight%20%3E%201000%29%0A%09%09%09%09this._target2%20%3D%20null%3B%0A%09%09%09else%0A%09%09%09%09this._target2%20%3D%20this._target%3B%0A%09%09%09//%20Editable%20element%20does%20not%20start%20GrabScroll%0A%09%09%09if%20%28this.isParentEditableNode%28this._target%29%29%0A%09%09%09%09return%3B%0A%09%09%09//%20Draggable%20element%20does%20not%20start%20GrabScroll%0A%09%09%09if%20%28this.isParentDraggableNode%28this._target%29%29%0A%09%09%09%09return%3B%0A%09%09%09//%20Factors%20to%20be%20steamed%20does%20not%20start%20the%20GrabScroll%0A%09%09%09if%20%28this.isIgnore%28this._target%29%29%0A%09%09%09%09return%3B%0A%09%09%09//%20Video%20control%20does%20not%20start%20the%20GrabScroll%0A%09%09%09if%20%28this.isVideoControl%28event.target%29%29%0A%09%09%09%09return%3B%0A%09%09%09//%20Clickable%20links%20does%20not%20start%20GrabScroll%0A%09%09%09if%20%28this.isParentClickableNode%28this._target%29%29%20%7B%0A%09%09%09%09if%20%28btnPref%28%22NotClicableLink%22%29%29%0A%09%09%09%09%09return%3B%0A%09%09%09%09//%20Blocking%20of%20DragStart%20on%20links%0A%09%09%09%09if%20%28%21%28%27linkDragSelection%27%20in%20window%29%29%0A%09%09%09%09%09event.preventDefault%28%29%3B%0A%09%09%09%7D%0A%09%09%09//%20On%20images%0A%09%09%09this._isImage%20%3D%20this.isImage%28event%29%3B%0A%09%09%09if%20%28this._isImage%29%20%7B%0A%09%09%09%09//%20Images%20does%20not%20start%20the%20GrabScroll%0A%09%09%09%09if%20%28btnPref%28%22NotImage%22%29%29%0A%09%09%09%09%09return%3B%0A%09%09%09%09//%20DragStart%20block%20on%20images%0A%09%09%09%09event.preventDefault%28%29%3B%0A%09%09%09%7D%0A%09%09%09//Compativility%20with%20ResizeTa%0A%09%09%09var%20target%20%3D%20this._target%3B%0A%09%09%09while%20%28target%29%20%7B%0A%09%09%09%09if%20%28%22getAttribute%22%20in%20target%20%26%26%20target.getAttribute%28%22draggable%22%29%20%3D%3D%3D%20%22true%22%29%0A%09%09%09%09%09return%3B%0A%09%09%09%09try%20%7B%0A%09%09%09%09%09var%20style%20%3D%20this._doc.defaultView.getComputedStyle%28target%2C%20null%29%3B%0A%09%09%09%09%09if%20%28/resize%7Cmove%7Call-scroll%7Ccrosshair/.test%28style.getPropertyValue%28%22cursor%22%29%29%29%0A%09%09%09%09%09%09return%3B%0A%09%09%09%09%09else%20if%20%28/resize%7Cmove%7Call-scroll%7Ccrosshair/.test%28style.getPropertyValue%28%22auto%22%29%29%29%0A%09%09%09%09%09%09break%3B%0A%09%09%09%09%7D%20catch%20%28e%29%20%7B%7D%0A%09%09%09%09target%20%3D%20target.parentNode%3B%0A%09%09%09%7D%0A%09%09%09if%20%28btnPref%28%22MouseButton%22%29%20%3E%200%29%20%7B%0A%09%09%09%09event.preventDefault%28%29%3B%0A%09%09%09%09event.stopPropagation%28%29%3B%0A%09%09%09%7D%0A%09%09%09this._timer%20%3D%20new%20Date%28%29.getTime%28%29%3B%0A%09%09%09this.mLastX%20%3D%20event.screenX%3B%0A%09%09%09this.mLastY%20%3D%20event.screenY%3B%0A%09%09%09this.mStatus%20%3D%201%3B%0A%09%09%09this._MOVERATEpZoom%20%3D%20btnPref%28%22MoveRate%22%29%20/%20%28ZoomManager.useFullZoom%20%3F%20ZoomManager.zoom%20%3A%201%29%3B%0A%09%09%09%5Bthis.NS%2C%20this.EW%2C%20this.NSEW%5D%20%3D%20this.getScrollView%28event%29%3B%0A%09%09%09this._window.addEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09adjustedTimer%20%3A%20function%20%28%29%20%7B%0A%09%09var%20magTimer%20%3D%20btnPref%28%22Timer%22%29%3B%0A%09%09return%20magTimer%3B%0A%09%7D%2C%0A%09grabFinish%20%3A%20function%20%28%29%20%7B%0A%09%09this._window.removeEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%09%09var%20selCon%20%3D%20this.getSelconForDoc%28this._doc%29%3B%0A%09%09if%20%28selCon%29%0A%09%09%09selCon.setDisplaySelection%28selCon.SELECTION_ON%29%3B%0A%09%7D%2C%0A%09mousemove%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28this.mStatus%20%3D%3D%3D%202%20%7C%7C%20this.mStatus%20%3D%3D%3D%201%29%20%7B%0A%09%09%09var%20x%20%3D%20event.screenX%3B%0A%09%09%09var%20y%20%3D%20event.screenY%3B%0A%09%09%09var%20doc%20%3D%20event.originalTarget.ownerDocument%3B%0A%09%09%09if%20%28this.mStatus%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%09if%20%28%21this._isImage%20%26%26%0A%09%09%09%09%09%28new%20Date%28%29.getTime%28%29%20-%20this._timer%29%20%3E%20this.adjustedTimer%28%29%29%20%7B%0A%09%09%09%09%09this.grabFinish%28%29%3B%0A%09%09%09%09%09this.mStatus%20%3D%200%3B%0A%09%09%09%09%09return%3B%0A%09%09%09%09%7D%0A%09%09%09%09if%20%28Math.abs%28x%20-%20this.mLastX%29%20%3C%20btnPref%28%22ToleranceWhenNoHScroll%22%29%29%0A%09%09%09%09%09var%20movingh%20%3D%20Math.abs%28x%20-%20this.mLastX%29%20%3E%20Math.abs%28y%20-%20this.mLastY%29%20*%2050%3B%0A%09%09%09%09if%20%28%21this._isImage%20%26%26%20btnPref%28%22MouseButton%22%29%20%3D%3D%3D%200%20%26%26%20this.isText%28event%29%20%26%26%20movingh%20%26%26%20%21this.EW%29%20%7B%0A%09%09%09%09%09this.grabFinish%28%29%3B%0A%09%09%09%09%09this.mStatus%20%3D%200%3B%0A%09%09%09%09%09return%3B%0A%09%09%09%09%7D%0A%09%09%09%09if%20%28Math.abs%28x%20-%20this.mLastX%29%20+%20Math.abs%28y%20-%20this.mLastY%29%20%3C%20btnPref%28%22Tolerance%22%29%29%0A%09%09%09%09%09return%3B%0A%09%09%09%09if%20%28btnPref%28%22MouseButton%22%29%20%3D%3D%3D%200%29%20%7B%0A%09%09%09%09%09var%20selCon%20%3D%20this.getSelconForDoc%28this._doc%29%3B%0A%09%09%09%09%09if%20%28selCon%29%20%7B%0A%09%09%09%09%09%09var%20selection%20%3D%20selCon.getSelection%28selCon.SELECTION_NORMAL%29%3B%0A%09%09%09%09%09%09selection.removeAllRanges%28%29%3B%0A%09%09%09%09%09%09selCon.setDisplaySelection%28selCon.SELECTION_OFF%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09if%20%28%22ucjsMouseGestures%22%20in%20window%29%20%7B%0A%09%09%09%09%09%09ucjsMouseGestures._isMouseDownR%20%3D%20false%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%09this.mLastX%20%3D%20x%20-%20%28x%20-%20this.mLastX%29%20/%2010%3B%0A%09%09%09%09this.mLastY%20%3D%20y%20-%20%28y%20-%20this.mLastY%29%20/%2010%3B%0A%09%09%09%09this.mStatus%20%3D%202%3B%0A%09%09%09%7D%0A%09%09%09if%20%28this._mtimer%29%0A%09%09%09%09return%3B%0A%09%09%09this.cSpeedX%20%3D%20this._MOVERATEpZoom%20*%20%28x%20-%20this.mLastX%29%3B%0A%09%09%09this.cSpeedY%20%3D%20this._MOVERATEpZoom%20*%20%28y%20-%20this.mLastY%29%3B%0A%09%09%09this.scroll%28event%29%3B%0A%09%09%09this.mLastX%20%3D%20x%3B%0A%09%09%09this.mLastY%20%3D%20y%3B%0A%09%09%7D%0A%09%7D%2C%0A%09getSelconForDoc%20%3A%20function%20getSelconForDoc%28doc%29%20%7B%0A%09%09if%20%28%21doc%29%0A%09%09%09return%20null%3B%0A%09%09var%20aFrame%20%3D%20doc.defaultView%3B%0A%09%09if%20%28%21aFrame%29%0A%09%09%09return%20null%3B%0A%09%09var%20docShell%20%3D%20this.getDocShellForFrame%28aFrame%29%3B%0A%09%09var%20selCon%20%3D%20docShell%0A%09%09%09.QueryInterface%28Ci.nsIInterfaceRequestor%29%0A%09%09%09.getInterface%28Ci.nsISelectionDisplay%29%0A%09%09%09.QueryInterface%28Ci.nsISelectionController%29%3B%0A%09%09return%20selCon%3B%0A%09%7D%2C%0A%09getDocShellForFrame%20%3A%20function%20getDocShellForFrame%28aFrame%29%20%7B%0A%09%09return%20aFrame%0A%09%09.QueryInterface%28Ci.nsIInterfaceRequestor%29%0A%09%09.getInterface%28Ci.nsIWebNavigation%29%0A%09%09.QueryInterface%28Ci.nsIDocShell%29%3B%0A%09%7D%2C%0A%09click%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28event.button%20%3D%3D%3D%20btnPref%28%22MouseButton%22%29%20%26%26%20this.mStatus%20%3D%3D%3D%202%29%20%7B%0A%09%09%09event.preventDefault%28%29%3B%0A%09%09%09event.stopPropagation%28%29%3B%0A%09%09%7D%0A%09%09if%20%28event.button%20%3D%3D%3D%200%20%26%26%20this.mStatus%20%3E%3D%202%20%26%26%20this._doc%20instanceof%20Ci.nsIImageDocument%29%20%7B%0A%09%09%09event.preventDefault%28%29%3B%0A%09%09%09event.stopPropagation%28%29%3B%0A%09%09%7D%0A%09%09this.grabFinish%28%29%3B%0A%09%09this.mStatus%20%3D%200%3B%0A%09%7D%2C%0A%09mouseup%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28event.button%20%3D%3D%3D%20btnPref%28%22MouseButton%22%29%20%26%26%20this.mStatus%20%3E%201%29%20%7B%0A%09%09%09event.preventDefault%28%29%3B%0A%09%09%09event.stopPropagation%28%29%3B%0A%09%09%09this.grabFinish%28%29%3B%0A%09%09%09if%20%28this.mStatus%20%3D%3D%3D%202%29%0A%09%09%09%09this.mStatus%20%3D%203%3B%0A%09%09%09if%20%28btnPref%28%22InertiaEnabled%22%29%20%26%26%0A%09%09%09%09%28Math.abs%28this.cSpeedX%29%20%3E%20btnPref%28%22InertiaThreshold%22%29%20%7C%7C%20Math.abs%28this.cSpeedY%29%20%3E%20btnPref%28%22InertiaThreshold%22%29%29%29%20%7B%0A%09%09%09%09if%20%28this.cScroll%29%0A%09%09%09%09%09clearTimeout%28this.cScroll%29%3B%0A%09%09%09%09var%20v%20%3D%20btnPref%28%22InertiaRate%22%29%3B%0A%09%09%09%09if%20%28this.cSpeedX%20%3E%200%29%0A%09%09%09%09%09this.cSpeedX%20%3D%20Math.min%28this.cSpeedX%2C%20v%29%3B%0A%09%09%09%09else%0A%09%09%09%09%09this.cSpeedX%20%3D%20Math.max%28this.cSpeedX%2C%20-v%29%3B%0A%09%09%09%09if%20%28this.cSpeedY%20%3E%200%29%0A%09%09%09%09%09this.cSpeedY%20%3D%20Math.min%28this.cSpeedY%2C%20v%29%3B%0A%09%09%09%09else%0A%09%09%09%09%09this.cSpeedY%20%3D%20Math.max%28this.cSpeedY%2C%20-v%29%3B%0A%09%09%09%09this.scroll2%28event%29%3B%0A%09%09%09%09scrolling%28event%2C%20this%29%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20if%20%28event.button%20%3D%3D%3D%20btnPref%28%22MouseButton%22%29%20%26%26%20this.mStatus%20%3D%3D%3D%201%29%20%7B%0A%09%09%09this.grabFinish%28%29%3B%0A%09%09%09this.mStatus%20%3D%200%3B%0A%09%09%7D%0A%09%7D%2C%0A%09scroll2%20%3A%20function%20%28event%29%20%7B%0A%09%09var%20ay%20%3D%20Math.abs%28this.cSpeedY%29%3B%0A%09%09var%20ax%20%3D%20Math.abs%28this.cSpeedX%29%3B%0A%09%09if%20%28ay%20%3C%201%20%26%26%20ax%20%3C%201%29%20%7B%0A%09%09%09clearTimeout%28this.cScroll%29%3B%0A%09%09%09return%3B%0A%09%09%7D%0A%09%09this.scroll%28event%29%3B%0A%09%09if%20%28ax%20%3E%3D%20100%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%20100%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%2020%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%2010%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%205%29%0A%09%09%09this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%09%09else%20if%20%28ax%20%3C%201%29%0A%09%09%09this.cSpeedX%20%3D%200%3B%0A%09%09if%20%28ay%20%3E%3D%20100%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%20100%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%2020%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%2010%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%205%29%0A%09%09%09this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%09%09else%20if%20%28ay%20%3C%201%29%0A%09%09%09this.cSpeedY%20%3D%200%3B%0A%09%7D%2C%0A%09scroll%20%3A%20function%20%28event%29%20%7B%0A%09%09this._mtimer%20%3D%20true%3B%0A%09%09if%20%28this.NS%20%26%26%20this.NS%20%3D%3D%3D%20this.EW%29%20%7B%0A%09%09%09if%20%28%22scrollBy%22%20in%20this.NS%29%20%7B%0A%09%09%09%09this.NS.scrollBy%28this.cSpeedX%2C%20this.cSpeedY%29%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09this.NS.scrollLeft%20+%3D%20this.cSpeedX%3B%0A%09%09%09%09this.NS.scrollTop%20+%3D%20this.cSpeedY%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20%7B%0A%09%09%09if%20%28this.NS%29%20%7B%0A%09%09%09%09if%20%28%22scrollBy%22%20in%20this.NS%29%20%7B%0A%09%09%09%09%09this.NS.scrollBy%280%2C%20this.cSpeedY%29%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09this.NS.scrollTop%20+%3D%20this.cSpeedY%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09if%20%28this.EW%29%20%7B%0A%09%09%09%09if%20%28%22scrollBy%22%20in%20this.EW%29%20%7B%0A%09%09%09%09%09this.EW.scrollBy%28this.cSpeedX%2C%200%29%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09this.EW.scrollLeft%20+%3D%20this.cSpeedX%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09setTimeout%28function%20%28self%29%20%7B%0A%09%09%09self._mtimer%20%3D%20false%3B%0A%09%09%7D%2C%2020%2C%20this%29%3B%0A%09%7D%2C%0A%09isText%20%3A%20function%20%28event%29%20%7B%0A%09%09return%20event.explicitOriginalTarget.nodeType%20%3D%3D%3D%20document.TEXT_NODE%3B%0A%09%7D%2C%0A%09isImage%20%3A%20function%20%28event%29%20%7B%0A%09%09if%20%28event.target%20instanceof%20Ci.nsIImageLoadingContent%29%0A%09%09%09return%20event.target%3B%0A%09%09else%0A%09%09%09return%20null%3B%0A%09%7D%2C%0A%09isIgnore%20%3A%20function%20%28aNode%29%20%7B%0A%09%09while%20%28aNode%29%20%7B%0A%09%09%09var%20name%20%3D%20aNode.nodeName.toLowerCase%28%29%3B%0A%09%09%09if%20%28name%20%3D%3D%3D%20%22html%22%29%0A%09%09%09%09return%20false%3B%0A%09%09%09if%20%28/%28scrollbar%7Cselect%7Coption%7Cembed%7Cobject%7Ctree%7Capplet%7Cstatusbar%29/.test%28name%29%29%0A%09%09%09%09return%20true%3B%0A%09%09%09aNode%20%3D%20aNode.parentNode%3B%0A%09%09%7D%0A%09%09return%20false%3B%0A%09%7D%2C%0A%09isParentClickableNode%20%3A%20function%20%28aNode%29%20%7B%0A%09%09if%20%28%21aNode%29%0A%09%09%09return%20null%3B%0A%09%09var%20d%20%3D%20aNode.ownerDocument%3B%0A%09%09try%20%7B%0A%09%09%09var%20xpathResult%20%3D%20d.evaluate%28%0A%09%09%09%09%09/*%27ancestor-or-self%3A%3A*%5B%28%28local-name%28%29%20%3D%20%22a%22%20or%20local-name%28%29%20%3D%20%22A%22%29%20and%20@href%29%20or%20local-name%28%29%20%3D%20%22button%22%20or%20local-name%28%29%20%3D%20%22BUTTON%22%20or%20%28%28local-name%28%29%20%3D%20%22input%22%20or%20local-name%28%29%20%3D%20%22INPUT%22%29%20and%20%28@type%20%3D%20%22SUBMIT%22%20or%20@type%20%3D%20%22submit%22%20or%20@type%20%3D%20%22BUTTON%22%20or%20@type%20%3D%20%22button%22%20or%20@type%20%3D%20%22IMAGE%22%20or%20@type%20%3D%20%22image%22%29%29%5D%27%2C*/%0A%09%09%09%09%09%27ancestor-or-self%3A%3A*%5B%28%28local-name%28%29%20%3D%20%22a%22%20or%20local-name%28%29%20%3D%20%22A%22%29%29%20or%20local-name%28%29%20%3D%20%22button%22%20or%20local-name%28%29%20%3D%20%22BUTTON%22%20or%20%28%28local-name%28%29%20%3D%20%22input%22%20or%20local-name%28%29%20%3D%20%22INPUT%22%29%20and%20%28@type%20%3D%20%22SUBMIT%22%20or%20@type%20%3D%20%22submit%22%20or%20@type%20%3D%20%22BUTTON%22%20or%20@type%20%3D%20%22button%22%20or%20@type%20%3D%20%22IMAGE%22%20or%20@type%20%3D%20%22image%22%29%29%5D%27%2C%0A%09%09%09%09%09aNode%2C%0A%09%09%09%09%09this.NSResolver%2C%0A%09%09%09%09%09XPathResult.FIRST_ORDERED_NODE_TYPE%2C%0A%09%09%09%09%09null%29%3B%0A%09%09%7D%20catch%20%28e%29%20%7B%0A%09%09%09return%20null%3B%0A%09%09%7D%0A%09%09return%20xpathResult.singleNodeValue%3B%0A%09%7D%2C%0A%09NSResolver%20%3A%20%7B%0A%09%09lookupNamespaceURI%20%3A%20function%20%28aPrefix%29%20%7B%0A%09%09%09switch%20%28aPrefix%29%20%7B%0A%09%09%09case%20%27xul%27%3A%0A%09%09%09%09return%20%27http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%27%3B%0A%09%09%09case%20%27html%27%3A%0A%09%09%09case%20%27xhtml%27%3A%0A%09%09%09%09return%20%27http%3A//www.w3.org/1999/xhtml%27%3B%0A%09%09%09case%20%27xlink%27%3A%0A%09%09%09%09return%20%27http%3A//www.w3.org/1999/xlink%27%3B%0A%09%09%09default%3A%0A%09%09%09%09return%20%27%27%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%2C%0A%09isParentEditableNode%20%3A%20function%20%28node%29%20%7B%0A%09%09try%20%7B%0A%09%09%09if%20%28node.ownerDocument.designMode%20%3D%3D%3D%20%27on%27%29%0A%09%09%09%09return%20node%3B%0A%09%09%7D%20catch%20%28e%29%20%7B%7D%0A%0A%09%09while%20%28node%20%26%26%20node.parentNode%29%20%7B%0A%09%09%09try%20%7B%0A%09%09%09%09if%20%28%21%28node%20instanceof%20Ci.nsIDOMNSEditableElement%29%29%0A%09%09%09%09%09throw%200%3B%0A%09%09%09%09node.QueryInterface%28Ci.nsIDOMNSEditableElement%29%3B%0A%09%09%09%09return%20node%3B%0A%09%09%09%7D%20catch%20%28e%29%20%7B%7D%0A%09%09%09node%20%3D%20node.parentNode%3B%0A%09%09%7D%0A%09%09return%20null%3B%0A%09%7D%2C%0A%09isParentDraggableNode%20%3A%20function%20%28node%29%20%7B%0A%09%09while%20%28node%20%26%26%20node.parentNode%29%20%7B%0A%09%09%09if%20%28node.getAttribute%28%27draggable%27%29%20%3D%3D%3D%20%27true%27%29%0A%09%09%09%09return%20node%3B%0A%09%09%09node%20%3D%20node.parentNode%3B%0A%09%09%7D%0A%09%09return%20null%3B%0A%09%7D%2C%0A%09isVideoControl%20%3A%20function%20%28node%29%20%7B%0A%09%09if%20%28/%5E%28audio%7Cvideo%29%24/i.test%28node.localName%29%29%20%7B%0A%09%09%09return%20true%3B%0A%09%09%09var%20i%20%3D%200%3B%0A%09%09%09while%20%28i%20%3C%20node.childNodes.length%29%20%7B%0A%09%09%09%09var%20child%20%3D%20node.childNodes%5Bi%5D%3B%0A%09%09%09%09if%20%28child.hasAttribute%28%27controls%27%29%20%26%26%20child.getAttribute%28%27controls%27%29%20%3D%3D%3D%20%27controls%27%29%20%7B%0A%09%09%09%09%09return%20true%3B%0A%09%09%09%09%7D%0A%09%09%09%09i++%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09return%20false%3B%0A%09%7D%2C%0A%09button%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Mouse%20button%20%28L%20M%20R%29%3A%20%22%2C%20%22LMR%22.substr%28btnPref%28%22MouseButton%22%29%2C%201%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09switch%20%28value.toUpperCase%28%29%29%20%7B%0A%09%09case%20%22M%22%3A%0A%09%09%09value%20%3D%201%3B%0A%09%09%09break%3B%0A%09%09case%20%22R%22%3A%0A%09%09%09value%20%3D%202%3B%0A%09%09%09break%3B%0A%09%09default%3A%0A%09%09case%20%22L%22%3A%0A%09%09%09value%20%3D%200%3B%0A%09%09%09break%3B%0A%09%09%7D%0A%09%09sIP%28%22MouseButton%22%2C%20value%29%3B%0A%09%7D%2C%0A%09threshold%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Stop%20GrabScroll%20if%20mouse%20button%20is%20pressed%20longer%20than%20this%20time%20%28In%20milliseconds%29.%22%2C%20btnPref%28%22Timer%22%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09var%20timer%20%3D%20parseInt%28value%2C%2010%29%3B%0A%09%09if%20%28timer%20%3C%3D%200%20%7C%7C%20%21timer%29%0A%09%09%09timer%20%3D%201000%3B%0A%09%09sIP%28%22Timer%22%2C%20timer%29%3B%0A%09%7D%2C%0A%09moverate%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Drag%20direction%20and%20speed%3A%5Cn%20Negative%20or%20positive%20values.%22%2C%20btnPref%28%22MoveRate%22%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09var%20moveRate%20%3D%20parseInt%28value%2C%2010%29%3B%0A%09%09if%20%28%21moveRate%29%0A%09%09%09moveRate%20%3D%20-1%3B%0A%09%09sIP%28%22MoveRate%22%2C%20moveRate%29%3B%0A%09%7D%2C%0A%09inertiaToggle%20%3A%20function%20%28%29%20%7B%0A%09%09var%20inertia%20%3D%20%21btnPref%28%22InertiaEnabled%22%29%3B%0A%09%09sBP%28%22InertiaEnabled%22%2C%20inertia%29%3B%0A%09%7D%2C%0A%09inertiaThreshold%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Kinetic%20scroll%20threshold%3A%20%22%2C%20btnPref%28%22InertiaThreshold%22%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09var%20inertiaThreshold%20%3D%20parseInt%28value%2C%2010%29%3B%0A%09%09if%20%28%21inertiaThreshold%29%0A%09%09%09inertiaThreshold%20%3D%2020%3B%0A%09%09sIP%28%22InertiaThreshold%22%2C%20inertiaThreshold%29%3B%0A%09%7D%2C%0A%09inertiarate%20%3A%20function%20%28%29%20%7B%0A%09%09var%20value%20%3D%20prompt%28%22Kinetic%20scroll%20speed%3A%20%22%2C%20btnPref%28%22InertiaRate%22%29%29%3B%0A%09%09if%20%28%21value%29%0A%09%09%09return%3B%0A%09%09var%20inertiaRate%20%3D%20parseInt%28value%2C%2010%29%3B%0A%09%09if%20%28%21inertiaRate%29%0A%09%09%09inertiaRate%20%3D%2050%3B%0A%09%09sIP%28%22InertiaRate%22%2C%20inertiaRate%29%3B%0A%09%7D%2C%0A%09clickable%20%3A%20function%20%28%29%20%7B%0A%09%09var%20notClicableLink%20%3D%20%21btnPref%28%22NotClicableLink%22%29%3B%0A%09%09sBP%28%22NotClicableLink%22%2C%20notClicableLink%29%3B%0A%09%7D%2C%0A%09getScrollView%20%3A%20function%20%28event%29%20%7B%0A%09%09var%20NS%2C%0A%09%09EW%2C%0A%09%09NSEW%3B%0A%09%09NS%20%3D%20EW%20%3D%20NSEW%20%3D%20null%3B%0A%09%09var%20_scrollingView%20%3D%20null%3B%0A%09%09var%20overflowx%2C%0A%09%09overflowy%2C%0A%09%09ox%2C%0A%09%09oy%3B%0A%09%09var%20scw%2C%0A%09%09sch%2C%0A%09%09horz%2C%0A%09%09vert%3B%0A%09%09var%20doc%2C%0A%09%09style%3B%0A%09%09var%20borderTop%3B%0A%09%09var%20borderBottom%3B%0A%09%09var%20borderLeft%3B%0A%09%09var%20borderRight%3B%0A%09%09if%20%28event.originalTarget.ownerDocument.contentType%20%3D%3D%3D%20%22application/xml%22%29%20%7B%0A%09%09%09_scrollingView%20%3D%20event.originalTarget.ownerDocument.defaultView%3B%0A%09%09%09if%20%28_scrollingView.scrollMaxX%20%3E%200%29%20%7B%0A%09%09%09%09if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%09%09%09%09%09NSEW%20%3D%20_scrollingView%3B%0A%09%09%09%09%09NS%20%3D%20_scrollingView%3B%0A%09%09%09%09%7D%0A%09%09%09%09EW%20%3D%20_scrollingView%3B%0A%09%09%09%7D%20else%20if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%09%09%09%09NS%20%3D%20_scrollingView%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20%7B%0A%09%09%09for%20%28_scrollingView%20%3D%20event.originalTarget%3B%20_scrollingView%3B%20_scrollingView%20%3D%20_scrollingView.parentNode%29%20%7B%0A%09%09%09%09if%20%28_scrollingView%20instanceof%20HTMLElement%29%20%7B%0A%09%09%09%09%09if%20%28_scrollingView.localName.toUpperCase%28%29%20%3D%3D%3D%20%22HTML%22%20%7C%7C%0A%09%09%09%09%09%09_scrollingView.localName.toUpperCase%28%29%20%3D%3D%3D%20%22BODY%22%29%20%7B%0A%09%09%09%09%09%09_scrollingView%20%3D%20_scrollingView.ownerDocument.defaultView%3B%0A%09%09%09%09%09%09if%20%28_scrollingView.scrollMaxX%20%3E%200%20%26%26%0A%09%09%09%09%09%09%09_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%09%09%09%09%09%09%09NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%09%09%09%09%09%09%09EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%09%09%09%09%09%09%09NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09if%20%28_scrollingView.scrollMaxX%20%3E%200%29%20%7B%0A%09%09%09%09%09%09%09EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%09%09%09%09%09%09%09NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09if%20%28_scrollingView.frameElement%20%26%26%20%21NS%20%26%26%20%21EW%20%26%26%20%21NSEW%29%20%7B%0A%09%09%09%09%09%09%09return%20this.getScrollView%28%7B%0A%09%09%09%09%09%09%09%09originalTarget%20%3A%20_scrollingView.frameElement%0A%09%09%09%09%09%09%09%7D%29%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09if%20%28_scrollingView.localName.toLowerCase%28%29%20%3D%3D%3D%20%22select%22%29%20%7B%0A%09%09%09%09%09%09_scrollingView.parentNode.focus%28%29%3B%0A%09%09%09%09%09%09return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09overflowx%20%3D%20%22%22%3B%0A%09%09%09%09%09overflowy%20%3D%20%22%22%3B%0A%09%09%09%09%09ox%20%3D%20true%3B%0A%09%09%09%09%09oy%20%3D%20true%3B%0A%09%09%09%09%09try%20%7B%0A%09%09%09%09%09%09doc%20%3D%20_scrollingView.ownerDocument%3B%0A%09%09%09%09%09%09style%20%3D%20doc.defaultView.getComputedStyle%28_scrollingView%2C%20%22%22%29%3B%0A%09%09%09%09%09%09overflowx%20%3D%20style.getPropertyValue%28%22overflow-x%22%29%3B%0A%09%09%09%09%09%09ox%20%3D%20overflowx%20%21%3D%3D%20%22hidden%22%20%26%26%20overflowx%20%21%3D%3D%20%22visible%22%3B%0A%09%09%09%09%09%09overflowy%20%3D%20style.getPropertyValue%28%22overflow-y%22%29%3B%0A%09%09%09%09%09%09oy%20%3D%20overflowy%20%21%3D%3D%20%22hidden%22%20%26%26%20overflowy%20%21%3D%3D%20%22visible%22%3B%0A%09%09%09%09%09%7D%20catch%20%28ex%29%20%7B%7D%0A%09%09%09%09%09borderTop%20%3D%200%3B%0A%09%09%09%09%09borderBottom%20%3D%200%3B%0A%09%09%09%09%09borderLeft%20%3D%200%3B%0A%09%09%09%09%09borderRight%20%3D%200%3B%0A%09%09%09%09%09if%20%28/%5E%28table%7Ctd%7Cth%29%24/i.test%28_scrollingView.localName%29%29%20%7B%0A%09%09%09%09%09%09try%20%7B%0A%09%09%09%09%09%09%09doc%20%3D%20_scrollingView.ownerDocument%3B%0A%09%09%09%09%09%09%09style%20%3D%20doc.defaultView.getComputedStyle%28_scrollingView%2C%20%22%22%29%3B%0A%09%09%09%09%09%09%09borderTop%20%3D%20style.getPropertyValue%28%22border-top-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%09%09%09%09%09%09%09borderBottom%20%3D%20style.getPropertyValue%28%22border-bottom-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%09%09%09%09%09%09%09borderLeft%20%3D%20style.getPropertyValue%28%22border-left-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%09%09%09%09%09%09%09borderRight%20%3D%20style.getPropertyValue%28%22border-right-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%09%09%09%09%09%09%7D%20catch%20%28ex%29%20%7B%7D%0A%09%09%09%09%09%7D%0A%09%09%09%09%09scw%20%3D%20_scrollingView.clientWidth%3B%0A%09%09%09%09%09horz%20%3D%20ox%20%26%26%20scw%20%21%3D%3D%200%20%26%26%0A%09%09%09%09%09%09scw%20+%20borderLeft%20+%20borderRight%20%3C%20_scrollingView.scrollWidth%3B%0A%09%09%09%09%09sch%20%3D%20_scrollingView.clientHeight%3B%0A%09%09%09%09%09vert%20%3D%20oy%20%26%26%20sch%20%21%3D%3D%200%20%26%26%0A%09%09%09%09%09%09sch%20+%20borderTop%20+%20borderBottom%20%3C%20_scrollingView.scrollHeight%3B%0A%09%09%09%09%09if%20%28horz%20%26%26%20vert%29%20%7B%0A%09%09%09%09%09%09NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%09%09%09%09%09%09EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%09%09%09%09%09%09NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09if%20%28horz%29%20%7B%0A%09%09%09%09%09%09EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09if%20%28vert%29%20%7B%0A%09%09%09%09%09%09NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%20//%20for%0A%09%09%7D%0A%09%09return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%09%7D%0A%7D%3B%0A%0Afunction%20scrolling%28aEvt%2C%20aSelf%29%20%7B%0A%09var%20Start%20%3D%20new%20Date%28%29.getTime%28%29%3B%0A%09aSelf.scroll2%28aEvt%29%3B%0A%09aSelf.cScroll%20%3D%20setTimeout%28arguments.callee%2C%0A%09%09%09Math.max%2825%20-%20%28%28new%20Date%28%29%29.getTime%28%29%20-%20Start%29%2C%200%29%2C%20aEvt%2C%20aSelf%29%3B%0A%7D%0A%0Aif%20%28btnPref%28%22GrabScrollEnabled%22%29%29%0A%09GrabScroll.initGrabScroll%28%29%3B%0Athis.onDestroy%20%3D%20function%20%28aReason%29%20%7B%0A%09%28aReason%20%3D%3D%3D%20%22update%22%20%7C%7C%20aReason%20%3D%3D%3D%20%22delete%22%29%20%26%26%20GrabScroll.uninitGrabScroll%28%29%3B%0A%7D%3B%0A%0Afunction%20sBP%28aKey%2C%20aVal%2C%20aBranch%29%20%7B%20//Set%20Boolean%20Pref%0A%09Services.prefs.setBoolPref%28%28%21aBranch%29%20%3F%20PREF_BRANCH%20+%20aKey%20%3A%20aKey%2C%20aVal%29%3B%0A%7D%0A%0Afunction%20sIP%28aKey%2C%20aVal%2C%20aBranch%29%20%7B%20//Set%20Integer%20Pref%0A%09Services.prefs.setIntPref%28%28%21aBranch%29%20%3F%20PREF_BRANCH%20+%20aKey%20%3A%20aKey%2C%20aVal%29%3B%0A%7D%0A%0Afunction%20gBP%28aKey%2C%20aBranch%29%20%7B%20//Get%20Boolean%20Pref%0A%09return%20Services.prefs.getBoolPref%28%28%21aBranch%29%20%3F%20PREF_BRANCH%20+%20aKey%20%3A%20aKey%29%3B%0A%7D%0A%0Athis.toggleGrabScroll%20%3D%20function%20%28%29%20%7B%0A%09var%20state%20%3D%20btnPref%28%22GrabScrollEnabled%22%29%3B%0A%09sBP%28%22GrabScrollEnabled%22%2C%20%21state%29%3B%0A%09notifyme%28null%2C%20%22GrabScroll%20%22%20+%20%28btnPref%28%22GrabScrollEnabled%22%29%20%3F%20%22ENABLED%22%20%3A%20%22DISABLED%22%29%2C%20%22%22%29%3B%0A%09self.init%28%29%3B%0A%7D%3B%0A%0Afunction%20%24XML%28aXML%29%20%7B%20//%20Return%20parsed%20XML%0A%09aXML%20%3D%20aXML.replace%28/%3E%5Cs+%3C/g%2C%20%22%3E%3C%22%29%3B%20//%20Linearize%20XML%0A%09return%20%28new%20DOMParser%29.parseFromString%28aXML%2C%20%22application/xml%22%29.documentElement%3B%0A%7D%0A%0Afunction%20notifyme%28aImg%2C%20aTitle%2C%20aMsg%29%20%7B%20//%20Notification%20function%0A%09var%20notFeature%20%3D%20gBP%28%22notification.feature.enabled%22%2C%20true%29%3B%0A%09try%20%7B%0A%09%09var%20ASrv%20%3D%20Cc%5B%27@mozilla.org/alerts-service%3B1%27%5D.getService%28Ci.nsIAlertsService%29%3B%0A%09%09if%20%28%21notFeature%29%20%7B%0A%09%09%09sBP%28%22notification.feature.enabled%22%2C%20true%2C%20true%29%3B%0A%09%09%09setTimeout%28function%20%28%29%20%7B%0A%09%09%09%09ASrv.showAlertNotification%28aImg%2C%20aTitle%2C%20aMsg%2C%20false%2C%20%22%22%2C%20null%29%3B%0A%09%09%09%09sBP%28%22notification.feature.enabled%22%2C%20false%2C%20true%29%3B%0A%09%09%09%7D%2C%20100%29%3B%0A%09%09%7D%20else%0A%09%09%09ASrv.showAlertNotification%28aImg%2C%20aTitle%2C%20aMsg%2C%20false%2C%20%22%22%2C%20null%29%3B%0A%09%7D%20catch%20%28aEr%29%20%7B%0A%09%09var%20win%20%3D%20Components.classes%5B%27@mozilla.org/embedcomp/window-watcher%3B1%27%5D.%0A%09%09%09getService%28Components.interfaces.nsIWindowWatcher%29.%0A%09%09%09openWindow%28null%2C%20%27chrome%3A//global/content/alerts/alert.xul%27%2C%0A%09%09%09%09%27_blank%27%2C%20%27chrome%2Ctitlebar%3Dno%2Cpopup%3Dyes%27%2C%20null%29%3B%0A%09%09win.arguments%20%3D%20%5BaImg%2C%20aTitle%2C%20aMsg%2C%20false%2C%20%27%27%5D%3B%0A%09%7D%0A%7D%0Athis.onclick%20%3D%20function%20%28aEvt%29%20%7B%0A%09if%20%28aEvt.button%20%3D%3D%3D%201%20%26%26%20%21aEvt.shiftKey%20%26%26%20%21aEvt.ctrlKey%20%26%26%20%21aEvt.altKey%29%20%7B%0A%09%09var%20menuPopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%0A%09%09%5B%0A%09%09%09%7BnodeName%3A%20%22menuitem%22%2C%20label%3A%20%22Button%20to%20start%20the%20GrabScroll%22%2C%20tltp%3A%20%22Choose%20the%20mouse%20button%20with%20which%20to%20start%20the%20GrabScroll.%22%2C%20cmd%3A%20%22document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29.cmds%28%27button%27%29%3Bevent.stopPropagation%28%29%3B%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuseparator%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuitem%22%2C%20label%3A%20%22GrabScroll%20start%20threshold%22%2C%20tltp%3A%20%22Time%20in%20milliseconds%20after%20which%20the%20GrabScroll%20is%20canceled%20if%20the%20cursor%20is%20not%20moved.%22%2C%20cmd%3A%20%22sdocument.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29.cmds%28%27threshold%27%29%3Bevent.stopPropagation%28%29%3B%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuitem%22%2C%20label%3A%20%22GrabScroll%20speed%20%26amp%3B%20direction%22%2C%20tltp%3A%20%22Drag%20direction%20and%20speed.%20With%20a%20negative%20value%2C%20the%20page%20content%20moves%20in%20the%20same%20direction%20as%20the%20cursor.%22%2C%20cmd%3A%20%22document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29.cmds%28%27moverate%27%29%3Bevent.stopPropagation%28%29%3B%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuseparator%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuitem%22%2C%20label%3A%20%22Scroll%20inertia%22%2C%20type%3A%20%22checkbox%22%2C%20checked%3A%20%22%22%20+%20btnPref%28%27InertiaEnabled%27%29%20+%20%22%22%2C%20cmd%3A%20%22document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29.cmds%28%27inertiaToggle%27%29%3Bevent.stopPropagation%28%29%3B%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuitem%22%2C%20label%3A%20%22Scroll%20inertia%20threshold%22%2C%20cmd%3A%20%22document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29.cmds%28%27inertiaThreshold%27%29%3Bevent.stopPropagation%28%29%3B%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuitem%22%2C%20label%3A%20%22Scroll%20inertia%20speed%22%2C%20cmd%3A%20%22document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29.cmds%28%27inertiarate%27%29%3Bevent.stopPropagation%28%29%3B%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuseparator%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuitem%22%2C%20label%3A%20%22Cancel%20GrabScroll%20on%20images%22%2C%20type%3A%20%22checkbox%22%2C%20checked%3A%20%22%22%20+%20btnPref%28%22NotImage%22%29%20+%20%22%22%2C%20tltp%3A%20%22Do%20not%20start%20GrabScroll%20if%20cursor%20is%20over%20an%20image.%22%2C%20cmd%3A%20%22document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29.cmds%28%27NotImage%27%29%3Bevent.stopPropagation%28%29%3B%22%7D%2C%0A%09%09%09%7BnodeName%3A%20%22menuitem%22%2C%20label%3A%20%22Cancel%20GrabScroll%20on%20links%22%2C%20type%3A%20%22checkbox%22%2C%20checked%3A%20%22%22%20+%20btnPref%28%27NotClicableLink%27%29%20+%20%22%22%2C%20tltp%3A%20%22Do%20not%20start%20GrabScroll%20if%20cursor%20is%20over%20a%20clickable%20link.%22%2C%20cmd%3A%20%22document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29.cmds%28%27clickable%27%29%3Bevent.stopPropagation%28%29%3B%22%7D%0A%09%09%5D.forEach%28function%28m%29%20%7B%0A%0A%09%09%09var%20mItem%20%3D%20document.createElement%28m.nodeName%29%3B%0A%0A%09%09%09if%20%28%27label%27%20in%20m%29%20mItem.setAttribute%28%27label%27%2C%20m.label%29%3B%0A%09%09%09if%20%28%27type%27%20in%20m%29%20mItem.setAttribute%28%27type%27%2C%20m.type%29%3B%0A%09%09%09if%20%28%27checked%27%20in%20m%29%20mItem.setAttribute%28%27checked%27%2C%20m.checked%29%3B%0A%09%09%09if%20%28%27tltp%27%20in%20m%29%20mItem.setAttribute%28%27tooltiptext%27%2C%20m.tltp%29%3B%0A%09%09%09if%20%28%27cmd%27%20in%20m%29%20mItem.setAttribute%28%27oncommand%27%2C%20m.cmd%29%3B%0A%0A%09%09%09menuPopup.appendChild%28mItem%29%3B%0A%09%09%7D%29%3B%0A%0A%09%09menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%09%09addDestructor%28function%28%29%20%7BmenuPopup.parentNode.removeChild%28menuPopup%29%7D%29%3B%0A%09%7D%0A%7D%0A%0A%0Athis.cmds%20%3D%20function%20%28aCmd%29%20%7B%0A%09switch%20%28aCmd%29%20%7B%0A%09case%20%22button%22%3A%0A%09%09GrabScroll.button%28%29%3B%0A%09%09break%3B%0A%09case%20%22threshold%22%3A%0A%09%09GrabScroll.threshold%28%29%3B%0A%09%09break%3B%0A%09case%20%22moverate%22%3A%0A%09%09GrabScroll.moverate%28%29%3B%0A%09%09break%3B%0A%09case%20%22inertiaToggle%22%3A%0A%09%09GrabScroll.inertiaToggle%28%29%3B%0A%09%09break%3B%0A%09case%20%22inertiaThreshold%22%3A%0A%09%09GrabScroll.inertiaThreshold%28%29%3B%0A%09%09break%3B%0A%09case%20%22inertiarate%22%3A%0A%09%09GrabScroll.inertiarate%28%29%3B%0A%09%09break%3B%0A%09case%20%22clickable%22%3A%0A%09%09GrabScroll.clickable%28%29%3B%0A%09%09break%3B%0A%09case%20%22NotImage%22%3A%0A%09%09sBP%28%22NotImage%22%2C%20%21btnPref%28%22NotImage%22%29%29%3B%0A%09%09break%3B%0A%09%7D%0A%7D%3B%0A%0Athis.style.opacity%20%3D%20btnPref%28%22GrabScrollEnabled%22%29%20%3F%20%221%22%20%3A%20%22.50%22%3B%0A%0Athis.tooltipText%20%3D%20%22%5Cn%5Ct%22%20+%20%28self.label%20%7C%7C%20self.name%29%20+%20%22%5Cn%5Cn%22%20+%0A%09%22%5CtL%3D%20Enable/Disable%20GrabScroll%5Ct%5Cn%22%20+%0A%09%22%5CtM%3D%20Open%20Options%20menu%5Ct%5Cn%5Cn%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.toggleGrabScroll%28%29%3B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Спасибо за наводку. У Alice0775 много потаскал, а это не видел. Как раз аддон "Grab and Drag" на грани подыхания. У Alice0775, кстати, новее версия есть GrabScroll_Fx29.uc.xul, но я не потяну под CB его переделать. Можете поставить  userchrome.js.xpi + этот userChrome.js должен лежать в папке chrome, и туда же GrabScroll_Fx29.uc.xul сохранить.

UPD: Починил и менюшку кнопки по СКМ.

turbot пишет

кстати, новее версия есть GrabScroll_Fx29.uc.xul, но я не потяну под CB его переделать.

Кнопка GrabScroll которую ты исправлял как раз создана на основе GrabScroll_Fx29.uc.xul

bunda1
Может и так, но я имел ввиду, что код текущей версии содержит много правок, которых нет в кнопке.

Может вы переделаете текущую версию под CB? :blush:

turbot пишет

bunda1
Может и так, но я имел ввиду, что код текущей версии содержит много правок, которых нет в кнопке.

А какие правки, может не стоит переделывать а лучше просто перевести кнопку что я как раз и делаю для себя?

bunda1 пишет

А какие правки

А чтоб я знал! :D Если б я понимал, что они делают, то, наверное, и сам переделать бы смог. :)

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

turbot пишет

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

Да кнопка от октябрь 20, 2014 значит исправлений в изначальном коде много. Можно и попробовать переделать текущую версию GrabScroll_Fx29.uc.xul под CB, но мне от этого кода начинается когнитивный диссонанс так что могу и не осилить переделку.

turbot, может лучше к автору кнопки обратиться? Odyseus не откажет. Custom Buttons • View topic - GrabScroll. bunda1 и так загружен.

lokiju
Я там уже второй год не могу зарегистрироваться - местный спам-фильтр не пускает. Так что только если кто другой отпишется. :)

turbot
difabor там отметился, именно в этой теме Custom Buttons • View topic - GrabScroll.)

lokiju пишет

bunda1 и так загружен.

Ну я ж и не настаиваю. :)
userChrome.js у меня и так стоит, хоть и пытаюсь от него избавиться, потихоньку перетаскивая нужное в cb. Но раз с этой не выйдет, придется оставить.

turbot пишет

Но раз с этой не выйдет, придется оставить.

Переделать в кнопку как раз не слишком трудно но мне обязательно нужно понять и улучшить код и переделать под себя, иначе не интересно. Вот где проблема :D

lokiju пишет

turbot
difabor там отметился, именно в этой теме Custom Buttons • View topic - GrabScroll.)

А что нужно? Что-то написать автору?
turbot, не стесняйтесь, я напишу. Но вот только проверить не смогу - у меня 28-я версия.
Имхо - дополнение Scrollbar Anywhere работает лучше - там нет паразитного выскакивания контекстного меню.
Но может и дополнение устарело?

difabor пишет

там нет паразитного выскакивания контекстного меню

Я лкм таскаю. Не проблема. :)

difabor пишет

А что нужно? Что-то написать автору?

Ну, во-первых (хоть это я уже и поправил)

Mishania пишет

На ff42 пользовался кнопочкой GrabScroll, обновился до ff45 и работать перестала. Можно поправить?

А во-вторых, чтобы обновил

кнопка от октябрь 20, 2014

код кнопки до актуальной у Alice0775

Commits on Apr 21, 2016

:)

turbot пишет

код кнопки до актуальной у Alice0775

Commits on Apr 21, 2016

Вот:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGrabScroll%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAlklEQVQ4jaWTuw0EIQxEd8UFBFeEczoYCYkm6IeiSU+zySIZjs9+JrKQ52GDvW1jGQA84905953k/gsASVJBlvoAKAajAeq8yu/eqE0l1uciYqcl6+QeYNpSm9wCvPe/nDNDCKxMABhjNG0VI1VVFFNKia8Ad/QK0HvE/Q5k+AuP+n8CWY72DHJpL0aAy0slIlYv0Gp8D2h34zRWWYjjAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...............%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20cbu.setPrefs%28%22grabScroll.enable%22%2C%20%21cbu.getPrefs%28%22grabScroll.enable%22%29%29%3B%0A%20%20%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20%7B%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%7D%3B%20%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20...............%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u0431%u0440%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%27%2C%20func%3A%20%27GrabScroll.button%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0427%u0443%u0432%u0441%u0442%u0432%u0438%u0442%u0435%u043B%u044C%u043D%u043E%u0441%u0442%u044C%27%2C%20func%3A%20%27GrabScroll.threshold%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u041D%u0430%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%27%2C%20func%3A%20%27GrabScroll.moverate%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0418%u043D%u0435%u0440%u0446%u0438%u044F%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%27%2C%20pref%3A%20%27grabScroll.enableinertia%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u041F%u043E%u0440%u043E%u0433%20%u0438%u043D%u0435%u0440%u0446%u0438%u0438%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%27%2C%20func%3A%20%27GrabScroll.inertiaThreshold%28%29%27%20%7D%2C%20%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u0435%u043B%u0438%u0447%u0438%u043D%u0430%20%u0438%u043D%u0435%u0440%u0446%u0438%u0438%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%27%2C%20func%3A%20%27GrabScroll.inertiarate%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u041F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u0435%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u043D%u0430%20%u0441%u0441%u044B%u043B%u043A%u0430%u0445%27%2C%20pref%3A%20%27grabScroll.clickable%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u041F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u0435%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u043D%u0430%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%u0445%27%2C%20pref%3A%20%27grabScroll.notimage%27%20%7D%2C%0A%5D%3B%0Avar%20menuPopup%20%3D%20self.appendChild%28%20document.createElement%28%22menupopup%22%29%20%29%3B%0Aarray.forEach%28m%3D%3E%20%7B%0A%20%20%20if%20%28%22separator%22%20in%20m%29%20%7B%20menuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%20return%20%7D%3B%0A%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2C%20m.label%29%3B%0A%20%20%20if%20%28%22pref%22%20in%20m%29%20%7B%20%0A%20%20%20%20%20%20%20%20mItem.setAttribute%28%27type%27%2C%20%27checkbox%27%29%3B%0A%20%20%20%20%20%20%20%20mItem.setAttribute%28%27checked%27%2C%20cbu.getPrefs%28m.pref%29%20%29%3B%0A%20%20%20%20%20%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20cbu.setPrefs%28m.pref%2C%20%21cbu.getPrefs%28m.pref%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20else%20mItem.onclick%20%3D%28%29%3D%3E%20eval%28m.func%29%3B%0A%20%20%20menuPopup.appendChild%28mItem%29%3B%0A%7D%29%3B%0AmenuPopup.setAttribute%28%22onclick%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%0A%0Avar%20GrabScroll%20%3D%20%7B%0A%20%20TOLERANCE%20%20%20%20%20%20%20%20%20%3A3%2C%20%20%20%20//mouse%20move%0A%20%20TOLERANCE_WHEN_NO_H_SCROLL%20%3A%205%2C%20//%0A%20%20CANCEL_WHEN_SELECTION%3A%20true%2C%20%20//%0A%20%20IGNOREURL%3A%20%5B%22http%3A//maps.google.*/*%22%2C%20%22http%3A//maps.yahoo.co.jp/pl*%22%2C%20%22http%3A//map.yahoo.co.jp/pl*%22%2C%20%22http%3A//map.goo.ne.jp/*%22%2C%20%22http%3A//www.mapion.co.jp/c/f*%22%2C%20%22http%3A//books.google.co.jp/books%3Fid%3D*%22%2C%20%22http%3A//books.google.co.jp/books%3Fid%3D*%22%5D%2C%0A%0A%20%20CURSOR%3A%20%22-moz-grab%22%2C%20//%20cursor%20style%0A%0A%20%20mStatus%3A%200%2C%20%20%20//0%3A%3F%3F%3F%2C%201%3Amousedown%2C%202%3Amousemove%2C%203%3Amouseup%0A%20%20mLastX%3A%200%2C%0A%20%20mLastY%3A%200%2C%0A%20%20mCursor%3A%20null%2C%0A%20%20mCursorElement%3A%20null%2C%0A%20%20_target%3A%20null%2C%20%20//%0A%20%20_target2%3A%20null%2C%20//%0A%20%20_isImage%3Afalse%2C%0A%20%20_timer%3A0%2C%20%20%20%20%20%20//mouseup%0A%20%20_ctimer%3A0%2C%0A%20%20_mtimer%3A%20false%2C%0A%20%20cScroll%3Afalse%2C%0A%20%20cSpeedX%3A0%2C%0A%20%20cSpeedY%3A0%2C%0A%20%20_doc%3Anull%2C%0A%20%20_MOVERATEpZoom%3A1%2C%0A%20%20_window%3A%20null%2C%0A%0A%20%20initGrabScroll%3A%20function%28%29%20%7B%0A%20%20%20%20var%20curentBrowserVersion%20%3D%20Services.appinfo.platformVersion%3B%20//%2731.*%27%0A%20%20%20%20var%20compareResult%20%3D%20Services.vc.compare%28curentBrowserVersion%2C%20%2746.*%27%29%3B%0A%20%20%20%20this.Bug1209100%20%3D%20%28compareResult%20%3C%200%29%20%3F%2010%20%3A%201%3B%0A%20%20%20%20%0A%20%20%20%20if%20%28%20GrabScroll.activeBrowser%28%29.mPanelContainer%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20this._window%20%3D%20GrabScroll.activeBrowser%28%29.mPanelContainer%3B%0A%20%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20else%20this._window%20%3D%20document.getElementById%28%27content%27%29%3B%0A%20%20%20%20%0A%20%20%20%20for%28%20var%20aURL%20in%20this.IGNOREURL%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20if%20%28%20this.IGNOREURL%5BaURL%5D%20%3D%3D%3D%20%27%27%20%29%20continue%3B%0A%20%20%20%20%20%20%20%20%20this.IGNOREURL%5BaURL%5D%20%3D%20this.convert2RegExp%28this.IGNOREURL%5BaURL%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20this._window.setCapture%28%29%3B%0A%20%20%20%20addEventListener%28%22mousedown%22%2C%20this%2C%20true%2C%20this._window%29%3B%0A%20%20%20%20addEventListener%28%22click%22%2C%20this%2C%20true%2C%20this._window%29%3B%0A%20%20%20%20addEventListener%28%22mouseup%22%2C%20this%2C%20true%2C%20this._window%29%3B%0A%20%20%20%20addEventListener%28%27pagehide%27%2C%20this%2C%20false%2C%20gBrowser%29%3B%0A%20%20%20%20gPrefService.addObserver%28%27grabScroll.%27%2C%20GrabScroll.initPrefs%2C%20false%29%3B%0A%20%20%20%20addDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28%27grabScroll.%27%2C%20GrabScroll.initPrefs%29%20%29%3B%0A%20%20%20%20%0A%20%20%20%20setTimeout%28%28%29%3D%3E%20GrabScroll.initPrefs%28%29%2C%200%29%3B%0A%20%20%7D%2C%0A%0A%20%20initPrefs%3A%20%20function%28%29%20%7B%0A%20%20%20%20this.MOUSEBUTTON%20%20%20%20%20%20%3D%20cbu.getPrefs%28%22grabScroll.button%22%29%20%7C%7C%200%3B%0A%20%20%20%20this.MOVERATE%20%20%20%20%20%20%20%20%20%3D%20cbu.getPrefs%28%22grabScroll.moverate%22%29%20%7C%7C%20-1%3B%0A%20%20%20%20this.TIMER%20%20%20%20%20%20%20%20%20%20%20%20%3D%20cbu.getPrefs%28%22grabScroll.timer%22%29%20%7C%7C%20500%3B%0A%20%20%20%20this.INERTIA%20%20%20%20%20%20%20%20%20%20%3D%20cbu.getPrefs%28%22grabScroll.enableinertia%22%29%20%7C%7C%20false%3B%0A%20%20%20%20this.INERTIATHRESHOLD%20%3D%20cbu.getPrefs%28%22grabScroll.inertiathreshold%22%29%20%7C%7C%2080%3B%0A%20%20%20%20this.INERTIARATE%20%20%20%20%20%20%3D%20cbu.getPrefs%28%22grabScroll.inertiarate%22%29%20%7C%7C%2050%3B%0A%20%20%20%20this.NOTIMAGE%20%20%20%20%20%20%20%20%20%3D%20cbu.getPrefs%28%22grabScroll.notimage%22%29%20%7C%7C%20true%3B%0A%20%20%20%20this.NOTCLICABLELINK%20%20%3D%20cbu.getPrefs%28%22grabScroll.clickable%22%29%20%7C%7C%20true%3B%0A%20%20%20%20%0A%20%20%20%20GrabScroll.setIcon%28%29%3B%0A%20%20%7D%2C%0A%0A%20%20activeBrowser%3A%20function%28%29%20%7B%0A%20%20%20%20return%20%28%27SplitBrowser%27%20in%20window%20%3F%20SplitBrowser.activeBrowser%20%3A%20null%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20%20gBrowser%3B%0A%20%20%7D%2C%0A%0A%20%20handleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20e%20%3D%20new%20XPCNativeWrapper%28e%29%3B%0A%20%20%20%20switch%28e.type%29%20%7B%0A%20%20%20%20%20%20case%20%22mousedown%22%3A%0A%20%20%20%20%20%20%20%20if%20%28%20this.cScroll%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20clearTimeout%28this.cScroll%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20this.cSpeedX%20%3D%20this.cSpeedY%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28%20cbu.getPrefs%28%22grabScroll.enable%22%29%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20this.grabStart%28e%29%3B%0A%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20%22mousemove%22%3A%0A%20%20%20%20%20%20%20%20this.mousemove%28e%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22click%22%3A%0A%20%20%20%20%20%20%20%20this.click%28e%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22mouseup%22%3A%0A%20%20%20%20%20%20%20%20this.mouseup%28e%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%27pagehide%27%3A%0A%20%20%20%20%20%20%20%20this._doc%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this.mCursorElement%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this._target%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this._target2%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this._isImage%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this.NS%20%3D%20this.EW%20%3D%20this.NSEW%20%3D%20null%3B%0A%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20grabStart%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28this.mStatus%20%3D%3D%203%29%0A%20%20%20%20%20%20this.mStatus%20%3D%200%3B%0A%0A%20%20%20%20if%20%28this.MOUSEBUTTON%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20if%20%28Math.abs%28this.mLastX%20-%20e.screenX%29%20%3C%205%20%26%26%0A%20%20%20%20%20%20%20%20%20%20Math.abs%28this.mLastY%20-%20e.screenY%29%20%3C%205%20%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20doc%20%3D%20e.originalTarget.ownerDocument%3B%0A%20%20%20%20if%20%28%21doc%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20if%20%28doc.contentType%20%3D%3D%20%27application/vnd.mozilla.xul+xml%27%29%0A%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20this._doc%20%3D%20doc%3B%0A%0A%20%20%20%20if%20%28e.button%20%3D%3D%20this.MOUSEBUTTON%20%26%26%20this.mStatus%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20if%20%28this.CANCEL_WHEN_SELECTION%20%26%26%20this.MOUSEBUTTON%20%3D%3D%200%20%26%26%20doc.defaultView.getSelection%28%29%20%21%3D%20%22%22%29%0A%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20%20%20this._target%20%3D%20e.originalTarget%3B%0A%0A%20%20%20%20%20%20if%20%28/%5E%28html%7Cbody%29%24/.test%28this._target.localName.toLowerCase%28%29%29%20%7C%7C%20this._target.clientHeight%20%3E%2030000%29%0A%20%20%20%20%20%20%20%20this._target2%20%3D%20null%3B%0A%20%20%20%20%20%20else%20if%20%28/div/.test%28this._target.localName.toLowerCase%28%29%29%20%26%26%20this._target.clientHeight%20%3E%201000%29%0A%20%20%20%20%20%20%20%20this._target2%20%3D%20null%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20this._target2%20%3D%20this._target%3B%0A%0A%20%20%20%20%20%20for%20%28aURL%20in%20this.IGNOREURL%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28this.IGNOREURL%5BaURL%5D%20%3D%3D%3D%20%27%27%29continue%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28doc.documentURI.match%28this.IGNOREURL%5BaURL%5D%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20dump%28this.IGNOREURL%5BaURL%5D+%27%5Cn%27+ex%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28this.isParentEditableNode%28this._target%29%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20if%20%28this.isParentDraggableNode%28this._target%29%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20if%20%28this.isIgnore%28this._target%29%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20if%20%28this.isVideoControl%28e.target%29%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20if%20%28this.isParentClickableNode%28this._target%29%29%7B%0A%20%20%20%20%20%20%20%20if%20%28this.NOTCLICABLELINK%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20if%20%28%21%28%27linkDragSelection%27%20in%20window%29%29%0A%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20this._isImage%20%3D%20this.isImage%28e%29%3B%0A%20%20%20%20%20%20if%20%28this._isImage%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28this.NOTIMAGE%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20var%20target%20%3D%20this._target%3B%0A%20%20%20%20%20%20while%20%28target%29%7B%0A%20%20%20%20%20%20%20%20if%20%28%22getAttribute%22%20in%20target%20%26%26%20target.getAttribute%28%22draggable%22%29%20%3D%3D%20%22true%22%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20style%20%3D%20this._doc.defaultView.getComputedStyle%28target%2C%20null%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28/resize%7Cmove%7Call-scroll%7Ccrosshair/.test%28style.getPropertyValue%28%22cursor%22%29%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20%28/resize%7Cmove%7Call-scroll%7Ccrosshair/.test%28style.getPropertyValue%28%22auto%22%29%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%7D%0A%20%20%20%20%20%20%20%20target%20%3D%20target.parentNode%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28this.MOUSEBUTTON%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20this._timer%20%3D%20new%20Date%28%29.getTime%28%29%3B%0A%20%20%20%20%20%20this.mLastX%20%3D%20e.screenX%3B%0A%20%20%20%20%20%20this.mLastY%20%3D%20e.screenY%3B%0A%20%20%20%20%20%20this.mStatus%20%3D%201%3B%0A%20%20%20%20%20%20this._MOVERATEpZoom%20%3D%20%20this.MOVERATE%20/%20%28ZoomManager.useFullZoom%20%3F%20ZoomManager.zoom%20%3A%201%29%3B%0A%0A%20%20%20%20%20%20%5Bthis.NS%2C%20this.EW%2C%20this.NSEW%5D%20%3D%20this.getScrollView%28e%29%3B%0A%20%20%20%20%20%20this._window.addEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%20%20%20%20%20%20this.setCursor%28this._target2%2C%20this.CURSOR%29%3B%0A%20%20%20%20%20%20this.resetCursorWithTimer%28this._target2%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20adjustedTimer%3A%20function%28%29%7B%0A%20%20%20%20var%20magTimer%20%3D%20this.TIMER%3B%0A%20%20%20%20return%20magTimer%3B%0A%20%20%7D%2C%0A%0A%20%20grabFinish%3A%20%20function%28%29%20%7B%0A%20%20%20%20this.resetCursorTimer%28%29%3B%0A%20%20%20%20this.resetCursor%28%29%3B%0A%0A%20%20%20%20this._window.removeEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%20%20%20%20var%20selCon%20%3D%20this.getSelconForDoc%28this._doc%29%3B%0A%20%20%20%20if%20%28selCon%29%0A%20%20%20%20%20%20selCon.setDisplaySelection%28selCon.SELECTION_ON%29%3B%0A%20%20%7D%2C%0A%0A%20%20mousemove%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28this.mStatus%20%3D%3D%202%20%7C%7C%20this.mStatus%20%3D%3D%201%20%29%20%7B%0A%20%20%20%20%20%20var%20x%20%3D%20e.screenX%3B%0A%20%20%20%20%20%20var%20y%20%3D%20e.screenY%3B%0A%20%20%20%20%20%20var%20doc%20%3D%20e.originalTarget.ownerDocument%3B%0A%0A%20%20%20%20%20%20if%20%28this.mStatus%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21this._isImage%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%28new%20Date%28%29.getTime%28%29%20-%20this._timer%29%20%3E%20this.adjustedTimer%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20this.mStatus%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28Math.abs%28x-this.mLastX%29%20%3C%20this.TOLERANCE_WHEN_NO_H_SCROLL%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20movingh%20%3D%20Math.abs%28x-this.mLastX%29%20%3E%20Math.abs%28y-this.mLastY%29%20*%2050%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21this._isImage%20%26%26%20this.MOUSEBUTTON%20%3D%3D%200%20%20%26%26%20this.isText%28e%29%20%20%26%26%20movingh%20%26%26%20%21this.EW%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.mStatus%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%28Math.abs%28x%20-%20this.mLastX%29%20+%20Math.abs%28y%20-%20this.mLastY%29%20%3C%20this.TOLERANCE%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28this.MOUSEBUTTON%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20selCon%20%3D%20this.getSelconForDoc%28this._doc%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28selCon%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20selection%20%3D%20selCon.getSelection%28selCon.SELECTION_NORMAL%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20selection.removeAllRanges%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20selCon.setDisplaySelection%28selCon.SELECTION_OFF%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%22ucjsMouseGestures%22%20in%20window%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20ucjsMouseGestures._isMouseDownR%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20this.mLastX%20%3D%20x%20-%20%28x%20-%20this.mLastX%29%20/%2010%3B%0A%20%20%20%20%20%20%20%20this.mLastY%20%3D%20y%20-%20%28y%20-%20this.mLastY%29%20/%2010%3B%0A%20%20%20%20%20%20%20%20this.mStatus%20%3D%202%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28this._ctimer%29%0A%20%20%20%20%20%20%20%20this.resetCursorTimer%28%29%3B%0A%0A%20%20%20%20%20%20if%20%28this._mtimer%29%0A%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20%20%20this.cSpeedX%20%3D%20this._MOVERATEpZoom%20*%20%28x%20-%20this.mLastX%29%3B%0A%20%20%20%20%20%20this.cSpeedY%20%3D%20this._MOVERATEpZoom%20*%20%28y%20-%20this.mLastY%29%3B%0A%0A%20%20%20%20%20%20if%20%28this.scroll%28e%29%29%20%7B%0A%20%20%20%20%20%20%20%20this.mLastX%20%3D%20x%3B%0A%20%20%20%20%20%20%20%20this.mLastY%20%3D%20y%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20getSelconForDoc%3A%20function%20getSelconForDoc%28doc%29%7B%0A%20%20%20%20if%20%28%21doc%29%0A%20%20%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20var%20aFrame%20%3D%20doc.defaultView%3B%0A%20%20%20%20if%20%28%21aFrame%29%0A%20%20%20%20%20return%20null%3B%0A%20%20%20%20var%20docShell%20%3D%20this.getDocShellForFrame%28aFrame%29%3B%0A%20%20%20%20var%20selCon%20%3D%20docShell%0A%20%20%20%20%20%20.QueryInterface%28Components.interfaces.nsIInterfaceRequestor%29%0A%20%20%20%20%20%20.getInterface%28Components.interfaces.nsISelectionDisplay%29%0A%20%20%20%20%20%20.QueryInterface%28Components.interfaces.nsISelectionController%29%3B%0A%20%20%20%20return%20selCon%3B%0A%20%20%7D%2C%0A%0A%20%20getDocShellForFrame%3A%20function%20getDocShellForFrame%28aFrame%29%7B%0A%20%20%20%20return%20aFrame%0A%20%20%20%20%20%20.QueryInterface%28Components.interfaces.nsIInterfaceRequestor%29%0A%20%20%20%20%20%20.getInterface%28Components.interfaces.nsIWebNavigation%29%0A%20%20%20%20%20%20.QueryInterface%28Components.interfaces.nsIDocShell%29%3B%0A%20%20%7D%2C%0A%0A%20%20click%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e.button%20%3D%3D%20this.MOUSEBUTTON%20%26%26%20this.mStatus%20%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28e.button%20%3D%3D%200%20%26%26%20this.mStatus%20%3E%3D%202%20%26%26%20this._doc%20instanceof%20Ci.nsIImageDocument%29%20%7B%0A%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20this.mStatus%20%3D%200%3B%0A%20%20%7D%2C%0A%0A%20%20mouseup%3A%20%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e.button%20%3D%3D%20this.MOUSEBUTTON%20%26%26%20this.mStatus%20%3E%201%29%20%7B%0A%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%0A%20%20%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20%20%20if%20%28this.mStatus%20%3D%3D%202%29%0A%20%20%20%20%20%20%20%20this.mStatus%20%3D%203%3B%0A%0A%20%20%20%20%20%20if%20%28this.INERTIA%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28Math.abs%28this.cSpeedX%29%20%3E%20this.INERTIATHRESHOLD%20%7C%7C%20Math.abs%28this.cSpeedY%29%20%3E%20this.INERTIATHRESHOLD%20%29%29%7B%0A%20%20%20%20%20%20%20%20if%20%28this.cScroll%29%0A%20%20%20%20%20%20%20%20%20%20clearTimeout%28this.cScroll%29%3B%0A%20%20%20%20%20%20%20%20var%20v%20%3D%20this.INERTIARATE%3B%0A%20%20%20%20%20%20%20%20if%20%28this.cSpeedX%20%3E%200%29%0A%20%20%20%20%20%20%20%20%20%20this.cSpeedX%20%3D%20Math.min%28this.cSpeedX%2C%20v%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20this.cSpeedX%20%3D%20Math.max%28this.cSpeedX%2C%20-v%29%3B%0A%20%20%20%20%20%20%20%20if%20%28this.cSpeedY%20%3E%200%29%0A%20%20%20%20%20%20%20%20%20%20this.cSpeedY%20%3D%20Math.min%28this.cSpeedY%2C%20v%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20this.cSpeedY%20%3D%20Math.max%28this.cSpeedY%2C%20-v%29%3B%0A%0A%20%20%20%20%20%20%20%20var%20Start%3B%0A%20%20%20%20%20%20%20%20function%20scrolling%28e%2C%20self%29%7B%0A%20%20%20%20%20%20%20%20%20%20Start%20%3D%20new%20Date%28%29.getTime%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20self.scroll2%28e%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20self.cScroll%20%3D%20setTimeout%28arguments.callee%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math.max%2825%20-%20%28%28new%20Date%28%29%29.getTime%28%29-Start%29%2C%200%29%2C%20e%2C%20self%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20this.scroll2%28e%29%3B%0A%20%20%20%20%20%20%20%20scrolling%28e%2C%20this%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20if%20%28e.button%20%3D%3D%20this.MOUSEBUTTON%20%26%26%20this.mStatus%20%3D%3D%201%29%7B%0A%20%20%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20%20%20this.mStatus%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20scroll2%3A%20function%28e%29%7B%0A%20%20%20%20var%20ay%20%3D%20Math.abs%28this.cSpeedY%29%3B%0A%20%20%20%20var%20ax%20%3D%20Math.abs%28this.cSpeedX%29%3B%0A%20%20%20%20if%20%28ay%20%3C%2010%20%26%26%20ax%20%20%3C%2010%29%7B%0A%20%20%20%20%20%20%20clearTimeout%28this.cScroll%29%3B%0A%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20this.scroll%28e%29%3B%0A%20%20%20%20if%20%20%20%20%20%20%28ax%20%3E%3D%20100%29%20this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ax%20%3C%20100%29%20this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ax%20%3C%2020%29%20this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ax%20%3C%2010%29%20%20this.cSpeedX%20%3D%200%3B%0A%0A%20%20%20%20if%20%20%20%20%20%20%28ay%20%3E%3D%20100%29%20this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ay%20%3C%20100%29%20this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ay%20%3C%2020%29%20this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ay%20%3C%2010%29%20this.cSpeedY%20%3D%200%3B%0A%20%20%7D%2C%0A%0A%20%20scroll%3A%20function%28e%29%7B%0A%20%20%20%20var%20minScroll%20%3D%20this.Bug1209100%3B%20//%20prevent%20Bug%201209100%2C%2010px%20%3Cfx46.%201px%20%3E%3Dfx46%0A%20%20%20%20this._mtimer%20%3D%20true%3B%0A%20%20%20%20var%20flg%20%3D%20false%3B%0A%20%20%20%20if%20%28this.NS%20%26%26%20this.NS%20%3D%3D%20this.EW%20%26%26%0A%20%20%20%20%20%20%20%20%28Math.abs%28this.cSpeedX%29%20%3E%20minScroll%20%7C%7C%20Math.abs%28this.cSpeedY%29%20%3E%20minScroll%29%29%20%7B%0A%20%20%20%20%20%20flg%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28%22scrollBy%22%20in%20this.NS%29%20%7B%0A%20%20%20%20%20%20%20%20this.NS.scrollBy%28this.cSpeedX%2C%20this.cSpeedY%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20this.NS.scrollLeft%20+%3D%20this.cSpeedX%3B%0A%20%20%20%20%20%20%20%20this.NS.scrollTop%20%20+%3D%20this.cSpeedY%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20if%20%28this.NS%20%26%26%20Math.abs%28this.cSpeedY%29%20%3E%20minScroll%29%20%7B%0A%20%20%20%20%20%20%20%20flg%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20if%20%28%22scrollBy%22%20in%20this.NS%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.NS.scrollBy%280%2C%20this.cSpeedY%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.NS.scrollTop%20+%3D%20this.cSpeedY%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28this.EW%20%26%26%20Math.abs%28this.cSpeedX%29%20%3E%20minScroll%29%7B%0A%20%20%20%20%20%20%20%20flg%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20if%20%28%22scrollBy%22%20in%20this.EW%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.EW.scrollBy%28this.cSpeedX%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.EW.scrollLeft%20+%3D%20this.cSpeedX%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20setTimeout%28function%28self%29%7B%0A%20%20%20%20%20%20self._mtimer%20%3D%20false%3B%0A%20%20%20%20%7D%2C%2020%2C%20this%29%3B%0A%20%20%20%20return%20flg%3B%0A%20%20%7D%2C%0A%0A%20%20isText%3A%20function%28e%29%20%7B%0A%20%20%20%20return%20e.explicitOriginalTarget.nodeType%20%3D%3D%20document.TEXT_NODE%3B%0A%20%20%7D%2C%0A%0A%20%20isImage%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e.target%20instanceof%20Ci.nsIImageLoadingContent%29%0A%20%20%20%20%20%20return%20e.target%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%7D%2C%0A%0A%20%20isIgnore%3A%20function%28aNode%29%7B%0A%20%20%20%20%20while%20%28aNode%29%7B%0A%20%20%20%20%20%20var%20name%20%3D%20aNode.nodeName.toLowerCase%28%29%3B%0A%20%20%20%20%20%20if%20%28name%20%3D%3D%20%22html%22%29%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20if%20%28/%28scrollbar%7Cselect%7Coption%7Cembed%7Cobject%7Ctree%7Capplet%7Cstatusbar%29/.test%28name%29%29%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20aNode%20%3D%20aNode.parentNode%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20false%3B%0A%20%20%7D%2C%0A%0A%20%20isParentClickableNode%20%3A%20function%28aNode%29%20%7B%0A%20%20%20%20if%20%28%21aNode%29%20return%20null%3B%0A%20%20%20%20var%20d%20%3D%20aNode.ownerDocument%3B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20var%20xpathResult%20%3D%20d.evaluate%28%0A%20%20%20%20%20%20%20%20%20%20%27ancestor-or-self%3A%3A*%5B%28%28local-name%28%29%20%3D%20%22a%22%20or%20local-name%28%29%20%3D%20%22A%22%29%29%20or%20local-name%28%29%20%3D%20%22button%22%20or%20local-name%28%29%20%3D%20%22BUTTON%22%20or%20%28%28local-name%28%29%20%3D%20%22input%22%20or%20local-name%28%29%20%3D%20%22INPUT%22%29%20and%20%28@type%20%3D%20%22SUBMIT%22%20or%20@type%20%3D%20%22submit%22%20or%20@type%20%3D%20%22BUTTON%22%20or%20@type%20%3D%20%22button%22%20or%20@type%20%3D%20%22IMAGE%22%20or%20@type%20%3D%20%22image%22%29%29%5D%27%2C%0A%20%20%20%20%20%20%20%20%20%20aNode%2C%0A%20%20%20%20%20%20%20%20%20%20this.NSResolver%2C%0A%20%20%20%20%20%20%20%20%20%20XPathResult.FIRST_ORDERED_NODE_TYPE%2C%0A%20%20%20%20%20%20%20%20%20%20null%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20catch%28e%29%20%7B%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20xpathResult.singleNodeValue%3B%0A%20%20%7D%2C%0A%0A%20%20NSResolver%20%3A%20%7B%0A%20%20%20%20lookupNamespaceURI%20%3A%20function%28aPrefix%29%20%7B%0A%20%20%20%20%20%20switch%20%28aPrefix%29%20%7B%0A%20%20%20%20%20%20%20%20case%20%27xul%27%3A%0A%20%20%20%20%20%20%20%20%20%20return%20%27http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%27%3B%0A%20%20%20%20%20%20%20%20case%20%27html%27%3A%0A%20%20%20%20%20%20%20%20case%20%27xhtml%27%3A%0A%20%20%20%20%20%20%20%20%20%20return%20%27http%3A//www.w3.org/1999/xhtml%27%3B%0A%20%20%20%20%20%20%20%20case%20%27xlink%27%3A%0A%20%20%20%20%20%20%20%20%20%20return%20%27http%3A//www.w3.org/1999/xlink%27%3B%0A%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20return%20%27%27%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20isParentEditableNode%20%3A%20function%28node%29%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20if%20%28node.ownerDocument.designMode%20%3D%3D%20%27on%27%29%0A%20%20%20%20%20%20%20%20return%20node%3B%0A%20%20%20%20%7D%20catch%28e%29%20%7B%7D%0A%20%20%20%20while%20%28node%20%26%26%20node.parentNode%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21%28node%20instanceof%20Ci.nsIDOMNSEditableElement%29%29%0A%20%20%20%20%20%20%20%20%20%20throw%200%3B%0A%20%20%20%20%20%20%20%20node.QueryInterface%28Ci.nsIDOMNSEditableElement%29%3B%0A%20%20%20%20%20%20%20%20return%20node%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20node%20%3D%20node.parentNode%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20null%3B%0A%20%20%7D%2C%0A%0A%20%20isParentDraggableNode%20%3A%20function%28node%29%7B%0A%20%20%20%20while%20%28node%20%26%26%20node.parentNode%29%20%7B%0A%20%20%20%20%20%20if%20%28node.getAttribute%28%27draggable%27%29%20%3D%3D%20%27true%27%29%0A%20%20%20%20%20%20%20%20return%20node%3B%0A%20%20%20%20%20%20node%20%3D%20node.parentNode%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20null%3B%0A%20%20%7D%2C%0A%0A%20%20isVideoControl%3A%20function%28node%29%20%7B%0A%20%20%20%20if%20%28/%5E%28audio%7Cvideo%29%24/i.test%28node.localName%29%29%20%7B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20var%20i%20%3D%200%3B%0A%20%20%20%20%20%20while%20%28i%20%3C%20node.childNodes.length%29%20%7B%0A%20%20%20%20%20%20%20%20var%20child%20%3Dnode.childNodes%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28child.hasAttribute%28%27controls%27%29%20%26%26%20child.getAttribute%28%27controls%27%29%20%3D%3D%20%27controls%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20i++%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20false%3B%0A%20%20%7D%2C%0A%0A%20%20setCursor%3A%20function%28element%2C%20cursor%29%20%7B%0A%20%20%20%20if%20%28%21%21element%20%26%26%20element.style%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20this.mCursor%20%3D%20element.style.cursor%3B%0A%20%20%20%20%20%20%20%20this.mCursorElement%20%20%3D%20element%3B%0A%20%20%20%20%20%20%20%20element.style.cursor%20%3D%20cursor%3B%0A%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%0A%20%20resetCursor%3A%20function%28%29%20%7B%0A%20%20%20%20var%20element%20%3D%20this.mCursorElement%3B%0A%20%20%20%20if%20%28%21%21element%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20element.style.cursor%20%3D%20this.mCursor%3B%0A%20%20%20%20%20%20%20%20%20%20this.mCursor%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%20%20this.mCursorElement%20%3D%20null%3B%0A%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20resetCursorWithTimer%3A%20function%28%29%20%7B%0A%20%20%20%20if%20%28this._ctimer%29%0A%20%20%20%20%20%20clearTimeout%28this._ctimer%29%3B%0A%20%20%20%20this._ctimer%20%3D%20setTimeout%28function%28self%29%7B%0A%20%20%20%20%20%20self.resetCursor%28%29%3B%0A%20%20%20%20%7D%2C%20this.adjustedTimer%28%29%2C%20this%29%3B%0A%20%20%7D%2C%0A%0A%20%20resetCursorTimer%3A%20function%28%29%20%7B%0A%20%20%20%20if%20%28this._ctimer%29%20%7B%0A%20%20%20%20%20%20clearTimeout%28this._ctimer%29%3B%0A%20%20%20%20%20%20this._ctimer%20%3D%20null%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20convert2RegExp%3A%20function%28%20pattern%20%29%20%7B%0A%20%20%20%20var%20s%20%3D%20new%20String%28pattern%29%3B%0A%20%20%20%20var%20res%20%3D%20new%20String%28%22%5E%22%29%3B%0A%0A%20%20%20%20for%20%28var%20k%20%3D%200%20%3B%20k%20%3C%20s.length%20%3B%20k++%29%20%7B%0A%20%20%20%20%20%20switch%28s%5Bk%5D%29%20%7B%0A%20%20%20%20%20%20%20%20case%20%27*%27%20%3A%0A%20%20%20%20%20%20%20%20%20%20res%20+%3D%20%22.*%22%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%27.%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%3F%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%5E%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%24%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27+%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%7B%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%5B%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%7C%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%28%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%29%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%5D%27%20%3A%0A%20%20%20%20%20%20%20%20%20%20res%20+%3D%20%22%5C%5C%22%20+%20s%5Bk%5D%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%27%5C%5C%27%20%3A%0A%20%20%20%20%20%20%20%20%20%20res%20+%3D%20%22%5C%5C%5C%5C%22%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%27%20%27%20%3A%0A%20%20%20%20%20%20%20%20%20%20//%20Remove%20spaces%20from%20URLs.%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20default%20%3A%0A%20%20%20%20%20%20%20%20%20%20res%20+%3D%20s%5Bk%5D%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20new%20RegExp%28res%20+%20%27%24%27%2C%20%22i%22%29%3B%0A%20%20%7D%2C%0A%0A%20%20button%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22button%28L%20M%20R%29%3A%20%22%2C%22LMR%22.substr%28this.MOUSEBUTTON%2C1%29%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20switch%28value.toUpperCase%28%29%29%7B%0A%20%20%20%20%20%20case%20%22M%22%3A%20value%20%3D1%3B%20break%3B%0A%20%20%20%20%20%20case%20%22R%22%3A%20value%20%3D2%3B%20break%3B%0A%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20case%20%22L%22%3A%20value%20%3D0%3B%20break%3B%0A%20%20%20%20%7D%0A%20%20%20%20this.MOUSEBUTTON%20%3D%20value%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.button%22%2C%20value%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20threshold%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22Timer%3A%20%22%2Cthis.TIMER%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.TIMER%20%3D%20parseInt%28value%2C10%29%3B%0A%20%20%20%20if%28%20this.TIMER%20%3C%3D0%20%7C%7C%20%21this.TIMER%20%29%20this.TIMER%20%3D%201000%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.timer%22%2C%20this.TIMER%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20moverate%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22%5B+-%5Drate%3A%20%22%2Cthis.MOVERATE%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.MOVERATE%20%3D%20parseInt%28value%2C10%29%3B%0A%20%20%20%20if%28%20%21this.MOVERATE%20%29%20this.MOVERATE%20%3D%20-1%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.moverate%22%2C%20this.MOVERATE%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20inertiaThreshold%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22Kinetic%20scroll%20threshold%3A%20%22%2Cthis.INERTIATHRESHOLD%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.INERTIATHRESHOLD%20%3D%20parseInt%28value%2C10%29%3B%0A%20%20%20%20if%28%20%21this.INERTIATHRESHOLD%20%29%20this.INERTIATHRESHOLD%20%3D%2020%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.inertiathreshold%22%2C%20this.INERTIATHRESHOLD%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20inertiarate%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22Kinetic%20scroll%20speed%3A%20%22%2Cthis.INERTIARATE%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.INERTIARATE%20%3D%20parseInt%28value%2C10%29%3B%0A%20%20%20%20if%28%20%21this.INERTIARATE%20%29%20this.INERTIARATE%20%3D%2020%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.inertiarate%22%2C%20this.INERTIARATE%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20setIcon%3A%20function%28%29%7B%0A%20%20%20%20//document.getAnonymousNodes%28self%29%5B1%5D.src%20%3D%20%21cbu.getPrefs%28%22grabScroll.enable%22%29%0A%20%20%20%20//%3F%20self.image%0A%20%20%20%20//%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%3B%0A%20%20%20%20self.checked%20%3D%20cbu.getPrefs%28%22grabScroll.enable%22%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20getScrollView%3A%20function%20%28e%29%20%7B%0A%20%20%20%20var%20NS%2CEW%2CNSEW%3B%0A%20%20%20%20NS%20%3D%20EW%20%3D%20NSEW%20%3D%20null%3B%0A%20%20%20%20var%20_scrollingView%20%3D%20null%3B%0A%20%20%20%20var%20overflowx%2C%20overflowy%2C%20ox%2C%20oy%3B%0A%20%20%20%20var%20scw%2C%20sch%2C%20horz%2C%20vert%3B%0A%20%20%20%20var%20doc%2C%20style%3B%0A%20%20%20%20var%20borderTop%3B%0A%20%20%20%20var%20borderBottom%3B%0A%20%20%20%20var%20borderLeft%3B%0A%20%20%20%20var%20borderRight%3B%0A%0A%20%20%20%20if%20%28e.originalTarget.ownerDocument.contentType%20%3D%3D%20%22application/xml%22%29%20%7B%0A%20%20%20%20%20%20_scrollingView%20%3D%20e.originalTarget.ownerDocument.defaultView%3B%0A%0A%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%21%3D%20_scrollingView.scrollMinX%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxY%20%21%3D%20_scrollingView.scrollMinY%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%20%20%20%20NS%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%20%20%20%20EW%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20EW%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28_scrollingView.scrollMaxY%20%21%3D%20_scrollingView.scrollMinY%29%20%7B%0A%20%20%20%20%20%20%20%20NS%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28_scrollingView.frameElement%29%20%7B%0A%20%20%20%20%20%20%20%20//this.findNearestScrollableElement%28_scrollingView.frameElement%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20//%20abort%20scrolling%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20for%20%28_scrollingView%20%3D%20e.originalTarget%3B%20_scrollingView%3B%20_scrollingView%20%3D%20_scrollingView.parentNode%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28_scrollingView%20instanceof%20HTMLElement%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.localName.toUpperCase%28%29%20%3D%3D%20%22HTML%22%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_scrollingView.localName.toUpperCase%28%29%20%3D%3D%20%22BODY%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20_scrollingView%20%3D%20_scrollingView.ownerDocument.defaultView%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%21%3D%20_scrollingView.scrollMinX%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxY%20%21%3D%20_scrollingView.scrollMinY%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28_scrollingView.scrollMaxY%20%21%3D%20_scrollingView.scrollMinY%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28_scrollingView.frameElement%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//return%20this.getScrollView%28%7BoriginalTarget%20%3A%20_scrollingView.frameElement%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20abort%20scrolling%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%3E%200%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.frameElement%20%26%26%20%21NS%20%26%26%20%21EW%20%26%26%20%21NSEW%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20this.getScrollView%28%7BoriginalTarget%20%3A%20_scrollingView.frameElement%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.localName.toLowerCase%28%29%20%3D%3D%20%22select%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_scrollingView.parentNode.focus%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20overflowx%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20overflowy%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20ox%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20oy%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20doc%20%3D%20_scrollingView.ownerDocument%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20style%20%3D%20doc.defaultView.getComputedStyle%28_scrollingView%2C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20overflowx%20%3D%20style.getPropertyValue%28%22overflow-x%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20ox%20%3D%20overflowx%20%21%3D%20%22hidden%22%20%26%26%20overflowx%20%21%3D%20%22visible%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20overflowy%20%3D%20style.getPropertyValue%28%22overflow-y%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20oy%20%3D%20overflowy%20%21%3D%20%22hidden%22%20%26%26%20overflowy%20%21%3D%20%22visible%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%28ex%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20borderTop%20%20%20%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20borderBottom%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20borderLeft%20%20%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20borderRight%20%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28/%5E%28table%7Ctd%7Cth%29%24/i.test%28_scrollingView.localName%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc%20%3D%20_scrollingView.ownerDocument%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20style%20%3D%20doc.defaultView.getComputedStyle%28_scrollingView%2C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20borderTop%20%20%20%20%3D%20style.getPropertyValue%28%22border-top-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20borderBottom%20%3D%20style.getPropertyValue%28%22border-bottom-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20borderLeft%20%20%20%3D%20style.getPropertyValue%28%22border-left-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20borderRight%20%20%3D%20style.getPropertyValue%28%22border-right-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%28ex%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20scw%20%3D%20_scrollingView.clientWidth%3B%0A%20%20%20%20%20%20%20%20%20%20horz%20%3D%20ox%20%26%26%20scw%20%21%3D%3D%200%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scw%20+%20borderLeft%20+%20borderRight%20%3C%20_scrollingView.scrollWidth%3B%0A%20%20%20%20%20%20%20%20%20%20sch%20%3D%20_scrollingView.clientHeight%3B%0A%20%20%20%20%20%20%20%20%20%20vert%20%3D%20oy%20%26%26%20sch%20%21%3D%3D%200%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sch%20+%20borderTop%20+%20borderBottom%20%3C%20_scrollingView.scrollHeight%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28horz%20%26%26%20vert%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28horz%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28vert%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20//%20for%0A%20%20%20%20%7D%0A%20%20%20%20return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%20%20%7D%0A%7D%3B%0AGrabScroll.initGrabScroll%28%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Только неплохо бы перевести меню и сообщения как следует ну и иконки красивые нарисовать.

bunda1
Забыли исключения для ПКМ с клавишами модификаторами сделать.

bunda1 пишет

Только неплохо бы перевести меню и сообщения как следует ну и иконки красивые нарисовать.

Меня самого эти "ускорения инерции прокрутки" озадачивают. :) Все и так отлично. Спасибо большое. :beer:

22-04-2016 02:24:40
Что-то настройки инерции не работают (неправ: работают - меняются, но никак не сказываются на работе). И в консоль ругается на и т.п.

Еще курсор обратно не меняется порой, когда отпускаешь. В скрипте с этим и вышенаписанным  нет проблем.

turbot, в свете того, что bunda1 сделал обновлённый вариант - стОит теребить автора?
И ещё. Если Вы это повесили на лкм, не трудно ли выделять текст с модификатором?
У меня вообще-то есть идея как скроллить без того, чтобы мешать жестам :)

difabor пишет

turbot, в свете того, что bunda1 сделал обновлённый вариант - стОит теребить автора?

Если вам не трудно. Все-таки, не все нашим форумом пользуются. :)

И ещё. Если Вы это повесили на лкм, не трудно ли выделять текст с модификатором?

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

turbot
Done: http://custombuttons.sourceforge.net/forum/viewtopic.php?p=11886#p11886

Всем спасибо, поставил кнопку от bunda1 и проблемы исчезли. Отдельное спасибо difabor за сообщение автору. Меня в мой старый аккаунт не запустили, а зарегистрироваться по новой не сумел.
PS. А я поторопился, на 45 так и не заработало, я ж в 42 пробовал. Это может у меня косяк?

Уважаемые разработчики, не могли бы вы пожалуйста сделать кнопку с таким функционалом? Изменять значки папок в закладках (для каждой папки свой значок)

Stakhovsky
А зачем кнопка? Засуньте стиль в Stylish или userChrome.css.

turbot
Так там же все ручками надо вставлять, постоянно открывать стиль, редактировать. Ну кнопка как всегда ускоряет процесс, удобство.
Жаль не работает это - Set Icon
Там можно было вставить сразу ссылку на иконку и все
В этом стиле я проверял, вставлял ссылку сразу на иконку - ничего, но получилось с кодом base64
Допустим так - нашел иконку - скопировал изображение как base64 или ссылку на него - правый клик на папке закладок - изменить иконку - вставил код или ссылку - ок

22-04-2016 19:58:00
Можно ли что бы кнопка создавала в стиле тот шаблон что есть с заполненным именем от названия папки на коротой кликнул пкм и выбрал изменить иконку, а с буфера (без окна) брала ссылку на иконку? и удалялся с удалением папки.

Mishania пишет

Всем спасибо, поставил кнопку от bunda1 и проблемы исчезли. Отдельное спасибо difabor за сообщение автору. Меня в мой старый аккаунт не запустили, а зарегистрироваться по новой не сумел.
PS. А я поторопился, на 45 так и не заработало, я ж в 42 пробовал. Это может у меня косяк?

Автор ответил: http://custombuttons.sourceforge.net/fo … 887#p11887

difabor
Вы бы заодно попросили его обновить код до актуальной версии оригинала. :)

И, если не трудно, отпишите ему здесь, что предложенный фикс некорректно работает в ночнушке: команда custombuttons.copyURI();, для копирования кнопки в буфер, вообще перестает работать. :(

Я дурак. Зацепил следующую функцию при замене. Все работает. :)

turbot
Насчёт кнопки Быстрое переключение параметров about:config

скрытый текст
1. Поддержка записи юникода в стро́ковых настройках может и не нужна,
    но, о её отсутствии, наверно, сто́ит упомянуть в описании кнопки.
    И, возможно, ещё добавить, что кнопка заточена под мышь, и с клавиатуры работать не будет.

2. Кнопка выглядит нормально на #nav-bar'е, а на других дефолтных тулбарах выглядит хуже.
    Вот скрин с чистого профиля. FF 45, CB 0.0.5.8.9

Выделить код

Код:

data:image/png;base64,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

3. Ерунда конечно, но раз уж решил, что кнопка будет this.type = 'menu';
    то хотя бы подними эту строку в начало кода и сделай её такой:
    if (this.type != 'menu') { this.type = 'menu'; return; }

    А то там и так на каждый (!) объект в массиве регистрируется по два листенера,
    так ещё и когда дойдёт до this.type = 'menu'; то всё зря, кнопка переинициализируется,
    и код пойдёт заново, и, как бы, обидно за четырнадцать лишних листенеров.

Dumby
Ага, спасибо. :)

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

1

А разве  about:config его поддерживает? :rolleyes: Да и в других кнопках его наличие к неприятным последствиям приводит, чо это только мне сноску делать? :D Например, PasteButtonsForStylish к такому же приводит. :P (я вот был изрядно озадачен, кгогда символ \u000E в названии пункта меню сломал CB вообще)

Dumby пишет

И, возможно, ещё добавить, что кнопка заточена под мышь, и с клавиатуры работать не будет.

Я пытаюсь это поправить, но oncommand почему-то не работает. Был бы благодарен за подсказку, почему. :blush:

Dumby пишет

А то там и так на каждый (!) объект в массиве регистрируется по два листенера,

Я подумал, это лучше, чем по обсерверу. Я не прав? :blush: К тому ж, уж больно монструозно тогда выходило (по причине, конечно, моей неграмотности)...


Но я старался, правда... shuffle.gif

Dumby пишет

и, как бы, обидно за четырнадцать лишних листенеров.

А разве повторно добавляемые листенеры, будучи одинаковыми, не игнорируются? Мне что-то такое попадалось на mdn. Был уверен, что это не проблема.

Вот, нашел:

Несколько одинаковых слушателей события

Если зарегистрировано несколько одинковых EventListeners на одном EventTarget с одинаковыми параметрами, дублирующиеся слушатели игнорируются. Они не позволяют EventListener'у быть вызванным дважды, и так как одинаковые слушатели игнорируются, не требуется удалять их вручную с помощью метода removeEventListener.


Поправил кое-что. Спасибо за подсказки.

turbot
Насчёт кнопки Быстрое переключение параметров about:config

На мой взгляд if (this.type != 'menu') { this.type = 'menu'; return; } там не нужен и

Выделить код

Код:

// Удаляет дропмаркер у кнопки и уменьшает оставшийся отступ в конце иконки
var that = this;
this.hideDm = function() {
  var dm = document.getAnonymousElementByAttribute(that, "class", "toolbarbutton-menu-dropmarker");
  var icon = document.getAnonymousElementByAttribute(that, "class", "toolbarbutton-icon");
  if (dm) {
    dm.setAttribute("collapsed", "true");
    if (this.parentNode.customizationtarget === "nav-bar-customization-target") icon.setAttribute('style', '-moz-padding-end: 7px');
  } else {
    setTimeout(that.hideDm, 10);
  }
}
this.hideDm();

тоже не нужен, а то получается что this.type = 'menu' добавляет дропмаркер у кнопки а код // Удаляет дропмаркер у кнопки... его удаляет.

bunda1 пишет

На мой взгляд if (this.type != 'menu') { this.type = 'menu'; return; } там не нужен

Это вынужденная мера. Без type = 'menu' кнопка мигает при кликах по пунктам меню. Не знаю, почему. Пожаловались - поправил как сумел. :)

turbot пишет
bunda1 пишет

На мой взгляд if (this.type != 'menu') { this.type = 'menu'; return; } там не нужен

Это вынужденная мера. Без type = 'menu' кнопка мигает при кликах по пунктам меню. Не знаю, почему.

Вроде не мигает:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EQuick%20toogle%20for%20about%3Aconfig%20preferences%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAACXBIWXMAAABnAAAAZwHVKNQmAAADGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6egY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBA3y7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBwgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJAwMDg3N+QWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8EgX3xMw8BUMDVQYqg4jIKAX08EGIIUByaVEZhMXIwMDAoM2Qw7CDkY8xi/EskynTYmYR5i4WFpZGVibWNjYetmnsyuybOVw5bnIWcHFyLeV24n7E08KrwXuOr4xfnv+0QIWguuANoS5hO+EvIqtFU8TkxW6Jz5AIlxSXvCE1RzpBRk3mrexWuXp5LwUxhSeKm5SalENU1FR+qp5TW6JerRGsqaPFpvVIe5/ObN0qvSh9KwMZg3+Gj4yOG68xmWxaZZZs7mNhbqlkxWf12/qlzQ3bE3Y77Vc7zHWc6NTqXOVS4JruFuce7hHg6eXl6u3oY+dr7WfpbxFgEWgRZBlsHWIX6hTmFu4dERgZHhUfnR5TEFsZ1xzflzArcVnS5uSDKedT76W9S/+XKZClmG2S454bnZef31owq3Bj0YniByU/ygTLtStcKxOqaqpn1GytvVT3oYG/Ua/Jrzm/ZULrprYr7d87pbvsu5N7OnvX9V3t/zNRZZLP5JIp86aemPZphuxMz1mlsxfOOT/3z3ztBVELOxftXPxqqfQyn+V1KzaufLJaYo3P2sZ129a/2ai0KXLzxC0ntjFut9pRvHPtrhd7lPbG7Zu1/9pB4UOBh/uPnD3Gc9z7RPfJM6d5zvidnXDu0gXRixGX5lx+cFXlWtb19Te+3rK53Xzn1D2h+9EPljx8+9j8SePTM8/FXyS9XPfq9xuPt1PfPf5g+LHh0/kv8l/zv+3/IfAz6deWP2x/I/6t/v8fAATCIM0IpJTRAAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAEOSURBVHjabJGtS0MBFMXPJojBMMPwC1nV6FCZoGj/ZVGYiIJDBOEFm3XFP2DFIAu6ZrAYBM0OREEUnN20ICI40OfbsTzYB48b7oF74J4PWUnDjMU4GSv5PEubCo/UuwjMs8FEjLOEPNCkRloWAyxb3GEOGWKRTSLeLFYwXyLFBeaGH8w7z/yyRZlvilR5YV+kuMYY04r3NpNEfBByaYksZUyDAoPsYELmmKJKjj0CS0QYU4rl3WLMeceRCBMItW7CMEd9LxbIcUqOXQJLFld9Iks9Ii0qPTYjAo5pscYJrxzIIs1SV1B5ivzRsFjFfHaiLrDOaIxHCLmnyRmp5LLytKnw1FNWH2XaYoyM9T8AOvnw3YUOg90AAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0411%u044B%u0441%u0442%u0440%u043E%u0435%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0435%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%20about%3Aconfig%20%u043E%u0442%2023.04.2016%0Athis._handleClick%20%3D%28%29%3D%3E%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%20%0A%0Avar%20menuPopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%0AmenuPopup.id%20%3D%20%27quick-aboutconfig-menupopup%27%3B%0AmenuPopup.onmouseup%20%3De%3D%3E%20e.preventDefault%28%29%3B%20//%20%u041D%u0435%20%u0437%u0430%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20%u043F%u043E%u0434%u043C%u0435%u043D%u044E%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0430%u0445%20%u043F%u043E%20%u043F%u0443%u043D%u043A%u0442%u0430%u043C%20%u043C%u0435%u043D%u044E%0A%0A//%20nodeName%3A%20menuitem%20-%20%u0434%u043B%u044F%20%u043B%u043E%u0433%u0438%u0447%u0435%u0441%u043A%u0438%u0445%28boolean%29%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%2C%20menu%20-%20%u0434%u043B%u044F%20%u0446%u0435%u043B%u044B%u0445%28integer%29%20%u0438%20%u0441%u0442%u0440%u043E%u043A%u043E%u0432%u044B%u0445%28string%29.%20menuseparator%20-%20%u0434%u043B%u044F%20%u0440%u0430%u0437%u0434%u0435%u043B%u0438%u0442%u0435%u043B%u044F.%0A//%20pref%20-%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%20about%3Aconfig.%0A//%20restart%20%28%u0437%u0430%u0434%u0430%u0432%u0430%u0442%u044C%20%u0441%20%u043F%u0443%u0441%u0442%u044B%u043C%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%u043C.%20%u0442.%u0435.%2C%20restart%3A%20%22%22%29%20-%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0432%u043E%u0437%u043C%u043E%u0436%u043D%u043E%u0441%u0442%u044C%20%u043F%u0435%u0440%u0435%u0437%u0430%u043F%u0443%u0441%u043A%u0430%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%0A//%20%28%u0441%20%u043F%u043E%u0434%u0442%u0432%u0435%u0440%u0436%u0434%u0435%u043D%u0438%u0435%u043C%20%u0432%20%u0434%u0438%u0430%u043B%u043E%u0433%u043E%u0432%u043E%u043C%20%u043E%u043A%u043D%u0435%29%20%u043F%u043E%u0441%u043B%u0435%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430.%0A//%20userChoice%20-%20%u0437%u0430%u0434%u0430%u0435%u0442%20%u043F%u0440%u0435%u0434%u043F%u043E%u0447%u0438%u0442%u0430%u0435%u043C%u043E%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u0438%20%u0435%u0441%u043B%u0438%20%u0442%u0435%u043A%u0443%u0449%u0435%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u0441%20%u043D%u0438%u043C%20%u043D%u0435%20%u0441%u043E%u0432%u043F%u0430%u0434%u0430%u0435%u0442%2C%20%u043F%u0443%u043D%u043A%u0442%20%u043C%u0435%u043D%u044E/%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043C%u0435%u043D%u044E%20%u043F%u043E%u043C%u0435%u0447%u0430%u044E%u0442%u0441%u044F%20%u043A%u0440%u0430%u0441%u043D%u044B%u043C%20%u0446%u0432%u0435%u0442%u043E%u043C.%0A//%20%u0422%u0430%u043A%u0436%u0435%20%u043C%u043E%u0436%u043D%u043E%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043F%u0440%u0435%u0434%u0443%u043F%u0440%u0435%u0436%u0434%u0430%u044E%u0449%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u0434%u043B%u044F%20%u0442%u0430%u043A%u0438%u0445%20%u043F%u0443%u043D%u043A%u0442%u043E%u0432.%20%u0421%u043C.%20%u0441%u0442%u0438%u043B%u044C%20%u0432%20%u043F%u043E%u0441%u0442%u0435%20%u043A%u043A%u043D%u043E%u043F%u043A%u0438.%0A//%20strValues%20-%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u044F%20%u0438%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0430%u0435%u043C%u043E%u0435%20%u0432%20%u043C%u0435%u043D%u044E%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u044F.%20%u0417%u0430%u0434%u0430%u0432%u0430%u0442%u044C%20%u0434%u043B%u044F%20%u0446%u0435%u043B%u044B%u0445%28integer%29%20%u0438%20%u0441%u0442%u0440%u043E%u043A%u043E%u0432%u044B%u0445%28string%29%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432.%0A//%20%u0417%u0430%u0434%u0430%u0435%u0442%u0441%u044F%20%u0432%20%u0432%u0438%u0434%u0435%3A%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%2C%2C%2C%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%7C%7C%7C%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u04352%2C%2C%2C%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u04352%7C%7C%7C%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u04353%2C%2C%2C%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u04353%20%u0438%20%u0442.%u0434.%0A//%20%u041F%u043E%u043B%u043D%u043E%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0430%u0435%u0442%u0441%u044F%20%u0432%20%u043F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%u0445%2C%20%u043F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043D%u0430%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043F%u043E%u0434%u043C%u0435%u043D%u044E/%u043F%u0443%u043D%u043A%u0442%20%u043F%u043E%u0434%u043C%u0435%u043D%u044E.%0A//%20%u0414%u043B%u044F%20%u043B%u043E%u0433%u0438%u0447%u0435%u0441%u043A%u0438%u0445%28boolean%29%20-%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0430%u0435%u0442%u0441%u044F%20%u0441%u0440%u0430%u0437%u0443%20%u043F%u043E%u0441%u043B%u0435%20%u0441%u0430%u043C%u043E%u0433%u043E%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430%20%28%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20true%20-%20%u0442%u0430%u043A%u0436%u0435%20%u0441%u0442%u0430%u0432%u0438%u0442%20%u0433%u0430%u043B%u043E%u0447%u043A%u0443%20%u0434%u043B%u044F%20%u043D%u0435%u0433%u043E%29.%0A//%20%u041B%u041A%u041C%20%u043F%u043E%20%u043F%u0443%u043D%u043A%u0442%u0430%u043C%20%u043C%u0435%u043D%u044E%20-%20%u043F%u0435%u0440%u043A%u043B%u044E%u0447%u0430%u0435%u0442%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u044F%20%u0434%u043B%u044F%20%u043B%u043E%u0433%u0438%u0447%u0435%u0441%u043A%u0438%u0445%28boolean%29%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%2C%0A//%20%u043B%u044E%u0431%u0430%u044F%20%u043A%u043D%u043E%u043F%u043A%u0430%20%u043F%u043E%20%u043F%u0443%u043D%u043A%u0442%u0430%u043C%20%u0432%20%u0441%u0443%u0431%u043C%u0435%u043D%u044E%20-%20%u0437%u0430%u0434%u0430%u0435%u0442%20%u044D%u0442%u043E%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u0434%u043B%u044F%20%u0446%u0435%u043B%u044B%u0445%28integer%29%20%u0438%20%u0441%u0442%u0440%u043E%u043A%u043E%u0432%u044B%u0445%28string%29%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432.%0A//%20%u041F%u041A%u041C%20%u043F%u043E%20%u043F%u0443%u043D%u043A%u0442%u0430%u043C%20%u043C%u0435%u043D%u044E%20%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044E%20%u0441%u0443%u0431%u043C%u0435%u043D%u044E%20-%20%u0441%u0431%u0440%u0430%u0441%u044B%u0432%u0430%u0435%u0442%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430%20%u0432%20%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u043E%u0435.%0A%5B%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22dom.workers.enabled%22%2C%20userChoice%3A%20%22false%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22dom.indexedDB.enabled%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22dom.storage.enabled%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22javascript.enabled%22%2C%20userChoice%3A%20%22true%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22noscript.allowURLBarJS%22%2C%20userChoice%3A%20%22false%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menuseparator%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menu%22%2C%20pref%3A%20%22general.useragent.override%22%2C%20userChoice%3A%20%22Mozilla/5.0%20%28X11%3B%20U%3B%20Linux%20x86_64%3B%20rv%3A48.0%29%20Gecko/20100101%20Firefox/48.0%22%2C%20strValues%3A%20%22Mozilla/5.0%20%28X11%3B%20U%3B%20Linux%20x86_64%3B%20rv%3A48.0%29%20Gecko/20100101%20Firefox/48.0%2C%2C%2CFirefox48/Linux%7C%7C%7CMozilla/5.0%20%28Windows%20NT%206.1%3B%20WOW64%3B%20rv%3A45.0%29%20Gecko/20100101%20Firefox/45.0%2C%2C%2CFirefox45/Windows%7C%7C%7C%2C%2C%2C%u041F%u0443%u0441%u0442%u043E%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menu%22%2C%20pref%3A%20%22general.useragent.locale%22%2C%20restart%3A%20%22%22%2C%20strValues%3A%20%22en-US%2C%2C%2CEnglish%7C%7C%7Cru%2C%2C%2C%u0420%u0443%u0441%u0441%u043A%u0438%u0439%22%7D%0A%5D.forEach%28function%28m%29%20%7B%0A%0A%20%20var%20mItem%20%3D%20document.createElement%28m.nodeName%29%3B%0A%0A%20%20if%20%28%22restart%22%20in%20m%29%20var%20browserRestart%20%3D%20%27if%20%28custombuttons.confirmBox%28null%2C%20%22Restart%3F%22%2C%20%22Yes%22%2C%20%22Cancel%22%29%29%20Services.startup.quit%28Services.startup.eAttemptQuit%20%7C%20Services.startup.eRestart%29%3B%27%3B%0A%0A%20%20if%20%28m.nodeName%20%3D%3D%3D%20%22menuitem%22%29%20%7B%0A%20%20%20%20mItem.setAttribute%28%27type%27%2C%20%27checkbox%27%29%3B%0A%20%20%20%20mItem.setAttribute%28%27class%27%2C%20%27menuitem-iconic%27%29%3B%0A%20%20%20%20mItem.setAttribute%28%27onclick%27%2C%20%27if%20%28event.button%20%3D%3D%3D%200%29%20custombuttons.setPrefs%28%22%27%20+%20m.pref%20+%20%27%22%2C%20%21custombuttons.getPrefs%28%22%27%20+%20m.pref%20+%20%27%22%29%29%3B%20if%20%28event.button%20%3D%3D%3D%202%29%20%7Bevent.preventDefault%28%29%3B%20custombuttons.clearPrefs%28%22%27%20+%20m.pref%20+%20%27%22%29%7D%3B%20%27%20+%20browserRestart%20+%20%27%27%29%3B%0A%20%20%7D%0A%0A%20%20if%20%28m.nodeName%20%3D%3D%3D%20%22menu%22%29%20%7B%0A%20%20%20%20mItem.setAttribute%28%27oncontextmenu%27%2C%20%27event.preventDefault%28%29%3B%20custombuttons.clearPrefs%28%22%27%20+%20m.pref%20+%20%27%22%29%3B%20%27%20+%20browserRestart%20+%20%27%27%29%3B%0A%0A%20%20%20%20var%20subMenu%20%3D%20mItem.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%0A%20%20%20%20for%20%28var%20value%20of%20m.strValues.split%28%27%7C%7C%7C%27%29%29%20%7B%0A%20%20%20%20%20%20var%20submItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20%20var%20smVal%20%3D%20value.split%28%27%2C%2C%2C%27%29%5B0%5D%3B%0A%20%20%20%20%20%20var%20smName%20%3D%20value.split%28%27%2C%2C%2C%27%29%5B1%5D%3B%0A%0A%20%20%20%20%20%20submItem.setAttribute%28%27type%27%2C%20%27radio%27%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%27class%27%2C%20%27menu-iconic%27%29%3B%0A%20%20%20%20%20%20submItem.setAttribute%28%27label%27%2C%20smName%29%3B%0A%20%20%20%20%20%20submItem.setAttribute%28%27tooltiptext%27%2C%20smVal%29%3B%0A%20%20%20%20%20%20submItem.setAttribute%28%27onclick%27%2C%20%27event.preventDefault%28%29%3B%20custombuttons.setPrefs%28%22%27%20+%20m.pref%20+%20%27%22%2C%20%22%27%20+%20smVal%20+%20%27%22%29%3B%20%27%20+%20browserRestart%20+%20%27%27%29%3B%0A%0A%20%20%20%20%20%20subMenu.appendChild%28submItem%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20menuPopup.appendChild%28mItem%29%3B%0A%0A%20%20//%20%u041B%u0438%u0441%u0442%u0435%u043D%u0435%u0440%u044B%20%u043E%u0442%u0441%u043B%u0435%u0436%u0438%u0432%u0430%u044E%u0449%u0438%u0435%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0435%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%0A%20%20//%20%u0438%20%u0443%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u044E%u0449%u0438%u0435%20%u0441%u043E%u043E%u0442%u0432%u0435%u0442%u0441%u0442%u0432%u0443%u044E%u0449%u0438%u0435%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044F%20%u0438%20%u0447%u0435%u043A%u0431%u043E%u043A%u0441%u044B%20%u0434%u043B%u044F%20%u043F%u0443%u043D%u043A%u0442%u043E%u0432%20%u043C%u0435%u043D%u044E%20%u043F%u0440%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0438%20%u043C%u0435%u043D%u044E%20%u0438%20%u043A%u043B%u0438%u043A%u0430%u0445%0A%20%20for%20%28var%20type%20of%20%5B%27click%27%2C%20%27popupshowing%27%5D%29%20%7B%0A%20%20%20%20menuPopup.addEventListener%28type%2C%20%28e%29%3D%3E%20%7B%0A%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%22pref%22%20in%20m%29%20var%20val%20%3D%20custombuttons.getPrefs%28m.pref%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28m.nodeName%20%3D%3D%3D%20%27menuitem%27%29%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27checked%27%2C%20val%29%3B%0A%20%20%20%20%20%20%20%20%20%20mItem.label%20%3D%20m.pref%20+%20%27%3B%27%20+%20val%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28%22userChoice%22%20in%20m%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20usrChc%20%3D%20%28val.toString%28%29%20%3D%3D%3D%20m.userChoice%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27style%27%2C%20usrChc%20%3F%20%27%27%20%3A%20%27color%3A%20orangered%20%21important%3B%20font-weight%3A%20bold%20%21important%3B%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27user-choice%27%2C%20usrChc%20%3F%20%27true%27%20%3A%20%27false%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28subMenu%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20smitem%20of%20subMenu.getElementsByTagName%28%27menuitem%27%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20smval%20%3D%20smitem.getAttribute%28%27tooltiptext%27%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20smitem.setAttribute%28%27checked%27%2C%20%28val%20%3D%3D%3D%20smval%29%20%3F%20true%20%3A%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28m.nodeName%20%3D%3D%3D%20%22menu%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20try%20%7Bvar%20vname%20%3D%20subMenu.getElementsByAttribute%28%27checked%27%2C%20%27true%27%29%5B0%5D.getAttribute%28%27label%27%29%7D%20catch%28e%29%20%7Bvname%20%3D%20%27Default%27%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27label%27%2C%20m.pref%20+%20%27%20-%20%27%20+%20vname%29%3B%0A%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27tooltiptext%27%2C%20val%20%7C%7C%20%27This%20preferences%20has%20null%20value%20or%20does%20not%20exist.%27%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28%22userChoice%22%20in%20m%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20smUsrChc%20%3D%20%28val%20%3D%3D%3D%20%27%27%20+%20m.userChoice%20+%20%27%27%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27style%27%2C%20smUsrChc%20%3F%20%27%27%20%3A%20%27color%3A%20orangered%20%21important%3B%20font-weight%3A%20bold%20%21important%3B%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27user-choice%27%2C%20smUsrChc%20%3F%20%27true%27%20%3A%20%27false%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%2C%200%29%0A%20%20%20%20%7D%2C%20false%29%0A%20%20%7D%0A%7D%29%3B%0A%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

А с просто

Выделить код

Код:

document.getAnonymousElementByAttribute(that, "class", "toolbarbutton-menu-dropmarker").setAttribute("collapsed", "true");

- то ли не работает, то ли просто ругается в консоль на симанки. Подглядел выход в кнопке okkamas_knife(кажется).


bunda1
Мигает. Меняет состояние с нажатого-отжатого. У меня так и было первоначально. :)

turbot пишет

Мигает. Меняет состояние с нажатого-отжатого. У меня так и было первоначально. :)

А, вот ты о чём, ну тогда:

Выделить код

Код:

menuPopup.onmouseup = menuPopup.onmousedown =e=> e.preventDefault(); // Не закрывать меню кнопки и подменю при кликах по пунктам меню

bunda1
О, спасибо! :) Сейчас поправлю.

23-04-2016 20:45:45
bunda1
А теперь деструктор нужен для попапа?

turbot пишет

Но я старался, правда...

Да-да, уж поверь, я оценил.

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

чо это только мне сноску делать?

Эээ, кто что-то выложил в Готовых, тот и сноски к этому делает, если захочет. Очевидно же.

А разве  about:config его поддерживает?

Видимо я неправильно или непонятно выразился.
Вот сейчас дописал словечко в конец. Жму, но в конфиг пишет EC9.

Выделить код

Код:

data:image/png;base64,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

Ещё раз: никто не напрягает что-то исправлять в коде,
но подправить описание, вроде, несложно и правильно само по себе.

но oncommand почему-то не работает. Был бы благодарен за подсказку, почему

Где посмотреть код с oncommand, который не работает?

Я подумал, это лучше, чем по обсерверу. Я не прав?

Что значит «не прав»? Кнопка работает, — значит прав.
А оптимизировать можно/нужно до бесконечности.

А разве повторно добавляемые листенеры, будучи одинаковыми, не игнорируются?

Игнорируются, будучи одинаковыми. Одинаковыми.

Если зарегистрировано несколько одинковых EventListeners на одном EventTarget с одинаковыми параметрами

Вот не поленись запилить кнопку и посчитать алерты при инициализации и после клика.

Выделить код

Код:

[1, 2, 3].forEach(function() {
    self.addEventListener("click", function func1(e) {
        if (!e.button) alert(arguments.callee.name);
    }, false);
    alert("Added listener 1");
});

function func2(e) {
    if (!e.button) alert(arguments.callee.name);
}
[1, 2, 3].forEach(function() {
    self.addEventListener("click", func2, false);
    alert("Added listener 2");
});

turbot пишет

bunda1
А теперь деструктор нужен для попапа?

Не нужно.

23-04-2016 21:13:02
Вместо mItem.setAttribute('onclick',.... и  submItem.setAttribute('onclick', .... можно использовать
mItem.onclick =e=> {... }; и submItem.onclick =e=> {.. .};
Ну и всё то что делает:

Выделить код

Код:

for (var type of ['click', 'popupshowing']) {
    menuPopup.addEventListener(type, (e)=> {...

засунуть в них.

Dumby

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

Dumby пишет

Вот сейчас дописал словечко в конец. Жму, но в конфиг пишет EC9.

Теперь понятнее не стало. :D
Все, понял. Поправлю. (если смогу) Такое - да, конечно стоит упомянуть в описании. Был неправ. :dumb:

Где посмотреть код с oncommand, который не работает?

Ну просто заменить onclick в коде. Так первоначально и было.

Dumby пишет

Вот не поленись запилить кнопку и посчитать алерты при инициализации и после клика.

Ууу, вот оно что. Т.е., у меня там все печально? Нужно везде впихивать removeEventListener?

А оптимизировать можно/нужно до бесконечности.

Да, но это надо знать, что лучше для производительности. :) А у меня нет таких знаний. :)
Я просто рассуждал, что пусть жуткие листенеры, но дергать их будет нечасто, чем тоже немалое кол-во постоянно работающих обсерверов. Понятия не имею - чушь такие рассуждения или нет.

bunda1 пишет

Не нужно.

Ну и слава богу. :)

bunda1 пишет

засунуть в них.

Да но там еще и расставляет при открытии попапа. Я решил, что пусть его. :)

turbot пишет

Я решил, что пусть его. :)

Хотя бы обработчик поменяй на:  addEventListener(type, (e)=> {    }, false, menuPopup); и посмотри в консоли ошибок при открытие меню.

Dumby пишет

Жму, но в конфиг пишет EC9.

А это вообще можно обойти? Во что конвертировать? Ведь так-то, вручную, кириллицей в about:config записать можно...

bunda1 пишет

Хотя бы обработчик поменяй на:  addEventListener(type, (e)=> {    }, false, menuPopup); и посмотри в консоли ошибок при открытие меню.

Ни одной ошибки, даже с javascript.options.strict;true idontnow.gif
А что должно быть? Что у меня не так? Вы пальцем тыкайте. Я ж дурак. :D

turbot пишет

А что должно быть? Что у меня не так? Вы пальцем тыкайте.

Timestamp: 23.04.2016 22:03:34
Error: TypeError: val is null
Source File: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button66@init line 1 > Function
Line: 78

23-04-2016 22:09:42
Хотя замена обработчика тут наверно не поможет. Я не про ошибку val is null

Ошибка на 46-ой

Опять мои посты съедает? :rolleyes:

bunda1
Ммм, посмотрю. Но я не знаю, что там не так...

23-04-2016 22:52:21
Еще раз глянул https://developer.mozilla.org/en-US/doc … n/toString и не знаю...

23-04-2016 23:07:19
bunda1
Ага, это если нет параметра вовсе в about:config.

Выделить код

Код:

if ("userChoice" in m) {
            try {var usrChc = (val.toString() === m.userChoice);} catch(e) {usrChc = false};

            mItem.setAttribute('style', usrChc ? '' : 'color: orangered !important; font-weight: bold !important;');
            mItem.setAttribute('user-choice', usrChc ? 'true' : 'false');
          }

- так не ругается. Или можно проще? :rolleyes:

turbot пишет

Еще раз глянул https://developer.mozilla.org/en-US/doc … n/toString и не знаю...

А эсли так:   cbu.setPrefs(pref, convertFromUnicode("UTF-8", str) );

bunda1
Это про юникод? Потому что с val я разобрался. См. выше.

23-04-2016 23:15:30
Кстати, у меня некоторые кнопки с cbu, в отличии от custombuttons, после редактирования, не работают до рестарта браузера. Опять в ночнушках что-то поломали?

turbot пишет

bunda1
Это про юникод?

Да.

23-04-2016 23:21:06

turbot пишет

Или можно проще?

Может попробуй if ("pref" in m) var val = custombuttons.getPrefs(m.pref) || false;

bunda1
:beer: Работает!

попробуй

Попробую, спасибо.

turbot пишет

Кстати, у меня некоторые кнопки с cbu, в отличии от custombuttons, после редактирования, не работают до рестарта браузера.

Вроде глюк с cbu уже исправили в Сustom Buttons. А у тебя последняя версия Сustom Buttons?

Да, самая (проверил по sourceforge). Плюс там еще фиксы накопились под ночнушку.

23-04-2016 23:34:00

turbot пишет

:beer: Работает!

Поторопился. Там еще обратно конвертировать, чтоб сравнивать... :/ Но направление уловил. Спасибо.

23-04-2016 23:39:43
Хм, а какую кодировку писать в convertToUnicode()? ASCII? А то что-то не работает...

turbot пишет

Там еще обратно конвертировать, чтоб сравнивать.

Может gPrefService.getComplexValue(pref, Ci.nsISupportsString).data

bunda1
Ага, спасибо. Вроде все получилось. Погоняю еще для проверки и обновлю кнопку. Спасибо за помощь. :beer:

А почему ConvertToUnicode() не работает?



Сделал. Жду новых указаний на ошибки. :D

turbot пишет

А почему ConvertToUnicode() не работает?

Как не работает?

turbot пишет

Сделал. Жду новых указаний на ошибки.

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

turbot пишет

if ("pref" in m) try {var val = gPrefService.getComplexValue(m.pref, Ci.nsISupportsString).data} catch(e) {val = custombuttons.getPrefs(m.pref)}

В окне SeaMonkey (2.39) нет объекта gPrefService

Выделить код

Код:

data:image/png;base64,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

turbot пишет

Ну просто заменить onclick в коде.

скрытый текст
Вот опять же, не поленись запилить и нажать кнопку.

Выделить код

Код:

var prefName = "CB" + _id.slice(20) + ".test";
var prefValue = "быль";

var prefs = "Preferences" in window ? Preferences : {
    get: pref => Application.prefs.getValue(pref, undefined),
    set: (pref, val) => Application.prefs.setValue(pref, val),
    reset: pref => Services.prefs.clearUserPref(pref)
};

this.setAttribute("oncommand", "bla();");
this.bla = () => {
    prefs.set(prefName, prefValue);
    gBrowser.selectedTab = gBrowser.addTab("about:config?filter=" + prefName);
    setTimeout(() => {
        if (confirm("Reset ?\n\n" + prefName + ";" + prefs.get(prefName))) prefs.reset(prefName);
    }, 500);
}

turbot
Вместо gPrefService можно использовать Services.prefs который будет работать и на SeaMonkey. Я кнопки для SeaMonkey обычно не делаю вот и не подумал что gPrefService на SeaMonkey не работает.

turbot
Продолжу козлиться насчёт описания

скрытый текст
В описании не указано когда дописывается «... - Default»
Явно не то же самое что prefHasUserValue

Вот, например, расклад.
general.useragent.locale;ru - пишет «Русский» (что верно), хотя и дефолт.
general.useragent.override;dummy - пишет «Default» (что интуитивно не верно).

Выделить код

Код:

data:image/png;base64,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

Dumby
Пощадите! pray.gif

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

Вот опять же, не поленись запилить и нажать кнопку.

Вы переоцениваете мои умственные способности. Я уже пытался делать из них функцию и добавлять через mItem.setAttribute('oncommand', 'document.getElementById("' + self.id + '").tooglePref();'). Безрезультатно. И я абсолютно не понимаю - почему. То есть, вообще не имею предположений. Я вообще думал бросить затею с кнопкой из-за этого, пока случайно не обнаружил, что onclick - прекрасно работает. :sick:
Кстати, а как у вас Application там работает? Разве это не фуэл, который выпилили?

насчёт описания

Выделить код

Код:

try {
            var vname = subMenu.getElementsByAttribute('checked', 'true')[0].getAttribute('label');
          } catch(e) {
            if (!Services.prefs.prefHasUserValue(m.pref)) vname = 'Default';
            else vname = 'Undefined'
          };

так?

В окне SeaMonkey (2.39) нет объекта gPrefService

Dumby
bunda1
Спасибо, поправлю.

24-04-2016 19:41:55

bunda1 пишет

Как не работает?

Никак. Пишет что не является функцией. Вчера повсякому пробовал.

bunda1 пишет

GrabScroll

Спасибо. Прокрутка стала даже глаже, чем в оригинале. А вот курсор все еще, периодически, остается в виде руки даже при отключении кнопки. (И было б неплохо добавить опцию в менюшкку "не изменять вид курсора" (я знаю, что в коде поправить можно, но все ж).)

turbot пишет

Прокрутка стала даже глаже, чем в оригинале.

Я не менял оргинальный код в отношении прокрутки :/

turbot пишет

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

А что там надо переключать?

bunda1
Да нет, не кажется. Специально сверял. (Хотя обоим все-таки далеко до гладкости аддона Grab and Drag) :) Но может дело в качестве/особенностях работы кода в CB и userScript.js.xpi?

bunda1 пишет

А что там надо переключать?

Отключать изменение вида курсора при захвате страницы. Меня это раздражает. Но, может, только меня, поэтому не настаиваю. :)

turbot пишет

Пишет что не является функцией. Вчера повсякому пробовал.

Выделить код

Код:

alert(convertFromUnicode("UTF-8", "turbot") );

bunda1
ConvertToUnicode() :)

А from - да, работает.

turbot пишет

Отключать изменение вида курсора при захвате страницы. Меня это раздражает.

bunda1, надежда есть?

manuk пишет

bunda1, надежда есть?

Папробую :/

turbot

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

turbot пишет

Вы переоцениваете мои умственные способности. Я уже пытался делать из них функцию и добавлять через mItem.setAttribute('oncommand', 'document.getElementById("' + self.id + '").tooglePref();'). Безрезультатно. И я абсолютно не понимаю - почему. То есть, вообще не имею предположений.

Ничего мы не переоцениваю, ну разве что только насчёт наличия
полезной способности излишне доходчиво объяснять нечто своё.

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

Выделить код

Код:

var popup = this.appendChild(document.createElement("menupopup"));
popup.setAttribute("position", "after_start");
for(var ind = 0; ind < 5; ind++) {
    var mItem = popup.appendChild(document.createElement("menuitem"));
    mItem.setAttribute("label", "menuitem " + ind);
    mItem.setAttribute('oncommand', 'document.getElementById("' + self.id + '").tooglePref();') //███ "QUOTE"
}
popup.setAttribute("oncommand", "event.target.parentNode.parentNode.tooglePref(event);"); //███ "SINGLE"
this.tooglePref = e => alert("SUCCESS! " + (e ? "SINGLE " + e.target.label : "QUOTE"));
this._handleClick = () => popup.openPopup(self);

Кстати, а как у вас Application там работает? Разве это не фуэл, который выпилили?

Да, это тот самый фуэл, который выпилили.
А Application у нас там работает, надеюсь, ровно так же, как и у тебя.

так?

Что «так?»? Откуда мне знать что ты задумал?
Описание же не предоставлено, как я ни уговаривал.

Dumby

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

мы

Намек понял. :)

Что «так?»? Откуда мне знать что ты задумал?

Ммм, понял. Опишу. Я к тому ж решил сделать выделение жирным для недефолтных значений у всех параметров.
Но вообще я про то - можно ли так извращаться. Но уже и сам проверил - переваривает. :)

ну ладно вот тебе очередная кнопка

Можно я завтра задание тебе сдам? У меня уже голова болит и пиво булькает. :D

P.S.: А можно ли для элемент.стиль.цсс-свойство - !important как-то попростому присобачивать? Или только с setAttribute и, если надо чтобы старый не перекрывало, всякие push'ы и прочие прототипы использовать? А то я такое пока не потяну...

turbot пишет

А можно ли для элемент.стиль.цсс-свойство - !important как-то попростому присобачивать?

Ты об этом что ли?

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

Выделить код

Код:

document.getElementById("titlebar-buttonbox").style.setProperty(
    "outline", "1px solid red", "important"
);
Выделить код

Код:

data:image/png;base64,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

Dumby
Ага, судя по всему об этом. Спасибо.

manuk пишет
turbot пишет

Отключать изменение вида курсора при захвате страницы. Меня это раздражает.

bunda1, надежда есть?

Вообще удалил код который изменяет вид курсора в GrabScroll:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGrabScroll%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAawBrAGsept3cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAeElEQVR42pVSWw7AIAwC4209T8/LPmq6xk1T+Wwh0AfHGPjAzAD8tvqXZGaSAJD0Vlb2YC8kRxRD01CGR+hhSlKSpMUkRyBZdfBs0yHGDZOFlME82Y70snOkMzV21TxJUTPXmjUlQQVxu5bvcOdw0Gxfo+Jz8UuOB3pnSTiV10R3AAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...............%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20GrabScroll.toggle%28%29%3B%0A%20%20%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...............%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20/%20%u0432%u044B%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u0435%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%5Cn%u041F%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u0441%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%u043C%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%5Cn%u0414%u041F%3A%20%u0421%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%22%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20...............%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u0431%u0440%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%27%2C%20func%3A%20%27GrabScroll.button%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u0431%u0440%u0430%u0442%u044C%20%u043D%u0430%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u0438%20%u0441%u043A%u043E%u0440%u043E%u0441%u0442%u044C%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%27%2C%20func%3A%20%27GrabScroll.moverate%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u0432%u0440%u0435%u043C%u044F%20%u043E%u0442%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u044F%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%20%u043F%u0440%u0438%20%u0431%u0435%u0437%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%27%2C%20func%3A%20%27GrabScroll.threshold%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0430%u0432%u0442%u043E%u043F%u0440%u043E%u043A%u0440%u0443%u0442%u043A%u0443%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u043F%u0440%u0438%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%27%2C%20pref%3A%20%27grabScroll.enableinertia%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u0441%u043A%u043E%u0440%u043E%u0441%u0442%u044C%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%20%u043F%u0440%u0438%20%u043A%u043E%u0442%u043E%u0440%u043E%u0439%20%u043F%u043E%u044F%u0432%u043B%u044F%u0435%u0442%u0441%u044F%20%u0430%u0432%u0442%u043E%u043F%u0440%u043E%u043A%u0440%u0443%u0442%u043A%u0430%27%2C%20func%3A%20%27GrabScroll.inertiaThreshold%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u0434%u043B%u0438%u043D%u0443%20%u0430%u0432%u0442%u043E%u043F%u0440%u043E%u043A%u0440%u0443%u0442%u043A%u0438%27%2C%20func%3A%20%27GrabScroll.inertiarate%28%29%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u041E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u0435%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u043D%u0430%20%u0441%u0441%u044B%u043B%u043A%u0430%u0445%27%2C%20pref%3A%20%27grabScroll.clickable%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u041E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u0435%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u043D%u0430%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%u0445%27%2C%20pref%3A%20%27grabScroll.notimage%27%20%7D%2C%0A%5D%3B%0Avar%20menuPopup%20%3D%20self.appendChild%28%20document.createElement%28%22menupopup%22%29%20%29%3B%0Aarray.forEach%28m%3D%3E%20%7B%0A%20%20%20if%20%28%22separator%22%20in%20m%29%20%7B%20menuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%20return%20%7D%3B%0A%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2C%20m.label%29%3B%0A%20%20%20if%20%28%22pref%22%20in%20m%29%20%7B%20%0A%20%20%20%20%20%20%20%20mItem.setAttribute%28%27type%27%2C%20%27checkbox%27%29%3B%0A%20%20%20%20%20%20%20%20mItem.setAttribute%28%27checked%27%2C%20cbu.getPrefs%28m.pref%29%20%29%3B%0A%20%20%20%20%20%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20cbu.setPrefs%28m.pref%2C%20%21cbu.getPrefs%28m.pref%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20else%20mItem.onclick%20%3D%28%29%3D%3E%20eval%28m.func%29%3B%0A%20%20%20menuPopup.appendChild%28mItem%29%3B%0A%7D%29%3B%0AmenuPopup.setAttribute%28%22onclick%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%0A%0Avar%20GrabScroll%20%3D%20%7B%0A%20%20TOLERANCE%20%20%20%20%20%20%20%20%20%3A3%2C%0A%20%20TOLERANCE_WHEN_NO_H_SCROLL%20%3A%205%2C%0A%20%20CANCEL_WHEN_SELECTION%3A%20true%2C%0A%20%20MOUSEBUTTON%3A%20%20%20%20%20%20cbu.getPrefs%28%22grabScroll.button%22%29%20%7C%7C%200%2C%0A%20%20MOVERATE%3A%20%20%20%20%20%20%20%20%20cbu.getPrefs%28%22grabScroll.moverate%22%29%20%7C%7C%20-1%2C%0A%20%20TIMER%3A%20%20%20%20%20%20%20%20%20%20%20%20cbu.getPrefs%28%22grabScroll.timer%22%29%20%7C%7C%20500%2C%0A%20%20INERTIATHRESHOLD%3A%20cbu.getPrefs%28%22grabScroll.inertiathreshold%22%29%20%7C%7C%2080%2C%0A%20%20INERTIARATE%3A%20%20%20%20%20%20cbu.getPrefs%28%22grabScroll.inertiarate%22%29%20%7C%7C%2050%2C%0A%20%20IGNOREURL%3A%20%20%20%20%20%20%20%20%5B%22http%3A//maps.google.*/*%22%2C%22http%3A//maps.yahoo.co.jp/pl*%22%2C%22http%3A//map.yahoo.co.jp/pl*%22%2C%22http%3A//map.goo.ne.jp/*%22%2C%22http%3A//www.mapion.co.jp/c/f*%22%2C%22http%3A//books.google.co.jp/books%3Fid%3D*%22%2C%22http%3A//books.google.co.jp/books%3Fid%3D*%22%5D%2C%0A%0A%20%20mStatus%3A%200%2C%20%0A%20%20mLastX%3A%200%2C%0A%20%20mLastY%3A%200%2C%0A%20%20mCursor%3A%20null%2C%0A%20%20mCursorElement%3A%20null%2C%0A%20%20_target%3A%20null%2C%0A%20%20_target2%3A%20null%2C%0A%20%20_isImage%3Afalse%2C%0A%20%20_timer%3A0%2C%0A%20%20_ctimer%3A0%2C%0A%20%20_mtimer%3A%20false%2C%0A%20%20cScroll%3Afalse%2C%0A%20%20cSpeedX%3A0%2C%0A%20%20cSpeedY%3A0%2C%0A%20%20_doc%3Anull%2C%0A%20%20_MOVERATEpZoom%3A1%2C%0A%20%20_window%3A%20null%2C%0A%20%20%20%20%20%20%0A%20%20initGrabScroll%3A%20function%28%29%20%7B%0A%20%20%20%20var%20curentBrowserVersion%20%3D%20Services.appinfo.platformVersion%3B%20//%2731.*%27%0A%20%20%20%20var%20compareResult%20%3D%20Services.vc.compare%28curentBrowserVersion%2C%20%2746.*%27%29%3B%0A%20%20%20%20this.Bug1209100%20%3D%20%28compareResult%20%3C%200%29%20%3F%2010%20%3A%201%3B%0A%20%20%20%20%0A%20%20%20%20if%20%28%20GrabScroll.activeBrowser%28%29.mPanelContainer%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20this._window%20%3D%20GrabScroll.activeBrowser%28%29.mPanelContainer%3B%0A%20%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20else%20this._window%20%3D%20document.getElementById%28%27content%27%29%3B%0A%0A%20%20%20%20for%28%20var%20aURL%20in%20this.IGNOREURL%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20if%20%28%20this.IGNOREURL%5BaURL%5D%20%3D%3D%3D%20%27%27%20%29%20continue%3B%0A%20%20%20%20%20%20%20%20%20this.IGNOREURL%5BaURL%5D%20%3D%20this.convert2RegExp%28this.IGNOREURL%5BaURL%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20this._window.setCapture%28%29%3B%0A%20%20%20%20addEventListener%28%22mousedown%22%2C%20this%2C%20true%2C%20this._window%29%3B%0A%20%20%20%20addEventListener%28%22click%22%2C%20this%2C%20true%2C%20this._window%29%3B%0A%20%20%20%20addEventListener%28%22mouseup%22%2C%20this%2C%20true%2C%20this._window%29%3B%0A%20%20%20%20addEventListener%28%27pagehide%27%2C%20this%2C%20false%2C%20gBrowser%29%3B%0A%20%20%20%20%0A%20%20%20%20this.setIcon%28%29%3B%0A%20%20%7D%2C%0A%0A%20%20activeBrowser%3A%20function%28%29%20%7B%0A%20%20%20%20return%20%28%27SplitBrowser%27%20in%20window%20%3F%20SplitBrowser.activeBrowser%20%3A%20null%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20%20gBrowser%3B%0A%20%20%7D%2C%0A%0A%20%20handleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20e%20%3D%20new%20XPCNativeWrapper%28e%29%3B%0A%20%20%20%20switch%28e.type%29%20%7B%0A%20%20%20%20%20%20case%20%22mousedown%22%3A%0A%20%20%20%20%20%20%20%20if%20%28%20this.cScroll%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20clearTimeout%28this.cScroll%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20this.cSpeedX%20%3D%20this.cSpeedY%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28%20cbu.getPrefs%28%22grabScroll.enable%22%29%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20this.grabStart%28e%29%3B%0A%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20%22mousemove%22%3A%0A%20%20%20%20%20%20%20%20this.mousemove%28e%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22click%22%3A%0A%20%20%20%20%20%20%20%20this.click%28e%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22mouseup%22%3A%0A%20%20%20%20%20%20%20%20this.mouseup%28e%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%27pagehide%27%3A%0A%20%20%20%20%20%20%20%20this._doc%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this.mCursorElement%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this._target%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this._target2%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this._isImage%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this.NS%20%3D%20this.EW%20%3D%20this.NSEW%20%3D%20null%3B%0A%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20grabStart%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28this.mStatus%20%3D%3D%203%29%0A%20%20%20%20%20%20this.mStatus%20%3D%200%3B%0A%0A%20%20%20%20if%20%28this.MOUSEBUTTON%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20if%20%28Math.abs%28this.mLastX%20-%20e.screenX%29%20%3C%205%20%26%26%0A%20%20%20%20%20%20%20%20%20%20Math.abs%28this.mLastY%20-%20e.screenY%29%20%3C%205%20%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20doc%20%3D%20e.originalTarget.ownerDocument%3B%0A%20%20%20%20if%20%28%21doc%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20if%20%28doc.contentType%20%3D%3D%20%27application/vnd.mozilla.xul+xml%27%29%0A%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20this._doc%20%3D%20doc%3B%0A%0A%20%20%20%20if%20%28e.button%20%3D%3D%20this.MOUSEBUTTON%20%26%26%20this.mStatus%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20if%20%28this.CANCEL_WHEN_SELECTION%20%26%26%20this.MOUSEBUTTON%20%3D%3D%200%20%26%26%20doc.defaultView.getSelection%28%29%20%21%3D%20%22%22%29%0A%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20%20%20this._target%20%3D%20e.originalTarget%3B%0A%0A%20%20%20%20%20%20if%20%28/%5E%28html%7Cbody%29%24/.test%28this._target.localName.toLowerCase%28%29%29%20%7C%7C%20this._target.clientHeight%20%3E%2030000%29%0A%20%20%20%20%20%20%20%20this._target2%20%3D%20null%3B%0A%20%20%20%20%20%20else%20if%20%28/div/.test%28this._target.localName.toLowerCase%28%29%29%20%26%26%20this._target.clientHeight%20%3E%201000%29%0A%20%20%20%20%20%20%20%20this._target2%20%3D%20null%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20this._target2%20%3D%20this._target%3B%0A%0A%20%20%20%20%20%20for%20%28aURL%20in%20this.IGNOREURL%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28this.IGNOREURL%5BaURL%5D%20%3D%3D%3D%20%27%27%29continue%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28doc.documentURI.match%28this.IGNOREURL%5BaURL%5D%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20LOG%28this.IGNOREURL%5BaURL%5D+%27%5Cn%27+ex%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28this.isParentEditableNode%28this._target%29%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20if%20%28this.isParentDraggableNode%28this._target%29%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20if%20%28this.isIgnore%28this._target%29%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20if%20%28this.isVideoControl%28e.target%29%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20if%20%28this.isParentClickableNode%28this._target%29%29%7B%0A%20%20%20%20%20%20%20%20if%20%28cbu.getPrefs%28%22grabScroll.clickable%22%29%29%0A%09return%3B%0A%20%20%20%20%20%20%20%20if%20%28%21%28%27linkDragSelection%27%20in%20window%29%29%0A%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20this._isImage%20%3D%20this.isImage%28e%29%3B%0A%20%20%20%20%20%20if%20%28this._isImage%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28cbu.getPrefs%28%22grabScroll.notimage%22%29%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20var%20target%20%3D%20this._target%3B%0A%20%20%20%20%20%20while%20%28target%29%7B%0A%20%20%20%20%20%20%20%20if%20%28%22getAttribute%22%20in%20target%20%26%26%20target.getAttribute%28%22draggable%22%29%20%3D%3D%20%22true%22%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20style%20%3D%20this._doc.defaultView.getComputedStyle%28target%2C%20null%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28/resize%7Cmove%7Call-scroll%7Ccrosshair/.test%28style.getPropertyValue%28%22cursor%22%29%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20%28/resize%7Cmove%7Call-scroll%7Ccrosshair/.test%28style.getPropertyValue%28%22auto%22%29%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%7D%0A%20%20%20%20%20%20%20%20target%20%3D%20target.parentNode%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28this.MOUSEBUTTON%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20this._timer%20%3D%20new%20Date%28%29.getTime%28%29%3B%0A%20%20%20%20%20%20this.mLastX%20%3D%20e.screenX%3B%0A%20%20%20%20%20%20this.mLastY%20%3D%20e.screenY%3B%0A%20%20%20%20%20%20this.mStatus%20%3D%201%3B%0A%20%20%20%20%20%20this._MOVERATEpZoom%20%3D%20%20this.MOVERATE%20/%20%28ZoomManager.useFullZoom%20%3F%20ZoomManager.zoom%20%3A%201%29%3B%0A%0A%20%20%20%20%20%20%5Bthis.NS%2C%20this.EW%2C%20this.NSEW%5D%20%3D%20this.getScrollView%28e%29%3B%0A%20%20%20%20%20%20this._window.addEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20adjustedTimer%3A%20function%28%29%7B%0A%20%20%20%20var%20magTimer%20%3D%20this.TIMER%3B%0A%20%20%20%20return%20magTimer%3B%0A%20%20%7D%2C%0A%0A%20%20grabFinish%3A%20%20function%28%29%20%7B%0A%20%20%20%20this._window.removeEventListener%28%22mousemove%22%2C%20this%2C%20true%29%3B%0A%20%20%20%20var%20selCon%20%3D%20this.getSelconForDoc%28this._doc%29%3B%0A%20%20%20%20if%20%28selCon%29%0A%20%20%20%20%20%20selCon.setDisplaySelection%28selCon.SELECTION_ON%29%3B%0A%20%20%7D%2C%0A%0A%20%20mousemove%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28this.mStatus%20%3D%3D%202%20%7C%7C%20this.mStatus%20%3D%3D%201%20%29%20%7B%0A%20%20%20%20%20%20var%20x%20%3D%20e.screenX%3B%0A%20%20%20%20%20%20var%20y%20%3D%20e.screenY%3B%0A%20%20%20%20%20%20var%20doc%20%3D%20e.originalTarget.ownerDocument%3B%0A%0A%20%20%20%20%20%20if%20%28this.mStatus%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21this._isImage%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%28new%20Date%28%29.getTime%28%29%20-%20this._timer%29%20%3E%20this.adjustedTimer%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20this.mStatus%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28Math.abs%28x-this.mLastX%29%20%3C%20this.TOLERANCE_WHEN_NO_H_SCROLL%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20movingh%20%3D%20Math.abs%28x-this.mLastX%29%20%3E%20Math.abs%28y-this.mLastY%29%20*%2050%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21this._isImage%20%26%26%20this.MOUSEBUTTON%20%3D%3D%200%20%20%26%26%20this.isText%28e%29%20%20%26%26%20movingh%20%26%26%20%21this.EW%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.mStatus%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%28Math.abs%28x%20-%20this.mLastX%29%20+%20Math.abs%28y%20-%20this.mLastY%29%20%3C%20this.TOLERANCE%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28this.MOUSEBUTTON%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20selCon%20%3D%20this.getSelconForDoc%28this._doc%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28selCon%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20selection%20%3D%20selCon.getSelection%28selCon.SELECTION_NORMAL%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20selection.removeAllRanges%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20selCon.setDisplaySelection%28selCon.SELECTION_OFF%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%22ucjsMouseGestures%22%20in%20window%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20ucjsMouseGestures._isMouseDownR%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20this.mLastX%20%3D%20x%20-%20%28x%20-%20this.mLastX%29%20/%2010%3B%0A%20%20%20%20%20%20%20%20this.mLastY%20%3D%20y%20-%20%28y%20-%20this.mLastY%29%20/%2010%3B%0A%20%20%20%20%20%20%20%20this.mStatus%20%3D%202%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28this._mtimer%29%0A%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20%20%20this.cSpeedX%20%3D%20this._MOVERATEpZoom%20*%20%28x%20-%20this.mLastX%29%3B%0A%20%20%20%20%20%20this.cSpeedY%20%3D%20this._MOVERATEpZoom%20*%20%28y%20-%20this.mLastY%29%3B%0A%0A%20%20%20%20%20%20if%20%28this.scroll%28e%29%29%20%7B%0A%20%20%20%20%20%20%20%20this.mLastX%20%3D%20x%3B%0A%20%20%20%20%20%20%20%20this.mLastY%20%3D%20y%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20getSelconForDoc%3A%20function%20getSelconForDoc%28doc%29%7B%0A%20%20%20%20if%20%28%21doc%29%0A%20%20%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20var%20aFrame%20%3D%20doc.defaultView%3B%0A%20%20%20%20if%20%28%21aFrame%29%0A%20%20%20%20%20return%20null%3B%0A%20%20%20%20var%20docShell%20%3D%20this.getDocShellForFrame%28aFrame%29%3B%0A%20%20%20%20var%20selCon%20%3D%20docShell.QueryInterface%28Ci.nsIInterfaceRequestor%29.getInterface%28Ci.nsISelectionDisplay%29.QueryInterface%28Ci.nsISelectionController%29%3B%0A%20%20%20%20return%20selCon%3B%0A%20%20%7D%2C%0A%0A%20%20getDocShellForFrame%3A%20function%20getDocShellForFrame%28aFrame%29%7B%0A%20%20%20%20return%20aFrame.QueryInterface%28Ci.nsIInterfaceRequestor%29.getInterface%28Ci.nsIWebNavigation%29.QueryInterface%28Ci.nsIDocShell%29%3B%0A%20%20%7D%2C%0A%0A%20%20click%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e.button%20%3D%3D%20this.MOUSEBUTTON%20%26%26%20this.mStatus%20%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28e.button%20%3D%3D%200%20%26%26%20this.mStatus%20%3E%3D%202%20%26%26%20this._doc%20instanceof%20Ci.nsIImageDocument%29%20%7B%0A%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20this.mStatus%20%3D%200%3B%0A%20%20%7D%2C%0A%0A%20%20mouseup%3A%20%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e.button%20%3D%3D%20this.MOUSEBUTTON%20%26%26%20this.mStatus%20%3E%201%29%20%7B%0A%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%0A%20%20%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20%20%20if%20%28this.mStatus%20%3D%3D%202%29%0A%20%20%20%20%20%20%20%20this.mStatus%20%3D%203%3B%0A%0A%20%20%20%20%20%20if%20%28cbu.getPrefs%28%22grabScroll.enableinertia%22%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28Math.abs%28this.cSpeedX%29%20%3E%20this.INERTIATHRESHOLD%20%7C%7C%20Math.abs%28this.cSpeedY%29%20%3E%20this.INERTIATHRESHOLD%20%29%29%7B%0A%20%20%20%20%20%20%20%20if%20%28this.cScroll%29%0A%20%20%20%20%20%20%20%20%20%20clearTimeout%28this.cScroll%29%3B%0A%20%20%20%20%20%20%20%20var%20v%20%3D%20this.INERTIARATE%3B%0A%20%20%20%20%20%20%20%20if%20%28this.cSpeedX%20%3E%200%29%0A%20%20%20%20%20%20%20%20%20%20this.cSpeedX%20%3D%20Math.min%28this.cSpeedX%2C%20v%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20this.cSpeedX%20%3D%20Math.max%28this.cSpeedX%2C%20-v%29%3B%0A%20%20%20%20%20%20%20%20if%20%28this.cSpeedY%20%3E%200%29%0A%20%20%20%20%20%20%20%20%20%20this.cSpeedY%20%3D%20Math.min%28this.cSpeedY%2C%20v%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20this.cSpeedY%20%3D%20Math.max%28this.cSpeedY%2C%20-v%29%3B%0A%0A%20%20%20%20%20%20%20%20var%20Start%3B%0A%20%20%20%20%20%20%20%20function%20scrolling%28e%2C%20self%29%7B%0A%20%20%20%20%20%20%20%20%20%20Start%20%3D%20new%20Date%28%29.getTime%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20self.scroll2%28e%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20self.cScroll%20%3D%20setTimeout%28arguments.callee%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math.max%2825%20-%20%28%28new%20Date%28%29%29.getTime%28%29-Start%29%2C%200%29%2C%20e%2C%20self%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20this.scroll2%28e%29%3B%0A%20%20%20%20%20%20%20%20scrolling%28e%2C%20this%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20if%20%28e.button%20%3D%3D%20this.MOUSEBUTTON%20%26%26%20this.mStatus%20%3D%3D%201%29%7B%0A%20%20%20%20%20%20this.grabFinish%28%29%3B%0A%20%20%20%20%20%20this.mStatus%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20scroll2%3A%20function%28e%29%7B%0A%20%20%20%20var%20ay%20%3D%20Math.abs%28this.cSpeedY%29%3B%0A%20%20%20%20var%20ax%20%3D%20Math.abs%28this.cSpeedX%29%3B%0A%20%20%20%20if%20%28ay%20%3C%2010%20%26%26%20ax%20%20%3C%2010%29%7B%0A%20%20%20%20%20%20%20clearTimeout%28this.cScroll%29%3B%0A%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20this.scroll%28e%29%3B%0A%20%20%20%20if%20%20%20%20%20%20%28ax%20%3E%3D%20100%29%20this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ax%20%3C%20100%29%20this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ax%20%3C%2020%29%20this.cSpeedX%20%3D%20this.cSpeedX%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ax%20%3C%2010%29%20%20this.cSpeedX%20%3D%200%3B%0A%0A%20%20%20%20if%20%20%20%20%20%20%28ay%20%3E%3D%20100%29%20this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ay%20%3C%20100%29%20this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ay%20%3C%2020%29%20this.cSpeedY%20%3D%20this.cSpeedY%20*%200.95%3B%0A%20%20%20%20else%20if%20%28ay%20%3C%2010%29%20this.cSpeedY%20%3D%200%3B%0A%20%20%7D%2C%0A%0A%20%20scroll%3A%20function%28e%29%7B%0A%20%20%20%20var%20minScroll%20%3D%20this.Bug1209100%3B%20//%20prevent%20Bug%201209100%2C%2010px%20%3Cfx46.%201px%20%3E%3Dfx46%0A%20%20%20%20this._mtimer%20%3D%20true%3B%0A%20%20%20%20var%20flg%20%3D%20false%3B%0A%20%20%20%20if%20%28this.NS%20%26%26%20this.NS%20%3D%3D%20this.EW%20%26%26%0A%20%20%20%20%20%20%20%20%28Math.abs%28this.cSpeedX%29%20%3E%20minScroll%20%7C%7C%20Math.abs%28this.cSpeedY%29%20%3E%20minScroll%29%29%20%7B%0A%20%20%20%20%20%20flg%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28%22scrollBy%22%20in%20this.NS%29%20%7B%0A%20%20%20%20%20%20%20%20this.NS.scrollBy%28this.cSpeedX%2C%20this.cSpeedY%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20this.NS.scrollLeft%20+%3D%20this.cSpeedX%3B%0A%20%20%20%20%20%20%20%20this.NS.scrollTop%20%20+%3D%20this.cSpeedY%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20if%20%28this.NS%20%26%26%20Math.abs%28this.cSpeedY%29%20%3E%20minScroll%29%20%7B%0A%20%20%20%20%20%20%20%20flg%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20if%20%28%22scrollBy%22%20in%20this.NS%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.NS.scrollBy%280%2C%20this.cSpeedY%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.NS.scrollTop%20+%3D%20this.cSpeedY%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28this.EW%20%26%26%20Math.abs%28this.cSpeedX%29%20%3E%20minScroll%29%7B%0A%20%20%20%20%20%20%20%20flg%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20if%20%28%22scrollBy%22%20in%20this.EW%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.EW.scrollBy%28this.cSpeedX%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.EW.scrollLeft%20+%3D%20this.cSpeedX%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20setTimeout%28function%28self%29%7B%0A%20%20%20%20%20%20self._mtimer%20%3D%20false%3B%0A%20%20%20%20%7D%2C%2020%2C%20this%29%3B%0A%20%20%20%20return%20flg%3B%0A%20%20%7D%2C%0A%0A%20%20isText%3A%20function%28e%29%20%7B%0A%20%20%20%20return%20e.explicitOriginalTarget.nodeType%20%3D%3D%20document.TEXT_NODE%3B%0A%20%20%7D%2C%0A%0A%20%20isImage%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e.target%20instanceof%20Ci.nsIImageLoadingContent%29%0A%20%20%20%20%20%20return%20e.target%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%7D%2C%0A%0A%20%20isIgnore%3A%20function%28aNode%29%7B%0A%20%20%20%20%20while%20%28aNode%29%7B%0A%20%20%20%20%20%20var%20name%20%3D%20aNode.nodeName.toLowerCase%28%29%3B%0A%20%20%20%20%20%20if%20%28name%20%3D%3D%20%22html%22%29%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20if%20%28/%28scrollbar%7Cselect%7Coption%7Cembed%7Cobject%7Ctree%7Capplet%7Cstatusbar%29/.test%28name%29%29%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20aNode%20%3D%20aNode.parentNode%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20false%3B%0A%20%20%7D%2C%0A%0A%20%20isParentClickableNode%20%3A%20function%28aNode%29%20%7B%0A%20%20%20%20if%20%28%21aNode%29%20return%20null%3B%0A%20%20%20%20var%20d%20%3D%20aNode.ownerDocument%3B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20var%20xpathResult%20%3D%20d.evaluate%28%0A%20%20%20%20%20%20%20%20%20%20%27ancestor-or-self%3A%3A*%5B%28%28local-name%28%29%20%3D%20%22a%22%20or%20local-name%28%29%20%3D%20%22A%22%29%29%20or%20local-name%28%29%20%3D%20%22button%22%20or%20local-name%28%29%20%3D%20%22BUTTON%22%20or%20%28%28local-name%28%29%20%3D%20%22input%22%20or%20local-name%28%29%20%3D%20%22INPUT%22%29%20and%20%28@type%20%3D%20%22SUBMIT%22%20or%20@type%20%3D%20%22submit%22%20or%20@type%20%3D%20%22BUTTON%22%20or%20@type%20%3D%20%22button%22%20or%20@type%20%3D%20%22IMAGE%22%20or%20@type%20%3D%20%22image%22%29%29%5D%27%2C%0A%20%20%20%20%20%20%20%20%20%20aNode%2C%0A%20%20%20%20%20%20%20%20%20%20this.NSResolver%2C%0A%20%20%20%20%20%20%20%20%20%20XPathResult.FIRST_ORDERED_NODE_TYPE%2C%0A%20%20%20%20%20%20%20%20%20%20null%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20catch%28e%29%20%7B%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20xpathResult.singleNodeValue%3B%0A%20%20%7D%2C%0A%0A%20%20NSResolver%20%3A%20%7B%0A%20%20%20%20lookupNamespaceURI%20%3A%20function%28aPrefix%29%20%7B%0A%20%20%20%20%20%20switch%20%28aPrefix%29%20%7B%0A%20%20%20%20%20%20%20%20case%20%27xul%27%3A%0A%20%20%20%20%20%20%20%20%20%20return%20%27http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%27%3B%0A%20%20%20%20%20%20%20%20case%20%27html%27%3A%0A%20%20%20%20%20%20%20%20case%20%27xhtml%27%3A%0A%20%20%20%20%20%20%20%20%20%20return%20%27http%3A//www.w3.org/1999/xhtml%27%3B%0A%20%20%20%20%20%20%20%20case%20%27xlink%27%3A%0A%20%20%20%20%20%20%20%20%20%20return%20%27http%3A//www.w3.org/1999/xlink%27%3B%0A%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20return%20%27%27%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%0A%20%20isParentEditableNode%20%3A%20function%28node%29%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20if%20%28node.ownerDocument.designMode%20%3D%3D%20%27on%27%29%0A%20%20%20%20%20%20%20%20return%20node%3B%0A%20%20%20%20%7D%20catch%28e%29%20%7B%7D%0A%20%20%20%20while%20%28node%20%26%26%20node.parentNode%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21%28node%20instanceof%20Ci.nsIDOMNSEditableElement%29%29%0A%20%20%20%20%20%20%20%20%20%20throw%200%3B%0A%20%20%20%20%20%20%20%20node.QueryInterface%28Ci.nsIDOMNSEditableElement%29%3B%0A%20%20%20%20%20%20%20%20return%20node%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20node%20%3D%20node.parentNode%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20null%3B%0A%20%20%7D%2C%0A%0A%20%20isParentDraggableNode%20%3A%20function%28node%29%7B%0A%20%20%20%20while%20%28node%20%26%26%20node.parentNode%29%20%7B%0A%20%20%20%20%20%20if%20%28node.getAttribute%28%27draggable%27%29%20%3D%3D%20%27true%27%29%0A%20%20%20%20%20%20%20%20return%20node%3B%0A%20%20%20%20%20%20node%20%3D%20node.parentNode%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20null%3B%0A%20%20%7D%2C%0A%0A%20%20isVideoControl%3A%20function%28node%29%20%7B%0A%20%20%20%20if%20%28/%5E%28audio%7Cvideo%29%24/i.test%28node.localName%29%29%20%7B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20var%20i%20%3D%200%3B%0A%20%20%20%20%20%20while%20%28i%20%3C%20node.childNodes.length%29%20%7B%0A%20%20%20%20%20%20%20%20var%20child%20%3Dnode.childNodes%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28child.hasAttribute%28%27controls%27%29%20%26%26%20child.getAttribute%28%27controls%27%29%20%3D%3D%20%27controls%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20i++%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20false%3B%0A%20%20%7D%2C%0A%0A%20%20convert2RegExp%3A%20function%28%20pattern%20%29%20%7B%0A%20%20%20%20var%20s%20%3D%20new%20String%28pattern%29%3B%0A%20%20%20%20var%20res%20%3D%20new%20String%28%22%5E%22%29%3B%0A%0A%20%20%20%20for%20%28var%20k%20%3D%200%20%3B%20k%20%3C%20s.length%20%3B%20k++%29%20%7B%0A%20%20%20%20%20%20switch%28s%5Bk%5D%29%20%7B%0A%20%20%20%20%20%20%20%20case%20%27*%27%20%3A%0A%20%20%20%20%20%20%20%20%20%20res%20+%3D%20%22.*%22%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%27.%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%3F%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%5E%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%24%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27+%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%7B%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%5B%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%7C%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%28%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%29%27%20%3A%0A%20%20%20%20%20%20%20%20case%20%27%5D%27%20%3A%0A%20%20%20%20%20%20%20%20%20%20res%20+%3D%20%22%5C%5C%22%20+%20s%5Bk%5D%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%27%5C%5C%27%20%3A%0A%20%20%20%20%20%20%20%20%20%20res%20+%3D%20%22%5C%5C%5C%5C%22%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%27%20%27%20%3A%0A%20%20%20%20%20%20%20%20%20%20//%20Remove%20spaces%20from%20URLs.%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20default%20%3A%0A%20%20%20%20%20%20%20%20%20%20res%20+%3D%20s%5Bk%5D%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20new%20RegExp%28res%20+%20%27%24%27%2C%20%22i%22%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20toggle%3A%20function%28%29%7B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.enable%22%2C%20%21cbu.getPrefs%28%22grabScroll.enable%22%29%29%3B%0A%20%20%20%20this.setIcon%28%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20button%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22%u0412%u044B%u0431%u0435%u0440%u0438%u0442%u0435%20%u043A%u043D%u043E%u043F%u043A%u0443%3A%20L-%u043B%u0435%u0432%u0430%u044F%2C%20M-%u0441%u0440%u0435%u0434%u043D%u044F%u044F%2C%20R-%u043F%u0440%u0430%u0432%u0430%u044F%22%2C%20%22LMR%22.substr%28this.MOUSEBUTTON%2C1%29%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20switch%28value.toUpperCase%28%29%29%7B%0A%20%20%20%20%20%20case%20%22M%22%3A%20value%20%3D1%3B%20break%3B%0A%20%20%20%20%20%20case%20%22R%22%3A%20value%20%3D2%3B%20break%3B%0A%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20case%20%22L%22%3A%20value%20%3D0%3B%20break%3B%0A%20%20%20%20%7D%0A%20%20%20%20this.MOUSEBUTTON%20%3D%20value%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.button%22%2C%20value%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20threshold%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442e%20%u0432%u0440%u0435%u043C%u044F%20%u0432%20ms%281000%u043C%u0441%20%3D%201%u0441%u0435%u043A%29%22%2Cthis.TIMER%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.TIMER%20%3D%20parseInt%28value%2C10%29%3B%0A%20%20%20%20if%28%20this.TIMER%20%3C%3D0%20%7C%7C%20%21this.TIMER%20%29%20this.TIMER%20%3D%201000%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.timer%22%2C%20this.TIMER%29%3B%0A%20%20%7D%2C%0A%0A%20%20moverate%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442e%20%5B+-%5D%u0432%u0435%u043B%u0438%u0447%u0438%u043D%u0443%5Cn%20%u0415%u0441%u043B%u0438%20%5B+%5D%20c%u0442%u0440%u0430%u043D%u0438%u0446%u0430%20%u0431%u0443%u0434%u0435%u0442%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u0442%u0441%u044F%20%u043F%u0440%u043E%u0442%u0438%u0432%u043E%u043F%u043E%u043B%u043E%u0436%u043D%u043E%20%u0434%u0432%u0438%u0436%u0435%u043D%u0438%u044E%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20%20%22%2Cthis.MOVERATE%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.MOVERATE%20%3D%20parseInt%28value%2C10%29%3B%0A%20%20%20%20if%28%20%21this.MOVERATE%20%29%20this.MOVERATE%20%3D%20-1%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.moverate%22%2C%20this.MOVERATE%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20inertiaThreshold%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442e%20%u0441%u043A%u043E%u0440%u043E%u0441%u0442%u044C%20%u043F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u044F%20%u043F%u0440%u0438%20%u043A%u043E%u0442%u043E%u0440%u043E%u0439%20%u043F%u043E%u044F%u0432%u043B%u044F%u0435%u0442%u0441%u044F%20%u0430%u0432%u0442%u043E%u043F%u0440%u043E%u043A%u0440%u0443%u0442%u043A%u0430%22%2Cthis.INERTIATHRESHOLD%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.INERTIATHRESHOLD%20%3D%20parseInt%28value%2C10%29%3B%0A%20%20%20%20if%28%20%21this.INERTIATHRESHOLD%20%29%20this.INERTIATHRESHOLD%20%3D%2020%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.inertiathreshold%22%2C%20this.INERTIATHRESHOLD%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20inertiarate%3A%20function%28%29%7B%0A%20%20%20%20var%20value%20%3D%20prompt%28%22%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442e%20%u0434%u043B%u0438%u043D%u0443%20%u0430%u0432%u0442%u043E%u043F%u0440%u043E%u043A%u0440%u0443%u0442%u043A%u0438%22%2Cthis.INERTIARATE%29%3B%0A%20%20%20%20if%20%28%21value%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20this.INERTIARATE%20%3D%20parseInt%28value%2C10%29%3B%0A%20%20%20%20if%28%20%21this.INERTIARATE%20%29%20this.INERTIARATE%20%3D%2020%3B%0A%20%20%20%20cbu.setPrefs%28%22grabScroll.inertiarate%22%2C%20this.INERTIARATE%29%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20setIcon%3A%20function%28%29%7B%0A%20%20%20%20document.getAnonymousNodes%28self%29%5B1%5D.src%20%3D%20%21cbu.getPrefs%28%22grabScroll.enable%22%29%0A%20%20%20%20%3F%20self.image%0A%20%20%20%20%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH4AQXCg4QbH3A+AAAAZpJREFUOMuNk79qVUEQxn+zf06MCFZ2YnURBMHi+hp5ARtJY7PFhTRiY2ETkNuId5vbhLSmCeQtLAQhhTEpLeILaHL27K7FOXvYe+SiHwwzsMw33zfMinMOAO+9ooJzLnnv81ALWyBAaVRAGGoLhNPLNVose7P9mniDTA1hgHByseLkYkVFRMx9eXZ1xNnVEUVVTWCGIKSWkNrxMaSWLnUbRAWFqBA0wIMXTw646X5xfH4IQJc6Mukv3977XNSUZltUdKklDmvpKjVTO7UFC1wDP4DHr5694zb+Zv31LSG1xBz49O3jaGUKA1yvvrwm5shivvzeT4q08RZBEUUTJSLSL//0cs10icQciTnw/rMbpcYcyaQxT7E328c5Jwp4tJgvx4dC8r9QQAJmB88/YJTBKIMWixaNoMa8DQbogBZAi6XPmkbvoJXpoyIpl1kuspxvCzxczJfsmrvs6F2MarCqQYtFRDDKbP0L96prVMDP4/PDYbLFKIOgRmv19KKgWLgZ4v7Lp29o1J2N5n/tQFW/smcWvdFY9jPFH7MJpWpDanM5AAAAAElFTkSuQmCC%22%3B%0A%20%20%7D%2C%0A%20%20%0A%20%20getScrollView%3A%20function%20%28e%29%20%7B%0A%20%20%20%20var%20NS%2CEW%2CNSEW%3B%0A%20%20%20%20NS%20%3D%20EW%20%3D%20NSEW%20%3D%20null%3B%0A%20%20%20%20var%20_scrollingView%20%3D%20null%3B%0A%20%20%20%20var%20overflowx%2C%20overflowy%2C%20ox%2C%20oy%3B%0A%20%20%20%20var%20scw%2C%20sch%2C%20horz%2C%20vert%3B%0A%20%20%20%20var%20doc%2C%20style%3B%0A%20%20%20%20var%20borderTop%3B%0A%20%20%20%20var%20borderBottom%3B%0A%20%20%20%20var%20borderLeft%3B%0A%20%20%20%20var%20borderRight%3B%0A%0A%20%20%20%20if%20%28e.originalTarget.ownerDocument.contentType%20%3D%3D%20%22application/xml%22%29%20%7B%0A%20%20%20%20%20%20_scrollingView%20%3D%20e.originalTarget.ownerDocument.defaultView%3B%0A%0A%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%21%3D%20_scrollingView.scrollMinX%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxY%20%21%3D%20_scrollingView.scrollMinY%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%20%20%20%20NS%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%20%20%20%20EW%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20EW%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28_scrollingView.scrollMaxY%20%21%3D%20_scrollingView.scrollMinY%29%20%7B%0A%20%20%20%20%20%20%20%20NS%20%3D%20_scrollingView%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20for%20%28_scrollingView%20%3D%20e.originalTarget%3B%20_scrollingView%3B%20_scrollingView%20%3D%20_scrollingView.parentNode%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28_scrollingView%20instanceof%20HTMLElement%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.localName.toUpperCase%28%29%20%3D%3D%20%22HTML%22%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_scrollingView.localName.toUpperCase%28%29%20%3D%3D%20%22BODY%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20_scrollingView%20%3D%20_scrollingView.ownerDocument.defaultView%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%21%3D%20_scrollingView.scrollMinX%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxY%20%21%3D%20_scrollingView.scrollMinY%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28_scrollingView.scrollMaxY%20%21%3D%20_scrollingView.scrollMinY%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%3E%200%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxX%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.scrollMaxY%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.frameElement%20%26%26%20%21NS%20%26%26%20%21EW%20%26%26%20%21NSEW%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20this.getScrollView%28%7BoriginalTarget%20%3A%20_scrollingView.frameElement%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28_scrollingView.localName.toLowerCase%28%29%20%3D%3D%20%22select%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_scrollingView.parentNode.focus%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20overflowx%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20overflowy%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20ox%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20oy%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20doc%20%3D%20_scrollingView.ownerDocument%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20style%20%3D%20doc.defaultView.getComputedStyle%28_scrollingView%2C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20overflowx%20%3D%20style.getPropertyValue%28%22overflow-x%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20ox%20%3D%20overflowx%20%21%3D%20%22hidden%22%20%26%26%20overflowx%20%21%3D%20%22visible%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20overflowy%20%3D%20style.getPropertyValue%28%22overflow-y%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20oy%20%3D%20overflowy%20%21%3D%20%22hidden%22%20%26%26%20overflowy%20%21%3D%20%22visible%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%28ex%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20borderTop%20%20%20%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20borderBottom%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20borderLeft%20%20%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20borderRight%20%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28/%5E%28table%7Ctd%7Cth%29%24/i.test%28_scrollingView.localName%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc%20%3D%20_scrollingView.ownerDocument%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20style%20%3D%20doc.defaultView.getComputedStyle%28_scrollingView%2C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20borderTop%20%20%20%20%3D%20style.getPropertyValue%28%22border-top-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20borderBottom%20%3D%20style.getPropertyValue%28%22border-bottom-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20borderLeft%20%20%20%3D%20style.getPropertyValue%28%22border-left-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20borderRight%20%20%3D%20style.getPropertyValue%28%22border-right-width%22%29.replace%28%27px%27%2C%20%27%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%28ex%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20scw%20%3D%20_scrollingView.clientWidth%3B%0A%20%20%20%20%20%20%20%20%20%20horz%20%3D%20ox%20%26%26%20scw%20%21%3D%3D%200%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scw%20+%20borderLeft%20+%20borderRight%20%3C%20_scrollingView.scrollWidth%3B%0A%20%20%20%20%20%20%20%20%20%20sch%20%3D%20_scrollingView.clientHeight%3B%0A%20%20%20%20%20%20%20%20%20%20vert%20%3D%20oy%20%26%26%20sch%20%21%3D%3D%200%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sch%20+%20borderTop%20+%20borderBottom%20%3C%20_scrollingView.scrollHeight%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28horz%20%26%26%20vert%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NSEW%20%3D%20%21NSEW%20%3F%20_scrollingView%20%3A%20NSEW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28horz%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20EW%20%3D%20%21EW%20%3F%20_scrollingView%20%3A%20EW%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28vert%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NS%20%3D%20%21NS%20%3F%20_scrollingView%20%3A%20NS%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20%5BNS%2C%20EW%2C%20NSEW%5D%3B%0A%20%20%7D%0A%7D%3B%0AGrabScroll.initGrabScroll%28%29%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Отлично! Тоже вид кисти раздражал :)

bezuma пишет

bunda1
Отлично! Тоже вид кисти раздражал :)

Мне тоже вид кисти раздражал, наверно, вообще уберу изменение курсора из GrabScroll

bunda1 Я в Grab and Drug делал его невидимым - эстетично, на мой взгляд

bezuma пишет

bunda1 Я в Grab and Drug делал его невидимым - эстетично, на мой взгляд

Интересно scratch_one-s_head.gif

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

bezuma пишет

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

Знать бы еще как этот курсор удалить, может CSS кодом во время перетаскивания страницы и все дела :/

bunda1
Зачем было удалять? Просто сделать переключение этого
thumb.png 
- с none, как раз, курсора и не будет (с default - обычный). :)

turbot пишет

bunda1
Зачем было удалять? Просто сделать переключение этого

Спасибо! Надо будет это в описании кнопки добавить. Может, ты еще про какие настройки кнопки что знаешь?

bunda1
Не, в старом варианте я что-то ковырял, но там почти ничего не работало и понять что на что влияет - не представлялось возможным. А щас мне гемороя со своей хватает. Пока даже не смотрел ничего, кроме опций в менюшке. :)

bunda1
Ссылки и картинки начала цеплять - подскажи, что делать? Да, и хоткей не устанавливается

bezuma
thumb2.png

turbot
Аналогично проставлено, может конфликт где-то?

bezuma пишет

Да, и хоткей не устанавливается

Какой хоткей?

В смысле горячая клавиша на CB

Dumby

скрытый текст
Ок, допустим я разобрался. :dumb: oncommand при кликах мышью не работает из-за menuPopup.onmouseup = menuPopup.onmousedown =e=> e.preventDefault(); (но я все-рано не понимаю почему. Почему click - работает, а command - нет?) Это можно обойти? Чтоб и меню не закрывалось и command по кликам мышью работало?
Если нет, и установить два аттрибута, и oncommand и onclick, - единственный вариант, то как сделать, чтобы, при команде с клавиатуры, меню не закрывалось? Или никак, если верить mdn?

И почему

Выделить код

Код:

mItem.setAttribute('oncommand', 'if (event.shiftKey) {event.preventDefault(); event.stopPropagation(); custombuttons.clearPrefs("' + m.pref + '")};' + browserRestart);

- на menu не срабатывает? Первое нажатие комбинации клавиш все-равно субменю открывает...

turbot
Чем атрибут не угодил?

Dumby
Всем устраивает, кроме того, что я о нем не знал. :) Спасибо.

скрытый текст
Но легче не стало. Если я меняю листенер на command, то не обрабатывается contextmenu, а для command ведь нельзя event.button задать, да? То есть, либо третий листенер вешать, либо отказываться от сброса параметров по пкм, либо все нахрен переделывать. Я в упадке...
Это совсем плохо, если я туда еще на contextmenu впихну листенер?

И главное, как быть со вторым вопросом? Что первая команда на пункте типа menu - открывает его субменю? и preventDefault не помогает. Может есть еще какой волшебный атрибут? :)


Dumby
Если я вас уже этой ерундой и своей тупостью утомил, вы прямо скажите. Я не обижусь. Честно. :) Буду сам ковырять, потихоньку.

turbot пишет

Если я вас уже этой ерундой и своей тупостью утомил

Вовсе нет. Нисколько.

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

И главное, как быть со вторым вопросом? Что первая команда на пункте типа menu - открывает его субменю? и preventDefault не помогает.

Так у <menu>, как такового, вроде же нет события command.
А, кстати, почему ты не хочешь чтобы некая «первая команда» открывала субменю?

Если я меняю листенер на command, то не обрабатывается contextmenu

Ага, предлагаешь опять угадать что, как и где ты меняешь?

И вообще, - будь ты проще. Оставь пока в покое свою кнопку.
Сделай себе другую, какую-нибудь максимально простую болванку.
Закодируй в ней что требуется по принципу «как слышица, так и пишица».
И возись уже с ней, до полной ясности.

Вот, например, попробуй понажимать такую.
И если у тебя на клавиатуре есть клавиша,
(не знаю как её назвать, но эта та, которая 93 KeyboardEvent.DOM_VK_CONTEXT_MENU)
то и её тоже понажимай.

Выделить код

Код:

var data = [
    "foo",
    ,
    {"bar": [
        "sub1",
        "sub2",
        "sub3"
    ]},
    "baz"
];
var popup = this.appendChild(document.createElement("menupopup"));
popup.setAttribute("position", "after_start");
popup.setAttribute("oncommand", "parentNode.bla(event);");
popup.setAttribute("oncontextmenu", "event.preventDefault(); parentNode.bla(event);");

for(var item of data) {
    if (!item)
        popup.appendChild(document.createElement("menuseparator"));

    else if (typeof item == "string") {
        var menuitem = popup.appendChild(document.createElement("menuitem"));
        menuitem.setAttribute("closemenu", "none");
        menuitem.setAttribute("label", item);
    }
    else {
        var [str] = Object.keys(item);
        var menu = popup.appendChild(document.createElement("menu"));
        menu.setAttribute("label", str);

        var subPopup = menu.appendChild(document.createElement("menupopup"));

        for(var subitem of item[str]) {
            var menuitem = subPopup.appendChild(document.createElement("menuitem"));
            menuitem.setAttribute("closemenu", "none");
            menuitem.setAttribute("label", subitem);
        }
    }
}
this._handleClick = () => popup.openPopup(this);
this.bla = e => {
    if ("busy" in this) return; this.busy = true;
    var {target} = e, {label} = target;

    target.label = label + " " + e.type;
    target.style.cssText = "color: red !important; font-weight: bold !important;";
    setTimeout(() => {
        target.label = label;
        target.removeAttribute("style");
        delete this.busy;
    }, 700);
}

Dumby

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

Оставь пока в покое свою кнопку.

Мне бы только домучать работу с клавиатуры, а дальше уже сам буду, потихоньку, в человеческий вид ее переписывать.

Ага, предлагаешь опять угадать что, как и где ты меняешь?

Виноват. Я про то, что добавил сброс значений с модификатором shift, но если с менюитемами нет проблем, то первый shift+enter на меню - всегда раскрывает их субменю. Т.е., я понял почему там preventDefault на oncommand не работает, спасибо, но может можно для этих меню вообще отрубить открытие субменю по enter'у, а лучше по shift+enter? Благо, стрелками открыть можно. Или это можно сделать, только если еще один листенер вешать? dash2.gif Да и какой? Я пробовал и keydown и keyup и keypress...

то и её тоже понажимай.

Угу, спасибо. Не подумал об этом. Это, конечно, вариант, вот только

если у тебя на клавиатуре есть клавиша

... Если уж делать, хотелось бы найти вариант без "если".

Черт, как же мой, в мучения выношенный, выкидыш жутко смотрится рядом твоей "напобаловаця"...  Но я своего все равно люблю! :D

P.S.: Да, я смотрю, KeyboardEvent.keyCode как deprecated помечен? А в остальных нет независящих от платформы кодов для клавиш? Или плохо смотрел?

turbot пишет

может можно для этих меню вообще отрубить открытие субменю по enter'у, а лучше по shift+enter? Благо, стрелками открыть можно. Или это можно сделать, только если еще один листенер вешать? dash2.gif Да и какой? Я пробовал и keydown и keyup и keypress...

Что-то мне это тоже на башку не налазит. Может так попробуй :/.

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

Выделить код

Код:

var data = [
    "foo",
    ,
    {"bar": [
        "sub1",
        "sub2",
        "sub3"
    ]},
    "baz"
];
var popup = this.appendChild(document.createElement("menupopup"));
popup.setAttribute("position", "after_start");
popup.setAttribute("oncommand", "parentNode.bla(event);");
popup.setAttribute("oncontextmenu", "event.preventDefault(); parentNode.bla(event);");

for(var item of data) {
    if (!item)
        popup.appendChild(document.createElement("menuseparator"));

    else if (typeof item == "string") {
        var menuitem = popup.appendChild(document.createElement("menuitem"));
        menuitem.setAttribute("closemenu", "none");
        menuitem.setAttribute("label", item);
    }
    else {
        var [str] = Object.keys(item);
        var menu = popup.appendChild(document.createElement("menu"));
        menu.setAttribute("label", str);

        var subPopup = menu.appendChild(document.createElement("menupopup"));

        for(var subitem of item[str]) {
            var menuitem = subPopup.appendChild(document.createElement("menuitem"));
            menuitem.setAttribute("closemenu", "none");
            menuitem.setAttribute("label", subitem);
        }
    }
}
this._handleClick = () => popup.openPopup(this);
this.bla = e => {
    if ("busy" in this) return; this.busy = true;
    var {target} = e, {label} = target;

    var action = e.type == "contextmenu" || e.shiftKey ? "RESET" : "set";
    target.label = label + " " + action;
    target.style.cssText = "color: red !important; font-weight: bold !important;";
    setTimeout(() => {
        target.label = label;
        target.removeAttribute("style");
        delete this.busy;
    }, 700);
}
var keyListener = {
    get data() {
        delete this.data;
        return this.data = "code" in KeyboardEvent.prototype
            ? {key: "code", val: "Enter"}
            : {key: "keyCode", val: KeyboardEvent.DOM_VK_RETURN};
    },
    handleEvent: function(e) {
        this[e.type](e);
    },
    popupshown: function(e) {
        if (e.target != popup) return;
        popup.addEventListener("popuphidden", this, false);
        window.addEventListener("keydown", this, true);
    },
    popuphidden: function(e) {
        if (e.target != popup) return;
        popup.removeEventListener("popuphidden", this, false);
        window.removeEventListener("keydown", this, true);
    },
    keydown: function(e) {
        if (e.shiftKey && !e.ctrlKey && !e.altKey && e[this.data.key] == this.data.val) {
            var target = popup.querySelector("menu[_moz-menuactive]:not([open])");
            if (!target) return;
            var {firstChild} = target;
            firstChild.remove();
            setTimeout(() => target.appendChild(firstChild), 0);
            self.bla({target: target, type: "command", shiftKey: true});
        }
    }
};
addEventListener("popupshown", keyListener, false, popup);

Dumby
Хех, спасибо, впечатляет. Вот только я не потяну такое в свою кнопку запихнуть. :D

В общем, решил пока обойтись тем, что есть. Последняя просьба (клянусь): не подскажешь, как клавиша DOM_VK_CONTEXT_MENU по правильному называется, чтобы в описании указать. Не могу нагуглить.

turbot пишет

не подскажешь, как клавиша DOM_VK_CONTEXT_MENU по правильному называется

Нет, к сожалению, не смогу подсказать, не знаю как правильно её назвать.

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

В общем, решил пока обойтись тем, что есть.

Что-то не могу сообразить, а как собственно сам #quick-aboutconfig-menupopup
у тебя с клавиатуры открывается. В Инициализации, вроде, нет для этого специального кода.
И во вкладке Код нет строки для поддержки стандартного CB сочетания клавиш.

Вот только я не потяну такое в свою кнопку запихнуть.

Это не так сложно, как кажется. Можно ничего в твоём коде не менять,
а просто попробовать добавить в конец что-нибудь типа

Выделить код

Код:

addEventListener("popupshown", {
    handleEvent: function(e) {
        this[e.type](e);
    },
    popupshown: function(e) {
        if (e.target != menuPopup) return;
        menuPopup.addEventListener("popuphidden", this, false);
        window.addEventListener("keydown", this, true);
    },
    popuphidden: function(e) {
        if (e.target != menuPopup) return;
        menuPopup.removeEventListener("popuphidden", this, false);
        window.removeEventListener("keydown", this, true);
    },
    popupshowing: function(e) {
        e.target.parentNode.removeEventListener("popupshowing", this, false);
        e.preventDefault();
    },
    get old() {
        delete this.old;
        this.e = new MouseEvent("contextmenu", {});
        return this.old = parseInt(Services.appinfo.platformVersion) < 25;
    },
    get prop() {
        delete this.prop;
        if ("key" in KeyboardEvent.prototype) this.prop = "key", this.val = "Enter";
        else this.prop = "keyCode", this.val = KeyboardEvent.DOM_VK_RETURN;
        return this.prop;
    },
    keydown: function(e) {
        if (!e.shiftKey || e.ctrlKey || e.altKey || e[this.prop] != this.val) return;
        var target = menuPopup.querySelector("menu[_moz-menuactive]:not([open])");
        if (!target) return;

        this.old ? target.addEventListener("popupshowing", this, false) : e.stopPropagation();
        target.dispatchEvent(this.e);
        menuPopup.dispatchEvent(this.e);
    }
}, false, menuPopup);

Dumby
Спасибо. :beer:

а как собственно сам #quick-aboutconfig-menupopup
у тебя с клавиатуры открывается

Забыл вставить листенер. Добавил. :dumb:

Фух, на этом успокоюсь пока. Не слишком монструозно получилось? Или не стоит успокаиваться и надо переделывать под обсерверы? :sick:

turbot пишет

Забыл вставить листенер. Добавил.

А чем обусловлен именно такой выбор EventTarget'а?
То есть, если фокус вне gBrowser'а (например, в адресной строке),
то листенер срабатывать не должен?

Dumby
Хм, не подумал. :dumb:
Хотя, может так и лучше?

А к чему тогда его присобачить?

turbot пишет

Хотя, может так и лучше?

А вот прояви воображение, примерь ситуацию на себя.
Тебе бы так было лучше, или тебе так было бы не лучше.

А к чему тогда его присобачить?

Ну, предположу, что присобачить к window, и ещё, возможно,
на всякий случай, добавить проверку других модификаторов,
в том смысле, что именно Alt+M, а не какой-нибудь Ctrl+Alt+M.

Примерил. Раз фокус со строки не убирается, при открытии менюшки, то хуже точно не станет. Сделаю. :)

в том смысле, что именно Alt+M, а не какой-нибудь Ctrl+Alt+M.

Понял. Сделаю. Спасибо. (Хотя у меня ж на keyup повешен - разве нужно?) хех, проверил, нужно.

Не могу понять.
Вчера document.activeElement.tagName и document.activeElement.nodeName возвращали мне xul:browser (это если просто кликнуто на странице).

А сегодня в обоих случаях возвращает просто browser.
Вроде ничего не менял. В чем тут прикол?

Ferguss114
Возможно прикол в том, что вчера было кликнуто на странице
того браузера, который создаётся биндингом <tabbrowser>'а
(первая вкладка после запуска лисы), а сегодня нет.

Dumby
Да, точно!  Именно так и получилось  :D

Выделить код

Код:

// полноценная строка поиска
function onFind() { gFindBar.onFindCommand(); setTimeout(()=> gFindBar._findField.selectionStart = 2, 0) };
messageManager.addMessageListener("Findbar:Keypress", onFind);
addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onFind));

Как исправить код, чтобы он не реагировал на клавиши верх/вниз/влево/вправо, ентер и пробел?

Подскажите,а не существует ли кнопки,которая может заменить Tab History Menu ?

VORON
https://forum.mozilla-russia.org/viewto … 56#p710856

turbot
А не могли бы вы мне подсказать :)

Не знаю.

:( ещё и на enter реагирует, где не надо.

если  CB позволяющая  скопировать   ссылку на  изображение при  нажатом  ALT например ?

Сыылка прекрасно копируется и без alt. Но если вам надо принципиально с alt…

KOT040188 пишет

Сыылка прекрасно копируется и без alt. Но если вам надо принципиально с alt…

ну   чтоб одним кликом сохранялась в буфер ЛКМ+ALT например  или  колесо+ALT
Сейчас-то  надо  выбрать из меню  этот пункт при  ПКМ на картинку
когда   по 100 раз за час     ссылки  дёргаешь запаривает :)

Ах вот оно что…:)

selevo

Выделить код

Код:

addEventListener('dblclick', (e)=> {
  var img = e.originalTarget.tagName.toLowerCase() == "img";
  var win = e.originalTarget.ownerDocument.defaultView;
  if (img && e.button == 2 && win.top == content) {
    e.preventDefault();
    e.stopPropagation();
    document.getElementById("contentAreaContextMenu").hidePopup();
    var imgLink = e.originalTarget.src;
    if (imgLink && e.originalTarget.parentNode.tagName.toLowerCase() == "a"
       && e.originalTarget.parentNode.href.match(/\.(jpg|jpeg|png|gif|apng|webp)$/)) {
      imgLink = e.originalTarget.parentNode.href;
    }
    gClipboard.write(imgLink);
    custombuttons.alertSlide('Ссылка на изображение скопирована', imgLink);
  }
}, false, gBrowser);

Двойным ПКМ по картинкам. Если картинка - ссылка на картинку, то копируется ссылка на картинку. Только если ссылка прямая (можно изменить, удалив

Выделить код

Код:

&& e.originalTarget.parentNode.href.match(/\.(jpg|jpeg|png|gif|apng|webp)$/)

-тогда скопируется любая ссылка).

Не работает на 28,38 лисах.Запустилась только с 45 и 46

VORON
Так на них и оригинальное расширение работает...

Но вот, хозяин барин:

Выделить код

Код:

for (var type of ["mousedown", "dragstart", "TabClose"]) {
  addEventListener(type, (e)=> {
    if (e.target != gBrowser.selectedTab) return;
    var menuPopup = document.getElementById("backForwardMenu");
    if (e.type == "mousedown" && e.button == 0) {
      menuPopup.showPopup(e.target, -1, -1, "popup", "bottomleft", "topleft")
    } else {
      menuPopup.hidePopup();
    }
  }, true, gBrowser.tabContainer)
};

На 24+ точно работает

turbot пишет

VORON
Так на них и оригинальное расширение работает...
Но вот, хозяин барин:
На 24+ точно работает

Ну так ради уменьшения количества расширений,не только функционала для:D
Спасибо.

turbot
Благодарю, прекрасная работа!
Надеюсь другим тоже пригодится.

Dumby
не подскажете про BBCode:

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

Выделить код

Код:

addEventListener("click", (e)=> {
    if (document.activeElement != gBrowser.selectedBrowser) return;
    var text = e.target.tagName.toLowerCase() == "textarea";
    if (text && e.button == 0) {
        popup.showPopup(e.target, -1, -1, "panel", "topright", "bottomright");
        e.target.focus();
    }
    else popup.hidePopup();
}, false, window);

заменил menupopup на panel и поставил

Выделить код

Код:

popup.setAttribute('noautohide', 'true');

), но есть пара проблем:
Будучи panel, попапы кнопок лишаются прокрутки. Подскажите, как сделать остальные субменю снова menupopup? Я заблудился в вашем коде... :sick:

Собственно, вот. Главная проблема. Остальное - мелочи, но может тоже подскажете:
Плавающая панель очень неспешно (а вернее, только если шевельнуть мышью и снова на секунду-другую остановить) возвращается к границе формы после прокрутки страницы. Можно ли сделать, чтоб она чаще корректировала свое положение?
Если листенер на focus, то как закрывать ее? При клике на странице фокус на нее не переходит? Потому что панель не скрывается. (По этой причине с click и сделал.)

VORON
Я тут подумал, может так лучше будет:

Выделить код

Код:

addEventListener('mousedown', e=> {
  let tab = e.originalTarget;
  while (tab && tab.localName != 'tab') tab = tab.parentNode;
  var selTab = tab.hasAttribute('visuallyselected') || tab.hasAttribute('selected');
  if (!tab) return;
  var menuPopup = document.getElementById("backForwardMenu");
  var controlItem = e.originalTarget.localName == 'toolbarbutton' || e.originalTarget.localName == 'image';
  tab.onmouseup = (tab && selTab && e.button == 0 && !controlItem) ? e=> menuPopup.openPopup(tab, 'after_start') : delete e;
}, true, gBrowser.tabContainer);

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

UPD: Переделал снова. Ничего существенного, но так вроде правильнее будет. Старый вариант - под спойлером.

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

Выделить код

Код:

addEventListener('mousedown', (e)=> {
  let tab = e.originalTarget;
  while (tab && tab.localName != 'tab') {
    tab = tab.parentNode;
  }
  var selTab = tab.hasAttribute('visuallyselected') || tab.hasAttribute('selected');
  var menuPopup = document.getElementById("backForwardMenu");
  var controlItem = e.originalTarget.localName == 'toolbarbutton' || e.originalTarget.localName == 'image';
  tab.onmouseup =e=> null;
  if (tab && selTab && e.button == 0 && !controlItem) {
    tab.onmouseup =e=> {
      menuPopup.showPopup(tab, -1, -1, "popup", "bottomleft", "topleft");
    }
  }
}, true, gBrowser.tabContainer);

turbot пишет

Я заблудился в вашем коде...

Код не мой.

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

Будучи panel, попапы кнопок лишаются прокрутки. Подскажите, как сделать остальные субменю снова menupopup?

Это несложно. Если там, где ты «заменил menupopup на panel»
заменить обратно на menupopup и добавить в массив пятый элемент "panel",
а во вкладке Справка заменить самый первый ноль, соответственно, на четыре,
то на panel изменится только попап с кнопками.

Но menupopup какой-то жадный до клавиш, впрочем
можно попробовать оставить panel, а прокрутку как у menupopup
к panel добавить каким-нибудь биндингом.

Плавающая панель очень неспешно (а вернее, только если шевельнуть мышью и снова на секунду-другую остановить) возвращается к границе формы после прокрутки страницы. Можно ли сделать, чтоб она чаще корректировала свое положение?

Не знаю. Но, например, есть метод moveToAnchor.
Можно его на листенеры повесить, но это сложно,
поскольку скролл, зум, ресайз, и всё такоё.
А можно повесить на интервал, но, сам понимаешь, интервал есть интервал.

Если листенер на focus, то как закрывать ее?

Да, focus это стрёмно. Может осторожно попробуй дописать вместо своего

Выделить код

Код:

(listener => {
    addEventListener("focus", listener, true, gBrowser);
    addDestructor(() => listener.textarea && listener.destroy());
})({
    position: "before_end",
    updatePositionInterval: 100,

    handleEvent(e) {
        if (!this.isTarget(e.target)) return;

        var xblURL = "data:application/xml," + encodeURIComponent(`
            <bindings xmlns="http://www.mozilla.org/xbl" xmlns:xul="${xulns}">
                <binding id="${'CB' + _id.slice(20) + '-bbc-panels'}" role="xul:menupopup" extends="chrome://global/content/bindings/popup.xml#panel">
                    <content>
                        <xul:arrowscrollbox class="popup-internal-box" flex="1" orient="vertical" smoothscroll="false">
                            <children/>
                        </xul:arrowscrollbox>
                    </content>
                </binding>
            </bindings>
        `.trim().replace(/>\s+</g, "><"));
        for(var subPopup of this.subPopups) subPopup.nodeName == "panel"
            && subPopup.style.setProperty("-moz-binding", `url("${xblURL}")`, "important");

        this.handleEvent = e => this[e.type](e);
        this.init(e.target);
    },
    isTarget(node) {
        return node instanceof HTMLTextAreaElement && !node.readOnly
            && node.ownerDocument.defaultView.top == content;
    },
    focus(e) {
        !this.textarea && this.isTarget(e.target) && this.init(e.target);
    },
    init(textarea) {
        this.textarea = textarea;
        popup.setAttribute("noautohide", true);

        this.intervalId = setInterval(() => this.moveToAnchor(), this.updatePositionInterval);
        popup.firstChild.addEventListener("popuphiding", this, false);
        popup.addEventListener("mousedown", this, true);

        popup.openPopup(textarea, this.position);
        setTimeout(() => textarea.focus() || textarea.addEventListener("blur", this, false), 0);
    },
    destroy() {
        popup.removeAttribute("noautohide");

        clearInterval(this.intervalId);
        this.textarea.removeEventListener("blur", this, false);
        popup.firstChild.removeEventListener("popuphiding", this, false);
        popup.removeEventListener("mousedown", this, true);

        popup.hidePopup();
        for(var subPopup of this.subPopups) subPopup.state == "open" && subPopup.hidePopup();
        this.textarea = null;
    },
    moveToAnchor() {
        popup.moveToAnchor(this.textarea, this.position);
        for(var subPopup of this.subPopups) subPopup.anchorNode && subPopup.moveToAnchor(subPopup.anchorNode);
    },
    get subPopups() {
        delete this.subPopups;
        return this.subPopups = [...popup.querySelectorAll("popupset > :first-child")];
    },
    blur(e) {
        !popup.matches(":hover") ? this.destroy() : setTimeout(() =>
            this.textarea.ownerDocument.defaultView.top != content ||
            this.textarea.ownerDocument.visibilityState == "hidden"
                ? this.destroy() : this.textarea.focus()
        , 0);
    },
    popuphiding(e) {
        popup.matches(":hover") && e.preventDefault();
    },
    mousedown() {
        var subPopup = popup.querySelector(`#${popup.id} > hbox > button:hover + popupset > :first-child`);
        if (!subPopup || subPopup.state != "open") return;
        var parent = subPopup.parentNode;
        subPopup.remove();
        setTimeout(() => parent.appendChild(subPopup), 100);
    }
});

Dumby пишет

Может осторожно попробуй дописать вместо своего

Ух, спасибо. Я б такое ни в жизнь не сотворил. Вроде, все отлично работает, еще раз спасибо. :beer:

Dumby
Можно вас еще помучать: во фреймах почему-то вылазит. Например, в редакторе стайлиша (во вкладке).

Сам поправил. :)

turbot
Что поправить надо?- мне тоже такая кнопка по душе пришлась.

VORON
Уж не знаю, насколько это правильный выход, но я просто убрал top у ownerDocument.defaultView.top. :D

Infocatcher

Давным-давно пользуюсь кнопкой Back_to_Close, и всё никак не спрошу...

А можно сделать так, чтобы она не изменяла дефолтный вид BACK-стрелки, т.е. когда "Go Back" возврата больше нет, стрелка тускнеет. (?)

thrower пишет

А можно сделать так, чтобы она не изменяла дефолтный вид BACK-стрелки, т.е. когда "Go Back" возврата больше нет, стрелка тускнеет. (?)

По идее (лень тестовый профиль запускать :D), там достаточно стили убрать вот эти:
https://github.com/Infocatcher/Custom_B … #L144-L163
И вот тут еще убрать:
https://github.com/Infocatcher/Custom_B … #L184-L187

Infocatcher

Спасибо. :)
Помогло, но Back становится перманентно черным, а не серым (тусклым).
Я, в меру своего понимания, могу предположить, что так и будет, потому что функция закрытия при нажатии Back активна, соответственно, и стрелка "активного" цвета.
Если так, то возможно ли тогда (если не сложно) убрать весь блок, отвечающий конкретно за закрытие таба при нажатии Back.
(оставшихся хоткея и/или боковых кнопок мыши хватит с лихвой).

thrower пишет

Помогло, но Back становится перманентно черным, а не серым (тусклым).Я, в меру своего понимания, могу предположить, что так и будет, потому что функция закрытия при нажатии Back активна, соответственно, и стрелка "активного" цвета.Если так, то возможно ли тогда (если не сложно) убрать весь блок, отвечающий конкретно за закрытие таба при нажатии Back.(оставшихся хоткея и/или боковых кнопок мыши хватит с лихвой).

В общем, пока придумал такой воркераунд, без удаления стиля из кнопки. :)

Взял из chrome://browser/skin/Toolbar.png иконку, перегнал ее в base64, и с добавлением opacity: 0.4 получил желаемый результат.

За подсказку про opacity спасибо okkamas_knife.

thrower
Хм, ну тогда и правда проще там в стилях поправить, потому как серая отключенная кнопка не будет нажиматься.
Вот так можно сделать:

Выделить код

Код:

var cssStr = '\
    @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");\n\
    @-moz-document url("' + window.location.href + '") {\n\
        #back-button[_cb_backToClose] > .toolbarbutton-icon {\n\
            opacity: 0.4 !important;\n\
        }\n\
    }';

(заменить там аналогичный var cssStr = ...)
А иконку и не трогать вовсе, пусть оригинальная висит.

thrower пишет

Если так, то возможно ли тогда (если не сложно) убрать весь блок, отвечающий конкретно за закрытие таба при нажатии Back.

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

Infocatcher

Спасибо!
Да, так лучше (без наложения иконки в base64).

У меня в браузере создаётся на веб-страницах див с моим текстом. Можно ли сделать, чтобы размер текста в этом диве
не менялся, если я меняю шрифт на самой странице?

Шрифт на странице я меняю СВ кнопкой "Zoom", если это имеет значение.

Dumby
Я пытаюсь присобачить PasteButtonsForStylish к редактору Custom Buttons (уж больно там удобнее реализовано добавление всяких кнопок, менюшек и т.д., в отличии от старой версии CustomPaste for CustomButtons, что в готовых кнопках) и, в общем-то, все получилось, за исключением главного - вставки шаблонов в редактор.
На ReferenceError: insertCodeAtCaret is not defined в

Выделить код

Код:

else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) {
                            insertCodeAtCaret(trg.value);
                            codeElementWrapper.focus();
                        }

моя фантазия зашла в тупик. Это что-то из самого Stylish'а?

Можно тебя попросить о помощи? shuffle.gif

turbot пишет

Это что-то из самого Stylish'а?

Да, insertCodeAtCaret это из самого́ Stylish'а.

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

turbot пишет

Можно тебя попросить о помощи? shuffle.gif

Разумеется можно, но смогу ли я помочь... . А вместо того, чтобы ногой шаркать,
лучше бы дал кнопку в которой «... в общем-то, все получилось, за исключением ...».
Правда же это было бы мне удобней?

И почему бы не уточнить что-нибудь про тот CB-редактор,
который ты используешь, ну типа классика или красава,
или подкинуть каких-нибудь иных всяких прочих подробностей.

Может попробуй так :/

Выделить код

Код:

else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) {

                            var controller = commandDispatcher.getControllerForCommand("cmd_insertText");
                            if (!controller || !controller.isCommandEnabled("cmd_insertText")) return;

                            controller.QueryInterface(Ci.nsICommandController);
                            var params = Cc["@mozilla.org/embedcomp/command-params;1"].createInstance(Ci.nsICommandParams);
                            params.setStringValue("state_data", trg.value);
                            controller.doCommandWithParams("cmd_insertText", params);

                            // Select
                            var se = activeElement.parentNode.__sourceEditor;
                            if (se) {
                                var endPosition = se.getOffset(se.getCursor("end"));
                                se.setSelection(se.getPosition(endPosition - trg.value.length), se.getPosition(endPosition));
                            }
                            else
                                activeElement.selectionStart = activeElement.selectionEnd - trg.value.length;
                        }

Dumby пишет

или подкинуть каких-нибудь иных всяких прочих подробностей.

Э, не подумал. Собственно, окромя элемента, за который цепляться будет и адреса окна, ничего и не менял. Редактор - да, использую тот что "красава". :)

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

Выделить код

Код:

gBrowser.currentURI.spec == "about:customizing" || (() => {
    var obsId = "CB" + _id.slice(20) + "_PasteButtonsForCB";
    var storageId = obsId + "Storage";
    var help = self.Help;
//    ----------------------------------- Storage ----------------------------------
    
    // Simple replacement for Application.storage
    // See https://github.com/Infocatcher/Custom_Buttons/commit/14d4c33bee20528da14793d3b4a3773a8a34d048
    
    var storage = (function() {
        var global = Cu.import("resource://gre/modules/Services.jsm", {});
        var ns = storageId;
        var storage = global[ns] || (global[ns] = global.Object.create(null));
        return {
            get: function(key, defaultVal) {
                if(key in storage)
                    return storage[key];
                return defaultVal;
            },
            set: function(key, val) {
                if(key === null)
                    delete storage[key];
                else
                    storage[key] = val;
            }
        };
    })();

//    ------------------------------------------------------------------------------

    var obs = storage.get(obsId, null);
    if (!obs) {
        obs = {
            id: obsId,
            boxId: obsId + "_Box",
            brURL: location.href,
            topic: "document-shown",
            init: function() {
                this.proceedAll(true);
                Services.obs.addObserver(this, this.topic, false);
            },
            destroy: function() {
                this.proceedAll(false);
                try {Services.obs.removeObserver(this, this.topic);}
                catch(ex) {Cu.reportError(ex);}
            },

//            ----------------------------------- OBS ----------------------------------

            observe: function(doc) {this.proceedDoc(doc, true)},
            isCBDoc(doc) {
                return doc.location && doc.location.href.startsWith("chrome://custombuttons/content/editor.xul")
            },
            isBrowserDoc(doc) {
                return doc.location && doc.location.href == this.brURL
            },
            proceedAll(init) {
                var en = Services.wm.getEnumerator(null);
                while(en.hasMoreElements()) {
                    var doc = en.getNext().document;
                    if (this.isBrowserDoc(doc)) {
                        for(var br of doc.defaultView.gBrowser.browsers) {
                            this.proceedDoc(br.contentDocument, init);
                        }
                        var sidebarDoc = doc.getElementById("sidebar").contentDocument;
                        this.proceedDoc(sidebarDoc, init);
                        var wpb = sidebarDoc.getElementById("web-panels-browser");
                        wpb && this.proceedDoc(wpb.contentDocument, init);
                    } 
                    else
                        this.proceedDoc(doc, init);
                }
            },
            proceedDoc(doc, add) {
                if (!this.isCBDoc(doc) || doc.readyState != "complete") return;
                var box = doc.getElementById(this.boxId);
                if (add && !box) {
                    var tabbox = doc.getElementById("custombuttons-editbutton-tabbox");
                    var before = tabbox.getElementsByTagName("tabs")[0];
                    this.addBox(before);
                } else if (!add && box) {
                    box && box.remove();
                }
            },

//            --------------------------------------------- BOX --------------------------------------------

            get box() {
                delete this.box;
                return this.box = this.createBox();
            },
            createBox() {
                var box = this.insertElement("hbox", null, {
                    id: this.boxId,
                    onclick: `
                        if (event.button != 2) return;
                        var popup = this.linkedPopup;
                        if (popup.state != "closed") popup.hidePopup();
                        popup.linkedTarget = event.originalTarget;
                        popup.openPopupAtScreen(event.screenX, event.screenY);
                    `,
                    oncommand: `
                        event.stopPropagation();
                        var trg = event.originalTarget;
                        if (trg.nodeName == "toolbarbutton")
                            trg.firstChild.openPopup(trg);
                        else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) {

                            var controller = commandDispatcher.getControllerForCommand("cmd_insertText");
                            if (!controller || !controller.isCommandEnabled("cmd_insertText")) return;
                            
                            controller.QueryInterface(Ci.nsICommandController);
                            var params = Cc["@mozilla.org/embedcomp/command-params;1"].createInstance(Ci.nsICommandParams);
                            params.setStringValue("state_data", trg.value);
                            controller.doCommandWithParams("cmd_insertText", params);

                            // Select
                            var se = activeElement.parentNode.__sourceEditor;
                            if (se) {
                                var endPosition = se.getOffset(se.getCursor("end"));
                  se.setSelection(se.getPosition(endPosition - trg.value.length), se.getPosition(endPosition));
                            }
                            else
                                activeElement.selectionStart = activeElement.selectionEnd - trg.value.length;
                        }
                    `
                });
                return box;
            },
            get boxContent() {
                delete this.boxContent;
                return this.boxContent = help.trim();
            },
            addBox(before) {
                var box = before.appendChild(this.box.cloneNode(false));
                box.innerHTML = this.boxContent;
                box.linkedPopup = box.appendChild(this.popup.cloneNode(true));
                box.linkedPopup.creator = this;
                box.style.cssText = "max-height: 32px !important; max-width: 320px !important;";
            },

//            ------------------------------------------- CONTEXT ------------------------------------------

            popupXUL: `
                <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
                    id="${obsId + "_Context"}"
                    oncommand="event.stopPropagation(); creator.cmdDispatcher(event);"
                    onpopupshowing="creator.contextPopupshowing(this);">
                    <menuitem label="Изменить" value="openEditor"/>
                    <menuseparator/>
                    <menuitem label="Выше" value="moveUp"/>
                    <menuitem label="Ниже" value="moveDown"/>
                    <menuseparator/>
                    <menuitem label="Копировать" value="copyItem" closemenu="none"/>
                    <menuitem label="Вставить" value="pasteItem"/>
                    <menuitem label="Удалить" value="deleteItem"/>
                    <menuseparator/>
                    <menuitem label="Новый menuitem" value="newMenuitem"/>
                    <menuitem label="Новoe menu" value="newMenu"/>
                    <menuitem label="Новый toolbarbutton" value="newButton"/>
                    <menuitem label="Новый menuseparator" value="newSeparator"/>
                    <menuseparator/>
                    <menuitem label="Картинка base64" value="imgBase64"/>
                </menupopup>
            `,
            get popup() {
                delete this.popup;
                return this.popup = this.createPopup();
            },
            createPopup() {
                var xul = this.popupXUL.trim().replace(/>\s+</g, "><");
                var popup = new DOMParser().parseFromString(xul, "application/xml").documentElement;
                popup.creator = this;
                return popup;
            },
            cmdDispatcher(e) {
                var trg = e.originalTarget, popup = trg.parentNode, cmd = trg.value;
                if (!cmd) return;
                var popupNode = popup.linkedTarget;
                cmd.startsWith("new")
                    ? this.newItem(popupNode, cmd.slice(3))
                    : this[cmd](popupNode, popup);
                "copyItem openEditor imgBase64".includes(cmd) || this.save(popupNode);
            },
            get emptySeparator() {
                delete this.emptySeparator;
                return this.emptySeparator = this.insertElement("menuseparator");
            },
            get emptyMenuitem() {
                delete this.emptyMenuitem;
                return this.emptyMenuitem = this.insertElement("menuitem", null, {label: "menuitem", value: ""});
            },
            get emptyMenupopup() {
                delete this.emptyMenupopup;
                var popup = this.insertElement("menupopup");
                popup.appendChild(this.emptyMenuitem.cloneNode(false));
                return this.emptyMenupopup = popup;
            },
            get emptyMenu() {
                delete this.emptyMenu;
                var menu = this.insertElement("menu", null, {label: "menu"});
                menu.appendChild(this.emptyMenupopup.cloneNode(true));
                return this.emptyMenu = menu;
            },
            get emptyButton() {
                delete this.emptyButton;
                var btn = this.insertElement("toolbarbutton", null, {
                    image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////////////////////////////////////////////////////////////////////AAAA/wAAAP//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP8AAAD//////wAAAP//////////////////////////////////////////////////////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////////////////////////////////////////////////////AAAA//////8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////AAAA/wAAAP///////////////////////////////////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEH4KxBB+CsQQfgrEEH4KxBB+CsQQfgrEEAAKxBAACsQQAArEEAAKxBAACsQQ=="
                });
                btn.appendChild(this.emptyMenupopup.cloneNode(true));
                return this.emptyButton = btn;
            },
            newItem(node, name) {
                var newItem = this["empty" + name].cloneNode(true);
                node.parentNode.insertBefore(newItem, node.nextSibling);
                if (name == "Button") newItem.firstChild.setAttribute("position", "after_start");
            },
            deleteItem(node) {
                var win = this.top(node);
                if (!win.confirm("Удалить ?")) return;
                node.remove();
            },
            moveUp(node) {
                node.parentNode.insertBefore(node, node.previousSibling);
            },
            moveDown(node) {
                node.parentNode.insertBefore(node, node.nextSibling.nextSibling);
            },
            copyItem(node, popup) {
                this.transactionNode = node.cloneNode(true);
                popup.querySelector('menuitem[value="pasteItem"]').disabled = false;
            },
            pasteItem(node) {
                node.parentNode.insertBefore(this.transactionNode, node);
            },
            imgBase64(node) {
                var obs = this;
                var picker = makeFilePicker();
                picker.appendFilters(picker.filterImages);
                picker.init(this.top(node), "Изображение", picker.modeOpen);
                picker.open({done: function(result) {
                    if (result != picker.returnOK) return;
                    var reader = new FileReader();
                    reader.onload = function() {
                        if (!reader.result) return;
                        var name = node.nodeName;
                        "menuitem".includes(name) && node.classList.add(name + "-iconic");
                        node.setAttribute("image", reader.result);
                        obs.save(node);
                    }
                    reader.readAsDataURL(new File(picker.file));
                }});
            },
            disablers: {
                moveUp(node) {return !node.previousSibling},
                moveDown(node) {return !node.nextSibling || node.nextSibling.nodeName == "menupopup"},
                deleteItem(node) {
                    var count = node.parentNode.childElementCount;
                    return count == 1 || (node.nodeName == "toolbarbutton" && count == 2);
                },
                top(node) {return "toolbarbutton hbox".includes(node.nodeName);},
                newMenuitem(node) {return this.top(node);},
                newMenu(node) {return this.top(node);},
                newSeparator(node) {return this.top(node);},
                newButton(node) {return !this.top(node);},
                copyItem(node) {return node.nodeName == "hbox";},
                pasteItem() {return !("transactionNode" in this.obs);},
                imgBase64(node) {return !"toolbarbutton menu menuitem".includes(node.nodeName);}
            },
            contextPopupshowing(popup) {
                this.disablers.obs = this;
                var node = popup.linkedTarget;
                for(var key in this.disablers) {
                    var menuitem = popup.querySelector(`menuitem[value="${key}"]`);
                    if (menuitem) menuitem.disabled = this.disablers[key](node) || node.nodeName == "menupopup";
                }
                popup.querySelector('menuitem[value="openEditor"]').disabled = node.nodeName == "hbox";
            },

//            ----------------------------------------------- EDITOR ----------------------------------------------

            editorXUL: `
                <?xml version="1.0"?>
                <?xml-stylesheet href="chrome://global/skin/"?>
                <?xml-stylesheet href="chrome://custombuttons/content/codeeditor.css" type="text/css"?>
                <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
                    title="Изменить"
                    onload="obs = Components.utils.import('resource://gre/modules/Services.jsm')['${storageId}']['${obsId}']; obs.initEditor(window);"
                    ondialogaccept="obs.setAttributes(window);"
                    buttons="extra2,accept,cancel"
                    buttonlabelextra2="Удалить атрибут"
                    ondialogextra2="obs.deleteAttribute(window);">
                    <hbox align="center">
                        <label value="Новый атрибут"/>
                        <textbox flex="1" multiline="false" onkeydown="obs.onTexboxKeydown(event);"/>
                        <button label="Добавить" oncommand="obs.newAttribute(window, textbox.value);"/>
                    </hbox>
                    <tabbox flex="1">
                        <tabs/>
                        <tabpanels flex="1"/>
                    </tabbox>
                </dialog>
            `,
            get editorURL() {
                delete this.editorURL;
                var xul = this.editorXUL.trim();
                return this.editorURL = "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(xul);
            },
            openEditor(node) {
                this.node = node; this.elm = this.insertElement("box");
                Services.ww.openWindow(this.top(node), this.editorURL, "",
                    "chrome,modal,resizable,centerscreen,width=700,height=500"
                , null);
            },
            initEditor(win) {
                for(var str of ["tabs", "tabpanels", "textbox"]) {
                    win[str] = win.document.querySelector(str);
                }
                for(var {name, value} of this.node.attributes) {
                    var isVal = name == "value";
                    var tab = this.addTab(win, name, value, isVal);
                    if (isVal) tab.style.cssText = "font-weight: bold; color: navy;";
                }
                if (win.tabs.selectedIndex == -1) win.tabs.selectedIndex = 0;
            },
            addTab(win, name, value, sel) {
                var tab = this.insertElement("tab", win.tabs, {label: name});
                tab.linkedCbeditor = this.insertElement("cbeditor", win.tabpanels, {
                    class: "custombuttons-editor-codeBox",
                    multiline: "true",
                    flex: "1",
                    value: value
                });
                if (sel) {
                    win.tabs.selectedItem = tab;
                    tab.linkedCbeditor.focus();
                }
                return tab;
            },
            newAttribute(win, name) {
                name && this.addTab(win, name, "", true);
                win.textbox.value = "";
            },
            onTexboxKeydown(e) {
                if (e.keyCode == e.DOM_VK_RETURN) {
                    e.preventDefault();
                    this.newAttribute(e.target.ownerGlobal, e.target.value);
                } else try {
                    var attr = e.target.value + e.key;
                    this.elm.setAttribute(attr, true);
                    this.elm.removeAttribute(attr);
                } catch(ex) {
                    e.preventDefault();
                }
            },
            setAttributes(win) {
                for(var tab of win.tabs.childNodes) {
                    var val = tab.linkedCbeditor.value;
                    this.node.setAttribute(tab.label, val);
                }
                this.save();
            },
            deleteAttribute(win) {
                var tab = win.tabs.selectedItem;
                var attr = tab.label;
                if (!win.confirm("Удалить атрибут " + attr + " ?")) return;
                this.node.removeAttribute(tab.label);
                tab.linkedCbeditor.remove(); tab.remove();
                win.tabs.selectedIndex = 0;
            },
            save(node = this.node) {
                var box = node.ownerDocument.getElementById(this.boxId);
                if (!box) return;
                box.removeChild(box.linkedPopup);
                var xul = box.innerHTML.replace(/\t/g, "&#x9;").replace(/\n/g, "&#xA;").replace(/\r/g, "&#xD;");
                var link = custombuttons.makeButtonLink("edit", _id);
                var param = custombuttons.cbService.getButtonParameters(link);
                param = param.wrappedJSObject || param;
                param.help = xul;
                custombuttons.cbService.installButton(param);    
            },

//            ----------------------------------------------- MISC ------------------------------------------

            insertElement(element, parent, attributes, before = null) {
                var notExist = typeof element != "object";
                if (notExist) element = document.createElement(element);
                if (notExist && attributes) {
                    for(var attribute in attributes) {
                        attribute == "data" || element.setAttribute(attribute, attributes[attribute]);
                    }
                }
                parent && parent.insertBefore(element, before);
                return element;
            },
            top(node) {
                var win = node.ownerGlobal;
                if (!(win instanceof ChromeWindow))
                    win = Services.wm.getMostRecentWindow("navigator:browser");
                return win;
            }
        };
        storage.set(obsId, obs);
        obs.init();
    }
    function destructor(reason) {
        if (reason[5] != "e") return;
        var obs = storage.get(obsId, null);
        if (obs) {
            obs.destroy();
            storage.set(obsId, null);
        }
    }
    addDestructor(reason => {
        destructor(reason);
        setTimeout(function() {
            custombuttons.palette.querySelector('toolbarbutton[id="' + _id + '"]') && destructor("delete");
        }, 500);
    });
})();


Это уже с "попробуй". Спасибо, все работает. :beer:

30-05-2016 20:26:41
Раз уж пошла такая пьянка, помучаю тогда Infocatcher'а насчет "красавы". :)

Infocatcher
А можно ли приделать к CB_Source_Editor автодополнение во вкладках с кодом, как во вкладке "помощь" для стилей, и как это сделано у консоли браузера, вместо того, что сейчас, по Ctrl + Space?

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

Выделить код

Код:

string.replace(/re/g, 'abc')

или так

Выделить код

Код:

string.split(/re/).join('abc')
toxa пишет

как будет быстрее работать

У меня так алертится разница примерно раза в три-четыре

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

Выделить код

Код:

var string = "Preference", num = 200000, str;

var now = Date.now();
for(let n = num; n; n--) str = string.replace(/re/g, 'abc');
var delta1 = Date.now() - now;

now = Date.now();
for(let n = num; n; n--) str = string.split(/re/).join('abc');
var delta2 = Date.now() - now;

var res = delta1/delta2, factor = (res < 1 ? 1/res : res).toFixed(2);
alert(
    "string.replace(/re/g, 'abc')\t" + delta1
    + "\n" +
    "string.split(/re/).join('abc')\t" + delta2
    + "\n" +
    "factor\t" + factor
);

Dumby пишет
toxa пишет

как будет быстрее работать

У меня так алертится разница примерно раза в три-четыре

Ясно. Спасибо большое!

del. не туда:)
https://forum.mozilla-russia.org/viewto … 29#p716429

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

Выделить код

Код:

var string = '&quot; &quot;';
alert(decodeURIComponent(string))

Алерт показывает мне те же самые символы.
Хотя по идее функция decodeURIComponent должна бы превратить их в  "

beggrr
"" - это %22%22. А &quot; - это html спецсимволы. Их, вроде, только регуляркой заменять.

turbot пишет

beggrr
"" - это %22%22. А &quot; - это html спецсимволы. Их, вроде, только регуляркой заменять.

А почему он-лайновый декодер http://pressbin.com/tools/urlencode_urldecode/  заменяет эти спецсимволы через decodeURIComponent() и decodeURI() и unescape()

turbot пишет

beggrr
"" - это %22%22. А &quot; - это html спецсимволы. Их, вроде, только регуляркой заменять.

Я вот нашёл в Интернете интересное решение.

Выделить код

Код:

var string = '&quot; &quot;';
var textarea = document.createElement('textarea');
textarea.innerHTML = string;

alert(textarea.value)

Только непонятно, эту textarea надо потом удалять? Как?
А если не удалять, то она будет висеть в памяти? А если этих textarea будет несколько, они все будут занимать память?

rbfyec пишет

Я вот нашёл в Интернете интересное решение.

Ну так там у beggrr по ссылке так и сделано:

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

Выделить код

Код:

function encode(text) {
   if (document.getElementById('which_urlencode').checked == true) {
      document.getElementById('escape').innerHTML = escape(text);
      document.getElementById('encodeURI').innerHTML = encodeURI(text);
      document.getElementById('encodeURIComponent').innerHTML = encodeURIComponent(text);
      document.getElementById('urlencode').innerHTML = urlencode(text);
   }
   else {
      document.getElementById('unescape').innerHTML = unescape(text);
      document.getElementById('decodeURI').innerHTML = decodeURI(text);
      document.getElementById('decodeURIComponent').innerHTML = decodeURIComponent(text);
      document.getElementById('urldecode').innerHTML = urldecode(text);   
   }
}


Видимо, дело в innerHTML. А уж почему, не знаю. Сам чайник. :)

rbfyec пишет

Только непонятно, эту textarea надо потом удалять? Как?
А если не удалять, то она будет висеть в памяти? А если этих textarea будет несколько, они все будут занимать память?

Там textarea не вставляется в документ (через appendChild/insertBefore), поэтому ее удалит сборщик мусора, когда выполнение кода выйдет из функции, в которой есть ссылка на textarea. Если, конечно, не передать каким-нибудь образом ссылку вовне.

Infocatcher пишет

Там textarea не вставляется в документ (через appendChild/insertBefore), поэтому ее удалит сборщик мусора, когда выполнение кода выйдет из функции, в которой есть ссылка на textarea. Если, конечно, не передать каким-нибудь образом ссылку вовне.

А как можно потом проверить, поудалялись ли эти textarea?

rbfyec
Никак не проверить. :D
Чтобы проверить, нужна ссылка, а пока есть ссылка – ничего не удалится.
Если есть опасения, что создаются в той же области видимости функции и что осядет в замыкании – можно принудительно сделать

Выделить код

Код:

textarea = null;

Если делать расширение, можно в about:memory смотреть, там по адресу скрипта видно будет, если что-то в памяти осталось после выключения.

Infocatcher
Спасибо :)

В [firefox] 47.0/win64 сломались кнопки:
Zoom
Menuitem hider
Почините,  пожалуйста...если возможно.

[CB]Изменить масштаб тоже перестает работать после перезапуска [firefox]

oleg.sgh пишет

В [firefox] 47.0/win64 сломались кнопки:

Zoom
Menuitem hider
Изменить масштаб

bunda1 Спасибо! Заработала Menuitem hider :)

bunda1
Menuitem hider
Иконка перечеркнута...как будь то постоянно отключено и в рабочем состоянии кнопки.

oleg.sgh пишет

bunda1
Иконка перечеркнута...как будь то постоянно отключено и в рабочем состоянии кнопки.

Упс :) Исправил: Menuitem hider

bunda1
Замечательно. Спасибо.

bunda1
Еще обнаружил:

1. FF Exp Imp CB - не фурычит совсем
2. Переключать проигрывания анимации(gif) - неактивна (серая)
3. Save - не работает Сохранить ярлык страницы как…

bezuma
Упс, не тому комент вставил...:P

bunda1
Здравствуйте!
На 47 FF сломалась кнопка, там несколько функций в одной.
Из этого зоопарка совсем не работает "restart", пункт которого в меню "Файл" находится.
Ещё есть "масштаб", который в адресной строке. Я меняю его скроллингом мыши, сейчас он меняется, но значение масштаба отображается всегда 100%.

Весь код только в поле "инициализация".

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

Выделить код

Код:

// Context Search, от 29.01.2014. ................................
(function () {
   var searchService = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); 

   var searchSelect = document.getElementById('context-searchselect');  
   searchSelect.collapsed = false; // удалить стандартный пункт меню для поиска

   
   // Создать новый пункт меню для поиска ....
   var contextMenu = document.getElementById("contentAreaContextMenu");
   var menu = contextMenu.insertBefore( document.createElement('menu'), searchSelect ); // над каким пунктом меню показывать
   menu.setAttribute("class", "menu-iconic");
   
   // устанавливать иконку, название и поисковик для нового пункта меню
   function setMenu() {  
      menu.engine = searchService.currentEngine;
      menu.setAttribute("label", "Искать в...");
         };
   setMenu();   
 
   // наблюдатель за стандартным пунктом меню 'Копировать' прячет меню поиска
   var copy = document.getElementById('context-copy');  
   var setHiddenMenu = new MutationObserver(function() {
          menu.hidden = copy.hidden || copy.disabled;          
   });
   setHiddenMenu.observe( copy, { attributes: true, attributeFilter: ["hidden", "disabled"] } );
   
   
   // Создать подменю с поисковиками .... 
   var menuPopup = menu.appendChild( document.createElement("menupopup") ); 
   menuPopup.setAttribute('style', 'overflow: scroll'); 
    
   // создать пункты в подменю
   function setItemsToMenuPopup(e) {
      menuPopup.textContent = "";      

      var engines = searchService.getVisibleEngines({});
      engines.forEach(function( engine ) {
         var mItem = document.createElement("menuitem");
         mItem.setAttribute("label", engine.name );
         mItem.setAttribute("class", "menuitem-iconic");
         mItem.setAttribute("src", engine.iconURI.spec );
         mItem.engine = engine;
         menuPopup.appendChild( mItem );
      });

   };  
   setItemsToMenuPopup();
   
   
   // Установить действие для клика на меню и подменю ....
   menu.setAttribute("onmouseup", "\
      var background = ( event.button == 0 ) ? false : true;\
      var clip = gClipboard.read();\
      goDoCommand('cmd_copy');\
      setTimeout(function() {\
         document.getElementById('contentAreaContextMenu').hidePopup();\
         var submission = event.target.engine.getSubmission( gClipboard.read(), null );\
         gBrowser.loadOneTab( submission.uri.spec, null, null, submission.postData, background, false );\
         gClipboard.write( clip );\
      }, 0);\
   ");      
      
   
   // Наблюдатель за изменениями в поисковиках пересоздаёт меню и подменю .... 
   var getEngineModified = {
      observe: function(subject, topic, data) { 
         if ( /changed|removed|current/.test( data ) ) { setMenu(); setItemsToMenuPopup() };             
      }
   };
   Services.obs.addObserver( getEngineModified, "browser-search-engine-modified", false );   
   
   
   // Удалять наблюдатели и меню, показать стандартный пункт ....
   addDestructor(function() {
      contextMenu.removeChild( menu );           
      setHiddenMenu.disconnect();
      Services.obs.removeObserver( getEngineModified, "browser-search-engine-modified", false );
      
      searchSelect.collapsed = false; 
   });   
})();

// Добавить новый пункт "Перезапуск" в главном меню .....................................................
(function() {
    // блокировать дублирование пункта при открытии настройки панелей
    if ( document.getElementById("restart_firefox") ) return;
    
    var menuItem = document.createElement("menuitem");
    menuItem.setAttribute("id", "restart_firefox");               
    menuItem.setAttribute("label", "Restart");
    menuItem.setAttribute("oncommand", "Application.restart()");    
    
    var QuitItem = document.getElementById("menu_FileQuitItem"); // в меню 'Файл'
    QuitItem.parentNode.insertBefore( menuItem, QuitItem );
    
    var appmenuQuit = document.getElementById("appmenu_quit") || document.getElementById("appmenu-quit"); // в меню kнопки "Firefox"
    if ( appmenuQuit ) appmenuQuit.parentNode.insertBefore( menuItem.cloneNode(true), appmenuQuit );
})();

// Добавить новый пункт "Поиск изображения в google" в контекстном меню изображений ...........................
(function() {
   if ( document.getElementById("image-search") ) return; 
               
   var menuItem = document.createElement("menuitem");
   menuItem.id = "image-search";
   menuItem.setAttribute("label", "Поиск изображения в google");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab('http://www.google.com/searchbyimage?image_url=' + encodeURIComponent( gContextMenu.mediaURL || gContextMenu.imageURL || gContextMenu.bgImageURL ) )");
   document.getElementById("context-viewimage").parentNode.insertBefore( menuItem, document.getElementById("context-viewimage") );
   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu.onImage; 
     }, false);
})();

// Кнопка для управления масштабом страницы в адресной строке 2, от 14.12.2014. ................................
(function f() {   
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   zoomButton.setAttribute("context", "event.stopPropagation()");
   var urlbarIcons = document.getElementById("urlbar-icons");
   urlbarIcons.insertBefore( zoomButton, urlbarIcons.lastChild ); // перед последней кнопкой адресной строки
   addDestructor(function() { urlbarIcons.removeChild( zoomButton ) });
   
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -5px;"; // Css стиль для кнопки масштаба
   zoomButton.tooltipText = "Л: Сбросить масштаб на 100%\nС: Единый масштаб для всех страниц \nП: Открыть меню управления масштабом ";

   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", function(e) {
      // сбросить масштаб               
      if ( e.button == 0 && e.target.localName !== "menuitem" ) FullZoom.reset();
       
      // единый масштаб для всех страниц
      if ( e.button == 1 ) {                 
           cbu.isPref("CB.zoom.allEvenly", false );
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
                
           updateZoomButton();
           }
      
      // открыть меню управления масштабом  
      if ( e.button == 2 ) {            
           
           zoomButton.textContent = ""; // удалить старое меню
           
           // создать новое меню управления масштабом
           var zoom = zoomButton.label.replace('%','');
           var menu = zoomButton.appendChild( document.createElement("menupopup") );
           cbu.getPrefs("toolkit.zoomManager.zoomValues").split(',').forEach(function( val ) {
              var mItem = menu.appendChild( document.createElement("menuitem") ); 
              var str = Math.round(val*100);      
              mItem.setAttribute("value", val );
              mItem.setAttribute("label", str );
              mItem.setAttribute('type', 'checkbox');
              mItem.setAttribute('checked', str == zoom );              
              mItem.setAttribute("oncommand", "this.parentNode.setZoom(event)"); 
           });
           menu.setZoom = function(e) {
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = e.target.value;
              updateZoomButton();
           };
           
           menu.appendChild( document.createElement("menuseparator") ); // добавить разделитель 
           
           // добавить к новому меню стандартное меню масштаба
           var popup = document.getElementById("viewFullZoomMenu").lastChild;
           [...popup.childNodes].forEach(function( mItem ) {
               popup.lastChild.setAttribute('checked', !ZoomManager.useFullZoom );
               menu.appendChild( mItem.cloneNode(true) );
           });
           
           menu.showPopup( zoomButton, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
           };
               
   }, false, zoomButton );

         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", function(e) {
      e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge();
   }, false, zoomButton );
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var str = "updateZoomButton(); $&";
   var handleEvent = parseInt(Application.version) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled;
   var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, handleEvent];
   array.forEach(function(func) { eval( (func.toString().match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace(/}$/, str)).replace('_', '.') ) }); 
   addDestructor(function() { 
      array.forEach(function(func) { eval( (func.toString().match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace('_', '.') ) });  
   });
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; 
      setTimeout(function() {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);
      
      // запомнить текущий масштаб в 'about:config'
      if ( e == undefined ) { 
           try { window.clearTimeout( f.timeout ) } catch(e) {};
           f.timeout = window.setTimeout(function() {
              cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )  
           }, 250 );
           }     
   };
     
     
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", function(e) { 
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
      if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
           var value = cbu.getPrefs("CB.zoom.Percent");
           if ( ZoomManager.zoom.toFixed(2) == value ) return;

           setTimeout(function() {  
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0) 
           }      
      else 
           updateZoomButton(e);
                 
   }, true, gBrowser.tabContainer );   
})();

1fesFFFF

скрытый текст
Замените

Выделить код

Код:

menuItem.setAttribute("oncommand", "Application.restart()");

на:

Выделить код

Код:

menuItem.setAttribute("oncommand", "Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart)");

и

Выделить код

Код:

var handleEvent = parseInt(Application.version) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled;

на

Выделить код

Код:

var handleEvent = parseInt(Services.appinfo.platformVersion) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled;

в 47 [firefox] сломалась About: Menu :| Отремонтить как?

oleg953
Custom Buttons • View topic - About: Menus Mod

voqabuhe пишет

Custom Buttons • View topic - About: Menus Mod

вот она то и отвалилась в 47 [firefox]

08-06-2016 13:20:06
нашёл то что работает №111

oleg953 пишет

вот она то и отвалилась в 47

Странно, у меня работает. Возможно мне её уже правили, но не помню. Попробуй, если ещё нужна

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EAbout%3A%20Menu%20Mod%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACIUlEQVQ4y42Tv09TcRTFP6+vQE0Ngs4maoK6IVipiAIuDkLYEaKTq4mzf4Kr0cTJWY0rRAmUaDSBmEBCdCFYopQWkKoU+8r73nsdXn/QxIGbfLdzzzk593w9M+PB65U5PIY5yhiZ55OpmwBBEBAHEHHDd69eaMKpgXkgTjHA80DVePl5tUkoDmAqAJTDCAwRWAE1QzR6vu/VsU0EKlJ111BXqC/WSPAa2GYHEkYEFpEchI7puQyLS0sY0NvdzdDAdVqI17G1iUUZSFU5UpqanWVlPcfo6BgjI2N8yW7ybn4eUcXMmHz6tvO/GaiBqLKa3+HW4DV6us4SiqIG7xcW+bpTolIu4cfb1iaeTD0EXsSiDByihlMlECPZfpLcZoFsMeDbbpkf+TzJ9k52y5H98cHeDhX3rBGiCk6Vrb0KYsaJ48dYXF6msL2NmpHN5Rjq78dVbW/vO1QlcShERyCKUyOTmSG7WeD0mXNsfF8Hg3TqChfPd7GytQ9AsRxi4hoZiAhBqMzMTLO6tkaqL83AlcvEYjcQhb3A8aeiTenXgo8cOGGnWCSXz9GXTpO61MPG7wpS64IZyRa/udFOmq+QTLZzb+IO+K0USmG0CEj1tE6toR46zLR0iECpiBJ6rVQOjESLX6+yqNbbWJtPCx9/+W2J+wCemTH++NUHVRk4ymf0Yv5CLBa7/ebRxM8gCCKCRCJxCugA/CNw/AX2o98clP8BXEloo/iyk7kAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%0Avar%20%7Bclasses%3A%20Cc%2C%20interfaces%3A%20Ci%2C%20utils%3A%20Cu%7D%20%3D%20Components%3B%0Avar%20menu%20%3D%20document.createElement%28%22menupopup%22%29%3B%0Amenu.setAttribute%28%22context%22%2C%20%22inspect%28event%29%22%29%3B%0Amenu.setAttribute%28%22oncontextmenu%22%2C%20%22toolbar-context-menu%22%29%3B%0Amenu.setAttribute%28%22onpopupshowing%22%2C%20%22populate%28this%29%22%29%3B%0Amenu.setAttribute%28%22oncommand%22%2C%20%22getTab%28event.target.label%29%22%29%3B%0Amenu.setAttribute%28%22onclick%22%2C%20%22middleClickHandler%28event%29%22%29%3B%0Amenu.id%20%3D%20%22aboutMenu%22%3B%0A%0Athis.appendChild%28menu%29%3B%0A%0Amenu.populate%20%3D%20populate.bind%28%29%3B%0Amenu.style.MozAppearance%20%3D%20%22none%22%3B%0Amenu.style.border%20%3D%20%222px%20outset%20%23999%22%3B%0Amenu.style.listStyleImage%20%3D%20%22none%22%3B%0A%0Afunction%20populate%28aNode%29%20%7B%0A%20%20while%28aNode.lastChild%29%20aNode.removeChild%28aNode.lastChild%29%3B%0A%20%20var%20protocols%20%3D%20%5B%5D%3B%0A%20%20var%20ios%20%3D%20Cc%5B%22@mozilla.org/network/io-service%3B1%22%5D.getService%28Ci.nsIIOService%29%3B%0A%20%20for%28var%20cid%20in%20Cc%29%20%7B%0A%20%20%20%20let%20res%20%3D%20cid.match%28/@mozilla.org%5C/network%5C/protocol%5C/about%3B1%5C%3Fwhat%5C%3D%28.*%29%24/%29%3B%0A%20%20%20%20if%28res%29%20%7B%0A%20%20%20%20%20%20let%20aboutType%20%3D%20res%5B1%5D%3B%0A%20%20%20%20%20%20let%20contract%20%3D%20%22@mozilla.org/network/protocol/about%3B1%3Fwhat%3D%22%20+%20aboutType%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20let%20am%20%3D%20Cc%5Bcontract%5D.getService%28Ci.nsIAboutModule%29%3B%0A%20%20%20%20%20%20%20%20let%20uri%20%3D%20ios.newURI%28%22about%3A%22%20+%20aboutType%2C%20null%2C%20null%29%3B%0A%20%20%20%20%20%20%20%20let%20flags%20%3D%20am.getURIFlags%28uri%29%3B%0A%20%20%20%20%20%20%20%20if%28%21%28flags%20%26%20Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20protocols.push%28aboutType%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%28e%29%20%7B%7D%0A%20%20%7D%20%7D%0A%20%20var%20newGecko%20%3D%20parseInt%28navigator.userAgent.match%28/%5Cd+.%5Cd+%28%3F%3D%5C%29%29/%29%29%20%3E%3D%204%3B%0A%20%20if%28newGecko%20%26%26%20%28protocols.length%20%3E%2010%29%29%20%7B%0A%20%20%20%20var%20hbox%20%20%3D%20aNode.appendChild%28document.createElement%28%22hbox%22%29%29%3B%0A%20%20%20%20var%20vbox1%20%3D%20hbox.appendChild%28document.createElement%28%22vbox%22%29%29%3B%0A%20%20%20%20var%20vbox2%20%3D%20hbox.appendChild%28document.createElement%28%22vbox%22%29%29%3B%0A%20%20%20%20protocols.sort%28%29.forEach%28function%28aProtocol%29%20%7B%0A%20%20%20%20%20%20let%20vbox%20%3D%20%28aProtocol%20%3C%20protocols%5BparseInt%28Math.round%28protocols.length%20/%202%29%29%5D%29%20%3F%20vbox1%20%3A%20vbox2%3B%0A%20%20%20%20%20%20addMenuItem%28vbox%2C%20%22about%3A%22%20+%20aProtocol%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20protocols.sort%28%29.forEach%28function%28aProtocol%29%20%7BaddMenuItem%28aNode%2C%20%22about%3A%22%20+%20aProtocol%29%3B%7D%29%3B%0A%7D%20%7D%0A%0Afunction%20addMenuItem%28aNode%2C%20aLabel%29%20%7B%0A%20%20var%20cb%20%3D%20document.createElement%28%22checkbox%22%29%3B%0A%20%20cb.setAttribute%28%22label%22%2C%20aLabel%29%3B%0A%20%20cb.setAttribute%28%22class%22%2C%20%22about-menuitem%22%29%3B%0A%20%20aNode.appendChild%28cb%29%3B%0A%7D%0A%0Amenu.inspect%20%3D%20function%20inspect%28aEvent%29%20%7B%0A%20%20if%28%21%22inspectDOMNode%22%20in%20window%29%20return%3B%0A%20%20aEvent.preventDefault%28%29%3B%0A%20%20inspectDOMNode%28aEvent.target%29%3B%0A%20%20closeMenus%28aEvent.target%29%3B%0A%7D%0A%0Avar%20thisId%20%3D%20this.id%3B%0A%0Amenu.middleClickHandler%20%3D%20function%20middleClickHandler%28aEvent%29%20%7B%0A%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20var%20thisBtn%20%3D%20document.getElementById%28thisId%29%3B%20%0A%20%20%20%20thisBtn.firstChild.openPopup%28%29%3B%0A%20%20%20%20thisBtn.firstChild.autoPosition%20%3D%20false%3B%0A%20%20%7D%2C%2010%29%3B%0A%20%20if%28aEvent.button%20%21%3D%201%29%20return%3B%0A%20%20aEvent.preventDefault%28%29%3B%0A%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28aEvent.target.label%29%3B%0A%20%20closeMenus%28aEvent.target%29%3B%0A%7D%0A%0Athis.type%20%3D%20%22menu%22%3B%0Athis.label%20%3D%20this.tooltipText%20%3D%20%22About%3A%20Pages%22%3B%0A//%20this.boxObject.lastChild.collapsed%20%3D%20true%3B%0A%0Amenu.getTab%20%3D%20function%20getTab%28aURI%29%20%7B%0A%20%20function%20switchIfURIInWindow%28aWindow%29%20%7B%0A%20%20%20%20var%20browsers%20%3D%20aWindow.gBrowser.browsers%3B%0A%20%20%20%20for%28let%20i%20%3D%200%3B%20i%20%3C%20browsers.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20let%20browser%20%3D%20browsers%5Bi%5D%3B%0A%20%20%20%20%20%20if%28browser.currentURI.equals%28aURI%29%29%20%7B%0A%20%20%20%20%20%20%20%20aWindow.focus%28%29%3B%0A%20%20%20%20%20%20%20%20aWindow.gBrowser.tabContainer.selectedIndex%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%20%7D%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%20%20if%28%21%28aURI%20instanceof%20Ci.nsIURI%29%29%20aURI%20%3D%20makeURI%28aURI%2C%20null%2C%20null%29%3B%0A%20%20var%20isBrowserWindow%20%3D%20%21%21window.gBrowser%3B%0A%20%20if%28isBrowserWindow%20%26%26%20switchIfURIInWindow%28window%29%29%20return%20true%3B%0A%20%20var%20wm%20%3D%20Cc%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D.getService%28Ci.nsIWindowMediator%29%3B%0A%20%20var%20winEnum%20%3D%20wm.getEnumerator%28%22navigator%3Abrowser%22%29%3B%0A%20%20while%28winEnum.hasMoreElements%28%29%29%20%7B%0A%20%20%20%20let%20browserWin%20%3D%20winEnum.getNext%28%29%3B%0A%20%20%20%20if%28browserWin.closed%20%7C%7C%20browserWin%20%3D%3D%20window%29%20continue%3B%0A%20%20%20%20if%28switchIfURIInWindow%28browserWin%29%29%20return%20true%3B%0A%20%20%7D%0A%20%20gBrowser.loadOneTab%28aURI.spec%2C%20%7BinBackground%3A%20true%7D%29%3B%0A%20%20return%20false%3B%0A%7D%0A%0Avar%20Cc%20%3D%20Components.classes%2C%20Ci%20%3D%20Components.interfaces%3B%0Avar%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27%20+%20encodeURIComponent%28this.Help%29%29%3B%0Avar%20sss%20%3D%20Cc%5B%27@mozilla.org/content/style-sheet-service%3B1%27%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Aif%28%21sss.sheetRegistered%28uri%2C%20sss.USER_SHEET%29%29%20sss.loadAndRegisterSheet%28uri%2C%20sss.USER_SHEET%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B/*http%3A//custombuttons.sourceforge.net/forum/viewtopic.php%3Ff%3D4%26t%3D367%26sid%3D8ee7ae46e4cd942e759e413f9ac6666a*/%0A/*%20Custom%20Buttons%20%u2022%20View%20topic%20-%20About%20Menu%20http%3A//custombuttons.sourceforge.net/forum/viewtopic.php%3Ff%3D4%26t%3D276%26sid%3D8f724b7464cf9c69d86e3370407b5ed9%26start%3D20%23p3807*/%0Adata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACIUlEQVQ4y42Tv09TcRTFP6+vQE0Ngs4maoK6IVipiAIuDkLYEaKTq4mzf4Kr0cTJWY0rRAmUaDSBmEBCdCFYopQWkKoU+8r73nsdXn/QxIGbfLdzzzk593w9M+PB65U5PIY5yhiZ55OpmwBBEBAHEHHDd69eaMKpgXkgTjHA80DVePl5tUkoDmAqAJTDCAwRWAE1QzR6vu/VsU0EKlJ111BXqC/WSPAa2GYHEkYEFpEchI7puQyLS0sY0NvdzdDAdVqI17G1iUUZSFU5UpqanWVlPcfo6BgjI2N8yW7ybn4eUcXMmHz6tvO/GaiBqLKa3+HW4DV6us4SiqIG7xcW+bpTolIu4cfb1iaeTD0EXsSiDByihlMlECPZfpLcZoFsMeDbbpkf+TzJ9k52y5H98cHeDhX3rBGiCk6Vrb0KYsaJ48dYXF6msL2NmpHN5Rjq78dVbW/vO1QlcShERyCKUyOTmSG7WeD0mXNsfF8Hg3TqChfPd7GytQ9AsRxi4hoZiAhBqMzMTLO6tkaqL83AlcvEYjcQhb3A8aeiTenXgo8cOGGnWCSXz9GXTpO61MPG7wpS64IZyRa/udFOmq+QTLZzb+IO+K0USmG0CEj1tE6toR46zLR0iECpiBJ6rVQOjESLX6+yqNbbWJtPCx9/+W2J+wCemTH++NUHVRk4ymf0Yv5CLBa7/ebRxM8gCCKCRCJxCugA/CNw/AX2o98clP8BXEloo/iyk7kAAAAASUVORK5CYII%3D%0A%0Adata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACK0lEQVQ4y6WTwUvUURDHP++3b3WxkjSIiCApKaLCFNMyKSu6CQQEnQxPQX+Nx6BTnaJunQrBFcPcJMQuEQVIqrirRpqa7v5+b2YC3F1dEQh6MDDMvPm8N2++z5kZ/7P8w2fjAIMakqeqktmbjKJUMfLpJ8DzV497Dwa4lG/SEIYG73RlCn+kJnniUCrzYmx6KPL+DbB6EMANvv724UgmfbHeR/V72zHcrl+OO8C5nXgcpLRRCl+8Suh5cKkFB5irFICxayJW9V0ZppB5OTXT41UCDojFSLRyLwghMDw6yqfP0xjQ0dZOX+8tcBEAvi5CJeBVYpwrn+bAAaLGu+wIX2fz9Pffx8wYGc+RSJbbfXcBIFFUYrzECQao7RRWep7Jr3Dv5g3azp9FAYsc73OTxOU9JVNMFK8SanpVIKjR0NhMYWWZ4ydPk6iymF+mobGZzbh2Ul5DTBBloySslQQtg44cbmBiapr5/AqKMbewQM/1HrarD1UFJGyLsh4Lv2MBg49jwywUljjVcob8/Cxm0Hm1m9bWc2yK7QOosJkYsRqJKLnsW+Z+zNDeeY3urk5SUYRgrG8LP4tKyke1ABOhmAjFoPxaXWOpsMiVzm4ut3cwu5YggJoRxEhHjrr9UlYJFBPBOTjWfJRHAwO4dD3LGwEfOVKAAinARY5QndSOKr2DyexE7oL3vk5USaci4qCwR5UABmBGZQaqmpjZdwc0AQ1lc//4iw3YArb+Ak3uO3iDCbpzAAAAAElFTkSuQmCC%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

oleg953 пишет

нашёл то что работает №111

Там слишком мало эбаутов :)

voqabuhe пишет

мне её уже правили

скорее всего... всё заработало :beer:

Продублирую тут свой пост, может кто решил вопрос.

mssign пишет

В 47 не работает кнопка  Открыть страницу или выделенную ссылку в другом браузере

Поддерживаю. Помогите кто может.
Еще у меня отвалились кнопки:
Переключить стиль

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0426%u0432%u0435%u0442%20%u0441%u0441%u044B%u043B%u043E%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACx0lEQVQ4jWNgoCYQnXqVJ23Vw521e56/m3rs9d/+Qy9/1u989j5p0YPTEgXnFYgyRKHrhkfd8dc3jz399v/o42//HWfeXSWZdVaTgYGBkRj9jHp9NyYuuvL+o9WU24tytz69aNl5bZF03Elh4myvu5S44cbnX9q1l/qlM89aVO54ftu1/+YWqYzz1prNN+eY9dw7aNJxd7dJy53dpi03D2qUXlsG1yxTel61eMfzqzNOvXsjkXzaTDz2qM6UA69e+02+dUA6/ZyzcsXNyT5zH3/O3vjif+aaF/91Sq6vE4s9XwY3wKjlysxN1z/9mXvy3YcJ+1++mHHw9dsDNz/9j51154ygy245/fqb6/3nPfrn1HvnbuKyJ//Fo841M4SuYmNgcNjPIp1xOnbJmbeffafd2SsefDhSLOBQsKjvgbwpu5+/TZ5957JkwpmMmCVP/9u03rksFnXWPWLu4//Sked6IU6PO6GXvfrRpYkHXr4S9TtoCHORiMd29aTpdy5mzLr3wHXS/feu/XdfioWdthYLORUUOfPhf9XE8xD/t+989n3awVf/m7c++5I0/fY2BgYGBhG3ncZBPTdOLjv05n/0pHv/E5c8+S8ScaaWgYGBQTDopHf41Pv/tZPObyEYK2LRF2Ki5z/+n7zoyf+YOQ//+/bd+x8++d7/lLkP/2vGnd/C67wHd/QKR502s6q/cdmr9+432ahz04UCThQI+x3LUYs8vy555oP/unHnDvI67NfAaYBG9sU1CfMe/RcNOtHM4LuZCybO734o2KXixgfdqHMH+F32KGFoFAk9aywScqbYre3OB4/WO1+FfE8EMxjPZGVgYGDgdzuoKOB2sMGt8upX25yLj3kd9sdjGODeeeeTb9/d/749d/77dNz5b5h28RiD5SpOBgYGBrPkixc9q2/886q58d+r+sZ/9/KrPwkGJCEAAGPyWBBZxhFHAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0A//%20%u041B%u041A%u041C%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20%u0441%u0442%u0438%u043B%u044C%20..........%0Athis._handleClick%20%3D%20function%28%29%20setStyleForPages%28void%28run.value%20%3D%20%21run.value%29%29%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0432%20about%3Aconfig%20%u0435%u0441%u043B%u0438%20%u043E%u043D%u0438%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20..........%0Avar%20s%20%3D%20%22CB%22%20+%20_id.slice%2820%29%20+%20%22.setStyleForPage%22%3B%0Acbu.isPref%28s%2C%20false%29%3B%0Avar%20previousUri%20%3D%20%22CB%22%20+%20_id.slice%2820%29%20+%20%22.previousUri%22%3B%0A%0A%0A//%20%u0418%u043A%u043E%u043D%u043A%u0430%20%u0434%u043B%u044F%20%u0432%u043A%u043B%u044E%u0447%u0435%u043D%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%20%20..........%0Avar%20icon%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0Avar%20styleImage%20%3D%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC8ElEQVQ4jY2RaSzbcRjHf3S2N9sLU1UqC1lshFmMycZeOFpsUxbX3HHNimxZmGsZ3eIYosx9DEsakcWMTRwVXbQ2Vtrq3O3866q7rjl3WJ+9ECIxme/7z+f5PvkidCDqBYOnQ6snWhLYs8sFnfI/2e3zP+ktMytBzHE+8ZFIBx0nOhlih8Qvcknn9BZ0yLbAukRarRkuNEAIKR2HVzLOEucwB1a+W+SPMB80TvdeTx9ikvy71I53PbEv8L14/ZdhQl82KUx4LZ41O0LJljRo0USWBkmSMvPMUa5ZmrTVLBlrvZos4epHD1Xtw9rRIr0o1uxgcffyIjGYb67h12GUz1mQO+V945Du99iej5PkOZbL1iM+zEFYzRwYPR6uJfiJYvYFV5IHSuqH13bKu5ZXX7bNzxVz5UscyRr4lWICVXLruct0SZ1zxaTChoFJA6umQMO7Jwm5V59EyKrtBInG96sULK1TC7GPGq6fvAh32l3VqZyH+a2zS8GvsH7NAAHNt3IabqRg/QRvob1nuQxIXj2M3er+POOIt5N9OZz5BXUnrsleI7xD88WgIqyXVjo6TskdW6FkS+cJHnxLglu3i1fJBOgFinb/f9Eys13IXYCkxpmNoKKRJoQQwtu1mLpkiruq2hfBJ3cUAiunAO8pSEAIIVWXrtt3C8bAMEjU8N9VCD5ffX1eyyCYOQWMpylQ734B2DYqUOesDfHO/sNnbNlHz6vmzTe3oIv7bzGkW8897/F6Ii12thsZoBhiweabSOgOv6QoI+slHynQj+itCaiYBHUXXhKLjBvdamQA5FIBYlUBUnVBnmEFTeRTk4dAvLvQFO8miLJLxVYdUrDNs1SeK9sap1AIa+FgVuhEYFvjFIcE9unYGjVLCtRMDBzTMDAJ7e1sJuOmNsqDAehE+BGDYDkGwQQNB+9uEg8L/hWuh9YzXoje75lYXViIVwFpiBKwqbgdFkX5ybEECCH02V07jkVRHmNb4xQsirJsD/4L5j+KqY53NfUAAAAASUVORK5CYII%3D%22%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20css%20%u043A%u043E%u0434%20%u0438%u0437%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u043F%u0440%u0430%u0432%u043A%u0430%20..........%0Avar%20css%20%3D%20self.Help%3B%0Avar%20run%20%3D%20Application.prefs.get%28s%29%3B%0A%0A%0A//%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20..........%0Afunction%20setStyleForPages%28reason%29%20%7B%0A%20%20%20if%20%28%20reason%20%3D%3D%20%22destructor%22%20%29%20return%3B%20%0A%0A%20%20%20var%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%20%0A%20%20%20var%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%29%3B%20%0A%20%20%20%0A%20%20%20try%20%7B%20sss.unregisterSheet%28Services%5B_id%20+%20%22previousUri%22%5D%20%7C%7C%20uri%2C%200%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20Services%5B_id%20+%20%22previousUri%22%5D%20%3D%20uri%3B%0A%20%20%20%0A%20%20%20run.value%20%26%26%20%21reason%20%26%26%20sss.loadAndRegisterSheet%28%20uri%2C%200%20%29%3B%0A%20%20%20icon.src%20%3D%20run.value%20%3F%20styleImage%20%3A%20self.image%3B%0A%7D%3B%0AaddDestructor%28setStyleForPages%29%3B%0Arun.value%20%26%26%20setStyleForPages%28%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B/*AGENT_SHEET*/%0A%0A%20%20a%2C%20a%20span%20%0A%7B%0A%20%20text-decoration%3A%20none%20%21important%3B%20%0A%20%20color%3A%20%23BABAFF%20%21important%3B%0A%7D%0Aa%3Avisited%2C%20a%3Avisited%20span%20%7Bcolor%3A%20red%20%21important%3B%7D%0A%0Aa%3Ahover%2C%20a%3Ahover%20span%20%0A%7B%0A%20%20color%3A%20%239999ff%20%21important%3B%0A%20%20text-shadow%3A%200px%200px%208px%20%239999ff%20%21important%3B%20%0A%20%20transition%3A%20text-shadow%20.3s%20%20linear%20%21important%3B%0A%7D%0Aa%3Aactive%2C%20a%3Aactive%20span%20%20%7Bcolor%3A%20Silver%20%21important%3B%7D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация

Выделить код

Код:

// ЛКМ переключить настройки кнопки и стиль ..........
this._handleClick = function() setStyleForPages(void(run.value = !run.value));


// Создать настройки кнопки в about:config если они не существует ..........
var s = "CB" + _id.slice(20) + ".setStyleForPage";
cbu.isPref(s, false);
var previousUri = "CB" + _id.slice(20) + ".previousUri";


// Иконка для включеной кнопки  ..........
var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
var styleImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC8ElEQVQ4jY2RaSzbcRjHf3S2N9sLU1UqC1lshFmMycZeOFpsUxbX3HHNimxZmGsZ3eIYosx9DEsakcWMTRwVXbQ2Vtrq3O3866q7rjl3WJ+9ECIxme/7z+f5PvkidCDqBYOnQ6snWhLYs8sFnfI/2e3zP+ktMytBzHE+8ZFIBx0nOhlih8Qvcknn9BZ0yLbAukRarRkuNEAIKR2HVzLOEucwB1a+W+SPMB80TvdeTx9ikvy71I53PbEv8L14/ZdhQl82KUx4LZ41O0LJljRo0USWBkmSMvPMUa5ZmrTVLBlrvZos4epHD1Xtw9rRIr0o1uxgcffyIjGYb67h12GUz1mQO+V945Du99iej5PkOZbL1iM+zEFYzRwYPR6uJfiJYvYFV5IHSuqH13bKu5ZXX7bNzxVz5UscyRr4lWICVXLruct0SZ1zxaTChoFJA6umQMO7Jwm5V59EyKrtBInG96sULK1TC7GPGq6fvAh32l3VqZyH+a2zS8GvsH7NAAHNt3IabqRg/QRvob1nuQxIXj2M3er+POOIt5N9OZz5BXUnrsleI7xD88WgIqyXVjo6TskdW6FkS+cJHnxLglu3i1fJBOgFinb/f9Eys13IXYCkxpmNoKKRJoQQwtu1mLpkiruq2hfBJ3cUAiunAO8pSEAIIVWXrtt3C8bAMEjU8N9VCD5ffX1eyyCYOQWMpylQ734B2DYqUOesDfHO/sNnbNlHz6vmzTe3oIv7bzGkW8897/F6Ii12thsZoBhiweabSOgOv6QoI+slHynQj+itCaiYBHUXXhKLjBvdamQA5FIBYlUBUnVBnmEFTeRTk4dAvLvQFO8miLJLxVYdUrDNs1SeK9sap1AIa+FgVuhEYFvjFIcE9unYGjVLCtRMDBzTMDAJ7e1sJuOmNsqDAehE+BGDYDkGwQQNB+9uEg8L/hWuh9YzXoje75lYXViIVwFpiBKwqbgdFkX5ybEECCH02V07jkVRHmNb4xQsirJsD/4L5j+KqY53NfUAAAAASUVORK5CYII=";


// Получить настройки кнопки и css код из вкладки Справка ..........
var css = self.Help;
var run = Application.prefs.get(s);


// Переключить css стиль для страницы ..........
function setStyleForPages(reason) {
   if ( reason == "destructor" ) return; 

   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); 
   var uri = makeURI("data:text/css," + encodeURIComponent(css)); 
   
   try { sss.unregisterSheet(Services[_id + "previousUri"] || uri, 0) } catch(e) {};
   Services[_id + "previousUri"] = uri;
   
   run.value && !reason && sss.loadAndRegisterSheet( uri, 0 );
   icon.src = run.value ? styleImage : self.image;
};
addDestructor(setStyleForPages);
run.value && setStyleForPages();


Спрятать панель дополнений
скрытый текст

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0421%u043F%u0440%u044F%u0442%u0430%u0442%u044C%20%u043F%u0430%u043D%u0435%u043B%u044C%20%u0434%u043E%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u0439%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB30lEQVR42mNkoBAwInPWHbjdsHDHrVsbO7yXkWVA7fwT/+XlxRjmrjq39Om961mPdtV+IsmA3Il7/jvbazL8/PmHYcPOG3dPX3oUfWdN6kmiDUhq2/jf3kqD4f9/EO8/w/Xbb37vOPqo7uWtI10vjk/7R9CA8OoV/20tNUF6Gf79/8fw7+9fhs9ffjDsO/V834P7j2Lvbyl+hteAwJKF/63MdYAu+M/wF6j5798/DL9//WL4/fsnw437n99cvf856ebKpM04DfArmPff1FSP4f+//xDNQI1fPn9lePf2PcPz5y8Z7j16/Z+BS3Ly/U35+VgNcM2Y8V9DU4fhz58/DN9//GL4/PkL0IBPDJ8/fWD4+P4dw7dv3/7/5xCZ9GBbRQFOAzS1DcEG/Pz5k+Hrt+9AzR8ZPn14x/D+w9tXHz//SHq8t30rTi945s76b2BgwfDr92+gbUDNX74yfPjwhuHurSs7Xz+5n/DmwooXeAPRp2jOf3NTe4bv338ANX9huPvw5s9LJ49Uvn9wccLXJ6f/E4xG39K5/20tXBjeAP18YP+Wa7dOH4/6cH3LRaITklfZnP+y8ir/t65aOPPtnctF35+e+c5AAKAYYJvfsfDKzr1r3t/YvZmQRqwGkAMAJ5ELIPTev5gAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0421%u043F%u0440%u044F%u0442%u0430%u0442%u044C%20%u043F%u0430%u043D%u0435%u043B%u044C%20%u0434%u043E%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u0439%20%u043E%u0442%2011.02.2014.%0A%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20pref.value%20%3D%20pref.value%20%3F%20false%20%3A%20true%3B%0A%7D%3B%0A%0A%0Avar%20right%20%3D%200%3B%20//%20%u043E%u0442%u0441%u0442%u0443%u043F%20%u0441%u043F%u0440%u0430%u0432%u0430%20%u0432%20px%20%20%0A%0Avar%20s%20%3D%20%27CB.hideAddonBar%27%0Acbu.isPref%28s%2C%20false%20%29%3B%0Avar%20pref%20%3D%20Application.prefs.get%28s%29%3B%0A%0A%0Afunction%20toggleButton%28%29%20%7B%20%20%20%0A%20%20%20document.getElementById%28%22ctraddon_addon-bar%22%29.setAttribute%28%27hideElements%27%2C%20pref.value%20%29%3B%20%20%20%20%20%0A%20%20%20%20%0A%20%20%20var%20icon%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28%20self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0A%20%20//%20icon.style.transform%20%3D%20pref.value%20%3F%20%22rotate%28180deg%29%22%20%3A%20%22%22%3B%20%20%20//%20%u043F%u0435%u0440%u0435%u0432%u0435%u0440%u043D%u0443%u0442%u044C%20%u0438%u043A%u043E%u043D%u043A%u0443%0A%20%20%20%0A%20%20%20self.tooltipText%20%3D%20pref.value%20%3F%20%27%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C%20%u043F%u0430%u043D%u0435%u043B%u044C%20%u0434%u043E%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u0439%27%20%3A%20%27%u0421%u043F%u0440%u044F%u0442%u0430%u0442%u044C%20%u043F%u0430%u043D%u0435%u043B%u044C%20%u0434%u043E%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u0439%27%3B%20%20%20%20%20%0A%7D%3B%0AtoggleButton%28%29%3B%0AgPrefService.addObserver%28%20s%2C%20toggleButton%2C%20false%20%29%3B%0AaddDestructor%28function%28%29%20%7B%20gPrefService.removeObserver%28%20s%2C%20toggleButton%2C%20false%20%29%20%7D%29%3B%0A%0A//%20%u0421%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u043F%u0430%u043D%u0435%u043B%u0438%20%u0434%u043E%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u0439%20%20................................%0Avar%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27+%20encodeURIComponent%28%27%5C%0A/*%20%u043C%u0438%u043D%u0438%u043C%u0430%u043B%u044C%u043D%u044B%u0439%20%u0438%20%u043F%u0440%u043E%u0437%u0440%u0430%u0447%u043D%u044B%u0439%20*/%5C%0A%23ctraddon_addon-bar%20%7B%5C%0Awidth%3A%20auto%3B%5C%0Aposition%3A%20fixed%3B%20bottom%3A%20906px%3B%5C%0Apadding-top%3A%202px%20%21important%3B%5C%0Apadding-left%3A%202px%20%21important%3B%5C%0Apadding-right%3A%200px%3B%5C%0Aright%3A%20%27%20+%20right%20+%20%27px%3B%5C%0Abackground%3A%20rgba%28120%2C120%2C250%2C.4%29%20%21important%3B%5C%0A%7D%5C%0A/*%20%u0435%u0441%u043B%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0443%20%u0438%u043D%u0441%u0442%u0440%u0443%u043C%u0435%u043D%u0442%u043E%u0432%20*/%5C%0A%23ctraddon_addon-bar%5Bcustomizing%5D%20%7B%5C%0Abackground%3A%20-moz-Dialog%3B%5C%0Aborder-radius%3A%207px%200%200%200%3B%5C%0Aposition%3A%20fixed%3B%5C%0Avisibility%3A%20visible%20%21important%3B%5C%0A%7D%5C%0A/*%20%u0443%u0431%u0438%u0440%u0430%u0435%u043C%20%u043B%u0438%u0448%u043D%u0438%u0435%20%u044D%u043B%u0435%u043C%u0435%u043D%u0442%u044B%2C%20%u0443%u0431%u0438%u0440%u0430%u0435%u043C%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0438%20%u0430%u0442%u0440%u0438%u0431%u0443%u0442%u0430%20hideElements%20*/%5C%0A%23ctraddon_addon-bar%20dropmarker%2C%5C%0A%23addonbar-closebutton%2C%5C%0A%23ctraddon_addon-bar%3Anot%28%5Bcustomizing%5D%29%5BhideElements%3D%22true%22%5D%20label%2C%5C%0A%23ctraddon_addon-bar%3Anot%28%5Bcustomizing%5D%29%5BhideElements%3D%22true%22%5D%20hbox%2C%5C%0A%23ctraddon_addon-bar%3Anot%28%5Bcustomizing%5D%29%5BhideElements%3D%22true%22%5D%20.statusbarpanel-iconic%2C%5C%0A%23ctraddon_addon-bar%3Anot%28%5Bcustomizing%5D%29%5BhideElements%3D%22true%22%5D%20toolbarbutton%3Anot%28%5Bid%3D%22%27%20+%20_id%20+%20%27%22%5D%29%2C%5C%0A%23ctraddon_addon-bar%3Anot%28%5Bcustomizing%5D%29%5BhideElements%3D%22true%22%5D%20%23UserScriptLoader-icon%20%7B%5C%0Adisplay%3A%20none%20%21important%3B%5C%0A%7D%5C%0A%5C%0A%23ctraddon_addon-bar%20%3E%20%23status-bar%20%3E%20.statusbar-resizerpanel%20%7B%5C%0Aposition%3A%20relative%3B%5C%0Amargin-right%3A-4px%3B%5C%0A%7D%5C%0A%27%29%29%3B%0A%0Aconst%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Asss.loadAndRegisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0AaddDestructor%28function%28%29%20%7B%20sss.unregisterSheet%28uri%2C%20sss.AGENT_SHEET%29%20%7D%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B/*Addon%20Bar*/%0A%0A%23addon-bar%7B%0A%09%22-moz-appearance%3A%20none%20%21important%3B%0A%09border%3A%201px%20solid%20rgba%2810%25%2C10%25%2C10%25%2C.4%29%20%21important%3B%0A%09border-bottom%3A%20none%20%21important%3B%0A%09border-right%3A%20none%20%21important%3B%0A%09border-radius%3A%204px%200%200%200%20%21important%3B%0A%09background%3A%20rgba%28207%2C%20219%2C%20236%2C%20.85%29%3B%0A%09position%3A%20fixed%3B%0A%09bottom%3A%200%3B%0A%09right%3A%200%3B%0A%09height%3A%2022px%3B%0A%09width%3A%20auto%3B%0A%09min-width%3A%2018px%3B%0A%09vertical-align%3A%20top%3B%0A%09padding-left%3A%200%3B%0A%09margin%3A%200px%3B%22%0A%0A%7D%0A%0A%23browser-bottombox%7B%0A%09border%3A%20none%20%21important%3B%0A%7D%0A%0A%23addon-bar%20.chromeclass-toolbar-additional%7B%0A%09vertical-align%3A%20top%3B%0A%09%0A%7D%0A%0A%23addon-bar%20.toolbarbutton-1%7B%0A%09vertical-align%3A%20top%3B%0A%09padding%3A%201px%20%21important%3B%0A%7D%0A%0A%23addonbar-closebutton%7B%0A%09display%3A%20none%3B%0A%7D%0A%0A%23main-window%5Bsizemode%3D%22maximized%22%5D%20%23browser-bottombox%20%23addon-bar%7B%0A%20%20margin%3A%200%20%21important%3B%0A%7D%0A%0A%23status-bar%7B%0Aheight%3A%2022px%3B%0Aborder-bottom%3A%20none%20%21important%3B%0Amin-width%3A%2018px%3B%0Avertical-align%3A%20top%3B%0Apadding-left%3A%200%3B%0Amargin%3A%200px%3B%0Abackground%3A%20transparent%3B%0A%7D%0A%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация

Выделить код

Код:

// Спрятать панель дополнений от 11.02.2014.

this.onclick = function(e) {
     if ( e.button == 0 ) pref.value = pref.value ? false : true;
};


var right = 0; // отступ справа в px  

var s = 'CB.hideAddonBar'
cbu.isPref(s, false );
var pref = Application.prefs.get(s);


function toggleButton() {   
   document.getElementById("ctraddon_addon-bar").setAttribute('hideElements', pref.value );     
    
   var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
  // icon.style.transform = pref.value ? "rotate(180deg)" : "";   // перевернуть иконку
   
   self.tooltipText = pref.value ? 'Показать панель дополнений' : 'Спрятать панель дополнений';     
};
toggleButton();
gPrefService.addObserver( s, toggleButton, false );
addDestructor(function() { gPrefService.removeObserver( s, toggleButton, false ) });

// Стиль для панели дополнений  ................................
var uri = makeURI('data:text/css,'+ encodeURIComponent('\
/* минимальный и прозрачный */\
#ctraddon_addon-bar {\
width: auto;\
position: fixed; bottom: 906px;\
padding-top: 2px !important;\
padding-left: 2px !important;\
padding-right: 0px;\
right: ' + right + 'px;\
background: rgba(120,120,250,.4) !important;\
}\
/* если открыть настройку инструментов */\
#ctraddon_addon-bar[customizing] {\
background: -moz-Dialog;\
border-radius: 7px 0 0 0;\
position: fixed;\
visibility: visible !important;\
}\
/* убираем лишние элементы, убираем кнопки при добавлении атрибута hideElements */\
#ctraddon_addon-bar dropmarker,\
#addonbar-closebutton,\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] label,\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] hbox,\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] .statusbarpanel-iconic,\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] toolbarbutton:not([id="' + _id + '"]),\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] #UserScriptLoader-icon {\
display: none !important;\
}\
\
#ctraddon_addon-bar > #status-bar > .statusbar-resizerpanel {\
position: relative;\
margin-right:-4px;\
}\
'));

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
addDestructor(function() { sss.unregisterSheet(uri, sss.AGENT_SHEET) });


===================
Спасибо, turbot
Проблема частично решена
Осталась только Открыть страницу или выделенную ссылку в другом браузере

bunda1
А как бы к About: Menus Mod прикрутить из твоей кнопки №111
ПКМ => открыть about:config,
СКМ => открыть about:config с настройкой( выделенной или из буфера )

voqabuhe пишет

bunda1
А как бы к About: Menus Mod прикрутить из твоей кнопки №111
ПКМ => открыть about:config,
СКМ => открыть about:config с настройкой( выделенной или из буфера )

Добавь в начале инициализации:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки .....
this.onclick =e=> {
          
    // действие при клике СКМ ....    
    if ( e.button == 1 ) { 
         // запомнить текст из буфера обмена и скопировать текст на странице
         var clip = gClipboard.read();
         window.content.focus();
         goDoCommand("cmd_copy");            

         gBrowser.selectedTab = gBrowser.addTab('about:config?filter=' + gClipboard.read()); 
                   
         clip && gClipboard.write(clip); // вернуть текст в буфер обмена
         }
     
    // действие при клике ПКМ ....    
    if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
         e.preventDefault();  
         gBrowser.selectedTab = gBrowser.addTab("about:config");  
         }
};

bunda1
Спасибо. Очень полезная добавка получилась к About: Menus Mod

09-06-2016 16:50:29
Есть такая полезная кнопочка About:config Multiple Selection, всё хорошо, но вот есть  в ней один баг, перестают работать в about:config Сброс и переключение значения по двойному ЛКМ. Может кто глянет? Плиз. help.gif
Автор исправил

В 47.0 перестала работать кнопка Переключить JavaScript( Firefox17+ ) от 13.02.2016. Поправьте, пожалуйста.

rubel пишет

В 47.0 перестала работать кнопка Переключить JavaScript

У меня, видимо, аналогичная кнопка Включить/Выключить JavaScript
Она не только не работает, но ее вообще невозможно удалить.
Меню кнопки просто нет ни с shift, ни с ctrl.
Удалял папку custombuttons и отключал дополнение Custombuttons
Эта нехорошая кнопка висит и никуда не собирается пропадать.
Подскажите, где могла прописаться эта зараза?

Подскажите если мне надо узнать скрыт ли элемент как лучше написать

Выделить код

Код:

getComputedStyle(element, null).display

или

getComputedStyle(element, null).getPropertyValue('display')

И в чем принципиальная разница?

Ultima2m ПКМ на строчке кнопки

скрытый текст
UkBGi7Y.jpg

перестала работать закрыть/перезагрузить

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

Выделить код

Код:

/*Initialization Code*/

this.tooltipText = "Left     => Перезагрузить \nMiddle => Закрыть \nRight   => Меню";

this.onclick = function(event) {
    if(event.button == 0) {
// Действие при клике ЛКМ
  var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
                             .getService(Components.interfaces.nsIAppStartup);
  appStartup.quit(appStartup.eForceQuit | appStartup.eRestart);
    }
        else if(event.button == 1 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Действие при клике ПКМ без модификаторов
goQuitApplication();
    }
};/*Initialization Code*/                                                                                                                                                                                                                                     //  Настройка функций кликов мыши для кнопки .................
this.onclick = function(e) {
     
    if ( e.button == 0 ) Application.restart(); // ЛКМ
         
    if ( e.button == 1 ) gShowPopup(this); // СКМ 
        
    if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { // ПКМ
         e.preventDefault();
         goQuitApplication();
         }
};
this.tooltipText = "Л: Перезагрузить \nС: CB Меню \nП: Закрыть";/*Initialization Code*//*Initialization Code*/                                                                                                                                                                                             // Очистить панель поиска прокруткой колёсиком мыши на панели поиска, от 19.09.2014. ..............
(function () { 
   var searchbar = document.getElementById("searchbar");
   if ( !searchbar ) return;
 
   addEventListener('DOMMouseScroll', function(){
      searchbar.textbox.value = '';
   }, false, searchbar ); 
})();


вылечить можно?

vitalii201 пишет

Ultima2m ПКМ на строчке кнопки

Это было бы слишком просто :|
В этом списке ее просто нет.
mIVIL8e.png
Такое чувство, что она в код прописалась :lol:

Ultima2m пишет

Удалял папку custombuttons и отключал дополнение Custombuttons
Эта нехорошая кнопка висит и никуда не собирается пропадать.
Подскажите, где могла прописаться эта зараза?

Отключи в настройках Custom buttons инициализацию кнопок + рестарт, потом ПКМ на кнопке и все дела. По идеи удаление папки custombuttons при выключенным браузере должно было помочь, такая кнопка не могла ни где прописаться :/

rubel пишет

В 47.0 перестала работать кнопка Переключить JavaScript( Firefox17+ ) от 13.02.2016. Поправьте, пожалуйста.

Переключить JavaScript

Извиняюсь перед всеми, но похоже, эта кнопка все-таки вшита.

У меня Cyberfox и в принципе он от ФФ не отличается. Перешел на него, когда не было ФФ х64.
Создал чистый профиль и эта кнопка там присутствует.
А я тут всех взбаламутил.

oleg953 пишет

перестала работать закрыть/перезагрузить
вылечить можно?

Выделить код

Код:

// Настройка функций кликов мыши для кнопки .................
this.onclick = function(e) {
     
    if ( e.button == 0 ) { // ЛКМ
         var startup = Services.startup; startup.quit(startup.eForceQuit | startup.eRestart); 
         }
         
    if ( e.button == 1 ) gShowPopup(this); // СКМ 
        
    if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { // ПКМ
         e.preventDefault();
         goQuitApplication();
         }
};
this.tooltipText = "Л: Перезагрузить \nС: CB Меню \nП: Закрыть";                                                                                                                                                                                             // Очистить панель поиска прокруткой колёсиком мыши на панели поиска, от 19.09.2014. ..............


(function () { 
   var searchbar = document.getElementById("searchbar");
   if ( !searchbar ) return;
 
   addEventListener('DOMMouseScroll', function(){
      searchbar.textbox.value = '';
   }, false, searchbar ); 
})();
turbot пишет

Замените ...

Спасибо!

Ну а мой вопрос чуть выше как же?
https://forum.mozilla-russia.org/viewtopic.php?pid=717302#p717302

bunda1
Спасибо, прекрасно работает и иконку сразу заметно, когда выключены JavaScript. :)

bunda1 пишет

bunda1

спасибо :beer:

Ferguss114 пишет

Подскажите если мне надо узнать скрыт ли элемент как лучше написать

Выделить код

Код:

getComputedStyle(element, null).display

или

getComputedStyle(element, null).getPropertyValue('display')

Зависит от цели написания. "Печальное зрелище" (как сказал бы ослик Иа), связанное именно с этим вопросом, находится здесь: http://blogs.msmvps.com/luisabreu/blog/ … -at-first/

Ferguss114 пишет

И в чем принципиальная разница?

Чаще всего, разницы между "element.attribute" и "element.getValue('attribute')" нет никакой. Хотя встречаются и исключения.

yup
Спасибо за разъяснение

turbot
Насчёт кнопки Sidebar Sites.

скрытый текст
Правильно ли я понимаю, что при клике по #sidebar'у,
вроде, не требуется исполнять дальнейшую обработку,
если кликнуто ПКМ, СКМ, или ЛКМ с модификаторами?

Правильно ли я понимаю, что «&& link.src» это на тот случай,
если ссылка, а в ней картинка? А если ссылка сделана как-то иначе,
то она будет открываться во вкладке. Типа какая-нибудь такая.

Ну, и чисто для шутки, зацени вариант. Код хамский и зависимый,
но задуман, наверно, более по-перформансу и с уважением
к атрибуту target, если таковой имеется.

Выделить код

Код:

((browser, listener, br) => { if (browser) {
    addEventListener("DOMFrameContentLoaded", listener, true, browser);
    var getBr = () => browser.contentDocument.querySelector(listener.selector);
    if ((br = getBr())) br.window = {parent: listener.parent};
    addDestructor(() => {
        if ((br = getBr())) delete br.window;
    });
}})(SidebarUI.browser, {
    selector: "browser#web-panels-browser",
    handleEvent(e) {
        if (e.target.matches(this.selector) && !("window" in e.target))
            e.target.window = {parent: this.parent};
    },
    get parent() {
        delete this.parent;
        var parent = {};
        parent.contentAreaClick = eval(`(${
            contentAreaClick.toString().replace(
                'linkNode.getAttribute("onclick")',
                "!target && this.shouldLoadInPanelBrowser(linkNode) || $&"
            )
        })`);
        parent.shouldLoadInPanelBrowser = link => {
            // Здесь можно что-нибудь проверить
                Services.console.logStringMessage([
                    "CB" + _id.slice(20),
                    "LINK:\t" + link,
                    "DOC:\t" + link.ownerDocument.location
                ].map(item => String(item).slice(0, 200)).join("\n"));

            return true;
        }
        return this.parent = parent;
    }
});

Dumby
На [firefox] 47 перестал работать код №8074. Не посмотришь?

Dumby

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

Правильно ли я понимаю, что «&& link.src» это на тот случай,

Угу. Я подозревал, что с этим проблемы будут. :)

Правильно ли я понимаю, что при клике по #sidebar'у,
вроде, не требуется исполнять дальнейшую обработку,
если кликнуто ПКМ, СКМ, или ЛКМ с модификаторами?

Что-то затупил. Было не надо. Но я там уже ужас-ужас наваял в попытке восстановить работу контекстной навигации и теперь нужно. :)

За код спасибо.Поздно заметил. Попытаюсь потом перенести наваянное в него. Если разберусь. :D

thrower пишет

На [firefox] 47 перестал работать код №8074. Не посмотришь?

Чем, собственно, расширение не угодило :rolleyes:. Может так :/

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

Выделить код

Код:

({
    id: _id + "-torrent-observer",
    topic: "http-on-examine-response",
    cd: "Content-Disposition",
    re: /^\s*attachment/i,
    find() {
        var en = Services.obs.enumerateObservers(this.topic);
        while(en.hasMoreElements()) {
            var obs = en.getNext().wrappedJSObject;
            if (obs && obs.id == this.id) return obs;
        }
    },
    init() {
        this.wrappedJSObject = this;
        addDestructor(reason => {
            if (reason[5] != "e") return;
            var obs = this.find();
            obs && Services.obs.removeObserver(obs, this.topic);
        }, this);
        var obs = this.find();
        obs || Services.obs.addObserver(this, this.topic, false);
    },
    observe(channel) {
        try {
            channel.QueryInterface(Ci.nsIHttpChannel);
            var disp = channel.getResponseHeader(this.cd);
            channel.loadFlags & channel.LOAD_DOCUMENT_URI
                && channel.contentType == "application/x-bittorrent"
                && this.re.test(disp)
                && channel.setResponseHeader(this.cd, disp.replace(this.re, "inline"), false);
        } catch(ex) {}
    }
}).init();

Dumby
Супер! Спасибо!


//
Кнопка, в отличие от аналогичных расширений, воздействует точечно, именно там, где необходимо.

как можно избавиться от тормозов Source Editor? невозможно работать.

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

Выделить код

Код:

// Открывать ссылки длинным кликом, от 21.01.2014. ..............................................................
(function func() {
   
   const time = 500;            // время удержания в мс
   const background = true;    // открывать в фоновой вкладке
   const nextToCurrent = true;  // открывать рядом с текущей вкладкой
 
   function handleLongPress(e) { 
      window.clearTimeout( func.timer );
      setTimeout(function() { try { func.removeListener() } catch(ev) {} }, 0);
      
      var lab = XULBrowserWindow.overLink;
    
      if ( e.button == 1 || !lab || lab.startsWith("javascript") ) return;
   
      if ( e.type == "mousedown" && !e.target.className.startsWith("ui-slider-handle") ) {
           func.timer = setTimeout(function() {
                function c(e) { e.preventDefault(); e.stopPropagation() };
                addEventListener('click', c, true);
                func.removeListener = function() { removeEventListener('click', c, true) }; 
                
                e.button == 0
                ? gBrowser.loadOneTab( lab, {relatedToCurrent: nextToCurrent, inBackground: background, referrerURI: makeURI(content.location.href)} )
                : gBrowser.loadURI( lab, makeURI(content.location.href) );
                
           }, time );  
           }
      else 
           clearTimeout( func.timer );
   };
   ["mouseup", "mousedown", "dragstart"]
   .forEach(function(type) { addEventListener(type, handleLongPress, true, gBrowser) });
})();

Dumby

скрытый текст
Спасибо еще раз. Переделал Sidebar Sites под предложенный тобой код. :)

Можно еще пару тупых вопросов:
Почему у меня там ругается, если сделать вместо for of - [...self.Help.split("\n\n")].forEach, либо for (var item of  self.Help.split("\n\n")) Array.push(item)?
И как сделать из params строку(? (не уверен в терминологии)), чтобы не устанавливать с "' + params + '" (т.е., с кавычками)? И вообще, что он мне отдает? Как это правильно назвать?
Можно ли там обойтись без encodeURIComponent?

Подозреваю, что все эти вопросы связаны. Чертовы строки и массивы... shuffle.gif

broker пишет

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

Какой у тебя браузер?

turbot пишет

Можно еще пару тупых вопросов

Конечно можно, но вопросы сформулированы так,
что для меня затруднительно их понять.

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

Почему у меня там ругается, если сделать вместо for of - [...self.Help.split("\n\n")].forEach

Вроде не должен никто ругаться. А если кто-то ругается,
мол зачем ты уже готовый массив spread operator'ом в новый массив перегоняешь,
то сам знаешь что ему ответить.

И как сделать из params строку

У тебя params это массив образованый из строки методом split,
соединить обратно в строку можно методом join.

Остальное не понял. Но вот, вариант

Выделить код

Код:

var menuPopup = appendChild("menupopup", self, {context: ""});
var menugroup = appendChild("menugroup", menuPopup, {
    orient: "vertical",
    oncommand: "openPage(event.target);",
    oncontextmenu: "removePage(event.target);"
});
var sep = "\n\n", items = self.Help.split(sep);
items.forEach((item, index) => {
    var [title, url, icon] = item.split("\n");
    appendChild("menuitem", menugroup, {
        tooltiptext: url,
        class: "menuitem-iconic",
        label: title || "Untitled",
        image: icon || "chrome://mozapps/skin/places/defaultFavicon.png"
    }).index = index;
});
menugroup.openPage = ({index}) => openWebPanel(...items[index].split("\n"));
menugroup.removePage = ({index}) => items.splice(index, 1) && installButton(items.join(sep));

function installButton(help) {
    var link = custombuttons.makeButtonLink("edit", _id);
    var param = custombuttons.cbService.getButtonParameters(link);
    param = param.wrappedJSObject || param;
    param.help = help;
    custombuttons.cbService.installButton(param);
}
function appendChild(type, parent, attrs) {
    var node = parent.appendChild(document.createElement(type));
    for(var name in attrs) node.setAttribute(name, attrs[name]);
    return node;
}
// и так далее ...

bunda1 пишет

broker пишет: Здравствуйте. Не работает кнопка должным образом, если нажать на силку то загружается страница на которой сейчас нахожусь.Какой у тебя браузер?

[firefox]48:( на 45 все хорошо.

Dumby
Спасибо. Немного, что-то, яснее стало. :)

И за код тоже. Попробую присобачить. :)

broker пишет

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

Я сейчас проверил код на Firefox 48 и у меня всё работает. Код никак не может загружать текущую страницу при нажатии на ссылку. Похоже у тебя установлено какое то расширение которое меняет сплывающую подсказку которая появляется при наведении курсора на ссылку:
a890b3fed4d34dd3d09c99fcbc1bd94e.png
Эта подсказка должна показывать адрес ссылки, а не текущей страницы, потому что код берёт адрес ссылки от подсказки.

bunda1
Я как бы не правильно написал саму проблему:blush: Проблема в том что если я сейчас на етой странице нажму "Форумы" то у меня грузится новая вкладка  "Форумы" и в том числе и та на которой сейчас нахожусь загружается "Форумы". На 45 все те само разширения и кнопки что ина 48 мозилке чет ребята разработчики  накрутили:mad:

bunda1
Нашел такое обсуждение по кнопке Autocopy+3, но вот исправленную кнопку найти не удалось. По этой ссылке лежит кнопка в которой getBrowserSelection() не исправлено. Подскажите пожалуйста где можно взять исправленную версию.

gyra

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

Выделить код

Код:

// Функции автоматически копирует выделенный текст на странице, если это разрешено в 'about:config' ................................
({
        PREF_ROOT: "Autocopy",
        PREF_BLINK: "Autocopy.selectingTextBlink",
        get blinkMenuitem() {
                delete this.blinkMenuitem;
                return this.blinkMenuitem = menuPopup.querySelector('[onclick*="' + this.PREF_BLINK + '"]');
        },
        init: function() {
                gPrefService.addObserver(this.PREF_ROOT, this, false);
                addDestructor(() => gPrefService.removeObserver(this.PREF_ROOT, this));
 
                if (!gPrefService.getBoolPref(this.PREF_ROOT)) return;
                this.blink = gPrefService.getBoolPref(this.PREF_BLINK);
                this.setAutocopy(true);
        },
        observe: function(subj, topic, data) {
                if (data == this.PREF_ROOT)
                        this.setAutocopy(gPrefService.getBoolPref(data));
                else if (data == this.PREF_BLINK) setTimeout(() =>
                        this.blinkMenuitem.setAttribute("checked", this.blink = gPrefService.getBoolPref(data))
                , 100);
        },
        setAutocopy: function(set) {
                var method = set ? addEventListener : removeEventListener;
                for(var type of ["mousedown", "mouseup"]) method(type, this, false, gBrowser);
        },
        handleEvent: function(e) {
                if (e.button || e.target instanceof Ci.nsIDOMNSEditableElement) return;
                var win = e.target.ownerDocument.defaultView;
                if (win.top != content) return;
 
                var sel = win.getSelection().toString();
                if (e.type == "mousedown") {this.sel = sel; return;}
                if (!sel || sel == this.sel) return;
 
                goDoCommand("cmd_copy");
 
                if (!this.blink) return;
                gBrowser.selectedBrowser.blur();
                setTimeout(() => gBrowser.selectedBrowser.focus(), 300);
        }
}).init();


Код Dumby из того поста.

turbot
Спасибо!

citehala пишет

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

У меня это сработало

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

Выделить код

Код:

// See https://gist.github.com/Noitidart/0de3be2442a0295eb386
// vk codes: https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx

// Double Ctrl [Ctrl-Down, Ctrl-Up, Ctrl-Down, Ctrl-Up]
var data = [[0x11, false], [0x11, true], [0x11, false], [0x11, true]];

// Ctrl+Q [Ctrl-Down, Q-Down, Q-Up, Ctrl-Up]
//var data = [[0x11, false], [0x51, false], [0x51, true], [0x11, true]];

var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm", {});
var KEYBDINPUT = ctypes.StructType("tagKEYBDINPUT", [
    {wVk: ctypes.unsigned_short},
    {wScan: ctypes.unsigned_short},
    {dwFlags: ctypes.unsigned_long},
    {time: ctypes.unsigned_long},
    {dwExtraInfo: ctypes.voidptr_t.size == 8 ? ctypes.uint64_t : ctypes.unsigned_long},
    {padding0: ctypes.uint8_t.array(8)}
]);
var INPUT = ctypes.StructType("tagINPUT", [{type: ctypes.unsigned_long}, {ki: KEYBDINPUT}]);
var pInputs = INPUT.array()(data.map(([vkCode, keyup]) => 
    INPUT(1, KEYBDINPUT(vkCode, 0, keyup ? 2 : 0, 0, 0, ctypes.uint8_t.array(8)()))
));
var user32 = ctypes.open("user32"); try {
    var SendInput = user32.declare("SendInput", ctypes.winapi_abi, ctypes.unsigned_int, ctypes.unsigned_int, INPUT.ptr, ctypes.int);
    SendInput(pInputs.length, pInputs, INPUT.size);
} finally {
    user32.close();
}

На последней лисе перестал работать этот код:

Выделить код

Код:

// закладка в последнюю папку
(({panel}, prefName) => {

    cbu.isPref(prefName, PlacesUtils.unfiledBookmarksFolderId);
    addDestructor(reason => reason == "delete" && Services.prefs.clearUserPref(prefName));

    var popupshownFolderId = Services.prefs.getIntPref(prefName);
    var handler = e => {
        if (e.target != panel) return;
        var id = PlacesUtils.bookmarks.getFolderIdForItem(StarUI._itemId);
        if (e.type == "popupshown") {
            popupshownFolderId = id;
            return;
        }
        if (StarUI._actionOnHide || popupshownFolderId == id) return;
        Services.prefs.setIntPref(prefName, id);
    }
    for(var type of ["popupshown", "popuphiding"]) addEventListener(type, handler, false, panel);

    var src = BookmarkingUI.onCommand.toString();
    var res = src.replace("e(isBookmarked", `$&, isBookmarked || Services.prefs.getIntPref("${prefName}")`);
    var func = eval(`(${res})`).bind(BookmarkingUI);

    addEventListener("command", e => {
        e.stopPropagation();
        func(e);
    }, true, document.getElementById("bookmarks-menu-button"));

})(StarUI, "CB.lastEditBookmarkPanelFolderId");

Как исправить?

KOT040188
:/

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

Выделить код

Код:

(({panel}, prefName, btn) => {

    var showEditUIIfNotBookmarked = true;

    if (!btn) return;
    cbu.isPref(prefName, PlacesUtils.unfiledBookmarksFolderId);
    addDestructor(reason => reason == "delete" && Services.prefs.clearUserPref(prefName));

    var popupshownFolderId = Services.prefs.getIntPref(prefName);
    var handler = e => {
        if (e.target != panel) return;
        var id = PlacesUtils.bookmarks.getFolderIdForItem(StarUI._itemId);
        if (e.type == "popupshown") {
            popupshownFolderId = id;
            return;
        }
        if (StarUI._actionOnHide || popupshownFolderId == id) return;
        Services.prefs.setIntPref(prefName, id);
    }
    for(var type of ["popupshown", "popuphiding"]) addEventListener(type, handler, false, panel);

    var src = BookmarkingUI.onCommand.toString();
    var res = src.replace("true", `${showEditUIIfNotBookmarked || "isBookmarked"}, isBookmarked || Services.prefs.getIntPref("${prefName}")`);
    if (!showEditUIIfNotBookmarked) res = res.replace(
        'widget.node.removeAttribute("closemenu")',
        'isBookmarked ? $& : widget.node.setAttribute("closemenu", "none")'
    );
    var func = eval(`(${res})`).bind(BookmarkingUI);
    addEventListener("command", e => e.stopPropagation() || func(e), true, btn);
})(StarUI, "CB.lastEditBookmarkPanelFolderId", document.getElementById("bookmarks-menu-button"));

Здравствуйте ! Не работает кнопка Переключить язык интерфейса( Firefox ) (Отредактировано bunda1 (24-10-2013 18:52:48))
kiss_1kb.1466246514.png
Отремонтируйте пожалуйста !


Как ни странно, и эта не работает : Сохранить ярлык страницы на ...( Firefox24+ ) от 09.06.2016
kiss_2kb.1466248545.png
:::: Mozilla/5.0 (Windows NT 6.1; rv:47.0) Gecko/20100101 Firefox/47.0

p.s. Проверил на Firefox 28.0 + 0.0.5.8.1-signed.1-let-fixed = не работает.
Хотя, например, расширение lcwmcfpon легко создаёт ярлыки и на 47.

Dumby
Спасибо, работает. А можно сделать прокрутку к выбранной папке, а то прокрутка всегда вверху, а папка бывает внизу?
Ещё бы это исправить…
Этот код на последней лисе также не работает:

Выделить код

Код:

// Открывать библиотеку во вкладке и последнюю активную папку библиотеки, от 08.08.2014. ................................
   --------------------------------------------------------------------------- */
   (function () {
   var historyFolderNum = 1;     // папка истории которую откроет код
   var sortHistoryFolder = true; // сортировать папку истории которую откроет код
      
   var command;
   const pn = "CB.lastUsedLibraryFolder";
   const library = "chrome://browser/content/places/places.xul";

   
   // Перехватывать открытие библиотеки и открывать её в вкладке рядом с текущей ....
   function libraryInTab(e) {
      command = e.target.getAttribute("oncommand");

      if ( !/showPlacesOrganizer|DownloadsUI|DownloadsPanel/.test( command ) ) return;
      if ( /UnfiledBookmarks/.test( command ) && e.type == 'click' ) return; 
           e.stopPropagation();
     
      // закрыть все вкладки библиотеки кроме первой ....
      var libTab = null;
      Array.slice( gBrowser.tabs ).forEach(function(tab) {
            if ( tab.linkedBrowser.currentURI.spec !== library ) return;
            !libTab ? libTab = tab : gBrowser.removeTab( tab );
      });
   
      // переместить или открыть библиотеку рядом с текущей вкладкой ....
      var selTab = gBrowser.selectedTab;
      if ( libTab !== selTab ) {
           if ( libTab && gBrowser.visibleTabs.indexOf( libTab ) == -1 )
                TabView.moveTabTo( libTab, TabView._window.GroupItems._activeGroupItem.id );
           libTab = libTab || gBrowser.addTab( library );          
           var pos = selTab._tPos + ( libTab._tPos > selTab._tPos );
           gBrowser.moveTabTo( libTab, pos );
           gBrowser.selectedTab = libTab;
           
           // если уже открытая библиотека была перемещена
           if ( !libTab.hasAttribute('busy') ) openLastUsedFolder();                          
           }
       else       
           openLastUsedFolder();  // если библиотека уже в текущей вкладке      
   };
   addEventListener("command", libraryInTab, true, window );
   addEventListener("click", libraryInTab, true, document.getElementById('appmenuSecondaryPane') );

   
   // Открывать и запоминать последнюю активную папку если библиотека открыта как вкладка ....
   function openLastUsedFolder( e ) {
      var win = e ? e.target.defaultView : content.document.defaultView;
      if ( win.location != library ) return;

      // получить нужную папку
      try { var value = cbu.getPrefs( pn ) } catch(e) { value = '' }; 
      if ( /DownloadsUI|DownloadsPanel/.test( command ) ) value = 'place:transition=7&sort=4';
      if ( /UnfiledBookmarks/.test( command ) ) value = 'place:folder=UNFILED_BOOKMARKS&excludeItems=1&expandQueries=0';

      // закрыть меню большой кнопки и кнопки загрузок
      setTimeout(function() { 
         try { document.getElementById("appmenu-popup").hidePopup();
               document.getElementById("downloadsPanel").hidePopup();
             } catch(e) {} 
      }, 10 );
           
      // открыть нужную папку используя рекурсию   
      (function f() { 
         if ( win.location != library ) return;
         try {
             if ( /'History'/.test( command ) ) {
                  var doc = win.document;        
                  var view = doc.getElementById('placesList').view;                  
                  
                  if ( view ) view.selection.select( historyFolderNum ); // открыть указанную папку
                 
                  // сортировать папку истории по адресу
                  if ( sortHistoryFolder && view ) {                  
                       doc.getElementById('viewMenu').open = true;
                       doc.getElementById('viewSort').open = true;
                       doc.getElementById('viewMenu').open = false;
                       doc.getElementById('menucol_placesContentUrl').doCommand();
                       }
                  }
             else  
                  {         
                  win.PlacesOrganizer.location = value;
                  win.PlacesOrganizer._places.focus(); 
                  }                       
             }
         catch(e) { setTimeout(function() f(), 0) };
          
      })();
      
      // запоминать последнюю папку при закрытии библиотеки
      if ( e == undefined ) return;
      win.addEventListener("unload", function f(e) {        
          win.removeEventListener( e.type, f);
          
          var loc = win.PlacesOrganizer.location;
          /place:folder|place:sort/.test( loc ) && cbu.setPrefs( pn, loc );                
      });
   };
   addEventListener("DOMContentLoaded", openLastUsedFolder, false, gBrowser );
})();

Перестала работать кнопка Перезапуск браузера из контекстного меню

скрытый текст
// Добавить свои пункты в контекстное меню, от 09.02.2016. ...............   
(contextMenu=> {
   var menuItem1 = contextMenu.insertBefore(document.createElement("menuitem"), contextMenu.children[2]);
   addDestructor(()=> menuItem1.remove() );
   menuItem1.setAttribute("label", "Открыть about:config");
   menuItem1.setAttribute("oncommand", "gBrowser.selectedTab = gBrowser.addTab('about:config')");
   
   var menuItem2 = contextMenu.insertBefore(document.createElement("menuitem"), contextMenu.children[2]);
   addDestructor(()=> menuItem2.remove() );
   menuItem2.setAttribute("label", "Перезапуск");
   menuItem2.setAttribute("oncommand", "Application.restart()");
   }
)(document.getElementById("contentAreaContextMenu"));

Поправьте кто умеет это:)

tom911

Выделить код

Код:

Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart)

Вместо Application.restart()

turbot пишет

tom911

Выделить код

Код:

Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart)

Вместо Application.restart()

Спасибо, работает:)

dimoniam пишет

Не работает кнопка Переключить язык интерфейса( Firefox )
Отремонтируйте пожалуйста !

Переключить язык интерфейса

20-06-2016 11:27:14

dimoniam пишет

Как ни странно, и эта не работает : Сохранить ярлык страницы на ...( Firefox24+ ) от 09.06.2016

Сохранить ярлык страницы на ...

KOT040188 пишет

Этот код на последней лисе также не работает:

:/
Открывать библиотеку в вкладке и последнюю активную папку библиотеки

broker пишет

bunda1
Я как бы не правильно написал саму проблему:blush: Проблема в том что если я сейчас на етой странице нажму "Форумы" то у меня грузится новая вкладка  "Форумы" и в том числе и та на которой сейчас нахожусь загружается "Форумы". На 45 все те само разширения и кнопки что ина 48 мозилке чет ребята разработчики  накрутили:mad:

Пробовал по разному но проблему которой ты пишешь я не могу повторить. Может так попробуй:

Выделить код

Код:

// Открывать ссылки длинным кликом, от 20.06.2016. ....................
(function func() {
   var time = 500;            // время удержания в мс
   var background = true;     // открывать в фоновой вкладке
   var nextToCurrent = true;  // открывать рядом с текущей вкладкой
 
   function handleLongPress(e) { 
      window.clearTimeout(func.timer);
      setTimeout(()=> { try { func.removeListener() } catch(e) {} }, 0);
      
      var lab = XULBrowserWindow.overLink;
    
      if ( e.button || !lab || lab.startsWith("javascript") ) return;
   
      if ( e.type == "mousedown" && !e.target.className.startsWith("ui-slider-handle") ) {
           func.timer = setTimeout(()=> {
              function c(e) { e.preventDefault(); e.stopPropagation() };
              addEventListener('click', c, true);
              func.removeListener =()=> { removeEventListener('click', c, true) }; 
           
              gBrowser.loadOneTab(lab, {relatedToCurrent: nextToCurrent, inBackground: background, referrerURI: makeURI(content.location.href)});
           }, time);  
           }
      else 
           clearTimeout(func.timer);
   };
   ["mouseup", "mousedown", "dragstart"]
   .forEach(type=> { addEventListener(type, handleLongPress, true, gBrowser) });
})();

у меня кнопка пропала  вообще пункта нет   добавить кнопку
обновился  методом копирования до 43.0.1
видимо после этого
в каталаго  установленных расширений  дополнение кнопки есть

selevo пишет

у меня кнопка пропала  вообще пункта нет   добавить кнопку
обновился  методом копирования до 43.0.1
видимо после этого
в каталаго  установленных расширений  дополнение кнопки есть

А ты установи последнюю версию Сustom Buttons.

это второе что я сделал
0.5.8.9 версия стоит
запарили они менять структуры доступа к браузеру
А где посмотреть чё там они  понаизменяли в коде
API функции да чёда... ?
я решил  код из кнопки   поставить в  грисмонкей
но не пашет...

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

Выделить код

Код:

addEventListener('dblclick', (e)=> {
  var img = e.originalTarget.tagName.toLowerCase() == "img";
  var win = e.originalTarget.ownerDocument.defaultView;
    if (img && e.button == 2 && win.top == content) {
    e.preventDefault();
    e.stopPropagation();
    document.getElementById("contentAreaContextMenu").hidePopup();
    var imgLink = e.originalTarget.src;
    if (imgLink && e.originalTarget.parentNode.tagName.toLowerCase() == "a"
       && e.originalTarget.parentNode.href.match(/\.(jpg|jpeg|png|gif|apng|webp)$/)) {
      imgLink = e.originalTarget.parentNode.href;
    }
    gClipboard.write(imgLink);
    custombuttons.alertSlide('Ссылка на изображение скопирована', imgLink);
  }
}, false, gBrowser);

а  встроеный блокнот  жаваскрипт пишет ошибку
gBrowser is not defined

не туда смотрел
есть такой пункт
но  код нерабочий теперь

selevo
В гризманки и не будет работать. Как переделать под него - не представляю. Сомневаюсь, что скриптами, исполняемыми в контексте страницы, можно в буфер браузера что-то писать. Да и контекстное меню из них не закроешь.
А в CB все работает. Даже в 50-ой ночнушке. Собственно, я его и делал на 49-ой. Ищите у себя причину, может, конфликтует с чем-то, что также правые клики перехватывает. И, вы кнопку-то вынесли на панель? Кнопки в меню "гамбургера" не инициализируются автоматически, при старте браузера. Только после первого открытия этого меню. Код, вообще, во вкладке "инициализация"? Не в "код"?

не знаю что делал но сейчас всё работает нормально
спасибо

Dumby, приветствую! На версии 47.0 (возможно даже на более ранних версиях, заметил только сейчас) перестал работать поиск на сайте:
https://forum.mozilla-russia.org/viewto … 46#p675146
Нельзя поправить? Посмотри пожалуйста.

Здравствуйте.

Помогите пожалуйста создать кнопку, которая открывала бы окно просмотра сертификата безопасности текущей страницы.
К сожалению, код window.openDialog('chrome://pippki/content/certViewer.xul'); открывает соответствующее окно, но при этом все поля в нем пустые.
Заранее спасибо.

Также подскажите пожалуйста, можно ли отключать отдельные кнопки не из меню Custom Buttons, а из safe mode или редактированием файлов в профиле? К примеру, на случай, если в Initialization оказался код, препятствующий загрузке браузера.

(Прошу прощения за двойной постинг; судя по отсутствию ответов в моей теме, вопросы следует задавать сюда).

firefan пишет

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

Папка профиля - текстовой файл prefs.js - user_pref("extensions.custombuttons.mode", 66); - 66 на 98, тогда при запуске браузера кнопки не будут инициализированы.

24-06-2016 11:52:57
А как сделать просмотр сертификата я не знаю.

bunda1 пишет

Папка профиля - текстовой файл prefs.js - user_pref("extensions.custombuttons.mode", 66); - 66 на 98, тогда при запуске браузера кнопки не будут инициализированы.

Супер. Благодарю.

Что касается сертификата, вот исходный код кнопки "View Certificate" из pageInfo.xul:

Выделить код

Код:

<!-- Cert button -->
        <hbox id="security-view-cert-box" pack="end">
          <button id="security-view-cert" label="&securityView.certView;"
                  accesskey="&securityView.accesskey;"
                  oncommand="security.viewCert();"/>
        </hbox>

Интересно, можно ли преобразовать это в код для Custom Buttons.

bunda1, перестало работать ((
https://forum.mozilla-russia.org/viewto … 53#p710453

becool
[CB]Редактировать размеры диалога добавления закладок звёздочки

turbot, и тот вариант не робит... ((

becool
У меня вариант Dumby. Он точно работает.

25-06-2016 17:32:36
Впрочем, проверил, из первого поста тоже работает. Ищите у себя причину.

turbot пишет

проверил, из первого поста тоже работает. Ищите у себя причину.

Точно, причина была в другом... Перестал работать код для отжатия кнопки:
https://forum.mozilla-russia.org/viewto … 67#p688767
А код для диалога закладок был после кода для отжатия...
turbot, поможешь с "ремонтом" кодя для отжатия? :)

Эта проблема тоже актуальна:
https://forum.mozilla-russia.org/viewto … 10#p718010
Помогите вылечить.

becool пишет

Перестал работать код для отжатия кнопки:
https://forum.mozilla-russia.org/viewto … 67#p688767

:/

Выделить код

Код:

cbu.setPrefs('extensions.searchwp.highlight.state', false);
becool пишет

Эта проблема тоже актуальна:

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

Выделить код

Код:

Services.search.init(() => {
    var data = {
        "Google SiteSearch": {
            url: "https://encrypted.google.com/search?hl=ru&q={searchTerms}&ie=utf-8&oe=utf-8",
            description: "Поиск по сайту в Google",
            icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABLklEQVQ4jZ3Tv6uCUBQHcP+9+psuejEXCaTZQBzMTXAxEQI3QdJBFAchKJKCTFrSRfD7pnd58QTN4Qzn3ns+nPuL43l+QSm9UUrxZdx4nl9wM4sZwg1NiKII13XheR7O5zP6vkcYhjAM49/aQSAIAniex7Dr9Yosywa7GATatoVlWSy3bRtd100HmqZBFEUs13Udj8djOuA4Drquw263gyzLOB6P2G630wFKKVRVxX6/B4CP7UwGKKVYrVZo2xaXywXr9Xo6YJomuwnf9/F+v/F8PqEoyjhwOBxwOp0gSRIbUxQFVVUhjuNxoK5r9gb+huu6SJJkHMjzHFVVYbPZfJxFURTQNG0ckGUZQRDg9XqhLEukaYo4jgeLf4HZn0kQhDtHCFkKgnCfAZSEkOUP0IqsHeSvVqEAAAAASUVORK5CYII="
        },
        "DuckDuckGo SiteSearch": {
            url: "https://duckduckgo.com/?kp=-1&kak=-1&kad=ru_RU&kae=d&kn=1&kf=fw&k1=-1&kd=-1&q={searchTerms}",
            description: "Поиск по сайту в DuckDuckGo",
            icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACdElEQVQ4jX2TX0tqWxTF/Rjns/Qa+AVEqNberbXXzr3UsqCgl0KNCIVIQ+jPiw+ShYSfQNlQFIKVFZ2nHo6PBUEQSdgf7Hcezm1z8x7ugPk0xxhzLtaYodAQkslk2BhT9TyPrzLGEI/Hq6lUKjzM/wZjTC+RSHBycsJgMODfODs7I5VKEY/He38Ve55HqVQC4OHhgcPDQxzHQUpJLpfj+voagK2tLYwxDIt7e3t7vL+/s7+/z9PTUzC5UCiglEJrzcHBAQDVahXP83pfa4/Ozs4CsLGxQSwWYxh3d3e4rovrumxvbwMwNzeHMWY0pLX+2el0aLfbSClpNps0Gg1ubm74+Pjg9fUV3/dpNpu4rovjOJyfn3N5eYnW+mdIaw1ANptFSonv+9zf3xMOh/F9HwClFI1GA6UUSilWVlYA0FoTchwnICml8H2fwWDA0dFR8ITHx0dqtRqFQoHd3V0WFxcDTUgpBcDU1BRSStbW1gLh8/Mzm5ub5PN5crkc6XSaWCzGl+abQTabZXJyMmgCfH5+UiwWWV1dZXl5mXw+TyaTIZPJACClJCSlrHY6HVqtFpZlMT4+zsvLS2BSr9cxxrC0tMT8/DxSSlqtFhcXF9i2XQ1prcPJZBKA9fV1xsbGuLq6Cgxub2+xbZtIJIKUkmKxCMD09DRa6z/RtizrV6VSod/vUyqVqNVqlMtlZmZmWFhYIJFIMDIyQrlc5u3tjUqlgmVZv76lUQjR+4pyt9vl+PiYSCRCOp2mXq8HX7qzs4MQ4u/3IIToSik5PT39Txrb7TZaa2zb7v7vRUaj0R8TExM1IURfCME/1RdC1KLR6I9h/m/LgGKpds8y0AAAAABJRU5ErkJggg=="
        }
    };
    var pn = "CB.searchEngineIndexes", sep = "\u00A0"; custombuttons.isPref(pn, "");
    var old = custombuttons.getPrefs(pn).split(sep);

    var ss = Services.search, names = [];
    function eng(name) ss.getEngineByName(name);
    for(var name of old) {
        if (name in data) continue;
        var engine = eng(name);
        engine && ss.removeEngine(engine);
    }
    for(var name in data) {
        var {url, description, icon} = data[name];
        var engine = eng(name), was = true;
        if (!engine) {
            was = false;
            ss.addEngineWithDetails(name, icon, null, description, "GET", url);
            engine = eng(name);
        }
        if (!engine) continue; else engine = engine.wrappedJSObject;
        if (was) {
            engine._urls = [];
            engine._initFromMetadata(name, icon, null, description, "GET", url, null);
        }
        engine._queryCharset = "utf-8";
        engine._urls[0].getSubmission = function(terms) {
            var {host, protocol} = content.location, suffix = "";
            if (protocol.startsWith("http") && host) suffix += "+site:" + host;
            var url = this.template.replace("{searchTerms}", terms + suffix);
            return { uri: makeURI(url), postData: null };
        }
        names.push(name);
    }
    custombuttons.setPrefs(pn, names.join(sep));
});

bunda1, turbot, большое спасибо, теперь работает!

Перестала работать кнопка Открыть видео в PotPlayerMini...как и одноименное дополнение...как и вообще открытие ссылок плеером.
Подозреваю что это на тубе химичат но хотелось бы уточнить - это только у  меня такое счастье или это в самом деле ютуб?

oleg.sgh, ага, не работает. Плеер открывает и тот даже с ютюбом коннектится, судя по реакции Firewall. Но не кажет и в плейлист не заносит.

Coroner У меня Firefox 47 (x32). Прочитав Ваш пост метнулся на ютуб, открыл первое попавшееся видео через PotPlayer (x32) этой кнопкой. Все ровно. И да, Windows 10 (x64)

zhulcov
Вообще неплохо бы попробовать одну и ту-же ссылку. Можете дать любую, которая открывается ?
[firefox] тот-же, win7 x32. Pot 1.6.57461

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

Coroner Если Вы про ютуб, то любая ссылка какая под руки попадется. Но вот после этого я пробежался по киношным сайтам, и таки да там пичалька. При открытии кнопкой пишет перезагруз сервера. Я провел эксперимент: начал скачивать фильм через IDM, а потом скопировав из него ссылку и вставив ее в Pot она чудненько заработала. Так, что всетаки с кнопкой что-то не то, не правильно определяет ссылки.

Пришел к выводу, что кнопка корректно считывает ссылки только видео HTML5.

zhulcov пишет

Пришел к выводу, что кнопка корректно считывает ссылки только видео HTML5

oleg.sgh пишет

Не работают некоторые видео...как оказалось.

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

Coroner Аналогично, пользуюсь редко. Но иногда очень спасает. Остается надеется на bunda1, что у него получится исправить.

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

скрытый текст
b-7170.png

Но это не совсем удобно против кнопки.

zhulcov пишет

Остается надеется на bunda1, что у него получится исправить.

Как бы там совсем сложно не оказалось. Не представляю как можно определить HTML5 оно или нет. Но возможно всё проще чем кажется ? :)

oleg.sgh пишет

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

Да, я тоже так пробовал. Вот почему и думаю что не всё так просто : ссылки-то на вид одинаковые, структурой вроде как не отличаются.
FlashGot хорош, конечно, но я как-то к менеджерам и управлялкам закачек, а так же и к самим качалкам не привык. А если ещё и на старом компьютере сижу, где кроме браузера что-то ещё открыто ресурсоёмкое, то напрягает медленное и мучительное открытие окошек или качалок, даже если просто файлик в 100 кб скачать надо.

Coroner

:offtopic:

напрягает медленное и мучительное открытие окошек или качалок

b-7171.png

:offtopic:
oleg.sgh, это понятно, но в таком режиме мне уже лень вообще что-то стороннее использовать. :angel: И стоит без дела Free Download Manager, даже кнопкой снабжённый (код которой я почему-то найти на форуме не могу, хотя я думаю Вы и так знаете о ней).
Вот чего я никак настроить и освоить не могу, так это CB + wGet (или Aria).А через FlashGot отдавать — громоздко получается.

oleg.sgh
Coroner
У меня с MPC-BE эта кнопка отлично работает.

oleg.sgh, само починилось что-ли ? Теперь внезапно всё открывается. Во всяком случае неоткрывающиеся не попадаются.
ifln, у меня MPC-HC прижился. Мне показалось что он полегче чем BE.

Coroner
Не починилось. И вряд ли в кнопке дело. Некоторые ссылки не открываются из самого плеера.
Пример и несколькими сериями ниже.

oleg.sgh, да, от России не открываются, зато бугагашечки - пожалуйста. Уж не в копирастии ли дело ? :D
ifln, не могли бы Вы открыть приведённую oleg.sgh ссылку в MPC-BE ? У меня в MPC-HC она не открывается.

Coroner
SimpleTV плеер открывает ту, *нерабочую* ссылку. Так что дело PotPlayer а не в кнопке.
Может в кодировке самого видео дело. Разбираться лень...да и бессмысленно.

Coroner пишет

oleg.sgh, да, от России не открываются

У меня из Латвии тоже не открывается, причём разными плеерами. Попробовал MPC-BE.1.4.6.1590 и вот он открывает то что остальные не открывают. Похоже youtube что то изменил у себя и не все разработчики плееров это заметили и соответственно обновили свои плеера.

Coroner
Добавляет в плейлист.
Открывает, хотя и относительно долго, 6-8 сек.
Регион Россия.

oleg.sgh, bunda1, ifln спасибо. Хорошо что не в кнопке дело. Переедем пока на  MPC-BE, благо код в кнопке поменять нетрудно. :)

Coroner пишет

Переедем пока на  MPC-BE, благо код в кнопке поменять нетрудно.

А какие параметры можно использовать при передачи ссылки в MPC-BE?

bunda1,
Кнопка "Блокнот во вкладке" не работает на fx 48.

bunda1 пишет

А какие параметры можно использовать при передачи ссылки в MPC-BE?

ПКМ > HELP > Command Line Switches

bunda1 Я пока не нашёл параметры для MPC-BE. Если предположить что они такие же как и command line switches for MPC-HC, то получается что параметр /add остаётся, он для MPC-HC ту-же функцию выполняет. Я возможно бы добавил /nofocus для открытия в фоне, иногда стартует долго, может быть так удобнее будет, и ещё опционально /play и /close для закрытия после воспроизведения. Но не знаю удобно-ли будет комбинировать нажатия с Shift или Ctrl.

Спасибо, я нашёл параметры для передачи в MPC-BE:
cf655f15ace51fff8cb91eef7f646c4d.png

27-06-2016 22:39:35

Northtech пишет

bunda1,
Кнопка "Блокнот во вкладке" не работает на fx 48.

Блокнот в вкладке

bunda1
спасибо :)

KOT040188 пишет

А можно сделать прокрутку к выбранной папке, а то прокрутка всегда вверху, а папка бывает внизу?
Ещё бы это исправить…

:/

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

Выделить код

Код:

(func => {
    var pos = .5;
    var scroll = tree => {
        // code from AI inspect()
        var tbo = tree.treeBoxObject;
        var cur = tbo.view.selection.currentIndex;
        var first = tbo.getFirstVisibleRow();
        var visibleRows = tbo.height/tbo.rowHeight;
        var newFirst = cur - pos*visibleRows + 1;
        tbo.scrollByLines(Math.round(newFirst - first));
    }
    gEditItemOverlay.toggleFolderTreeVisibility = eval(`(${
        func.toString().replace("this._folderTree.focus();", "$& scroll(this._folderTree);")
    })`);
    addDestructor(() => gEditItemOverlay.toggleFolderTreeVisibility = func);
})(gEditItemOverlay.toggleFolderTreeVisibility);
Выделить код

Код:

(obs => {
    Services.prefs.addObserver(obs.pref, obs, false);
    addDestructor(() => obs.observe(Services.prefs.removeObserver(obs.pref, obs)));
    obs.observe(null, "", obs.pref);
})({
    msgName: "Findbar:Keypress",
    pref: "accessibility.typeaheadfind",
    observe(subject, topic, data) {
        if (data && data != this.pref) return;
        data && Services.prefs.getBoolPref(this.pref)
        ? messageManager.addMessageListener(this.msgName, this)
        : messageManager.removeMessageListener(this.msgName, this);
    },
    receiveMessage(msg) {
        var {charCode, key} = msg.data.fakeEvent;
        if (!charCode || " /'".includes(key)) return true;

        gFindBar.onFindCommand().then(() => {
            gFindBar._findField.value = key;
            gFindBar._findField.selectionStart = 1;
        }, null);
    }
});

bunda1 пишет

А как сделать просмотр сертификата я не знаю.

А у тебя так открывается окно просмотра сертификата текущей страницы?

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

Выделить код

Код:

var {securityUI} = gBrowser; if (securityUI) {
    var {SSLStatus} = securityUI.QueryInterface(Ci.nsISSLStatusProvider);
    SSLStatus && SSLStatus.serverCert && Cc["@mozilla.org/nsCertificateDialogs;1"]
        .getService(Ci.nsICertificateDialogs).viewCert(window, SSLStatus.serverCert);
}

Dumby пишет

А у тебя так открывается окно просмотра сертификата текущей страницы?

Открывается только на нашем форуме, на других сайтах ничего не открывается.

bunda1 пишет

Открывается только на нашем форуме, на других сайтах ничего не открывается.

Спасибо. У меня на FF45 открывается и на других
mdn, wiki, searx, duck, translate, github, rarbg ...
А у тебя на каких не открывается?

Dumby пишет

А у тебя на каких не открывается?

На FF48:
http://www.delfi.lv/
http://www.softodrom.ru/
http://www.rambler.ru/

29-06-2016 21:45:46

Dumby пишет

И у меня на FF48 открывается.

bunda1 пишет

http://www.delfi.lv/
http://www.softodrom.ru/
http://www.rambler.ru/

Эээ, так это же не httpS ссылки :blush:.

Dumby пишет

Эээ, так это же не httpS ссылки :blush:.

Не httpS

bunda1 пишет

Не httpS

Вот и хорошо. Не до́лжно, значит и не должно́.

bunda1 ваш код Двойным правым кликом мыши сохранить изображение без запроса в указанную папку
не сохраняет изображения, если в заголовке страница есть японские/корейские символы: Heroes Шоу на SBS при этом расширение Image Picker работает нормально.
А можно сделать так, чтоб изображение сохранять по двойному клику средней кнопкой мыши?

bunda1
Автовыделение ++ на [firefox] 47 перестало работать (иконка потускнела).

Dobrov пишет

А можно сделать так, чтоб изображение сохранять по двойному клику средней кнопкой мыши?

Выделить код

Код:

// Двойным средным кликом мыши сохранить изображение в указанную папку без запроса, от 30.06.2016. ................
addEventListener("click", (e, targ = e.target)=> {
   if ( e.button !== 1 || targ.localName !== 'img' ) return;
   
   e.preventDefault();
   e.stopPropagation(); 
  
   var path = 'C:\\qwerty';
    
   if ( self.flag ) {
        var run = cbu.getPrefs("browser.download.folderList");
        var use = cbu.getPrefs("browser.download.useDownloadDir");
        try { var dir = Services.prefs.getComplexValue("browser.download.dir", Ci.nsISupportsString).data } 
        catch(e) { var dir = Services.downloads.defaultDownloadsDirectory.path };
                
        cbu.setPrefs("browser.download.folderList", 2);
        cbu.setPrefs("browser.download.useDownloadDir", true);
        cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", path));
        
        var imgLink = e.originalTarget.src;
        saveImageURL(imgLink, 0, 0, 0, 1, null, content.document);
      
        cbu.setPrefs("browser.download.folderList", run);
        cbu.setPrefs("browser.download.useDownloadDir", use);
        cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", dir));
        }
   self.flag = true;
   setTimeout(()=> self.flag = false, 600);

}, false, gBrowser);

30-06-2016 22:17:48

Dobrov пишет

bunda1 ваш код Двойным правым кликом мыши сохранить изображение без запроса в указанную папку
не сохраняет изображения, если в заголовке страница есть японские/корейские символы

Странно, но у меня там всё сохраняется. Может укажи какое то конкретное изображение которое не сохраняется.

30-06-2016 22:18:29

thrower пишет

bunda1
Автовыделение ++ на [firefox] 47 перестало работать (иконка потускнела).

Завтра или после завтра исправлю.

bunda1 пишет

Странно, но у меня там всё сохраняется. Может укажи какое то конкретное изображение которое не сохраняется.

Спасибо за код на middle-click!
но Картинка cover-DVD слева сверху не сохраняется, при открытии на весь экран 4 картинки превью тоже не сохраняются. (но в контекстном меню пунктов для изображения нет)

Dumby пишет

Эээ, так это же не httpS ссылки

А можно сделать, чтоб код пытался получить сертификат для текущего сайта? Как это в mozilla:exceptiondialog происходит? А то он не работает на about:certerror, когда чаще всего и нужно глянуть.

01-07-2016 08:56:25
thrower
Можете пока так поправить.

turbot
Это не то. Мне нужен autoselection (autohighlight, автовыделение), a не autocopy.

turbot пишет

Как это в mozilla:exceptiondialog происходит?

Вот и посмотри как это происходит.
Адрес: chrome://pippki/content/exceptionDialog.js
Поиск: function checkCert()

Dumby
У, спасибо. Получилось. Правда, пришлось половину содержимого в кнопку перетащить. :)

thrower пишет

bunda1
Автовыделение ++ на [firefox] 47 перестало работать (иконка потускнела).

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0410%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%20++%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD+//4B////APX69AV9vWaPVJsR9GabDPiQrDGn6OzRG////wD+/v0B////AP///gL///0B////AP///wD///8A////AP3+/gP///8ActGnhRyqVP83q0r8PqMu/kqZDf9yoh7Wu8t8YNjan07m4bM9+ffqCf///wD///4B////AP///wD8/v8C//7/AOL5/A4d1NrUFc/G/yHEov0qt3b/NKtM/UGeHv9WlAD/eJcB/peZAP+nphzH5+bAIP///wD+/v8A/fz/A/3+/wH///8A5/b+CyG8/c4Jz/z/ENfm/RrLuf8nu4b/M61S/UGgJvtbnBH8fqAQ/IKXAP+lrjax/v76AP7+/gH///8A7fD9CNni/Bb///8Ac7/4dQCn9/8P1f38ENbh/xzIsf8ouoD/NKtL/0GeHf9enA79dJ0M/4yiGOrx8d0c/f3/AJaT7105O+TOHTjn5GuP8n7u9v4AOK/3ugW/+/8N2vX9FdDN/yDDoP8rtXD/N6c//kqdGPpcnBD/dqIZ3/L05BCVht5rLhXE/zMj0f0nKuL/EkHp7+Dm/Bq64/wyBKz4/w/W/fwP1+X/Gsq4/ya+kPwwsWH+M58o/jSSAP+exXNr////AFkwrepXMrT8SjPG9icg2v8xRunM8fX+BfL5/gcdpPbOBMH8/w/b9vwX0dH+FcKk/yS3evFZum2rpdOaUPj79gD///8BZy6R8lsqn/8/Hbb/NSfS6MPE+DDj7PwI8vP9ALHe/DQXs/nWAs/9/wDV5v9C1Mmwye/jI////wD///8B////AP7+/gG/oclQgVSpuIhuy4/OyfIheHbpgx815+4vZ+7C2uf8Fuz5/we+8P83y/f8Jvb9/QL///8A8vv4CZPUpGO837Y5////AP///wD6+f0D////AIVy1IsgEsz/Lini+Qow5/+Gq/Vq////AM/t/Ruo6/4+6/z9C////wB817lzE6dQ/zGeJfOs05lI/Pv9Bf///wDXy+knTCOu7UYvxf89KtH4Fhrh/4yb9GTB3/sjCJH07QC9+v854Pio9///AFHOsrMktnX/NKtO/0KoPsz9/P0D////AMey2ElWJaL/UzG4+k0vv/4sGs/5vLn1Mkl68aoLcvD/G6j4+QDH+v+29f8xY9zUkA/Eo/8swpH3JL6M/P38/gL///8A08DcNF8kkPlgNar9Sh2m/3texp/i4PsPKTDk7hxP7P8eefD7Apb1/47Z/E2x8vw2AMrv/wXN5/8O0Ova////AP///wH8+/wAoHe0iWkukfN+U66v8+31C9PL7iA3H8n6KSzi/yNF6/sMVe3/rc35PP///wB/zv1qM7L7u53e/j7///8A////AP///wD7+fsB6NzqD/n2+gT///8A7uf0EV80rONFKcD/LCTU/zxC47/u8P4D////Af7+/gH//f4A///+AP///wD///8A//7/AP79/gL///8A/v7/Av38/gT///8AsZHEZmAplv5gOrPQzMbwKf///wD9/f4C/f//A/7//wL9/v8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20%0A%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041B%u041A%u041C%20....%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%0A%20%20%20%20%20%20%20%20autoHighlight%28%20cbu.setPrefs%28s%2C%20%21cbu.getPrefs%28s%29%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u0421%u041A%u041C%20....%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20toggleHighlightValue%28%27add%27%29%3B%0A%20%20%20%20%20%0A%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041F%u041A%u041C%20....%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20toggleHighlightValue%28%27clear%27%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%0A%0A//%20%u041E%u0431%u044A%u044F%u0432%u043B%u044F%u0435%u043C%20%u043F%u0435%u0440%u0435%u043C%u0435%u043D%u043D%u044B%u0435%20%u0434%u043B%u044F%20%u044D%u0442%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20..........%0Avar%20s%20%3D%20%22CB.autoHighlight%22%3B%0Avar%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Athis.onmouseover%20%3D%28%29%3D%3E%20%7B%0A%20%20%20var%20array%20%3D%20getArray%28%29.map%28str%3D%3E%20%7B%20return%20str.slice%280%2C50%29%20+%20%28str.length%20%3E%2050%20%3F%20%22...%22%20%3A%20%22%22%29%20%7D%29%3B%0A%20%20%20this.tooltipText%20%3D%20%22%u0410%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%20++%20%5Cn%u041B%3A%20B%u043A%u043B%u044E%u0447%u0438%u0442%u044C/%u0432%u044B%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%5Cn%u0421%3A%20%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%u041F%3A%20%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%5Cn%5Cn%u0422%u0435%u043A%u0441%u0442%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u044F%3A%20%5Cn%22%20+%20getArray%28%29.join%28%22%5Cn%22%29%3B%0A%7D%3B%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u043D%u0430%u0441%u0442%u0440%u043E%u0435%u043A%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u044F%20..........%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29.%0A%20%20%20src%20%3D%20cbu.getPrefs%28s%29%0A%20%20%20%3F%20self.image%0A%20%20%20%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAD///8A/v7+AP39/QH9/f0B/f39Af39/QH///8AmJiYKQAAALEDAwPqAAAA1gAAAGm7u7sA////Afv7+wD///8A////AP39/QH9/f0D////AP///wD7+/sB////AKKiogoAAADJAAAA/wAAAP0BAQH+AAAA/wsLC3HDw8MA////Bfb29gP+/v4A////Aefn5wDT09MJ1tbWCdTU1AT///8AXFxcSwAAAPsEBAT/AAAA/gAAAPwFBQX/AAAA63Nzczvu7u4A/Pz8Avz8/AHr6+sJMjIyZgAAAL8CAgLCAAAApsbGxhhoaGhLAAAA/gUFBf8AAAD+AAAA/wAAAP0DAwP/AAAA6hMTE5eHh4cr3d3dACsrK4gAAAD/AwMD/gMDA/wAAAD/Hh4emy0tLQwAAADwAQEB/wAAAP4AAAD/AAAA/wAAAP8BAQH9AwMD/wAAAOcrKys5AwMD7gYGBv4AAAD7BAQE/QAAAP9KSkp5////ABUVFcIAAAD/AQEB/QAAAP8AAAD/AAAA/wAAAP4BAQH6BwcH/wICAr8BAQGfAAAA/wEBAf8AAADrBQUFeMbGxgX///8AGhoawQAAAP8BAQH+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9BgYG66+vrwc1NTVCDw8PPgAAADUREREt0tLSF+7u7gAdHR27AAAA/wICAvsBAQH9AQEB/QEBAf0BAQH8AQEB+wICAv8BAQHC////AsHBwQAICAhzAAAA6AQEBP8AAADqWlpaL25ubj8AAAD4AgIC/wAAAP4AAAD/AAAA/wAAAP4CAgL/AAAA3VtbWznHx8cABgYGbwAAAP8BAQH+AAAA+AUFBf8AAAB18PDwAIyMjDwYGBiuGRkZwxgYGJQTExNzFhYWdQUFBWRgYGAb////ALS0tBwAAADXBQUF/wAAAPgFBQX/AAAA90tLSzunp6cApqamDaurqwP///8A////AP///wD///8A////AP///wD7+/sBtLS0LQAAAOwLCwv/CQkJ+wAAAP88PDyLkJCQDAICAqYAAADdAAAAkJCQkAP///8AW1tbLUlJSXFnZ2cR////AP7+/gHNzc0HDAwMpAAAAP8AAADuJycneRMTEw8PDw/AAQEB/wsLC/8AAAD6cnJyPHR0dB4AAADiAAAA/yAgIJX///8A/v7+Av///wC7u7sPgoKCRYqKii3T09MACgoKaAAAAP8BAQH4AgIC/AAAAP8vLy9GKysreQAAAP8FBQX/BwcH3LS0tAj///8A/f39Af39/QH///8A////AOzs7AYDAwPEAAAA/wAAAPsCAgL/AAAA8mtrawlMTEygAAAA/wgICP8AAADpampqGP///wD///8A/Pz8Afn5+QT+/v4B7e3tBAQEBMEAAAD/AQEB/QAAAP8TExNv////AFJSUosAAAD/AwMD/wEBAauurq4A////Av///wD///8A/v7+AP///wLv7+8AAwMDSwAAAOADAwPZAAAAZZOTkwP///8AT09PIQAAALYAAAC3oaGhIf///wD9/f0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%3B%0A%20%20%20%20%0A%20%20%20//%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0434%u0436%u0435%u0442%u043F%u0430%u043A%20%27FindBar%20Tweak%27%20....%20%0A%20%20%20AddonManager.getAddonsByTypes%28%5B%22extension%22%5D%2C%20addons%3D%3E%20%7B%0A%20%20%20%20%20%20addons.forEach%28addon%3D%3E%20%7B%20if%20%28addon.name%20%3D%3D%20%27FindBar%20Tweak%27%29%20addon.userDisabled%20%3D%20cbu.getPrefs%28s%29%20%7D%29%3B%0A%20%20%20%7D%29%3B%0A%7D%3B%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%29%3B%20%0A%0A%0A//%20%u0410%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u0432%u044B%u0434%u0435%u043B%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20..........%0Afunction%20autoHighlight%28%29%20%7B%0A%20%20var%20finder%20%3D%20gBrowser.finder%20%7C%7C%20gFindBar%3B%0A%20%20var%20lighted%20%3D%20%28finder._highlightDoc%20%7C%7C%20finder._highlight%29.bind%28finder%29%3B%0A%20%20lighted%28false%29%3B%20%20%20%0A%0A%20%20if%20%28%20cbu.getPrefs%28s%29%20%29%20%7B%20%20%20%0A%20%20%20%20%20%20%20var%20array%20%3D%20getArray%28%29%3B%0A%20%20%20%20%20%20%20while%28array.length%20%3E%200%29%20lighted%28true%2C%20array.shift%28%29%29%3B%0A%20%20%20%20%20%20%20%7D%20%0A%7D%3B%0A%0A%0A//%20%u041E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%20%u0441%u043B%u0435%u0434%u0438%u0442%20%u0437%u0430%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u043E%u0439%20%u0438%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0435%u043C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0438%20%u0437%u0430%u043F%u0443%u0441%u043A%u0430%u044E%u0442%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%20..........%0Avar%20listener%20%3D%20%7B%20%0A%20%20%20onStateChange%3A%20function%28wpr%2C%20req%2C%20flag%29%20%7B%0A%20%20%20%20%20%20if%20%28%20gBrowser.currentURI.spec.startsWith%28%22http%22%29%20%26%26%20flag%20%26%20Ci.nsIWebProgressListener.STATE_STOP%20%29%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20autoHighlight%28%29%2C%200%29%3B%0A%20%20%20%7D%2C%0A%20%20%20%20%20%20%0A%20%20%20onLocationChange%3A%20function%28wpr%2C%20req%29%20%7B%0A%20%20%20%20%20%20if%20%28%20gBrowser.currentURI.spec.startsWith%28%22http%22%29%20%26%26%20%21req%20%26%26%20wpr.document.readyState%20%3D%3D%20%22complete%22%20%29%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20autoHighlight%28%29%2C%200%29%3B%0A%20%20%20%7D%20%20%20%20%20%20%20%0A%7D%3B%0AgBrowser.addProgressListener%28listener%29%3B%0AaddDestructor%28%28%29%3D%3E%20gBrowser.removeProgressListener%28listener%29%20%29%3B%0A%0A%20%0A//%20%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0438%u043B%u0438%20%u0443%u0434%u0430%u043B%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u044F%20%u0432%20%27about%3Aconfig%20..........%0Afunction%20toggleHighlightValue%28arg%29%20%7B%20%0A%20%20if%20%28%20arg%20%3D%3D%20%27clear%27%29%0A%20%20%20%20%20%20%20var%20str%20%3D%20%27%27%2C%20notification%20%3D%20%22%u0422%u0435%u043A%u0441%u0442%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u044F%20%u0443%u0434%u0430%u043B%u0451%u043D%22%3B%0A%20%20%0A%20%20if%20%28%20arg%20%3D%3D%20%27add%27%20%29%20%7B%20%20%0A%20%20%20%20%20%20%20var%20sel%20%3D%20getSelect%28%29%3B%20%0A%20%20%20%20%20%20%20var%20array%20%3D%20%28getArray%28%29%20%3D%3D%20%22%22%29%20%3F%20%22%22%20%3A%20getArray%28%29.join%28%22%7C%22%29%20+%20%22%7C%22%3B%20%20%20%20%20%0A%0A%20%20%20%20%20%20%20if%20%28%20sel%20%29%20%7B%20var%20str%20%3D%20array%20+%20sel%20%7D%0A%20%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20val%20%3D%20custombuttons.promptBox%28self.label%2C%20%27B%u0432%u0435%u0434%u0438%u0442%u0435%20%u0442%u0435%u043A%u0441%u0442%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u044F%3A%27%29%5B1%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20val%20%3D%3D%20%22%22%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20str%20%3D%20array%20+%20val%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20goDoCommand%28%22cmd_selectNone%22%29%3B%0A%20%20%20%20%20%20%20var%20notification%20%3D%20%22%u0414%u043E%u0431%u0430%u0432%u0438%u043B%20%u0442%u0435%u043A%u0441%u0442%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u044F%3A%20%5Cn%22%20+%20%28sel%20%3F%20sel%20%3A%20val.replace%28/%5C%7C/g%2C%22%5Cn%22%29%29%3B%0A%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%0A%20%20cbu.setPrefs%28s%2C%20%28arg%20%3D%3D%20%27add%27%29%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20cbu.setPrefs%28%22CB.autoHighlight.value%22%2C%20convertFromUnicode%28%22UTF-8%22%2C%20str%29%29%3B%0A%20%20%0A%20%20alertsService.showAlertNotification%28self.image%2C%20self.label%2C%20notification%29%3B%0A%20%20autoHighlight%28%29%3B%20%20%20%20%20%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0438%u0437%20%27about%3Aconfig%27%20%u043C%u0430%u0441%u0441%u0438%u0432%20%u0441%20%u0442%u0435%u043A%u0441%u0442%u0430%u043C%u0438%20%u0434%u043B%u044F%20%u0430%u0432%u0442%u043E%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u044F%20..........%0Afunction%20getArray%28%29%20%7B%20%0A%20%20%20try%20%7B%20return%20Services.prefs.getComplexValue%28%22CB.autoHighlight.value%22%2C%20Ci.nsISupportsString%29.data.split%28%22%7C%22%29%20%7D%20%0A%20%20%20catch%28e%29%20%7B%20return%20%5B%5D%20%7D%3B%0A%7D%3B%20%20%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%u043B%u0438%20false%20..........%0Afunction%20getSelect%28%29%20%7B%0A%20%20%20var%20el%20%3D%20document.commandDispatcher.focusedElement%3B%0A%20%20%20try%20%7B%20return%20el.value.substring%28el.selectionStart%2C%20el.selectionEnd%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20var%20sel%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29%3B%0A%20%20%20return%20%28sel%20%3D%3D%20%27%27%29%20%3F%20false%20%3A%20sel.toString%28%29.replace%28/%5E%5Cs+%7C%5Cs+%24/g%2C%22%22%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Вдруг, кому пригодится, "Проверить сертификат сайта":

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0440%u043E%u0432%u0435%u0440%u0438%u0442%u044C%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%20%u0434%u043B%u044F%20%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/svg+xml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiB%20lbmNvZGluZz0id2luZG93cy0xMjUyIj8+DQo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNTQ4LjI5cHgiIGhlaWdodD0iNTQ4LjI5MXB4IiB2aWV3Qm94PSIwIDAgNTQ4LjI5IDU0OC4yOTEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDU0OC4yOSA1NDguMjkxOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8Zz4NCgkJPGc+DQoJCQk8cGF0aCBkPSJNMzY4LjgyMyw0MTEuODc5Yy02LjQyNSwwLTEwLjA2OCwwLjUyNC0xMS45ODQsMC44NzJ2MzIuMjgzaDEwLjQyMWMxMy4xOTUsMCwyMS4wMDctNi41OTQsMjEuMDA3LTE2LjgzNCAgICAgQzM4OC4yNjcsNDE3LjQzOSwzODAuOTcsNDEyLjA1MywzNjguODIzLDQxMS44Nzl6Ii8+DQoJCQk8cGF0aCBkPSJNNDcyLjkyOSwxMzEuMzk5Yy0wLjAzMS0yLjUxOC0wLjgyOC01LTIuNTU2LTYuOTY0TDM2NC42NSwzLjY3N2MtMC4wMjEtMC4wMzEtMC4wNTItMC4wNDItMC4wODktMC4wNzMgICAgIGMtMC42MjUtMC43MDctMS4zNTUtMS4yODctMi4xMjctMS43OTVjLTAuMjMtMC4xNTItMC40NjItMC4yODYtMC43MDMtMC40MjFjLTAuNjgzLTAuMzY2LTEuMzg3LTAuNjY2LTIuMTI3LTAuODg3ICAgICBjLTAuMTk5LTAuMDYtMC4zNzEtMC4xMzktMC41NzEtMC4xOTRDMzU4LjIzLDAuMTE4LDM1Ny40LDAsMzU2LjU2NiwwSDk2Ljc1N0M4NC45MDQsMCw3NS4yNTUsOS42NTEsNzUuMjU1LDIxLjUwMlY1MjYuNzkgICAgIGMwLDExLjg1OCw5LjY0OSwyMS41MDEsMjEuNTAyLDIxLjUwMWgzNTQuNzc2YzExLjg2MiwwLDIxLjUwMi05LjY0MywyMS41MDItMjEuNTAxVjEzMi42MDMgICAgIEM0NzMuMDM1LDEzMi4xOTksNDcyLjk3MywxMzEuNzk1LDQ3Mi45MjksMTMxLjM5OXogTTE5NC41NzIsNDg5Ljk5MmM3Ljk4OSwwLDE2Ljg0Mi0xLjczNywyMi4wNS0zLjgyMmwzLjk5LDIwLjY2MSAgICAgYy00Ljg2MSwyLjQzMS0xNS43OTgsNS4wNC0zMC4wMjcsNS4wNGMtNDAuNDM5LDAtNjEuMjc5LTI1LjE3MS02MS4yNzktNTguNWMwLTM5LjkyNiwyOC40NzMtNjIuMTQ3LDYzLjg4Ni02Mi4xNDcgICAgIGMxMy43MTEsMCwyNC4xMjQsMi43ODcsMjguODA2LDUuMjA3bC01LjM3NSwyMS4wMDljLTUuMzg2LTIuMjYyLTEyLjg1NC00LjM0Mi0yMi4yMTUtNC4zNDIgICAgIGMtMjEuMDA5LDAtMzcuMzIxLDEyLjY2OC0zNy4zMjEsMzguNzFDMTU3LjA4LDQ3NS4yNDEsMTcwLjk1OCw0ODkuOTkyLDE5NC41NzIsNDg5Ljk5MnogTTMxMi41OTIsNTEwLjEzM2gtNzQuNjM5VjM5My4xNGg3Mi4yMTQgICAgIHYyMS43aC00NS42NnYyNC4yOTloNDMuMDU2djIxLjUxOWgtNDMuMDU2djI3Ljc3M2g0OC4wODVWNTEwLjEzM3ogTTM5MS45MSw1MTAuMTMzYy0xLjkxMS0zLjMwMy00LjY4My0xMi44NDctOC4xNTctMjcuMjU1ICAgICBjLTMuMTI5LTE0LjU3OC04LjE2Mi0xOC41NzgtMTguOTI0LTE4Ljc0NmgtNy45OXY0Ni4wMDZoLTI2LjIwNVYzOTQuNzA0YzguNTA0LTEuMzk2LDIxLjE3Mi0yLjQzNywzNS4yMzktMi40MzcgICAgIGMxNy4zNTUsMCwyOS40OTYsMi42MDQsMzcuODM4LDkuMTk4YzYuOTQ5LDUuNTYzLDEwLjc2MiwxMy43MTcsMTAuNzYyLDI0LjQ4MWMwLDE0LjkyLTEwLjU4OCwyNS4xNjctMjAuNjUxLDI4Ljh2MC41NCAgICAgYzguMTU3LDMuMjkzLDEyLjY2NiwxMS4xMDMsMTUuNjE3LDIxLjg2NGMzLjY0NywxMy4xODcsNy4yOCwyOC40NjIsOS41MzcsMzIuOTg3SDM5MS45MVY1MTAuMTMzeiBNOTYuNzU3LDM2NS4wODVWMjEuNTA3SDM0NS44MiAgICAgdjExMC4wMTVjMCw1LjkzNSw0LjgwOSwxMC43NSwxMC43NTEsMTAuNzVoOTQuOTYybDAuMDEsMjIyLjgxM0g5Ni43NTd6Ii8+DQoJCTwvZz4NCgkJPHBhdGggZD0iTTM1OS4wODUsMTUxLjA0NGMwLTYuNDA3LTMuMzU5LTExLjk5OC04LjM5My0xNS4yMDhjMi45NjUtNC44NTQsMy42MTctMTEuMDA4LDEuMTcxLTE2LjYxNWwtMy4wMDgtNi44OTcgICAgYy0xLjktNC4zNjUtNS4zNDUtNy41NTctOS40MDgtOS4zMTVjLTAuMTg5LTQuMzM4LTEuODkxLTguNjI3LTUuMjA3LTExLjk0NGwtNS4zMjMtNS4zMjFjLTQuMjcyLTQuMjczLTEwLjE2Mi01LjkxOC0xNS43MDYtNS4wMSAgICBjLTEuMTIyLTUuODktNS4xMDMtMTEuMTA2LTExLjA5Mi0xMy40NmwtNy4wMDktMi43NjRjLTQuOTQ0LTEuOTI5LTEwLjE4My0xLjQ4OC0xNC42MDMsMC42OTYgICAgYy0zLjEzNy0yLjY1MS03LjEyNi00LjMwNy0xMS41NTgtNC4zMDdoLTcuNTM1Yy01LjU2MiwwLTEwLjQ3NSwyLjU3NS0xMy43OTIsNi41MzNjLTQuOTY2LTMuNDEtMTEuNDk5LTQuMzAyLTE3LjQxNS0xLjcxMSAgICBsLTYuODk3LDIuOTk1Yy01LjIyMSwyLjI4NC04LjczNiw2Ljc0Ni0xMC4xMzQsMTEuODQzYy00LjI3MywwLjI0Mi04LjQ3LDEuOTMtMTEuNzI4LDUuMTg3bC01LjMyMiw1LjMyMSAgICBjLTMuNzA0LDMuNzAxLTUuNDA3LDguNjA2LTUuMjMxLDEzLjQ1NmMtNS41NTEsMS4zMTUtMTAuMzk0LDUuMjI0LTEyLjY0MSwxMC45NDhsLTIuNzYzLDdjLTIuMDkzLDUuMzQ0LTEuNCwxMS4wNDIsMS4yNjcsMTUuNjQ4ICAgIGMtMy4zNzEsMy4yNjgtNS40ODgsNy44NDgtNS40ODgsMTIuOTI3djcuNTJjMCw1LjMyMywyLjMzMywxMC4wNTMsNS45OTUsMTMuMzQ3Yy0yLjM5NCw0LjY2Mi0yLjgzNSwxMC4yODktMC41NjQsMTUuNDY1ICAgIGwzLjAwNSw2Ljg5N2MyLjE4MSw1LjAzMiw2LjQxMiw4LjQ3OCwxMS4yNzYsOS45NjdjLTAuNDQxLDUuMTIzLDEuMjIsMTAuMzg1LDUuMTQ1LDE0LjI5OWw1LjMyMiw1LjMyICAgIGM0LjAzMiw0LjA0Nyw5LjUxNSw1LjY5NCwxNC43OTMsNS4wOThjMS43NSw0LjU2OSw1LjI4OSw4LjQyOCwxMC4yMDIsMTAuMzYybDEuMDkyLDAuNDM3TDE3OC41LDMyMmwzNy4zMjEtMjAuNDYzICAgIGMwLDAsOS42MzgsNjAuNzk5LDkuNjM4LDU4Ljk5OWMwLTEuNDU0LDIyLjMwNy04MS42MTMsMzAuOTUzLTExMi41NjFjMS41ODUsMC40NzMsMy4yNjMsMC43NDYsNS4wMDgsMC43NDZoMy4xMzlsMzYuNzQ2LDk3Ljk3MiAgICB2LTUxLjE3bDM1LjUxNywyNC4wNzhsLTMyLjE2My04MS40NTJsMC42LTAuMjU3YzQuMTczLTEuODMsNy4yNTQtNS4wNzYsOS4wNjUtOC44OThjNS4yMDcsMC41MzksMTAuNjE0LTEuMTEzLDE0LjYwNC01LjExOSAgICBsNS4zMjMtNS4zMmM0LjU4OC00LjU4NSw2LjE0Mi0xMS4wMTMsNC43NTUtMTYuOWM0Ljk4OC0xLjYwNiw5LjI1LTUuMjYyLDExLjMwOC0xMC41MDlsMi43NjItNy4wMDQgICAgYzEuNjE2LTQuMTMzLDEuNTMzLTguNDcxLDAuMjIxLTEyLjM2OWMzLjUzOC0zLjI5OSw1Ljc5NS03Ljk3MSw1Ljc5NS0xMy4yMDN2LTcuNTI1SDM1OS4wODV6IE0yNjUuMTg5LDIxOS4wNzEgICAgYy0zNS41LDAtNjQuMjYzLTI4Ljc3NC02NC4yNjMtNjQuMjU3YzAtMzUuNDk1LDI4Ljc2OS02NC4yNTgsNjQuMjYzLTY0LjI1OGMzNS40ODUsMCw2NC4yNTIsMjguNzY5LDY0LjI1Miw2NC4yNTggICAgQzMyOS40NDEsMTkwLjI5NywzMDAuNjc1LDIxOS4wNzEsMjY1LjE4OSwyMTkuMDcxeiIvPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0412%u044B%u043F%u043E%u043B%u043D%u044F%u0442%u044C%20%u043F%u043E%20%u041F%u041A%u041C%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20HTTPS%20Everywhere%0Avar%20HEBtn%20%3D%20document.getElementById%28%27https-everywhere-button%27%29%3B%0Aif%20%28%21HEBtn%29%20return%3B%0AHEBtn.oncontextmenu%20%3De%3D%3E%20this.click%28%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bconst%20soundService%20%3D%20Cc%5B%22@mozilla.org/sound%3B1%22%5D.createInstance%28Ci.nsISound%29%3B%0Aconst%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%3B%0Aconst%20directoryService%20%3D%20Cc%5B%22@mozilla.org/file/directory_service%3B1%22%5D.getService%28Ci.nsIProperties%29%3B%0Aconst%20foStream%20%3D%20Cc%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.createInstance%28Ci.nsIFileOutputStream%29%3B%0Aconst%20fus%20%3D%20Cc%5B%22@mozilla.org/docshell/urifixup%3B1%22%5D.getService%28Ci.nsIURIFixup%29%3B%0Aconst%20sertViewer%20%3D%20Cc%5B%22@mozilla.org/nsCertificateDialogs%3B1%22%5D.getService%28Ci.nsICertificateDialogs%29%3B%0A%0Avar%20img%20%3D%20self.image%2C%20lbl%20%3D%20self.label%2C%20hlp%20%3D%20self.Help%3B%0A%0Alet%20loc%20%3D%20window.gBrowser.selectedBrowser.contentWindow.location%3B%0A%0A//%20%u041E%u043F%u0446%u0438%u0438%3A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u0432%20%u043F%u0430%u043F%u043A%u0435%20%u043F%u0440%u043E%u0444%u0438%u043B%u044F%2C%20%u0432%20%u043F%u0430%u043F%u043A%u0435%20HTTPSEverywhereUserRules%2C%20xml-%u0444%u0430%u0439%u043B%20%u0441%20%u043F%u0440%u0430%u0432%u0438%u043B%u043E%u043C%20%u0434%u043B%u044F%20%u0430%u0434%u0434%u043E%u043D%u0430%20HTTPS%20Everywhere%0A//%20%u0428%u0430%u0431%u043B%u043E%u043D%20%u043F%u0440%u0430%u0432%u0438%u043B%20%u043D%u0430%u0445%u043E%u0434%u0438%u0442%u0441%u044F%20%u0432%u043E%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%22%u041F%u043E%u043C%u043E%u0449%u044C%22%0Avar%20HTTPSEverywhereRules%20%3D%20true%2C%0A//%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0434%u043B%u044F%20%u0440%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u044F%20%28%u0432%20%u0430%u0441%u0441%u043E%u0446%u0438%u0438%u0440%u043E%u0432%u0430%u043D%u043D%u043E%u0439%20%u0441%20xml-%u0444%u0430%u0439%u043B%u0430%u043C%u0438%20%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u0435%29%20%u0441%u043E%u0437%u0434%u0430%u043D%u043D%u043E%u0435%20%u043F%u0440%u0430%u0432%u0438%u043B%u043E%0A%20%20%20%20HTTPSEverywhereRulesEdit%20%3D%20true%2C%0A//%20%u041F%u0435%u0440%u0435%u043D%u0430%u043F%u0440%u0430%u0432%u0438%u0442%u044C%20%u043D%u0430%20https%20%u0432%u0435%u0440%u0441%u0438%u044E%20%u0441%u0430%u0439%u0442%u0430%2C%20%u043F%u0440%u0438%20%u043D%u0430%u043B%u0438%u0447%u0438%u0438%20%u0443%20%u043D%u0435%u0433%u043E%20%u0432%u0430%u043B%u0438%u0434%u043D%u043E%u0433%u043E%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%0A%20%20%20%20redirect%20%3D%20true%2C%0A//%20%u041E%u0442%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u0434%u0438%u0430%u043B%u043E%u0433%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%0A%20%20%20%20showSert%20%3D%20false%2C%0A//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0435%u0435%20%u0443%u0432%u0435%u0434%u043E%u043C%u043B%u0435%u043D%u0438%u0435%20%u0441%u043E%20%u0441%u0442%u0430%u0442%u0443%u0441%u043E%u043C%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%0A//%20%u041A%u043B%u0438%u043A%20%u043F%u043E%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u0448%u043A%u0435%20-%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u0434%u0438%u0430%u043B%u043E%u0433%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%20%28%u043F%u0440%u0438%20%u043D%u0430%u043B%u0438%u0447%u0438%u0438%20%u043E%u043D%u043E%u0433%u043E%20%u0443%20%u0441%u0430%u0439%u0442%u0430%29%0A%20%20%20%20alert%20%3D%20true%2C%0A//%20%u0417%u0432%u0443%u043A%u043E%u0432%u043E%u0435%20%u0443%u0432%u0435%u0434%u043E%u043C%u043B%u0435%u043D%u0438%u0435%20%u043F%u0440%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0438%20%u0434%u0438%u0430%u043B%u043E%u0433%u0430%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%0A%20%20%20%20alertSound%20%3D%20true%3B%0A%0A%0A//%20chrome%3A//pippki/content/exceptionDialog.js%0Afunction%20badCertListener%28%29%20%7B%7D%0AbadCertListener.prototype%20%3D%20%7B%0A%20%20getInterface%3A%20function%20%28aIID%29%20%7B%0A%20%20%20%20return%20this.QueryInterface%28aIID%29%3B%0A%20%20%7D%2C%0A%20%20QueryInterface%3A%20function%28aIID%29%20%7B%0A%20%20%20%20if%20%28aIID.equals%28Ci.nsIBadCertListener2%29%20%7C%7C%0A%20%20%20%20%20%20%20%20aIID.equals%28Ci.nsIInterfaceRequestor%29%20%7C%7C%0A%20%20%20%20%20%20%20%20aIID.equals%28Ci.nsISupports%29%29%20%7B%0A%20%20%20%20%20%20return%20this%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20throw%20new%20Error%28Components.results.NS_ERROR_NO_INTERFACE%29%3B%0A%20%20%7D%2C%0A%20%20handle_test_result%3A%20function%20%28%29%20%7B%0A%20%20%20%20if%20%28gSSLStatus%29%20%7B%0A%20%20%20%20%20%20gCert%20%3D%20gSSLStatus.QueryInterface%28Ci.nsISSLStatus%29.serverCert%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%20%20notifyCertProblem%3A%20function%20MSR_notifyCertProblem%28socketInfo%2C%20sslStatus%2C%20targetHost%29%20%7B%0A%20%20%20%20gBroken%20%3D%20true%3B%0A%20%20%20%20gSSLStatus%20%3D%20sslStatus%3B%0A%20%20%20%20this.handle_test_result%28%29%3B%0A%20%20%20%20return%20true%3B%20//%20suppress%20error%20UI%0A%20%20%7D%0A%7D%0A%0A//%20chrome%3A//pippki/content/exceptionDialog.js%0Afunction%20getURI%28%29%20%7B%0A%20%20let%20uri%20%3D%20fus.createFixupURI%28loc.href%2C%200%29%3B%0A%0A%20%20if%20%28%21uri%29%20%7B%0A%20%20%20%20return%20null%3B%0A%20%20%7D%0A%0A%20%20if%20%28uri.scheme%20%3D%3D%20%22http%22%29%20%7B%0A%20%20%20%20uri.scheme%20%3D%20%22https%22%3B%0A%20%20%7D%0A%0A%20%20if%20%28uri.port%20%3D%3D%20-1%29%20%7B%0A%20%20%20%20uri.port%20%3D%20443%3B%0A%20%20%7D%0A%0A%20%20return%20uri%3B%0A%7D%0A%0A//%20chrome%3A//pippki/content/exceptionDialog.js%0Afunction%20getCert%28%29%20%7B%0A%20%20gCert%20%3D%20null%3B%0A%20%20gSSLStatus%20%3D%20null%3B%0A%20%20gChecking%20%3D%20true%3B%0A%20%20gBroken%20%3D%20false%3B%0A%0A%20%20var%20uri%20%3D%20getURI%28%29%3B%0A%20%20var%20req%20%3D%20new%20XMLHttpRequest%28%29%3B%0A%0A%20%20try%20%7B%0A%20%20%20%20if%20%28uri%29%20%7B%0A%20%20%20%20%20%20req.open%28%27GET%27%2C%20uri.prePath%2C%20false%29%3B%0A%20%20%20%20%20%20req.channel.notificationCallbacks%20%3D%20new%20badCertListener%28%29%3B%0A%20%20%20%20%20%20req.send%28null%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%20catch%20%28e%29%20%7B%0A%20%20%20%20Cu.reportError%28%22Attempted%20to%20connect%20to%20a%20site%20with%20a%20bad%20certificate%20in%20the%20add%20exception%20dialog.%20%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22This%20results%20in%20a%20%28mostly%20harmless%29%20exception%20being%20thrown.%20%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Logged%20for%20information%20purposes%20only%3A%20%22%20+%20e%29%3B%0A%20%20%7D%20finally%20%7B%0A%20%20%20%20gChecking%20%3D%20false%3B%0A%20%20%7D%0A%0A%20%20if%20%28req.channel%20%26%26%20req.channel.securityInfo%29%20%7B%0A%20%20%20%20gSSLStatus%20%3D%20req.channel.securityInfo%0A%20%20%20%20%20%20.QueryInterface%28Ci.nsISSLStatusProvider%29.SSLStatus%3B%0A%20%20%20%20gCert%20%3D%20gSSLStatus.QueryInterface%28Ci.nsISSLStatus%29.serverCert%3B%0A%20%20%7D%0A%7D%0A%0Afunction%20createRule%28%29%20%7B%0A%20%20//%20http%3A//stackoverflow.com/questions/6449340/how-to-get-top-level-domain-base-domain-from-the-url-in-javascript%0A%20%20let%20domain%20%3D%20loc.host.match%28/%5B-%5Cw%5D+%5C.%28%3F%3A%5B-%5Cw%5D+%5C.xn--%5B-%5Cw%5D+%7C%5B-%5Cw%5D%7B3%2C%7D%7C%5B-%5Cw%5D+%5C.%5B-%5Cw%5D%7B2%7D%29%24/i%29%5B0%5D%3B%0A%0A%20%20var%20rule%20%3D%20convertFromUnicode%28%22UTF-8%22%2C%20hlp.replace%28/%5C%5Bdomain%5C%5D/g%2C%20domain%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace%28/%5C%5Bdomainesc%5C%5D/g%2C%20domain.replace%28/%5C./g%2C%20%27%5C%5C.%27%29%29%29%3B%20%0A%0A%20%20var%20file%20%3D%20directoryService.get%28%22ProfD%22%2C%20Ci.nsIFile%29%3B%0A%20%20file.append%28%22HTTPSEverywhereUserRules%22%29%3B%0A%20%20file.append%28domain%20+%20%27.xml%27%29%3B%0A%20%20foStream.init%28file%2C%200x02%7C0x08%7C0x20%2C%200666%2C%200%29%3B%0A%20%20foStream.write%28rule%2C%20rule.length%29%3B%0A%20%20foStream.close%28%29%3B%0A%20%20HTTPSEverywhereRulesEdit%20%26%26%20file.launch%28%29%3B%0A%7D%0A%0Afunction%20viewCert%28%29%20%7B%0A%20%20getCert%28%29%3B%0A%0A%20%20if%20%28%21gCert%20%7C%7C%20%21gSSLStatus%29%20%7B%0A%20%20%20%20alert%20%26%26%20alertsService.showAlertNotification%28img%2C%20lbl%20+%20loc.host%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%u0421%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%20%u043D%u0435%20%u043C%u043E%u0436%u0435%u0442%20%u0431%u044B%u0442%u044C%20%u043F%u043E%u043B%u0443%u0447%u0435%u043D%21%27%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%0A%20%20if%20%28showSert%29%20%7B%0A%20%20%20%20sertViewer.viewCert%28window%2C%20gCert%29%3B%0A%20%20%20%20alertSound%20%26%26%20soundService.playEventSound%28%27EVENT_ALERT_DIALOG_OPEN%27%29%3B%0A%20%20%7D%0A%0A%20%20var%20sertListener%20%3D%20%7B%0A%20%20%20%20observe%3A%20function%28aSubject%2C%20aTopic%2C%20aData%29%20%7B%0A%20%20%20%20%20%20if%20%28aTopic%20%21%3D%20%27alertclickcallback%27%29%20return%3B%0A%20%20%20%20%20%20sertViewer.viewCert%28window%2C%20gCert%29%3B%0A%20%20%20%20%20%20alertSound%20%26%26%20soundService.playEventSound%28%27EVENT_ALERT_DIALOG_OPEN%27%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20if%20%28gSSLStatus.isUntrusted%0A%20%20%20%20%20%20%7C%7C%20gSSLStatus.isDomainMismatch%0A%20%20%20%20%20%20%7C%7C%20gSSLStatus.isNotValidAtThisTime%29%0A%20%20%20%20alert%20%26%26%20alertsService.showAlertNotification%28img%2C%20lbl%20+%20loc.host%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%u0421%u0430%u0439%u0442%20%u0438%u0441%u043F%u043E%u043B%u044C%u0437%u0443%u0435%u0442%20%u043D%u0435%u0432%u0430%u043B%u0438%u0434%u043D%u044B%u0439%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%21%5Cn%u041D%u0430%u0436%u043C%u0438%u0442%u0435%20%u0434%u043B%u044F%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20true%2C%20null%2C%20sertListener%2C%20%22%22%29%3B%0A%20%20else%20%7B%0A%20%20%20%20if%20%28loc.protocol%20%21%3D%20%27https%3A%27%29%20%7B%0A%20%20%20%20%20%20redirect%20%26%26%20%28loc.protocol%20%3D%20%27https%27%29%3B%0A%20%20%20%20%20%20HTTPSEverywhereRules%20%26%26%20createRule%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20alert%20%26%26%20alertsService.showAlertNotification%28img%2C%20lbl%20+%20loc.host%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%u0421%u0430%u0439%u0442%20%u0438%u0441%u043F%u043E%u043B%u044C%u0437%u0443%u0435%u0442%20%u0432%u0430%u043B%u0438%u0434%u043D%u044B%u0439%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%21%5Cn%u041D%u0430%u0436%u043C%u0438%u0442%u0435%20%u0434%u043B%u044F%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20true%2C%20null%2C%20sertListener%2C%20%22%22%29%3B%0A%20%20%7D%0A%7D%0AviewCert%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%3Cruleset%20name%3D%22%28USER%20RULE%29%20%5Bdomain%5D%22%3E%0A%3Ctarget%20host%3D%22%5Bdomain%5D%22/%3E%0A%3Ctarget%20host%3D%22*.%5Bdomain%5D%22/%3E%0A%3Csecurecookie%20host%3D%22%5E%28%3F%3A.*%5C.%29%3F%5Bdomainesc%5D%24%22%20name%3D%22.+%22/%3E%0A%3Crule%20from%3D%22%5Ehttp%3A//%22%20to%3D%22https%3A//%22/%3E%0A%3C/ruleset%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

UPD: Исправил кое-что.

(если у кого svg-иконка кнопки корежит интерфейс, то вот png 16x16:

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAnNCSVQICFXsRgQAAAAJcEhZcwAAAGcAAABnAdUo1CYAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAA7UlEQVQoU3XQvyvEcRgH8FchJqNBLAyOSQyKxXyDsp1N/gN1wxUmRtvtXMqPLGy6MpBiEZcbDLdd1F0WkwH1GO7ie+eud32e5/n06vOpRwh2FVpSMRIaaRyF5tBv3FBQ82TwHzCh4k5dVk0o6m0H15aDAQ/qQsi3gxc9IdiQlZJy3A4upYM+t6YTt4l2SllR1WboCIJTB76NdgEWfRhzJdcNDFsPFn43kADnMjIy1pq1kfM/UBLKttzIybmXcyaUkuDTvGdVs4qO7Jj01QpepYV3KXkn5iwJj61fbFtxYcaqfYfWvCVf2BMdshfCD+SMw3jJ6NpdAAAAAElFTkSuQmCC

)

Клик по кнопке (или ПКМ по кнопке аддона HTTPS Everywhere (при наличии оного) - проверяет сертификат текущего сайта и (в зависимости от опций (в коде откомментированно, где что и за что отвечает)):
Открывает окно просмотра сертификата
Выводит всплывающее уведомление со статусом сертификата (клик по которому также открывает диалого просмотра сертификата)
Перенаправляет на https версию сайта (при наличии валидного сертификата) и создает (и открывает для редактирования) правило для аддона HTTPS Everywhere (шаблон во вкладке "справка").

А неплохо вышло.  Это я про результат, а не качество кода. :blush:

Прикрутить еще листенер на смену локации и может выйти какая-никакая, а замена почившему HTTPS-Finder'у.

Может, bunda1, возьметесь привести в божеский вид и допилить? :rolleyes:

bunda1
C прошлой бывали непонятки, а вот новая редакция кнопки (№1465) работает просто безупречно!

Спасибо! :)

turbot пишет

Может, bunda1, возьметесь привести в божеский вид и допилить? :rolleyes:

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

bunda1
Я и не настаиваю. :) Мож, и осилю сам что-то наваять, что не стыдно будет в готовые выложить. :)

turbot, огромное спасибо за кнопку сертификата.

Я правильно понимаю, что всплывающее сообщение о том, что сертификат валиден - это просто дублирование информации с цветных замочков перед адресной строкой? Было бы интересней, если бы по нажатию на кнопку (опционально) сертификат проверялся бы в OCSP. Это будет полезно для тех, кто отключил эту опцию в настройках Firefox, но при этом хотел бы иметь возможность выборочной проверки.

Также во всплывающем сообщении очень уместно смотрелись бы страны выпуска всей цепочки сертификатов типа US-US-RU. Это позволило бы на глаз определять любителей государственного или корпоративного MITM (к примеру, цепочка CN-CN-US для google.com сходу указывала бы, что, во-первых, вы в Китае, а во-вторых большой брат слишком сильно заботится о вас, и незаконно использует свой CA, на который пора писать абузу).

firefan
Нет. Замочек гораздо информативнее. Допустим, при наличии активного смешанного контента. Кнопка на такие нюансы внимания не обращает. Проверяется только статус сертификата сервера и его наличие. Вообще, изначально она предназначена просто просмотреть текущий сертификат. Остальное - побочные эффекты. Которые, внезапно, весьма полезными оказались. Как возможность обнаружить наличие https-версии и просмотреть статус/сертификат у сайта, даже на его http-версии.

firefan пишет

Также во всплывающем сообщении очень уместно смотрелись бы

Не спорю. Но я не осилю. Это надо парсить полученные ответные данные. Даж не предположу, как к этому подступиться. Если только кто другой возьмется. idontnow.gif

turbot пишет

Это надо парсить полученные ответные данные. Даж не предположу, как к этому подступиться.

А что ты предполагаешь парсить? Если наличие и информацию из этой строки

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

Выделить код

Код:

data:image/png;base64,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1KnhFd59V0ybJlascEv23FNcfbVef790PnAAaGBEXSrR0m7NGjFzZqw6K1fqI7yXX3ZLWrfWf056yhRmwgOAUERdivnqK7H//jVX08Z2t9yix56jXTv98RYt8LQFAICEqEtnxcX6CO/dd90SbWB37bX6f7ShHgDAQNSlv2XL9OdTSkrckv3204d3V18tWrVKducAIPmIOiVUV+tfSLjlFvHRR25hly56BF5xhf70CgA0YUSdQnbv1n9jZeZM/evnju7d9ac6R4xIducAIGmIOuVogVdQoAfeunVuYVGROOusZPcMAJKDqFNUVZV45BFx883i88/1lwsXissuS3afACA5iDql/fSTeOopsW2bGD1aNG+e7N4AQHIQdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFEXUAAMURdQAAxRF1AADFKRV1LVvvuf8+HRrz9AEAUtxXm77/YfNWRaJuy5bt327Z3pinDwCQFjq1bdW2batabJhyUQcAQP0i6gAAiiPqAACKI+oAAIoj6gAAiiPqAACKI+oAAIoj6gAAiiPqAACKI+oAAIpL3ai77777NmzYsGPHjmSfonTVsmXLbt26XX311cnuCAAkWYpG3e1z5rRq2XL48OH77rtvsk9Ruvrmm28WL168fceOG6ZMSXZfACCZUjTqbrhBuz5P6dix4/bt/PRzLbVq1eq7776bM2fO7bffnuy+AEAypWjUTZ48+Y477ti6dWuyz096a9OmzfXXX3/33XcnuyMAkEypG3XacISoqyMt6rTBMVEHoIlL6ajbsmVLss9Pemvbti1RBwApHXU//vhjss9PemvXrh1RBwDpE3UvTu407BFz8ehZq1+4sleyT10aIOoAQKRy1N1+++2bN292i1bMn99n3Dg94NbOP2vA0qHvPj+OtKtB+/btb7jhBqIOQBOX0lH3ww8/hK9eM3/QMWXXfXPXack+fSlur732IuoAIKWjLrpPaxYMPrbsuq/vPPWl6/a7s//bRWN7awsXPnrpk1qRuXb6O3o9o8BY5W57dK5eX64lrO2E0dqT5z5zoV5u1BNuJavi4CJrj2YDItfau2/D3nY3g7uwO2PXc4v0Sr1i7DFRHTp0IOoAIHWjbtasWV988YW3+NXpfS5/wn5x0UOf5p6klczr+/Id4vpTKsZrL7XiykcuOGXZkJefGtVD2kqrYxY4y3pT4iFjE3cLo/0jZ+iLnmYiWrhg3ierRfSGUbtwOrDiNLPLsfrpW05M586dp02bRtQBaOLSK+ocenQY2abHwCdHWoHjWeNWDosN4almx44nVKQsCmmh54Pa2ofE5U5uBTbsFbULK60vekhaZ5WZaRncoxPw7kbxIOoAQKR41G3cuDFi/Wsz+s3rs6JwVA9tYcwnRxzx/kHjy2eeqK+pfGTYaZ/aL3yVpWXhqaaVrjhNeyHXlBsKtLBwcNGKXoUzhdSNwIY9Y+9CqzZFzJF7Ypf0iOhzD09pPLp27UrUAUBKR92GDRvcotcLCnqMHGlkScHw02/tv7Bs5gla6Yz+8/q+uLjXQuO/9NX62qLB5rK15QxnpbusLYwRZhv6FhXj9UW9sOwmo6pbGGxhzGJxxE1WI25rgQ2jdmFuYhcJucDpeGif7aWTXrVac5r19NbVrVs3og4AUjfqbr311vXr17tFlY9edOas943FI6Ytf+JSM8le/+PBD/TRXxmrhblCK8xZbKwenv/xLSc4deT6coNOe/paMVwsXvy+va3w7sVczimzNnDKIzYM34XVN7ueXemI4cNFWZ/bAv2UNzG30bf49MrQBe9p7N69+0033UTUAWjiUjrqKisrG/dsvHFz5vw+zz9+yYGNtmHD6tGjB1EHAOpHXWZmZrCwtLQ0rC5RBwAKSt2oy83NXbduXeOejTduyVrQu+ixWkRdbTdsWD179pw+fTpRB6CJS+moW7NmTbLPT3rr3bs3UQcAqRt1M2fOJOrqSIu6GTNmEHUAmrgUjbobbrjhmmuuadOmjechTCSie/fuW7duvffee2+//fZk9wUAkilFo27OnDl77LHHBRdc0KFDh2SfonSlvaNPPfXUzp07p0yZkuy+AEAypWjUaWbPnr1p0ybtSp3sU5SutH8r7LPPPlOnTk12RwAgyVI36gAAqBdEHQBAcUQdAEBxRB0AQHFEHQBAcUQdAEBxRB0AQHFEHQBAcUQdAEBxRB0AQHFEHQBAcUQdAEBxRB0AQHFEHQBAcUQdAEBxRB0AQHFEHQBAcUQdAEBxDRJ1yT4oAAA86jnqOnTokOwjAgAgRL1FHQAA6YioAwAojqgDACiOqAMAKI6oAwAojqgDACiOqAMAKI6oAwA1LV29oejDzz//bluyO1JvunRsPfiwLkOP7JbohkQdACjo7++uL/j425bHHtasfZtk96Xe7N68dcfbH448uNNvBnRPaEOiDgAUdPnDb28+4bi+nVrdtt+OZPel3vz+65YV325v//pbD112bEIbEnUAoKBf3/1auwsHF3ZV5+6ladjG1j8+WfTc5BMT2oqoAwAFmVG3uMvWZHekng3/vA1RBwDQmVH3ZOctye5IPbvwi7ZEHQBAp0Vd2+GDlIy6LYuLiToAQEJRt/aBM46c9o65PKrw27tPT3bnYyDqAAAWM+r++rPNNVddO//a5WfeNa6Xtrji2n2Gl9767vPGi5R08X/bE3UAAJ0WdW2Gn/XX/eOIOtmKa/e9s/+/isf1Tnb/o1z8Vfuti58n6gAARtQNO+vx/X9IaKuXrtvvzv5vF43tbS5f+KhReumTX995qrTSWKMXCr3kyXOfuXD6O0IcnWtuKLcht3qfuPrY6e84hdr2g4v8NWs24qu9thYSdQAAI+r2/M1pD7b7Mq7alY9ccMrM1UIcOePlp0b18K57dXqfeX31YnPhDnH9KRXjP809yVx1+RPmNnoLy4a41eRm5JKo5Xhd8eMBP/19BVEHAEgw6mxG5B30kBRkRrGZZnoyfXLkajHESSdPVmkvVpymbeluprnoIbMkKuqcmhdZO60JUQcAsGhRt8d5p+a3/SLB7V6b0W9enxWFo8Qjw077dHz5zBO1+Bs2RcwpHNVDWzXmkyOOeP8go1iurOdWpb2BVGgt9lroVpM3cZfl0thytnTeueQlog4AYEXdgjaf11izsmDGqyfNHGmmzOsz+o8RC8tmnqAtzOv74uKRPSoLhp9eNFhfsop6LbTWmLXLbjKW9WoV47UNhbOlEMEt5LXSslwa29itXYg6AIBOi7oW550yv9XGmqu+/seDcxbbL4bnf3zLCfpC5aMXnTnrfSGOGD5clPW57YlLe2j1HuizXFswVolpy5/o+fDBD4jhYvHi96Ut5eaOmLZc3tBcKy87NZ391mDc9q5VS14m6gAARtQNPeX+lusbcidv3Jw5v8/zj19yYOMd11U7ulctJeoAAHWOuszMTF9JaWlpoBZRBwBIHi3qmp978rw9P2vInbxxS9aC3kWPNWbUjf/pwF3PvELUAQCsqLu3xbpkd6SeXVPVk6gDAOi0qGt2zklKRt3uZ18l6gAA4vKH3/766MO7t8m4vlkcD2GmiTt2d12/tXq/dz546LJjE9qQqAMABf393fUPf7Qp46hDROuWye5L/dm2o/q9/1x26D6/GdA9oe2IOgBQ01PvfFb04edfb96R7I7Um/3atxx8WJcLjk74MRiiDgCgOKIOAKA4og4AoDiiDgCgOKIOAKA4og4AoDiiDgCgOKIOAKA4og4AoDiiDgCgOKIOAKA4og4AoDiiDgCguJCoS3aXAACoZxN3//TxEd30qDv4/Q3J7gwAAA3CijoAABT2/3X00QbthkucAAAAAElFTkSuQmCC


то, вроде, парсить не сложно. Вот, попробуй понажимать
скрытый текст

Выделить код

Код:

try {
    var result = [], {SSLStatus} = gBrowser.securityUI.QueryInterface(Ci.nsISSLStatusProvider);
    var tree = Cc["@mozilla.org/security/nsASN1Tree;1"].createInstance(Ci.nsIASN1Tree);

    for(var cert = SSLStatus.serverCert; cert; cert = cert.issuer) {
        tree.loadASN1Structure(cert.ASN1Structure);
        for(var res, ind = 0; ind < tree.rowCount; ind++)
            if (tree.getCellText(ind, {}) == "Subject") {
                res = tree.getDisplayData(ind);
                break;
            }
        var array = res.split("\n");
        var country = array.find(str => str.startsWith("C = "));
        result.unshift((country ? country.slice(4) : "??") + array.map(str => "\t\t" + str).join("\n"));
    }
    alert(result.join("\n\n\n"));

} catch(ex) {}

Dumby

то, вроде, парсить не сложно.

Для меня - сложно. shuffle.gif Спасибо.

firefan

Также во всплывающем сообщении очень уместно смотрелись бы страны выпуска всей цепочки сертификатов типа US-US-RU

Готово:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0440%u043E%u0432%u0435%u0440%u0438%u0442%u044C%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%20%u0434%u043B%u044F%20%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/svg+xml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiB%20lbmNvZGluZz0id2luZG93cy0xMjUyIj8+DQo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNTQ4LjI5cHgiIGhlaWdodD0iNTQ4LjI5MXB4IiB2aWV3Qm94PSIwIDAgNTQ4LjI5IDU0OC4yOTEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDU0OC4yOSA1NDguMjkxOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8Zz4NCgkJPGc+DQoJCQk8cGF0aCBkPSJNMzY4LjgyMyw0MTEuODc5Yy02LjQyNSwwLTEwLjA2OCwwLjUyNC0xMS45ODQsMC44NzJ2MzIuMjgzaDEwLjQyMWMxMy4xOTUsMCwyMS4wMDctNi41OTQsMjEuMDA3LTE2LjgzNCAgICAgQzM4OC4yNjcsNDE3LjQzOSwzODAuOTcsNDEyLjA1MywzNjguODIzLDQxMS44Nzl6Ii8+DQoJCQk8cGF0aCBkPSJNNDcyLjkyOSwxMzEuMzk5Yy0wLjAzMS0yLjUxOC0wLjgyOC01LTIuNTU2LTYuOTY0TDM2NC42NSwzLjY3N2MtMC4wMjEtMC4wMzEtMC4wNTItMC4wNDItMC4wODktMC4wNzMgICAgIGMtMC42MjUtMC43MDctMS4zNTUtMS4yODctMi4xMjctMS43OTVjLTAuMjMtMC4xNTItMC40NjItMC4yODYtMC43MDMtMC40MjFjLTAuNjgzLTAuMzY2LTEuMzg3LTAuNjY2LTIuMTI3LTAuODg3ICAgICBjLTAuMTk5LTAuMDYtMC4zNzEtMC4xMzktMC41NzEtMC4xOTRDMzU4LjIzLDAuMTE4LDM1Ny40LDAsMzU2LjU2NiwwSDk2Ljc1N0M4NC45MDQsMCw3NS4yNTUsOS42NTEsNzUuMjU1LDIxLjUwMlY1MjYuNzkgICAgIGMwLDExLjg1OCw5LjY0OSwyMS41MDEsMjEuNTAyLDIxLjUwMWgzNTQuNzc2YzExLjg2MiwwLDIxLjUwMi05LjY0MywyMS41MDItMjEuNTAxVjEzMi42MDMgICAgIEM0NzMuMDM1LDEzMi4xOTksNDcyLjk3MywxMzEuNzk1LDQ3Mi45MjksMTMxLjM5OXogTTE5NC41NzIsNDg5Ljk5MmM3Ljk4OSwwLDE2Ljg0Mi0xLjczNywyMi4wNS0zLjgyMmwzLjk5LDIwLjY2MSAgICAgYy00Ljg2MSwyLjQzMS0xNS43OTgsNS4wNC0zMC4wMjcsNS4wNGMtNDAuNDM5LDAtNjEuMjc5LTI1LjE3MS02MS4yNzktNTguNWMwLTM5LjkyNiwyOC40NzMtNjIuMTQ3LDYzLjg4Ni02Mi4xNDcgICAgIGMxMy43MTEsMCwyNC4xMjQsMi43ODcsMjguODA2LDUuMjA3bC01LjM3NSwyMS4wMDljLTUuMzg2LTIuMjYyLTEyLjg1NC00LjM0Mi0yMi4yMTUtNC4zNDIgICAgIGMtMjEuMDA5LDAtMzcuMzIxLDEyLjY2OC0zNy4zMjEsMzguNzFDMTU3LjA4LDQ3NS4yNDEsMTcwLjk1OCw0ODkuOTkyLDE5NC41NzIsNDg5Ljk5MnogTTMxMi41OTIsNTEwLjEzM2gtNzQuNjM5VjM5My4xNGg3Mi4yMTQgICAgIHYyMS43aC00NS42NnYyNC4yOTloNDMuMDU2djIxLjUxOWgtNDMuMDU2djI3Ljc3M2g0OC4wODVWNTEwLjEzM3ogTTM5MS45MSw1MTAuMTMzYy0xLjkxMS0zLjMwMy00LjY4My0xMi44NDctOC4xNTctMjcuMjU1ICAgICBjLTMuMTI5LTE0LjU3OC04LjE2Mi0xOC41NzgtMTguOTI0LTE4Ljc0NmgtNy45OXY0Ni4wMDZoLTI2LjIwNVYzOTQuNzA0YzguNTA0LTEuMzk2LDIxLjE3Mi0yLjQzNywzNS4yMzktMi40MzcgICAgIGMxNy4zNTUsMCwyOS40OTYsMi42MDQsMzcuODM4LDkuMTk4YzYuOTQ5LDUuNTYzLDEwLjc2MiwxMy43MTcsMTAuNzYyLDI0LjQ4MWMwLDE0LjkyLTEwLjU4OCwyNS4xNjctMjAuNjUxLDI4Ljh2MC41NCAgICAgYzguMTU3LDMuMjkzLDEyLjY2NiwxMS4xMDMsMTUuNjE3LDIxLjg2NGMzLjY0NywxMy4xODcsNy4yOCwyOC40NjIsOS41MzcsMzIuOTg3SDM5MS45MVY1MTAuMTMzeiBNOTYuNzU3LDM2NS4wODVWMjEuNTA3SDM0NS44MiAgICAgdjExMC4wMTVjMCw1LjkzNSw0LjgwOSwxMC43NSwxMC43NTEsMTAuNzVoOTQuOTYybDAuMDEsMjIyLjgxM0g5Ni43NTd6Ii8+DQoJCTwvZz4NCgkJPHBhdGggZD0iTTM1OS4wODUsMTUxLjA0NGMwLTYuNDA3LTMuMzU5LTExLjk5OC04LjM5My0xNS4yMDhjMi45NjUtNC44NTQsMy42MTctMTEuMDA4LDEuMTcxLTE2LjYxNWwtMy4wMDgtNi44OTcgICAgYy0xLjktNC4zNjUtNS4zNDUtNy41NTctOS40MDgtOS4zMTVjLTAuMTg5LTQuMzM4LTEuODkxLTguNjI3LTUuMjA3LTExLjk0NGwtNS4zMjMtNS4zMjFjLTQuMjcyLTQuMjczLTEwLjE2Mi01LjkxOC0xNS43MDYtNS4wMSAgICBjLTEuMTIyLTUuODktNS4xMDMtMTEuMTA2LTExLjA5Mi0xMy40NmwtNy4wMDktMi43NjRjLTQuOTQ0LTEuOTI5LTEwLjE4My0xLjQ4OC0xNC42MDMsMC42OTYgICAgYy0zLjEzNy0yLjY1MS03LjEyNi00LjMwNy0xMS41NTgtNC4zMDdoLTcuNTM1Yy01LjU2MiwwLTEwLjQ3NSwyLjU3NS0xMy43OTIsNi41MzNjLTQuOTY2LTMuNDEtMTEuNDk5LTQuMzAyLTE3LjQxNS0xLjcxMSAgICBsLTYuODk3LDIuOTk1Yy01LjIyMSwyLjI4NC04LjczNiw2Ljc0Ni0xMC4xMzQsMTEuODQzYy00LjI3MywwLjI0Mi04LjQ3LDEuOTMtMTEuNzI4LDUuMTg3bC01LjMyMiw1LjMyMSAgICBjLTMuNzA0LDMuNzAxLTUuNDA3LDguNjA2LTUuMjMxLDEzLjQ1NmMtNS41NTEsMS4zMTUtMTAuMzk0LDUuMjI0LTEyLjY0MSwxMC45NDhsLTIuNzYzLDdjLTIuMDkzLDUuMzQ0LTEuNCwxMS4wNDIsMS4yNjcsMTUuNjQ4ICAgIGMtMy4zNzEsMy4yNjgtNS40ODgsNy44NDgtNS40ODgsMTIuOTI3djcuNTJjMCw1LjMyMywyLjMzMywxMC4wNTMsNS45OTUsMTMuMzQ3Yy0yLjM5NCw0LjY2Mi0yLjgzNSwxMC4yODktMC41NjQsMTUuNDY1ICAgIGwzLjAwNSw2Ljg5N2MyLjE4MSw1LjAzMiw2LjQxMiw4LjQ3OCwxMS4yNzYsOS45NjdjLTAuNDQxLDUuMTIzLDEuMjIsMTAuMzg1LDUuMTQ1LDE0LjI5OWw1LjMyMiw1LjMyICAgIGM0LjAzMiw0LjA0Nyw5LjUxNSw1LjY5NCwxNC43OTMsNS4wOThjMS43NSw0LjU2OSw1LjI4OSw4LjQyOCwxMC4yMDIsMTAuMzYybDEuMDkyLDAuNDM3TDE3OC41LDMyMmwzNy4zMjEtMjAuNDYzICAgIGMwLDAsOS42MzgsNjAuNzk5LDkuNjM4LDU4Ljk5OWMwLTEuNDU0LDIyLjMwNy04MS42MTMsMzAuOTUzLTExMi41NjFjMS41ODUsMC40NzMsMy4yNjMsMC43NDYsNS4wMDgsMC43NDZoMy4xMzlsMzYuNzQ2LDk3Ljk3MiAgICB2LTUxLjE3bDM1LjUxNywyNC4wNzhsLTMyLjE2My04MS40NTJsMC42LTAuMjU3YzQuMTczLTEuODMsNy4yNTQtNS4wNzYsOS4wNjUtOC44OThjNS4yMDcsMC41MzksMTAuNjE0LTEuMTEzLDE0LjYwNC01LjExOSAgICBsNS4zMjMtNS4zMmM0LjU4OC00LjU4NSw2LjE0Mi0xMS4wMTMsNC43NTUtMTYuOWM0Ljk4OC0xLjYwNiw5LjI1LTUuMjYyLDExLjMwOC0xMC41MDlsMi43NjItNy4wMDQgICAgYzEuNjE2LTQuMTMzLDEuNTMzLTguNDcxLDAuMjIxLTEyLjM2OWMzLjUzOC0zLjI5OSw1Ljc5NS03Ljk3MSw1Ljc5NS0xMy4yMDN2LTcuNTI1SDM1OS4wODV6IE0yNjUuMTg5LDIxOS4wNzEgICAgYy0zNS41LDAtNjQuMjYzLTI4Ljc3NC02NC4yNjMtNjQuMjU3YzAtMzUuNDk1LDI4Ljc2OS02NC4yNTgsNjQuMjYzLTY0LjI1OGMzNS40ODUsMCw2NC4yNTIsMjguNzY5LDY0LjI1Miw2NC4yNTggICAgQzMyOS40NDEsMTkwLjI5NywzMDAuNjc1LDIxOS4wNzEsMjY1LjE4OSwyMTkuMDcxeiIvPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0412%u044B%u043F%u043E%u043B%u043D%u044F%u0442%u044C%20%u043F%u043E%20%u041F%u041A%u041C%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20HTTPS%20Everywhere%0Avar%20HEBtn%20%3D%20document.getElementById%28%27https-everywhere-button%27%29%3B%0Aif%20%28%21HEBtn%29%20return%3B%0AHEBtn.oncontextmenu%20%3De%3D%3E%20this.click%28%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bconst%20soundService%20%3D%20Cc%5B%22@mozilla.org/sound%3B1%22%5D.createInstance%28Ci.nsISound%29%3B%0Aconst%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%3B%0Aconst%20directoryService%20%3D%20Cc%5B%22@mozilla.org/file/directory_service%3B1%22%5D.getService%28Ci.nsIProperties%29%3B%0Aconst%20foStream%20%3D%20Cc%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.createInstance%28Ci.nsIFileOutputStream%29%3B%0Aconst%20fus%20%3D%20Cc%5B%22@mozilla.org/docshell/urifixup%3B1%22%5D.getService%28Ci.nsIURIFixup%29%3B%0Aconst%20sertViewer%20%3D%20Cc%5B%22@mozilla.org/nsCertificateDialogs%3B1%22%5D.getService%28Ci.nsICertificateDialogs%29%3B%0A%0Avar%20img%20%3D%20self.image%2C%20lbl%20%3D%20self.label%2C%20hlp%20%3D%20self.Help%3B%0A%0Alet%20loc%20%3D%20window.gBrowser.selectedBrowser.contentWindow.location%3B%0A%0A//%20%u041E%u043F%u0446%u0438%u0438%3A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u0432%20%u043F%u0430%u043F%u043A%u0435%20%u043F%u0440%u043E%u0444%u0438%u043B%u044F%2C%20%u0432%20%u043F%u0430%u043F%u043A%u0435%20HTTPSEverywhereUserRules%2C%20xml-%u0444%u0430%u0439%u043B%20%u0441%20%u043F%u0440%u0430%u0432%u0438%u043B%u043E%u043C%20%u0434%u043B%u044F%20%u0430%u0434%u0434%u043E%u043D%u0430%20HTTPS%20Everywhere%0A//%20%u0428%u0430%u0431%u043B%u043E%u043D%20%u043F%u0440%u0430%u0432%u0438%u043B%20%u043D%u0430%u0445%u043E%u0434%u0438%u0442%u0441%u044F%20%u0432%u043E%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%22%u041F%u043E%u043C%u043E%u0449%u044C%22%0Avar%20HTTPSEverywhereRules%20%3D%20true%2C%0A//%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0434%u043B%u044F%20%u0440%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u044F%20%28%u0432%20%u0430%u0441%u0441%u043E%u0446%u0438%u0438%u0440%u043E%u0432%u0430%u043D%u043D%u043E%u0439%20%u0441%20xml-%u0444%u0430%u0439%u043B%u0430%u043C%u0438%20%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u0435%29%20%u0441%u043E%u0437%u0434%u0430%u043D%u043D%u043E%u0435%20%u043F%u0440%u0430%u0432%u0438%u043B%u043E%0A%20%20%20%20HTTPSEverywhereRulesEdit%20%3D%20true%2C%0A//%20%u041F%u0435%u0440%u0435%u043D%u0430%u043F%u0440%u0430%u0432%u0438%u0442%u044C%20%u043D%u0430%20https%20%u0432%u0435%u0440%u0441%u0438%u044E%20%u0441%u0430%u0439%u0442%u0430%2C%20%u043F%u0440%u0438%20%u043D%u0430%u043B%u0438%u0447%u0438%u0438%20%u0443%20%u043D%u0435%u0433%u043E%20%u0432%u0430%u043B%u0438%u0434%u043D%u043E%u0433%u043E%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%0A%20%20%20%20redirect%20%3D%20true%2C%0A//%20%u041E%u0442%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u0434%u0438%u0430%u043B%u043E%u0433%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%0A%20%20%20%20showSert%20%3D%20false%2C%0A//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0435%u0435%20%u0443%u0432%u0435%u0434%u043E%u043C%u043B%u0435%u043D%u0438%u0435%20%u0441%u043E%20%u0441%u0442%u0430%u0442%u0443%u0441%u043E%u043C%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%0A//%20%u041A%u043B%u0438%u043A%20%u043F%u043E%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u0448%u043A%u0435%20-%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u0434%u0438%u0430%u043B%u043E%u0433%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%20%28%u043F%u0440%u0438%20%u043D%u0430%u043B%u0438%u0447%u0438%u0438%20%u043E%u043D%u043E%u0433%u043E%20%u0443%20%u0441%u0430%u0439%u0442%u0430%29%0A%20%20%20%20alert%20%3D%20true%2C%0A//%20%u0417%u0432%u0443%u043A%u043E%u0432%u043E%u0435%20%u0443%u0432%u0435%u0434%u043E%u043C%u043B%u0435%u043D%u0438%u0435%20%u043F%u0440%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0438%20%u0434%u0438%u0430%u043B%u043E%u0433%u0430%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u0430%0A%20%20%20%20alertSound%20%3D%20true%2C%0A//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u0432%u043E%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0435%u043C%20%u0443%u0432%u0435%u0434%u043E%u043C%u043B%u0435%u043D%u0438%u0438%20%u043A%u043E%u0434%u044B%20%u0441%u0442%u0440%u0430%u043D%20%u0434%u043B%u044F%20%u0432%u0441%u0435%u0439%20%u0446%u0435%u043F%u043E%u0447%u043A%u0438%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%u043E%u0432%0A%20%20%20%20showIssuerCountryCode%20%3D%20true%3B%0A%0A%0A//%20chrome%3A//pippki/content/exceptionDialog.js%0Afunction%20badCertListener%28%29%20%7B%7D%0AbadCertListener.prototype%20%3D%20%7B%0A%20%20getInterface%3A%20function%20%28aIID%29%20%7B%0A%20%20%20%20return%20this.QueryInterface%28aIID%29%3B%0A%20%20%7D%2C%0A%20%20QueryInterface%3A%20function%28aIID%29%20%7B%0A%20%20%20%20if%20%28aIID.equals%28Ci.nsIBadCertListener2%29%20%7C%7C%0A%20%20%20%20%20%20%20%20aIID.equals%28Ci.nsIInterfaceRequestor%29%20%7C%7C%0A%20%20%20%20%20%20%20%20aIID.equals%28Ci.nsISupports%29%29%20%7B%0A%20%20%20%20%20%20return%20this%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20throw%20new%20Error%28Components.results.NS_ERROR_NO_INTERFACE%29%3B%0A%20%20%7D%2C%0A%20%20handle_test_result%3A%20function%20%28%29%20%7B%0A%20%20%20%20if%20%28gSSLStatus%29%20%7B%0A%20%20%20%20%20%20gCert%20%3D%20gSSLStatus.QueryInterface%28Ci.nsISSLStatus%29.serverCert%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%0A%20%20notifyCertProblem%3A%20function%20MSR_notifyCertProblem%28socketInfo%2C%20sslStatus%2C%20targetHost%29%20%7B%0A%20%20%20%20gBroken%20%3D%20true%3B%0A%20%20%20%20gSSLStatus%20%3D%20sslStatus%3B%0A%20%20%20%20this.handle_test_result%28%29%3B%0A%20%20%20%20return%20true%3B%20//%20suppress%20error%20UI%0A%20%20%7D%0A%7D%0A%0A//%20chrome%3A//pippki/content/exceptionDialog.js%0Afunction%20getURI%28%29%20%7B%0A%20%20let%20uri%20%3D%20fus.createFixupURI%28loc.href%2C%200%29%3B%0A%0A%20%20if%20%28%21uri%29%20%7B%0A%20%20%20%20return%20null%3B%0A%20%20%7D%0A%0A%20%20if%20%28uri.scheme%20%3D%3D%20%22http%22%29%20%7B%0A%20%20%20%20uri.scheme%20%3D%20%22https%22%3B%0A%20%20%7D%0A%0A%20%20if%20%28uri.port%20%3D%3D%20-1%29%20%7B%0A%20%20%20%20uri.port%20%3D%20443%3B%0A%20%20%7D%0A%0A%20%20return%20uri%3B%0A%7D%0A%0A//%20chrome%3A//pippki/content/exceptionDialog.js%0Afunction%20getCert%28%29%20%7B%0A%20%20gCert%20%3D%20null%3B%0A%20%20gSSLStatus%20%3D%20null%3B%0A%20%20gChecking%20%3D%20true%3B%0A%20%20gBroken%20%3D%20false%3B%0A%0A%20%20var%20uri%20%3D%20getURI%28%29%3B%0A%20%20var%20req%20%3D%20new%20XMLHttpRequest%28%29%3B%0A%0A%20%20try%20%7B%0A%20%20%20%20if%20%28uri%29%20%7B%0A%20%20%20%20%20%20req.open%28%27GET%27%2C%20uri.prePath%2C%20false%29%3B%0A%20%20%20%20%20%20req.channel.notificationCallbacks%20%3D%20new%20badCertListener%28%29%3B%0A%20%20%20%20%20%20req.send%28null%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%20catch%20%28e%29%20%7B%0A%20%20%20%20Cu.reportError%28%22Attempted%20to%20connect%20to%20a%20site%20with%20a%20bad%20certificate%20in%20the%20add%20exception%20dialog.%20%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22This%20results%20in%20a%20%28mostly%20harmless%29%20exception%20being%20thrown.%20%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Logged%20for%20information%20purposes%20only%3A%20%22%20+%20e%29%3B%0A%20%20%7D%20finally%20%7B%0A%20%20%20%20gChecking%20%3D%20false%3B%0A%20%20%7D%0A%0A%20%20if%20%28req.channel%20%26%26%20req.channel.securityInfo%29%20%7B%0A%20%20%20%20gSSLStatus%20%3D%20req.channel.securityInfo%0A%20%20%20%20%20%20.QueryInterface%28Ci.nsISSLStatusProvider%29.SSLStatus%3B%0A%20%20%20%20gCert%20%3D%20gSSLStatus.QueryInterface%28Ci.nsISSLStatus%29.serverCert%3B%0A%20%20%7D%0A%7D%3B%0A%0Afunction%20createRule%28%29%20%7B%0A%20%20//%20http%3A//stackoverflow.com/questions/6449340/how-to-get-top-level-domain-base-domain-from-the-url-in-javascript%0A%20%20let%20domain%20%3D%20loc.host.match%28/%5B-%5Cw%5D+%5C.%28%3F%3A%5B-%5Cw%5D+%5C.xn--%5B-%5Cw%5D+%7C%5B-%5Cw%5D%7B3%2C%7D%7C%5B-%5Cw%5D+%5C.%5B-%5Cw%5D%7B2%7D%29%24/i%29%5B0%5D%3B%0A%0A%20%20var%20rule%20%3D%20convertFromUnicode%28%22UTF-8%22%2C%20hlp.replace%28/%5C%5Bdomain%5C%5D/g%2C%20domain%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace%28/%5C%5Bdomainesc%5C%5D/g%2C%20domain.replace%28/%5C./g%2C%20%27%5C%5C.%27%29%29%29%3B%20%0A%0A%20%20var%20file%20%3D%20directoryService.get%28%22ProfD%22%2C%20Ci.nsIFile%29%3B%0A%20%20file.append%28%22HTTPSEverywhereUserRules%22%29%3B%0A%20%20file.append%28domain%20+%20%27.xml%27%29%3B%0A%20%20foStream.init%28file%2C%200x02%7C0x08%7C0x20%2C%200666%2C%200%29%3B%0A%20%20foStream.write%28rule%2C%20rule.length%29%3B%0A%20%20foStream.close%28%29%3B%0A%20%20HTTPSEverywhereRulesEdit%20%26%26%20file.launch%28%29%3B%0A%7D%3B%0A%0Afunction%20getCountries%28%29%20%7B%0A%20%20try%20%7B%0A%20%20%20%20var%20result%20%3D%20%5B%5D%2C%20%7BSSLStatus%7D%20%3D%20gBrowser.securityUI.QueryInterface%28Ci.nsISSLStatusProvider%29%3B%0A%20%20%20%20var%20tree%20%3D%20Cc%5B%22@mozilla.org/security/nsASN1Tree%3B1%22%5D.createInstance%28Ci.nsIASN1Tree%29%3B%0A%0A%20%20%20%20for%28var%20cert%20%3D%20SSLStatus.serverCert%3B%20cert%3B%20cert%20%3D%20cert.issuer%29%20%7B%0A%20%20%20%20%20%20tree.loadASN1Structure%28cert.ASN1Structure%29%3B%0A%20%20%20%20%20%20for%28var%20res%2C%20ind%20%3D%200%3B%20ind%20%3C%20tree.rowCount%3B%20ind++%29%0A%20%20%20%20%20%20%20%20if%20%28tree.getCellText%28ind%2C%20%7B%7D%29%20%3D%3D%20%22Subject%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20res%20%3D%20tree.getDisplayData%28ind%29%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20array%20%3D%20res.split%28%22%5Cn%22%29%3B%0A%20%20%20%20%20%20var%20country%20%3D%20array.find%28str%20%3D%3E%20str.startsWith%28%22C%20%3D%20%22%29%29%3B%0A%20%20%20%20%20%20result.unshift%28country%20%3F%20country.slice%284%29%20%3A%20%22%3F%3F%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20result.join%28%22-%22%29%3B%0A%0A%20%20%7D%20catch%28ex%29%20%7B%7D%0A%7D%3B%0A%0Afunction%20viewCert%28%29%20%7B%0A%20%20getCert%28%29%3B%0A%0A%20%20if%20%28%21gCert%20%7C%7C%20%21gSSLStatus%29%20%7B%0A%20%20%20%20alert%20%26%26%20alertsService.showAlertNotification%28img%2C%20lbl%20+%20loc.host%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%u0421%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%20%u043D%u0435%20%u043C%u043E%u0436%u0435%u0442%20%u0431%u044B%u0442%u044C%20%u043F%u043E%u043B%u0443%u0447%u0435%u043D%21%27%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%0A%20%20let%20cns%20%3D%20showIssuerCountryCode%20%3F%20%27%28%27%20+%20getCountries%28%29%20+%20%27%29%27%20%3A%20%27%27%3B%0A%0A%20%20if%20%28showSert%29%20%7B%0A%20%20%20%20sertViewer.viewCert%28window%2C%20gCert%29%3B%0A%20%20%20%20alertSound%20%26%26%20soundService.playEventSound%28%27EVENT_ALERT_DIALOG_OPEN%27%29%3B%0A%20%20%7D%0A%0A%20%20var%20sertListener%20%3D%20%7B%0A%20%20%20%20observe%3A%20function%28aSubject%2C%20aTopic%2C%20aData%29%20%7B%0A%20%20%20%20%20%20if%20%28aTopic%20%21%3D%20%27alertclickcallback%27%29%20return%3B%0A%20%20%20%20%20%20sertViewer.viewCert%28window%2C%20gCert%29%3B%0A%20%20%20%20%20%20alertSound%20%26%26%20soundService.playEventSound%28%27EVENT_ALERT_DIALOG_OPEN%27%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20if%20%28gSSLStatus.isUntrusted%0A%20%20%20%20%20%20%7C%7C%20gSSLStatus.isDomainMismatch%0A%20%20%20%20%20%20%7C%7C%20gSSLStatus.isNotValidAtThisTime%29%0A%20%20%20%20alert%20%26%26%20alertsService.showAlertNotification%28img%2C%20lbl%20+%20loc.host%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%u0421%u0430%u0439%u0442%20%u0438%u0441%u043F%u043E%u043B%u044C%u0437%u0443%u0435%u0442%20%u043D%u0435%u0432%u0430%u043B%u0438%u0434%u043D%u044B%u0439%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%21%20%27%20+%20cns%20+%20%27%5Cn%u041D%u0430%u0436%u043C%u0438%u0442%u0435%20%u0434%u043B%u044F%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20true%2C%20null%2C%20sertListener%2C%20%22%22%29%3B%0A%20%20else%20%7B%0A%20%20%20%20if%20%28loc.protocol%20%21%3D%20%27https%3A%27%29%20%7B%0A%20%20%20%20%20%20redirect%20%26%26%20%28loc.protocol%20%3D%20%27https%27%29%3B%0A%20%20%20%20%20%20HTTPSEverywhereRules%20%26%26%20createRule%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20alert%20%26%26%20alertsService.showAlertNotification%28img%2C%20lbl%20+%20loc.host%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%u0421%u0430%u0439%u0442%20%u0438%u0441%u043F%u043E%u043B%u044C%u0437%u0443%u0435%u0442%20%u0432%u0430%u043B%u0438%u0434%u043D%u044B%u0439%20%u0441%u0435%u0440%u0442%u0438%u0444%u0438%u043A%u0430%u0442%21%20%27%20+%20cns%20+%20%27%5Cn%u041D%u0430%u0436%u043C%u0438%u0442%u0435%20%u0434%u043B%u044F%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20true%2C%20null%2C%20sertListener%2C%20%22%22%29%3B%0A%20%20%7D%0A%7D%3B%0AviewCert%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%3Cruleset%20name%3D%22%28USER%20RULE%29%20%5Bdomain%5D%22%3E%0A%3Ctarget%20host%3D%22%5Bdomain%5D%22/%3E%0A%3Ctarget%20host%3D%22*.%5Bdomain%5D%22/%3E%0A%3Csecurecookie%20host%3D%22%5E%28%3F%3A.*%5C.%29%3F%5Bdomainesc%5D%24%22%20name%3D%22.+%22/%3E%0A%3Crule%20from%3D%22%5Ehttp%3A//%22%20to%3D%22https%3A//%22/%3E%0A%3C/ruleset%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Спасибки, соответственно, Dumby. :)

turbot, Dumby, вы лучшие, спасибо!

Есть небольшая особенность: если в поле Issuer больше 4 строк, то страна отображается как ??. Примеры: https://vk.com https://www.livejournal.com
(Хотя может и не в количестве строк дело, а в чем-то другом).

lokiju просит помочь с кодом Link Tooltips:

lokiju пишет

Показывает адрес ссылки под курсором возле курсора.

Выделить код

Код:

/*Initialization Code*/
/* :::::::: Link Tooltips :::::::::::::::*/

getBrowser().addEventListener("DOMContentLoaded", function(aEvent) {
    var doc = new XPCNativeWrapper(aEvent.originalTarget);
    var links = doc.evaluate("//a[@href and @href!='']", doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var link, i = 0; (link = links.snapshotItem(i)); i++)
    {
        link.title = link.title ? link.title + " <" + link.href + ">" : link.href;
    }
}, true);

Но  с FF38 ЕМНИП начались проблемы: после просмотра длинного адреса тултип не уменьшается при просмотре короткого адреса до перезагрузки браузера. Картинки

Картинки
[url=http://www.fotolink.su/v.php?id=5662b3bf5076b0191e6159b67a5112a0]http://www.fotolink.su/pic_s/5662b3bf50 … 5112a0.jpg
1280x778(125.46 kB)[/url]
[url=http://www.fotolink.su/v.php?id=7313fd74a430c9272883d2d77316be83]http://www.fotolink.su/pic_s/7313fd74a4 … 16be83.jpg
1280x877(734.24 kB)[/url]
[url=http://www.fotolink.su/v.php?id=5e883a4772c347ac75194f4da3533b7a]http://www.fotolink.su/pic_s/5e883a4772 … 533b7a.jpg
1280x877(125.89 kB)[/url]

firefan пишет

Есть небольшая особенность

Ну, там все правильно: параметр "country" - отсутствует:
thumb_25f5cd7561ee1888e7ba3b52517c25ef.jpg
Проверяется же поле "Subject", а не "Issuer". Хотя я тоже не уверен, что страну проверять надо у того, кому выдан, а не у того - кто. Если думаете, что второе - правильнее, то просто замените в коде, в строке

Выделить код

Код:

if (tree.getCellText(ind, {}) == "Subject") {

Subject - на Issuer.

bunda1 пишет

lokiju просит помочь с кодом Link Tooltips:

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

bunda1 пишет

Картинки

А как у тебя в тултипе код кнопки возникает, как на втором скрине?

voqabuhe
Это кнопка "CB code 2 link". Не могу найти поиском на форуме. Потерли, вероятно.

turbot
Дык здесь запости, плиз.

Дык, смысл? В личку отправил.

turbot
Понятно. Спасибо

lokiju пишет

Link Tooltips показывает адрес ссылки под курсором возле курсора. Но с FF38 ЕМНИП начались проблемы: после просмотра длинного адреса тултип не уменьшается при просмотре короткого адреса до перезагрузки браузера.

Попробуй:

Выделить код

Код:

// Добавить подсказки к ссылкам на странице, от 07.07.2016. .................
addEventListener('mouseenter', (e, el = e.target)=> {
   var url = XULBrowserWindow.overLink;
   if (url) el.title = url;
}, true, gBrowser);

bunda1, спасибо. Но у меня ваш код вобще не работает.Попробую ещё завтра с полной очисткой истории  и перезапуском ОС

turbot пишет

voqabuheЭто кнопка "CB code 2 link". Не могу найти поиском на форуме. Потерли, вероятно.
                    Отредактировано turbot (Сегодня 16:11:53)

Нет. Это бесчётное количество раз правленный кусочками скрипт Greasemonkey

Linkify Plus(Mar1,2013)

Выделить код

Код:

// ==UserScript==
// @name        Linkify Plus(Mar1,2013)
// @version     2.1.4
// @namespace   http://arantius.com/misc/greasemonkey/
// @description Turn plain text URLs into links.    Supports http, https, ftp, email addresses.
// @include     *
// @exclude     http://www.google.tld/search*
// @exclude     https://www.google.tld/search*
// @exclude     http://music.google.com/*
// @exclude     https://music.google.com/*
// @exclude     http://mail.google.com/*
// @exclude     https://mail.google.com/*
// @exclude     http://docs.google.com/*
// @exclude     https://docs.google.com/*
// @exclude     http://mxr.mozilla.org/*
// ==/UserScript==
//
// Copyright (c) 2011, Anthony Lieuallen
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice, 
//   this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice, 
//   this list of conditions and the following disclaimer in the documentation 
//   and/or other materials provided with the distribution.
// * Neither the name of Anthony Lieuallen nor the names of its contributors 
//   may be used to endorse or promote products derived from this software 
//   without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
// POSSIBILITY OF SUCH DAMAGE.
//

/*******************************************************************************
Loosely based on the Linkify script located at:
  http://downloads.mozdev.org/greasemonkey/linkify.user.js

Version history:
 Version 2.1.4 (Aug 12, 2012):
  - Bug fix for when (only some) nodes have been removed from the document.
 Version 2.1.3 (Oct 24, 2011):
  - More excludes.
 Version 2.1.2:
  - Some bug fixes.
 Version 2.1.1:
  - Ignore certain "highlighter" script containers.
 Version 2.1:
  - Rewrite the regular expression to be more readable.
  - Fix trailing "." characters.
 Version 2.0.3:
  - Fix infinite recursion on X(HT)ML pages.
 Version 2.0.2:
  - Limit @include, for greater site/plugin compatibility.
 Version 2.0.1:
  - Fix aberrant 'mailto:' where it does not belong.
 Version 2.0:
  - Apply incrementally, so the browser does not hang on large pages.
  - Continually apply to new content added to the page (i.e. AJAX).
 Version 1.1.4:
  - Basic "don't screw up xml pretty printing" exception case
 Version 1.1.3:
  - Include "+" in the username of email addresses.
 Version 1.1.2:
  - Include "." in the username of email addresses.
 Version 1.1:
  - Fixed a big that caused the first link in a piece of text to
    be skipped (i.e. not linkified).
*******************************************************************************/

var notInTags = [
      'a', 'code', 'head', 'noscript', 'option', 'script', 'style',
      'title', 'textarea'];
var textNodeXpath =
      ".//text()[not(ancestor::"+notInTags.join(') and not(ancestor::')+")]";
// Built based on:
//  - http://en.wikipedia.org/wiki/URI_scheme
//  - http://www.regular-expressions.info/regexbuddy/email.html
var urlRE = new RegExp(
    '('
    // leading scheme:// or "www."
    + '\\b([a-z][-a-z0-9+.]+://|www\\.)'
    // everything until non-URL character
    + '[^\\s\'"<>()]+'
    + '|'
    // email
    + '\\b[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}\\b'
    + ')', 'gi');
var queue = [];

/******************************************************************************/

linkifyContainer(document.body);
document.body.addEventListener('DOMNodeInserted', function(event) {
    linkifyContainer(event.target);
}, false);

/******************************************************************************/

function linkifyContainer(container) {
    // Prevent infinite recursion, in case X(HT)ML documents with namespaces
    // break the XPath's attempt to do so.    (Don't evaluate spans we put our
    // classname into.)
    if (container.className && container.className.match(/\blinkifyplus\b/)) {
      return;
    }

    var xpathResult = document.evaluate(
          textNodeXpath, container, null,
          XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

    var i = 0;
    function continuation() {
        var node = null, counter = 0;
        while (node = xpathResult.snapshotItem(i++)) {
          var parent = node.parentNode;
          if (!parent) continue;

          // Skip styled <pre> -- often highlighted by script.
          if ('PRE' == parent.tagName && parent.className) continue;
          
            linkifyTextNode(node);

            if (++counter > 50) {
                return setTimeout(continuation, 0);
            }
        }
    }
    setTimeout(continuation, 0);
}

function linkifyTextNode(node) {
    // fix for 4chan
    // traverse all siblings that are separated from this one with a <wbr>
    var toRemove = [];
    var addtxt = '';
    var next;
    var current = node;
    while (true) {
        next = current.nextSibling;
        if (next == null) {
            break;
        }
        if (next.tagName != 'WBR') {
            break;
        }
        toRemove.push(next);
        next = next.nextSibling;
        if (next == null || next.nodeType != Node.TEXT_NODE) {
            toRemove.pop();
            break;
        }
        toRemove.push(next);
        addtxt += next.textContent;
        current = next;
    }
    var i, l, m;
    var txt = node.textContent + addtxt;
    var span = null;
    var p = 0;
    while (m = urlRE.exec(txt)) {
        if (null == span) {
            // Create a span to hold the new text with links in it.
            span = document.createElement('span');
            span.className = 'linkifyplus';
        }

        //get the link without trailing dots
        l = m[0].replace(/\.*$/, '');
        var lLen = l.length;
        //put in text up to the link
        span.appendChild(document.createTextNode(txt.substring(p, m.index)));
        //create a link and put it in the span
        a = document.createElement('a');
        a.className = 'linkifyplus';
        a.appendChild(document.createTextNode(l));
        if (l.indexOf(":/") < 0) {
            if (l.indexOf("@") > 0) {
                l = "mailto:" + l;
            } else {
                l = "http://" + l;
          }
        }
        a.setAttribute('href', l);
        span.appendChild(a);
        //track insertion point
        p = m.index+lLen;
    }
    if (span) {
        //take the text after the last link
        span.appendChild(document.createTextNode(txt.substring(p, txt.length)));
        //replace the original text with the new span
        try {
            toRemove.forEach(function (n) { node.parentNode.removeChild(n); });
            node.parentNode.replaceChild(span, node);
        } catch (e) {
            console.error(e);
            console.log(node);
        }
    }
}

var style = document.createElement('style');
    style.type = 'text/css';
    style.appendChild(document.createTextNode('a.linkifyplus {color: #006400!important; background-color: #FFFF00!important;}'));
    document.getElementsByTagName('head')[0].appendChild(style);

lokiju пишет

bunda1, спасибо. Но у меня ваш код вобще не работает.Попробую ещё завтра с полной очисткой истории  и перезапуском ОС

У меня работает на разных версиях Firefox, проверь на чистом профиле.

turbot пишет

Subject - на Issuer.

Поменял. Благодарствую.

Господа, помогите пожалуйста с такой задачей:
Есть кнопка, которая открывает диалог сохранения иконки сайта по среднему клику (не обязательно именно эту кнопку брать за основу, это как пример):

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESave%20Favicon%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-4%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0Avar%20orgImg%3Dthis.image%3B%0Athis.onLeftClick%3Dfunction%28%29%0A%7B%0A%20%20%20this.image%20%3D%20gBrowser.selectedTab.image%3B%0A%7D%0A%0Athis.onMiddleClick%3Dfunction%28%29%0A%7B%0A%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28gBrowser.selectedTab.image%29%3B%0A%20%20%20%20%20%20%20%20setTimeout%28%20function%28%29%20%7B%20saveDocument%28window.content.document%29%3B%0A%20%20%20%20%20%20%20%20gBrowser.removeTab%28gBrowser.selectedTab%29%3B%20%20%7D%2C%201000%29%3B%0A%7D%0A%0Athis.onRightClick%3Dfunction%28%29%0A%7B%0A%20%20%20this.image%3DorgImg%3B%0A%7D%0A%0A//**********%20No%20need%20to%20make%20any%20changes%20to%20below%20code%20**************%0Athis.execute%3D%20function%28evt%29%0A%7B%0A%0A%20%20%20if%28evt.shiftKey%29%20%7B%0A%20%20%20%20%20%20this.showPopup%28this%29%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%7D%0A%0A%20%20%20switch%28evt.button%29%0A%20%20%20%7B%0A%20%20%20%20%20%20case%200%3A%0A%20%20%20%20%20%20%20%20%20this.onLeftClick%28%29%3B%0A%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%201%3A%0A%20%20%20%20%20%20%20%20%20this.onMiddleClick%28%29%3B%0A%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%202%3A%0A%20%20%20%20%20%20%20%20%20this.onRightClick%28%29%3B%0A%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%7D%0A%7D%0A%0A%0Athis.showPopup%20%3D%20function%28node%29%20%7B%0A%20%20var%20popup%20%3D%20document.getElementById%28%22custombuttons-contextpopup%22%29%3B%0A%20%20var%20x%20%3D%20node.boxObject.x%3B%0A%20%20var%20y%20%3D%20node.boxObject.y%20+%20node.boxObject.height%3B%0A%20%20document.popupNode%20%3D%20node%3B%0A%20%20popup.showPopup%28node%2C%20x%2C%20y%2C%20%22popup%22%2C%20null%2C%20null%29%3B%0A%7D%0A%0Athis.setAttribute%28%22onclick%22%2C%20%22this.execute%28event%29%3B%22%29%3B%0A//this.setAttribute%28%22context%22%2C%20%22%22%29%3B%0Athis.tooltipText%20%3D%20this.label%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Я хотел бы, чтобы иконка не сохранялась, а отправлялась расширению Image Assistant (расширение по правому клику из контекстного меню открывает в стороннем приложении выбранную картинку).
На всякий случай, вот код запуска Image Assistant из контекстного меню, который я посмотрел с помощью Menu Wizard: tv.ultranet.imageassistant.ImageAssistantClient.singleton.openImage();

Заранее спасибо за помощь.

Перестала работать кнопка Http-Logger в Firefox 47, поправьте пожалуйста кто может.

firefan пишет

Благодарствую

Поменяйте там еще:

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

Выделить код

Код:

function getCountries() {
  try {
    var result = [];

    for(var cert = gCert; cert; cert = cert.issuer) {
      tree.loadASN1Structure(cert.ASN1Structure);
      for(var res, ind = 0; ind < tree.rowCount; ind++)
        if (tree.getCellText(ind, {}) == "Issuer") {
          res = tree.getDisplayData(ind);
          break;
        }
      var array = res.split("\n");
      var country = array.find(str => str.startsWith("C = "));
      result.unshift(country ? country.slice(4) : "??");
    }
    return result.join("-");

  } catch(ex) {}
};


А то не будет показывать при невалидном сертификате. Кстати, у "Issuer" тоже не всегда страна прописана. Например, у сертификатов от Let's Encrypt.

Спасибо большое!

turbot, не могли бы вы ответить на пару вопросов по поводу вашей кнопки Быстрое переключение параметров about:config

1) Как указать \ (слеш) для параметра string? К сожалению, не могу указать путь там, слеши съедаются.
2) Можно ли этот функционал (изменение параметра, отслеживание его состояния)  вынести из контекстного меню в отдельную кнопку, чтобы изменение параметра происходило просто по нажатию, циклично? В идеале, чтобы она тоже цвет меняла в зависимости от настройки по-умолчанию.

firefan
1 - экранируйте. Т.е., \/\/ - вместо //
2 - я эту кнопку потому и сделал, что кол-во отдельных кнопок разрослось до неприличия. :) Вот:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EIndexedDB%20on/off%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/svg+xml%3Bbase64%2CPHN2ZyB3aWR0aD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTYgMTYiPgo8ZyBmaWxsPSIjZWRmMGYxIj4KPHBhdGggZD0ibTEuMywxMi41di0yLjRjMCwwIDAsMi41IDYuNywyLjUgNi43LDAgNi43LTIuNSA2LjctMi41djIuNGMwLDAgMCwyLjctNi44LDIuNy02LjYsMC02LjYtMi43LTYuNi0yLjd6Ii8+CjxwYXRoIGQ9Im0xNC43LDMuNGMwLTEuNC0zLTIuNS02LjctMi41cy02LjcsMS4xLTYuNywyLjVjMCwuMiAwLC4zIC4xLC41LS4xLS4zLS4xLS40LS4xLS40djEuNWMwLDAgMCwyLjcgNi43LDIuNyA2LjcsMCA2LjgtMi43IDYuOC0yLjd2LTEuNmMwLC4xIDAsLjItLjEsLjUtMC0uMi0wLS4zLTAtLjV6Ii8+CjxwYXRoIGQ9Im0xLjMsOC43di0yLjRjMCwwIDAsMi41IDYuNywyLjUgNi43LDAgNi43LTIuNSA2LjctMi41djIuNGMwLDAgMCwyLjctNi44LDIuNy02LjYtMC02LjYtMi43LTYuNi0yLjd6Ii8+CjwvZz4KPC9zdmc+Cg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20s%20%3D%20%27dom.indexedDB.enabled%27%3B%0Athis._handleClick%20%3D%28%29%3D%3E%20cbu.setPrefs%28s%2C%20%21cbu.getPrefs%28s%29%29%3B%0A%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20var%20val%20%3D%20cbu.getPrefs%28s%29%3B%20%0A%20%20%20var%20icon%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0A%20%20%20var%20label%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-text%22%29%3B%0A%20%20%20icon.style.filter%20%3D%20val%20%3F%20%27%27%20%3A%20%27opacity%2850%25%29%27%3B%20%20%20%0A%20%20%20label.style.filter%20%3D%20val%20%3F%20%27%27%20%3A%20%27opacity%2850%25%29%27%3B%20%20%20%0A%20%20%20self.checked%20%3D%20val%3B%0A%7D%3B%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%20%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
turbot пишет

1 - экранируйте. Т.е., \/\/ - вместо //

Я видимо не очень понял принцип, но такой набор знаков /\ \/ \\// //\\ на выходе дает / / // //
А мне нужен слеш в другую сторону \

Помогите пожалуйста с конкретным примером:
c:\Downloads\test
что прописать в код кнопки, чтобы этот же путь отобразился в параметре about:config ?

turbot пишет

2 - я эту кнопку потому и сделал, что кол-во отдельных кнопок разрослось до неприличия. :) Вот:

Спасибо за пример. Как я понял, там не string, а boolean. Не совсем понятно, что поменять, чтобы это работало для изменения string.

firefan пишет

А мне нужен слеш в другую сторону \

Ух, косяк. Пока не могу сообразить. Надо подумать.

UPD: Пока могу предложить \\\\ - прописывать для одного обратного слеша. :sick:

что поменять, чтобы это работало для изменения string.

Тоже надо подумать. :) Что-то у меня голова совсем не варит сегодня. Да еще и другой кнопкой занята.

turbot пишет

UPD: Пока могу предложить \\\\ - прописывать для одного обратного слеша. :sick:

То, что нужно. Спасибо вам!

firefan
Не, не то что нужно. Не будет чекбокса у пункта в субменю и не будет значение параметра отображать в меню.

turbot
Я по-ламерски поковырялся немного. Если сделать в userChoice не \\\\ , а \\ , то кнопка будет реагировать цветом на значение параметра (по крайней мере, если он один, я другие закомментировал). А чекбокса действительно почему-то нет, но меня и изменение цвета устраивает.

Сделать бы теперь еще, чтобы этот мой единственный параметр менялся просто по клику на кнопку, а не через меню.

firefan пишет

Если сделать

Ну, это тоже костыли. В выходные подумаю, что сделать.

firefan пишет

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETest%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/svg+xml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgdmlld0JveD0iMCAwIDU4LjIwMSA1OC4yMDEiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDU4LjIwMSA1OC4yMDE7IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iMTQ5NzQ5LnN2ZyI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDciPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnM0NSIgLz48c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjY4OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI0ODAiCiAgICAgaWQ9Im5hbWVkdmlldzQzIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSI0LjA1NDkxMzEiCiAgICAgaW5rc2NhcGU6Y3g9IjI5LjEwMDUiCiAgICAgaW5rc2NhcGU6Y3k9IjI5LjEwMDUiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJDYXBhXzEiIC8+PGcKICAgICBpZD0iZzMiCiAgICAgc3R5bGU9ImZpbGw6Izc5N2M3ZjtmaWxsLW9wYWNpdHk6MSI+PHBhdGgKICAgICAgIGQ9Ik0zMS43MDcsMzMuMDdjLTAuODcsMC4wMjctMS43NCwwLjA0Mi0yLjYwNiwwLjA0MmMtMC44NjksMC0xLjc0Mi0wLjAxNC0yLjYxNC0wLjA0MiAgIGMtNy4zNDEtMC4yMDEtMTMuMTkxLTEuMjM4LTE3LjQwMy0yLjcxN0M3LjEwNCwyOS42ODUsNS40MDksMjguODk5LDQuMSwyOHY3LjExMXYwLjV2MC41VjM3LjRjMi44NDYsMi45NzEsMTIuMzk0LDUuNzExLDI1LDUuNzExICAgczIyLjE1NC0yLjc0LDI1LTUuNzExdi0xLjI4OXYtMC41di0wLjVWMjhjLTEuMzE4LDAuOTA1LTMuMDI4LDEuNjk3LTUuMDI1LDIuMzY3QzQ0Ljg2NSwzMS44MzksMzkuMDI3LDMyLjg3LDMxLjcwNywzMy4wN3oiCiAgICAgICBpZD0icGF0aDUiCiAgICAgICBzdHlsZT0iZmlsbDojNzk3YzdmO2ZpbGwtb3BhY2l0eToxIiAvPjxwYXRoCiAgICAgICBkPSJNNC4xLDE0Ljg4OVYyMnYwLjVWMjN2MS4yODljMi42MzgsMi43NTQsMTEuMDMzLDUuMzEsMjIuMjg2LDUuNjY4YzAuMTE1LDAuMDA0LDAuMjMzLDAuMDA1LDAuMzQ5LDAuMDA4ICAgYzAuMzI2LDAuMDA5LDAuNjUxLDAuMDE4LDAuOTgyLDAuMDIzQzI4LjE3NCwyOS45OTYsMjguNjM1LDMwLDI5LjEsMzBzMC45MjYtMC4wMDQsMS4zODMtMC4wMTEgICBjMC4zMy0wLjAwNSwwLjY1Ni0wLjAxNCwwLjk4Mi0wLjAyM2MwLjExNi0wLjAwMywwLjIzNC0wLjAwNSwwLjM0OS0wLjAwOGMxMS4yNTMtMC4zNTksMTkuNjQ4LTIuOTE1LDIyLjI4Ni01LjY2OFYyM3YtMC41VjIyICAgdi03LjExMUM0OS4yMzMsMTguMjMyLDM4Ljk0NCwyMCwyOS4xLDIwUzguOTY4LDE4LjIzMiw0LjEsMTQuODg5eiIKICAgICAgIGlkPSJwYXRoNyIKICAgICAgIHN0eWxlPSJmaWxsOiM3OTdjN2Y7ZmlsbC1vcGFjaXR5OjEiIC8+PHBhdGgKICAgICAgIGQ9Ik01My45NjUsOC41NDJDNTIuODQzLDQuMjQxLDQ0LjIxNSwwLDI5LjEsMEMxNC4wMjMsMCw1LjQwNCw0LjIyLDQuMjQ3LDguNTFDNC4xNjIsOC42NTcsNC4xLDguODE4LDQuMSw5djAuNXYxLjgwNiAgIEM2LjkzNywxNC4yNjcsMTYuNDE3LDE3LDI5LjEsMTdzMjIuMTY0LTIuNzMzLDI1LTUuNjk0VjkuNVY5QzU0LjEsOC44MzIsNTQuMDQ0LDguNjgxLDUzLjk2NSw4LjU0MnoiCiAgICAgICBpZD0icGF0aDkiCiAgICAgICBzdHlsZT0iZmlsbDojNzk3YzdmO2ZpbGwtb3BhY2l0eToxIiAvPjxwYXRoCiAgICAgICBkPSJNNC4xLDQxdjguMjAxYzAsMC4xNjIsMC4wNDMsMC4zMTUsMC4xMTcsMC40NTFjMS4xODEsNC44OTUsMTEuNzQ3LDguNTQ5LDI0Ljg4Myw4LjU0OWMxMy4xMDYsMCwyMy42NTUtMy42MzksMjQuODc1LTguNTE2ICAgYzAuMDgtMC4xNDQsMC4xMjUtMC4zMDksMC4xMjUtMC40ODR2LTguMTk5Yy00LjEzNSwyLjkxMS0xMi42NTUsNS4xOTktMjUsNS4xOTlDMTYuNzU0LDQ2LjIwMSw4LjIzNCw0My45MTEsNC4xLDQxeiIKICAgICAgIGlkPSJwYXRoMTEiCiAgICAgICBzdHlsZT0iZmlsbDojNzk3YzdmO2ZpbGwtb3BhY2l0eToxIiAvPjwvZz48ZwogICAgIGlkPSJnMTMiIC8+PGcKICAgICBpZD0iZzE1IiAvPjxnCiAgICAgaWQ9ImcxNyIgLz48ZwogICAgIGlkPSJnMTkiIC8+PGcKICAgICBpZD0iZzIxIiAvPjxnCiAgICAgaWQ9ImcyMyIgLz48ZwogICAgIGlkPSJnMjUiIC8+PGcKICAgICBpZD0iZzI3IiAvPjxnCiAgICAgaWQ9ImcyOSIgLz48ZwogICAgIGlkPSJnMzEiIC8+PGcKICAgICBpZD0iZzMzIiAvPjxnCiAgICAgaWQ9ImczNSIgLz48ZwogICAgIGlkPSJnMzciIC8+PGcKICAgICBpZD0iZzM5IiAvPjxnCiAgICAgaWQ9Imc0MSIgLz48L3N2Zz4%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20s%20%3D%20%27CB.test%27%3B%0Avar%20vals%20%3D%20%5B%0A%20%20%20%22test%5C%5Ctest%5C%5C1%22%2C%0A%20%20%20%22test%5C%5Ctest%5C%5C2%22%2C%0A%20%20%20%22test%5C%5Ctest%5C%5C3%22%2C%0A%20%20%20%22test%5C%5Ctest%5C%5C4%22%0A%5D%0Avar%20userChoice%20%3D%20vals%5B1%5D%3B%0A%0Athis._handleClick%20%3D%28%29%3D%3E%20cbu.setPrefs%28s%2C%20%28vals.length%20%3C%3D%20vals.indexOf%28cbu.getPrefs%28s%29%29%20+%201%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20vals%5B0%5D%20%3A%20vals%5Bvals.indexOf%28cbu.getPrefs%28s%29%29%20+%201%5D%29%3B%0A%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20var%20val%20%3D%20cbu.getPrefs%28s%29%3B%20%0A%20%20%20var%20icon%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0A%20%20%20var%20label%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-text%22%29%3B%0A%20%20%20icon.style.filter%20%3D%20val%20%3D%3D%20userChoice%20%3F%20%27%27%20%3A%20%27hue-rotate%28140deg%29%20saturate%2810%29%20brightness%28.85%29%20contrast%283%29%27%3B%20%20%20%0A%20%20%20label.style.color%20%3D%20val%20%3D%3D%20userChoice%20%3F%20%27%27%20%3A%20%27red%27%3B%0A%20%20%20self.tooltipText%20%3D%20s%20+%20%27%3B%27%20+%20val%3B%0A%7D%3B%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%20%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
turbot пишет

Код:

turbot
Просто супер. Еще раз огромное спасибо!

Раскукоживатель коротких ссылок

turbot пишет

ПКМ по самой кнопке - "раскукожит" ссылку из буфера обмена.

ЛКМ ?

Ух, поправил. Спасибо.

firefan

turbot пишет

Не будет чекбокса у пункта в субменю и не будет значение параметра отображать в меню.

Исправил кое-как: Быстрое переключение параметров about:config, от 24.07.2016
Обратные слеши все равно надо экранировать. Т.е., \\ вместо \.

Кнопка Автоматически открыть - закрыть меню опять стала открывать лишнее. Исправьте пожалуйста,  кто может.
Вообще, если это несложно, устроит кнопка  что бы открывались папки панели закладок, при наведении через...0,5сек. Этого будет вполне достаточно.

Форсировал в [firefox] 48 мультипроцессность, отвалились кнопки от уважаемого bunda1 Autocopy+3 и GrabScroll, возможно ли их наладить или это принципиальная несовместимость?

Caddy пишет

или это принципиальная несовместимость?

Некоторые дополнения несовместимы с этим режимом.

Ultima2m
Да, я в курсе, но почти всё работает, вопрос в том, возможно ли решение для этих кнопок. Будем ждать гуру bunda1, но он, к сожалению, давно уже не заходит.

Caddy пишет

Форсировал в [firefox] 48 мультипроцессность, отвалились кнопки от уважаемого bunda1 Autocopy+3 и GrabScroll, возможно ли их наладить или это принципиальная несовместимость?

Наверно упомянутые кнопки можно исправить для совместимости с мультипроцессностю, но я пока не знаю как.

bunda1
Жаль, но будем надеяться, что найдётся решение на случай, если Mozilla сделает электролиз неотключаемым. Вернул всё обратно, пока от мультипроцессности заметил лишь весьма неприятный эффект, когда вкладки появляются без названий, а потом уже грузится страница, но хорошо хоть Сustom Buttons не отвалился, чего все боялись.

Доброго дня! Парни, где-то попадалась кнопка для всех about-ов. Может кто юзает - будьте добреньки, поделитесь :blush:

Спасибо...

Saenko, не помню чья

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Eabout%3Aabout%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKoSURBVDiNjZNLaJRnFIaf75vvy2UGTWr8NYkxl0IFUYkNXSSZQNWFWlxIEVy1FLLo0i4adddVXRnS4kJwYxci2GaRTWlSFGKFGRXNmFBF62VMO4TENBdjMv9k5p//Oy4SLzgqHs7yPc95eTlHiQjvqniPbVYRzuBoR+FQDEvId4neIPNCY945DayNVff/8NUvn9XXNJMv5hhKnTvYP3ymHmj/IMBSbmHjjP8fycxv+MEzGqtatUI1vK7R7wM4J32XUv3Li/l5imGBkbtXlsMw/PF1jXozg3iP3aM0Z8XRBFDr1fl7Og9EnTguXx30p/6fjAIozb/i6C4BdB2z6QOfH27ZUFNL0QUELs/tycs4J2zdGEerCADTM1P8df3PxyUZiKPF8zyGHpwGFLC6QCCRuYA4QQQ6mw4hjhYT77GN2qiBWFnV5sXc0xMAgfKx5foVYKURB2vLPbxoM8auODE6ws/fH+77dHtjhxp5OHzywpWf/IIsRk25Rq0CRFY4UVNNndkmqZFRf3YuWaYUS0aE3RP5MXX3/iCOgu3Y1WYfL90sdSDgxRoYTY5mZ2anjwC/AqEBdM4tMJ4dwYs1YiOGSBkYrVHqlQNxoC34OV8BdxK9gQ+guo7bwdYdrXu92nU6nR7Pzc/PSXxfazTj30IpRaWpIqbX4UQoBDkWJlRwLzVeLBTyGs2UcUX5duzvsfPqNpvDovQhnBIdELGaWFk1hclYmLx2fxmFbNm5qXJNvdi2DQ1WAsO1P/5petshyf6v25gJ0nxUUUeiP531s/kvAcor7MDOL2pjz3JzVKpqUoMTpb8QsSqdeTT98fomjyDv8LP5aKI3uAgQP2orCkGAVRVMZxbQhnQJIAzkm3s3Js6GSfkEQEd4+bpa8+TW71P1ANqoB65I93OA2DgV+Z+omgAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.tooltipText%20%3D%20%22%u041B%20%3D%20about%3Aconfig%20%7C%20%u0421%20%3D%20about%3Asupport%20%7C%20%u041F%20%3D%20about%3Aabout%22%3B%0A%0Athis.onclick%20%3D%20function%28event%29%20%7B%0A%20%20%20%20if%28event.button%20%3D%3D%202%29%20%7B%0A//%20%u041F%u041A%u041C%0A%20getBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%20%28%22about%3Aabout%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%28event.button%20%3D%3D%201%29%20%7B%0A//%20%u0421%u041A%u041C%0A%20getBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%20%28%22about%3Asupport%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%28event.button%20%3D%3D%200%29%20%7B%0A//%20%u041B%u041A%u041C%0A%20getBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%20%28%22about%3Aconfig%22%29%3B%0A%20%20%20%20%7D%0A%7D%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Выделить код

Код:

this.tooltipText = "Л = about:config | С = about:support | П = about:about";

this.onclick = function(event) {
    if(event.button == 2) {
// ПКМ
 getBrowser (). selectedTab = getBrowser (). addTab ("about:about");
    }
    else if(event.button == 1) {
// СКМ
 getBrowser (). selectedTab = getBrowser (). addTab ("about:support");
    }
    else if(event.button == 0) {
// ЛКМ
 getBrowser (). selectedTab = getBrowser (). addTab ("about:config");
    }
};
Saenko пишет

где-то попадалась кнопка для всех about-ов

Вот еще одна

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EAbout%3A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADC0lEQVQ4jX1TXUhTARj9iJCI6LGiJ+uhP3uICHuohygIiQr6ESoiiKKkiDK0h1Ja0g+mYsuyHzPbBg3vmlttbrapU++dOfe/dLnd6U1rm6mb1la3WtvpoYhM6byf833f+c4hmgUOh2O+x+PZbLM5d1qtPYfz8/OziIg0GtP2xwr1eiKaMxvvD+x2+9qpqSkkk0kMBEIpIlrIMIY14cgHMRz+AIfLP15Tq6iYISQIwhIiolaWXZ5IJAEA/jfBWE5OzgKvL/AKADKZDAK8IB4vKNo6jfzli3hjaCiaajFz55RK5dJYfBIA4PX1D6u1poui+BWp1A+MjcUhKas6P2Ntny9kZrtew+3hMfkxEY5Ex5DJZPC6nwcfGkEyISIW+4SH9Y2NRDR3hoBc3rTW4+VT6XQaXHs7gvwwkkkRg0PvMTH+EdFoHM1G67e8vAPZsxonCO/Xff+eShsZBcYMJXA4/RiNxuFyBTAwMAI+GEZbuxOFxVWKacTR0fHdocF3auFtVJiMx9AjWQn45ejscoLnwzCZbdA874DbFUJvbwDXy+Uprtvz0tBiLZdcu7uOPD6+3uXkEYlOgPe7EalbCHRthMHwi9Sk6cBIzxkwjAkc2wej0YZGVSvi8U8oOFV2gdTqlkMyha5Zq++MhYffglctBnw5UDNPYOX6IJMbkJ7IhalFCpPJAY7tQ+19DUqv3ON37D6Z9+eUq1fv5fbY+tNefSHE8DIoG2Xg2D7UN+jxOVmN8UAe7kgfob3NjQaZAfmHihv+MTGy6pnWIlosLthfXILy1kHoFdtgUa9GwLwcnFaK+oZmFF2UWjdt2bdh2istFstcry9kf9Xdj5raZ5DWqNJ6fTdYkxmsuQ06XTeqbzO4WaFAs5ETsrOz502brtPp5jdpO2yMqiNdWFz+IHfzjhXVNU81l6/UoVTyAPsPnC2RKV5UeLxBWDpd2LP/zN4ZOSgokiw6crR4J/0uiN7InnC7g2BUrQkiWkBEdPSkpGTX3tPniChr1jD9jcrKx2vKrj1UHSu4XEf/qe9PQrcUGXGfapEAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%28Mouse%20Click%20settings%29%20.......................................................%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20getBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%20%28%22about%3Aconfig%22%29%3B%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20//%20%u0437%u0430%u043F%u043E%u043C%u043D%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%20%u0438%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20....%0A%20%20%20%20%20%20%20%20%20%20var%20clip%20%3D%20gClipboard.read%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20window.content.focus%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20goDoCommand%28%22cmd_copy%22%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%0A%0A%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%20%27about%3Aconfig%27%20%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20//%20o%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%20%u0436%u0434%u0435%u0442%20%u043F%u043E%u043A%u0430%20%u043E%u0442%u043A%u0440%u043E%u0435%u0442%u0441%u044F%20%22about%3Aconfig%22%2C%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%20%u0438%20%u0443%u0434%u0430%u043B%u044F%u0435%u0442%20%u0441%u0435%u0431%u044F%20....%0A%20%20%20%20%20%20%20%20%20%20gBrowser.addEventListener%28%22pageshow%22%2C%20function%28e%29%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.removeEventListener%28%22pageshow%22%2C%20arguments.callee%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content.document.getElementById%28%22textbox%22%29.value%20%3D%20gClipboard.read%28%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content.document.getElementById%28%22textbox%22%29.doCommand%28%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20clip%20%29%20gClipboard.write%28%20clip%20%29%3B%20//%20%u0432%u0435%u0440%u043D%u0443%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u0431%u0443%u0444%u0435%u0440%20%u043E%u0431%u043C%u0435%u043D%u0430%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%0A%7D%3B%0A%0A%20%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20..............................................................................................%0Athis.ss%20%3D%20%5B%0A%20%20%20%20%20%7B%20label%3A%22%u0412%u0441%u0435%20about%3A%22%2C%20value%3A%20%27about%3Aabout%27%7D%2C%0A%20%20%20%20%20%7B%20label%3A%22%u041E%20%u043F%u043B%u0430%u0433%u0438%u043D%u0430%u0445%22%2C%20value%3A%20%27about%3Aplugins%27%7D%2C%0A%20%20%20%20%20%7B%20label%3A%22%u041D%u043E%u0432%u0430%u044F%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%22%2C%20value%3A%20%27about%3Anewtab%27%7D%2C%0A%20%20%20%20%20%7B%20label%3A%22%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u0430%u043A%20%u0442%u0430%u0431%22%2C%20value%3A%20%27about%3Apreferences%27%7D%2C%0A%20%20%20%20%20%7B%20label%3A%22%u0418%u043D%u0444%u043E%u0440%u043C%u0430%u0446%u0438%u044F%20%u043E%20%u043A%u044D%u0448%u0435%22%2C%20value%3A%20%27about%3Acache%27%7D%2C%20%20%20%0A%20%20%20%20%20%7B%20label%3A%22%u0412%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u0441%u0435%u0441%u0441%u0438%u0438%22%2C%20value%3A%20%27about%3Asessionrestore%27%7D%2C%0A%20%20%20%20%20%7B%20label%3A%22%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u0438%u044F%u043C%u0438%22%2C%20value%3A%20%27about%3Apermissions%27%7D%2C%0A%20%20%20%20%20%7B%20label%3A%22%u0418%u043D%u0444%u043E%u0440%u043C%u0430%u0446%u0438%u044F%20%u0434%u043B%u044F%20%u0440%u0435%u0448%u0435%u043D%u0438%u044F%20%u043F%u0440%u043E%u0431%u043B%u0435%u043C%22%2C%20value%3A%20%27about%3Asupport%27%7D%2C%0A%20%20%20%20%20%7B%20label%3A%22%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C%20%u0438%u0441%u043F%u043B%u044A%u0437%u043E%u0432%u0430%u043D%u0438%u0435%20%u043F%u0430%u043C%u044F%u0442%u0438%20%u043F%u043E%u0434%u0440%u043E%u0431%u043D%u043E%22%2C%20value%3A%20%27about%3Amemory%27%7D%0A%20%20%20%20%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%0Athis.mObj%20%3D%20custombuttons.getCbContextObj%28this%29%3B%0Athis.init%20%3D%20function%28x%29%20%7B%0A%20%20%20x.mObj.setSub%28%29%3B%0A%20%20%20var%20nItem%20%3D%20%7B%7D%2C%20mItem%20%3D%20%7B%7D%3B%0A%20%20%20document.getElementById%28CB2const.sCBCtxtMenu%29.setAttribute%28%22oncommand%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%20%20%20for%20%28%20var%20i%20in%20x.ss%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20nItem%20%3D%20new%20x.mObj.getItem%28%29%3B%0A%20%20%20%20%20%20%20%20%20nItem.label%20%3D%20x.ss%5Bi%5D.label%3B%0A%20%20%20%20%20%20%20%20%20if%20%28%20nItem.label%20%3D%3D%20%22separator%22%20%29%20var%20nItem%20%3D%20document.createElement%28%22menuseparator%22%29%3B%0A%20%20%20%20%20%20%20%20%20var%20mItem%20%3D%20x.mObj.insertBefore%28nItem%2C%20x.mObj.oMenu.lastChild%29%3B%0A%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27onclick%27%2C%20%27getBrowser%28%29.selectedTab%20%3D%20getBrowser%28%29.addTab%28%22%27%20+%20x.ss%5Bi%5D.value%20+%20%27%22%29%27%29%3B%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%7D%3B%20%20%20%0A%20%20%20x.mObj.getItem%28%29%3B%0A%20%20%20nItem%20%3D%20x.mObj.getItem%28%29%3B%0A%20%20%20this.separator%20%3D%20x.mObj.insertBefore%28%20nItem%20%2C%20x.mObj.oMenu.lastChild%29%3B%0A%7D%3B%0Athis.init%28this%29%3B%0A%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u043A%u043D%u043E%u043F%u043A%u0438%20............................................................................................%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%27about%3Aconfig%27%20%u0441%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u043E%u0439%20%28%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0439%20%u0438%u043B%u0438%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%29%5Cn%u0421%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%27about%3Aconfig%27%5Cn%u041F%3A%20%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C%20%u0432%u0441%u0435%20about%3A%22%3B%20%20%20%0A%0A%0A%0A//%20%u0414%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0432%20%u043C%u0435%u043D%u044E%20About%3Aconfig%20%u043F%u0443%u043D%u043A%u0442%20%22%u041A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0434%u043B%u044F%20user.js%22%20........................................................................................%0AAboutConfigMultipleSelection%20%3D%20ACMS%20%3D%20%7B%0A%0A%09get%20isThunderbird%28%29%20%7B%0A%09%09return%20Services.appinfo.ID%20%3D%3D%3D%20%22%7B3550f703-e582-4d05-9a08-453d09bdfdc6%7D%22%3B%0A%09%7D%2C%0A%0A%09Init%3A%20function%28%29%20%7B%0A%09%09if%20%28ACMS.isThunderbird%29%0A%09%09%09Services.obs.addObserver%28ACMS.Observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%09%09window.addEventListener%28%27DOMContentLoaded%27%2C%20ACMS.Listener%2C%20true%29%3B%0A%0A%09%09addDestructor%28function%28aReason%29%20%7B%0A%09%09%09if%20%28aReason%20%3D%3D%3D%20%22delete%22%20%7C%7C%20aReason%20%3D%3D%3D%20%22update%22%29%20%7B%0A%09%09%09%09if%20%28ACMS.isThunderbird%29%0A%09%09%09%09%09Services.obs.removeObserver%28ACMS.Observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%09%09%09%09window.removeEventListener%28%27DOMContentLoaded%27%2C%20ACMS.Listener%2C%20true%29%3B%0A%09%09%09%7D%0A%09%09%7D%29%3B%0A%09%7D%2C%0A%0A%09Observer%3A%20%7B%0A%09%09observe%3A%20function%28aSubject%2C%20aTopic%2C%20aData%29%20%7B%0A%09%09%09aSubject.addEventListener%28%27load%27%2C%20ACMS.Listener%2C%20true%29%3B%0A%09%09%7D%2C%0A%0A%09%09handleEvent%3A%20function%28aE%29%20%7B%0A%09%09%09aE.target.defaultView.removeEventListener%28%22load%22%2C%20ACMS.Listener%2C%20false%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%0A%09Listener%3A%20function%28aE%29%20%7B%0A%09%09var%20doc%20%3D%20aE.target%2C%0A%09%09%09win%3B%0A%09%09if%20%28ACMS.isThunderbird%20%26%26%20%28%21doc%20%7C%7C%20%21doc.location.href.startsWith%28%27chrome%3A//global/content/config.xul%27%29%29%29%0A%09%09%09return%3B%0A%09%09else%20if%20%28%21ACMS.isThunderbird%20%26%26%20%28%21doc%20%7C%7C%20%21doc.location.href.startsWith%28%27about%3Aconfig%27%29%29%29%0A%09%09%09return%3B%0A%09%09if%20%28%21doc.getElementById%28%27configTree%27%29%29%0A%09%09%09return%3B%0A%0A%09%09doc.getElementById%28%27configTree%27%29.setAttribute%28%27seltype%27%2C%20%27multiple%27%29%3B%0A%09%09win%20%3D%20doc.defaultView%3B%0A%0A%09%09var%20contextMenu%20%3D%20doc.getElementById%28%27configContext%27%29%2C%0A%09%09%09mItem%20%3D%20contextMenu.insertBefore%28doc.createElement%28%27menuitem%27%29%2C%20doc.getElementById%28%27copyValue%27%29.nextSibling%29%3B%0A%09%09mItem.id%20%3D%20%27copyAsFunction%27%3B%0A%09%09mItem.setAttribute%28%27label%27%2C%20%27%u041A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0434%u043B%u044F%20user.js%27%29%3B%0A%09%09mItem.setAttribute%28%27accesskey%27%2C%20%27u%27%29%3B%0A%09%09mItem.setAttribute%28%27oncommand%27%2C%20%27copyAsFunction%28%29%3B%27%29%3B%0A%0A%09%09win.getSelected%20%3D%20function%28%29%20%7B%0A%09%09%09var%20arr%20%3D%20%5B%5D%2C%0A%09%09%09%09i%20%3D%200%2C%0A%09%09%09%09k%20%3D%200%2C%0A%09%09%09%09j%20%3D%20win.view.selection.getRangeCount%28%29%2C%0A%09%09%09%09start%20%3D%20%7B%7D%2C%0A%09%09%09%09end%20%3D%20%7B%7D%3B%0A%09%09%09for%20%28i%3B%20i%20%3C%20j%3B%20i++%29%20%7B%0A%09%09%09%09win.view.selection.getRangeAt%28i%2C%20start%2C%20end%29%3B%0A%09%09%09%09for%20%28k%20%3D%20start.value%3B%20k%20%3C%3D%20end.value%3B%20k++%29%20%7B%0A%09%09%09%09%09arr.push%28win.gPrefView%5Bk%5D%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09return%20arr%3B%0A%09%09%7D%3B%0A%0A%09%09win.ResetSelected%20%3D%20function%28%29%20%7B%0A%09%09%09win.getSelected%28%29.forEach%28function%28i%29%20%7B%0A%09%09%09%09win.gPrefBranch.clearUserPref%28i.prefCol%29%3B%0A%09%09%09%7D%29%0A%09%09%7D%3B%0A%0A%09%09win.copyPref%20%3D%20function%28%29%20%7B%0A%09%09%09var%20arr%20%3D%20%5B%5D%3B%0A%09%09%09win.getSelected%28%29.forEach%28function%28i%29%20%7B%0A%09%09%09%09arr.push%28i.prefCol%20+%20%27%3B%27%20+%20i.valueCol%29%3B%0A%09%09%09%7D%29%3B%0A%09%09%09win.gClipboardHelper.copyString%28arr.join%28%27%5Cn%27%29%2C%20document%29%3B%0A%09%09%7D%3B%0A%0A%09%09win.copyName%20%3D%20function%28%29%20%7B%0A%09%09%09var%20arr%20%3D%20%5B%5D%3B%0A%09%09%09win.getSelected%28%29.forEach%28function%28i%29%20%7B%0A%09%09%09%09arr.push%28i.prefCol%29%3B%0A%09%09%09%7D%29%3B%0A%09%09%09win.gClipboardHelper.copyString%28arr.join%28%27%5Cn%27%29%2C%20document%29%3B%0A%09%09%7D%3B%0A%0A%09%09win.copyValue%20%3D%20function%28%29%20%7B%0A%09%09%09var%20arr%20%3D%20%5B%5D%3B%0A%09%09%09win.getSelected%28%29.forEach%28function%28i%29%20%7B%0A%09%09%09%09arr.push%28i.valueCol%29%3B%0A%09%09%09%7D%29%3B%0A%09%09%09win.gClipboardHelper.copyString%28arr.join%28%27%5Cn%27%29%2C%20document%29%3B%0A%09%09%7D%3B%0A%0A%09%09win.copyAsFunction%20%3D%20function%28%29%20%7B%0A%09%09%09var%20arr%20%3D%20%5B%5D%3B%0A%09%09%09win.getSelected%28%29.forEach%28function%28i%29%20%7B%0A%09%09%09%09if%20%28i.typeCol%20%3D%3D%3D%2032%29%20%7B%0A%09%09%09%09%09arr.push%28%27user_pref%28%22%27%20+%20i.prefCol%20+%20%27%22%2C%20%22%27%20+%20i.valueCol%20+%20%27%22%29%3B%27%29%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09arr.push%28%27user_pref%28%22%27%20+%20i.prefCol%20+%20%27%22%2C%20%27%20+%20i.valueCol%20+%20%27%29%3B%27%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%29%3B%0A%09%09%09win.gClipboardHelper.copyString%28arr.join%28%27%5Cn%27%29%2C%20document%29%3B%0A%09%09%7D%3B%0A%09%7D%0A%7D%3B%0A%0AAboutConfigMultipleSelection.Init%28%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Ребятки, премного благодарен! :rock:

2All, turbot
Насчёт кнопки Sidebar Sites.
Как-то не заметил, когда она у меня перестала работать :( Может с обновлением до 48.0? Кто-нибудь может подтвердить?

toltec
У вас последняя версия? Я там правил и не раз. И у меня все работает. Даже на ночнушке. Обратите внимание, что сайты в справку теперь записываются по другому, в виде:

Выделить код

Код:

About About
about:about
chrome://mozapps/skin/places/defaultFavicon.png

Результаты поиска | Форум Mozilla Россия
https://forum.mozilla-russia.org/search.php?action=show_24h
https://forum.mozilla-russia.org/favicon.ico

Может в этом причина. Если у вас там есть ранее добавленные сайты без фавиконок, добавьте им вручную дефолтную иконку: chrome://mozapps/skin/places/defaultFavicon.png

turbot пишет

У вас последняя версия? Я там правил и не раз.

У меня кнопка работает. А вот попробовал обновить на последнюю версию, она стала не активной.
toltec
Попробуй, может и у тебя заработает.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESidebar%20Sites%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAiEAAAIhAENVwL6AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAHqSURBVHjarJM9aBVBFIW/s2wkgmDnDxoUgoJWokXERlEbf5pY2AhCCkWUgCaNvs3b2Z335lmZoETRINhKLPxD0CZgI0GtLFQUG8FGmxSBmBRzbSYSJE2IB4b5u/cMc+65MjOWYsT57cAVM9sL7AIi8EnSuxjjWKdV/Vgar0WCRrPqknQDuAB0AR+BsbS+DOwEfku6GWNsdFpV/EvQaFa5pElJ+8xsFlhrZn2dVvUrkW+R9Bb4CWyW9CrGONBpVTEHkDQK9JvZHNADzEv6WpQ16R6gG9gELJjZ2SzLvgNNXRtx2yR9AS5JOmJmfcAQy+Me8Bz4AFw3s95cUi8wHLy7X5T1LPA4ePdkueyirNcDM8G7p0VZr5G0Q41mdTB497oo6/3Bu+mirA+b2beUEwGyLMuTXj0p9kDw7k1R1kfVaFYvgUfA3VSBfqANXAUMyNPsgQ7wEJgAzgOnMuA2MJ4O7gCjwbtpYKOkBUDAuuDd+/TIOHBxMTYzsxfAieDdA+BY8G4qKT8QYxyWNCjpHICZPQOOB+8mgJPBu6lc0iFgNzAFbCjK+nTwbrJdl5//FVHSGWAmbfcUZT2/6jLKzCjK+hYwCMwlw8ynsRTdydYLQLekdrsum3n625CkrSuw8mSM0f2/ZlpNO/8ZAGBFAEu2Gqq+AAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*%20https%3A//forum.mozilla-russia.org/viewtopic.php%3Fpid%3D717296%23p717296*/%0Avar%20menuPopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%2C%0A%20%20%20%20help%20%3D%20self.Help%3B%0A%0Afor%20%28var%20item%20of%20help.split%28%27%5Cn%5Cn%27%29%29%20%7B%0A%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%2C%0A%20%20%20%20%20%20params%20%3D%20item.split%28%27%5Cn%27%29%2C%0A%20%20%20%20%20%20title%20%3D%20params%5B0%5D%2C%0A%20%20%20%20%20%20url%20%3D%20params%5B1%5D%3B%0A%20%20mItem.setAttribute%28%27label%27%2C%20title%29%3B%0A%20%20mItem.setAttribute%28%27oncommand%27%2C%20%27openWebPanel%28%22%27%20+%20title%20+%20%27%22%2C%20%22%27%20+%20url%20+%20%27%22%29%27%29%3B%0A%20%20mItem.setAttribute%28%27oncontextmenu%27%2C%20%27this.parentNode.parentNode.removePage%28%22%27%20+%20title%20+%20%27%22%2C%20%22%27%20+%20url%20+%20%27%22%29%3B%27%29%3B%0A%20%20menuPopup.appendChild%28mItem%29%3B%0A%7D%3B%0AmenuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0Avar%20addMItem%20%3D%20menuPopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0AaddMItem.setAttribute%28%27label%27%2C%20%27%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u0441%u0430%u0439%u0442%27%29%3B%0AaddMItem.setAttribute%28%27oncommand%27%2C%20%22this.parentNode.parentNode.addPage%28%29%3B%22%29%3B%0AmenuPopup.setAttribute%28%27context%27%2C%20%27%27%29%3B%0A%0Athis.addPage%20%3D%28%29%3D%3E%20%7B%0A%20%20var%20newItem%20%3D%20%5B%2C%2Cwindow.content.document.title%2C%20window.content.document.location%5D.join%28%27%5Cn%27%29%2C%0A%20%20%20%20%20%20link%20%3D%20custombuttons.makeButtonLink%28%22edit%22%2C%20_id%29%2C%0A%20%20%20%20%20%20param%20%3D%20custombuttons.cbService.getButtonParameters%28link%29%3B%0A%20%20param%20%3D%20param.wrappedJSObject%20%7C%7C%20param%3B%0A%20%20param.help%20%3D%20param.help%20+%20newItem%3B%0A%20%20custombuttons.cbService.installButton%28param%29%3B%0A%7D%3B%0A%0Athis.removePage%20%3D%28aTitle%2C%20aURL%29%3D%3E%20%7B%0A%20%20var%20itemsToRemove%20%3D%20%5B%5D%2C%0A%20%20%20%20%20%20link%20%3D%20custombuttons.makeButtonLink%28%22edit%22%2C%20_id%29%2C%0A%20%20%20%20%20%20param%20%3D%20custombuttons.cbService.getButtonParameters%28link%29%3B%0A%20%20param%20%3D%20param.wrappedJSObject%20%7C%7C%20param%3B%0A%20%20itemsToRemove.push%28%5B%2C%2CaTitle%2C%20aURL%5D.join%28%27%5Cn%27%29%2C%20%5BaTitle%2C%20aURL%2C%2C%2C%5D.join%28%27%5Cn%27%29%29%3B%0A%20%20for%20%28var%20item%20of%20itemsToRemove%29%0A%20%20%20%20param.help%20%3D%20param.help.replace%28item%2C%20%27%27%29%3B%0A%20%20custombuttons.cbService.installButton%28param%29%3B%0A%7D%3B%0A%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20if%20%28e.target%20%21%3D%3D%20this%29%20return%3B%0A%20%20var%20cl%20%3D%20gClipboard.read%28%29%3B%0A%20%20if%20%28e.button%20%3D%3D%200%29%0A%20%20%20%20openWebPanel%28window.content.document.title%2C%20window.content.document.location%29%3B%0A%20%20if%20%28e.button%20%3D%3D%201%29%0A%20%20%20%20openWebPanel%28cl%2C%20cl%29%3B%0A%20%20if%20%28e.button%20%3D%3D%202%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%29%0A%20%20%20%20e.preventDefault%28%29%2C%20e.stopPropagation%28%29%2C%20menuPopup.openPopup%28this%2C%20%27after_start%27%29%3B%0A%7D%3B%0A%0Athis.tooltipText%20%3D%20%27%u041B%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%5Cn%u0421%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%5Cn%u041F%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u0441%u043E%20%u0441%u043F%u0438%u0441%u043A%u043E%u043C%20%u0437%u0430%u0434%u0430%u043D%u043D%u044B%u0445%20%u0430%u0434%u0440%u0435%u0441%u043E%u0432%27%3B%0A%0A%28contextMenu%20%3D%3E%20%7B%0A%20%20var%20menuitem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%0A%20%20menuitem.id%20%3D%20%22open-in-sidebar%22%3B%0A%20%20menuitem.setAttribute%28%22label%22%2C%20%22Open%20in%20Sidebar%22%29%3B%0A%20%20menuitem.setAttribute%28%22oncommand%22%2C%20%22openWebPanel%28gContextMenu.getLinkURL%28%29%2C%20gContextMenu.getLinkURL%28%29%29%22%29%3B%0A%20%20contextMenu.insertBefore%28menuitem%2C%20document.getElementById%28%22context-sep-open%22%29%29%3B%0A%0A%20%20addEventListener%28%22popupshowing%22%2C%20%28%29%3D%3E%20menuitem.hidden%20%3D%20%21gContextMenu.onLink%2C%20false%2C%20contextMenu%29%3B%0A%20%20addDestructor%28%28%29%3D%3E%20contextMenu.removeChild%28menuitem%29%29%3B%0A%7D%29%28document.getElementById%28%22contentAreaContextMenu%22%29%29%3B%0A%0A%28sidebarWindow%20%3D%3E%20%7B%0A%20%20addEventListener%28%27click%27%2C%20e%3D%3E%20%7B%0A%20%20%20%20var%20webPanel%20%3D%20sidebarWindow.contentDocument.getElementById%28%22web-panels-browser%22%29%3B%0A%20%20%20%20if%20%28%21webPanel%29%20return%3B%0A%20%20%20%20var%20sidebarDoc%20%3D%20webPanel.contentDocument%3B%0A%20%20%20%20if%20%28%21%28sidebarDoc%0A%20%20%20%20%20%20%20%20%20%20%26%26%20%28sidebarDoc.location.protocol%20%3D%3D%20%22http%3A%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20sidebarDoc.location.protocol%20%3D%3D%20%22https%3A%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20sidebarDoc.location.protocol%20%3D%3D%20%22ftp%3A%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20sidebarDoc.location.protocol%20%3D%3D%20%22ftps%3A%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20sidebarDoc.location.protocol%20%3D%3D%20%22file%3A%22%29%29%29%20return%3B%0A%20%20%20%20let%20link%20%3D%20e.originalTarget%3B%0A%20%20%20%20while%20%28link%20%26%26%20link.tagName.toLowerCase%28%29%20%21%3D%20%27a%27%20%26%26%20link.src%29%20link%20%3D%20link.parentNode%3B%0A%20%20%20%20if%20%28%21%28link%20%26%26%20link.href%20%26%26%20%21%28sidebarDoc.location.protocol%20%3D%3D%20%22file%3A%22%20%26%26%20link.className%20%3D%3D%20%27file%27%29%29%29%20return%3B%0A%20%20%20%20link.target%20%3D%20%22_self%22%3B%0A%20%20%7D%2C%20true%2C%20sidebarWindow%29%0A%7D%29%28document.getElementById%28%22sidebar%22%29%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%0ASidebar%20-%20Mozilla%20%7C%20MDN%0Ahttps%3A//developer.mozilla.org/en-US/Add-ons/Code_snippets/Sidebar%0A%0ACreating%20a%20Firefox%20sidebar%20-%20Mozilla%0Ahttps%3A//developer.mozilla.org/en-US/docs/Mozilla/Creating_a_Firefox_sidebar%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

voqabuhe
toltec
Custom Buttons должен быть исправленным. Иначе все кнопки, берущие код с вкладки "Help", работать не будут. Если неохота заморачиваться с отключением проверки подписей расширений, то можно временно сами кнопки так исправить, пока автор аддон не починит.
И повторюсь, проверьте содержимое "Help", все сайты должны разделятся пустой строкой и иметь три строки: название, адрес, иконка.

Я проверил на чистой 48-ой с отключенной проверкой расширений и поправленным аддоном - все работает. idontnow.gif

turbot пишет

то можно временно сами кнопки так исправить, пока автор аддон не починит.

Вроде так тоже работает:

Выделить код

Код:

custombutton.buttonGetHelp(self);
turbot пишет

И повторюсь, проверьте содержимое "Help", все сайты должны разделятся пустой строкой и иметь три строки: название, адрес, иконка.

Спасибо, теперь работает.

turbot
Поставил исправленный Custom Buttons и поменял фавиконки. Заработало, спасибо

bunda1
Здравствуйте, есть кнопка блокнот во вкладке очень удобно использовать, но у меня вопрос как сохранить инфу в текстовый файл?  то есть все заметки которые занесены сохранить в текстовый файл спасибо. Я в меню не нашол.

broker
Нажать Ctrl + S

broker пишет

bunda1
Здравствуйте, есть кнопка блокнот во вкладке очень удобно использовать, но у меня вопрос как сохранить инфу в текстовый файл?  то есть все заметки которые занесены сохранить в текстовый файл спасибо. Я в меню не нашол.

Есть такая кнопка Save которая добавляет в контекстное меню пункт для сохранения текста в текстовый файл или даёт возможность сохранить текст из меню самой кнопки Save.

bunda1
xrun1
Здравствуйте, спасибо за подсказки но кнопка save  у меня есть и она сохраняет с текстом и ище код какой то вот пример.

Выделить код

Код:

data:text/html;base64,PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz48dGl0bGU+Tm90ZXBhZDwvdGl0bGU+CjxoZWFkPgogPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsQUFBQkFBRUFFUkVBQUFFQUlBRHdCQUFBRmdBQUFDZ0FBQUFSQUFBQUlnQUFBQUVBSUFBQUFBQUF5QVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVCQWdBQUFBQXBLU2xSUmtaR2gwQkFRSHhCUVVGK1FVRkJma0ZCUVg1QlFVRitRRUJBZkVaR1JvZ2FHaG8xQUFBQUFBQUJBQUVDQWdJQ0FnSUNBZ1FFQkFVQUFBQUFNVEV3V2VMaTRmLy8vLy8vK3ZyNi8vcjYrdi82K3ZyLy9QejgvL3Y3Ky8vNStmbisrL3Y3LzdDd3NQZE5UVTJoQVFFQkFnQUFBQUFBQUFBQUF3TURCQUFBQUFCdmJtK3g4dkh5LytEZjRQZmk0K1A3NnVicisrTGg0dnZrNU9UNy9mMzkrLy8vLy92Ly8vLzc3L0R2L2F5c3JQOEJFQUVsS25nbnhEQ0RMZEV2Z1N6T0xYOHF5MEdUUHUxWnExYi9XYXRXL2xhc1UvOW9wMmYveGNQRi84UEV3Ly9pNStMLzh2ZngvL0gyNy8vcDYrbi9xcXFxL0VTYVFPUzY3YTcvdGVpcC9yYnBxdiszNnF2L3N1U20vNnpmb1ArczM2RC90ZU9vLzRiTmZQOTNzM2IvMzliZi85WFkxZi81L1BqLytQdjIvK3ZzNi8rcXFhci9UNlJLOGJ2anNQNnQycVQ4c055bS9MRGNwdnl4M2FmK3N0Nm8vN0xlcVArdzNhYi92dWF6LzFtcVZQKzJ3N2IvM2R2ZC8vRDA3Ly80Ky9mLzYrenIvNnFxcXY4Qk53RnZuZGlVLzhEanQveTM0YS8vdWVHdy83bmhzUCs1NGJEL3VlR3cvN2pnci8vQjVMai9tdFNTLzNxMWV2L1d6TmIvNHVmaC8vZjc5Zi9wNituL3FxcXEvd0FBQUFOSGswUGJ6dS9GLzczZ3RQM0E0N2Yvd09PMy84RGp0Ly9BNDdmL3dPTzQvNzNpdGYvRDVybi9ZN0plLzcvTXdQL2s0ZVAvK2YzNS8rdnM2LytxcXFyL0FBQUFBQUF6QUdhcDRLUC96ZWJHKzhUa3Z2L0c1Yi8veHVTLy84Ymx2Ly9GNWI3L3Z1SzIvOExrdVArVTBZdi9aYUJsLzk3VzN2L3U5ZTMvNiszci82cXFxdjhEQVFNQUFBQUFCRTZYUytEYjhkVC95dVBEL2N6bXh2L041c2Yvek9iRy84Ymx2Ly9BNDdqL3QrQ3UvN3Zqc1A5bnVXUC91TVc1Lyt6cjYvL3M3K3ovcWFtcS93QUNBQVFBQUFBQUFUUUJaclRpci8vYTZkWDcwdWZOLzlQb3p2L041c2YveHVTLy84RGp0Lys0NEsvL3UrT3cvNHpOZ3Y5dXFXNy82K1RyLytydTZ2K3FxYXIvQUFBQUFRTUJBd0FBQUFBSFZKaFMyT3IyNXYvVzU5TDkxT2pQLzh6bXh2L0c1Yi8vd09PMy83cmhzUCt3M2FiL3R1U3AvMWlzVS8rdnZhLy82K3JxLzZxcXF2OEFBQUFBQVFJQkF3QUFBQUFFTlFSa3YrUzcvK1ByM3Z2UjU4ei96T2JHLzhia3YvKy80cmYvdWVDdy83SGVwLyt6NEtmL2g4MTgvM0t1Y3YvcjR1di9xS3FvL2dBQUFBQUFBQUFCQXdFREFBQUFBQXBWbDFUVTdQYm8vOUhselAzUDU4ai94dVMvLzhManVmKzY0YkgvczkrcC82dmNvUCt0NEtEL1dxNVUvOGJTeC8yM3RMZjlBQUFBQUFBQUFBQUJBZ0VEQUFBQUFBazNDV2FxMzZiLzF1blIrY0xqdlB6RjVyNzh0K0N2L0xYZ3JQMnczNmI4b2RtVy9LemduLzF5eEdmN2dMS0EvNTJTbmUwQUFBQUFBQUFBQUFBQUFBRUNBUUlBQUFFQURVT0NRY2R3dDIzL1phdGk4MkdyWHZWanJXRDRYS2xZOUZxcFZ2WmFxbFgzVXFaTjgxT25UdnhZYkZuZEd4Y2JOQUFBQUFBQUFBQUFBQUFBQUFBQkFRRUFBQUFBRkJBVUhUQXpNR2NxS2lwUkpTY2xVUzh3TDE0bkp5Wk5LQ3NwVnk0dUxsc2lKQ0pLTmpVMmFRUUFCQU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9InR5cGU9ImltYWdlL3gtaWNvbiI+CjwvaGVhZD4KCjxURVhUQVJFQT48L1RFWFRBUkVBPgo8c3R5bGU+CgpodG1sIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsKICBvdmVyZmxvdzogaGlkZGVuOwp9CnRleHRhcmVhIHsKICBiYWNrZ3JvdW5kOiAjMzgzODM4OwogIG92ZXJmbG93LXk6IGF1dG87CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIGJvcmRlci1yYWRpdXM6IDJweDsKICBib3JkZXI6IDJweCBpbnNldCB3aGl0ZTsKICBjb2xvcjogMTk4Mzg0OwogIGZvbnQtZmFtaWx5OiBhcmlhbDsKZm9udC1zaXplOiAxMnB0Cn0KPC9zdHlsZT4K

Сохранить ярлык страницы как… - сохраняет закладку текущей страницы с ярлыком сайта, иконки для ярлыков хранятся в папке C:\Documents and Settings\Favicon\,
Сохранить ярлык страницы без запроса на сохранение- сохраняет закладку текущей страницы с ярлыком сайта в последнюю папку где сохранялся ярлыком сайта без запроса на место сохранения, иконки для ярлыков хранятся в папке C:\Documents and Settings\Favicon\,
Сохранить значок веб-сайта- дает возможность сохранить значок веб-сайта с диалогом сохранения,
Запомнить значок веб-сайта как base64- сохраняет иконку сайта в буфере обмена как код base64.
Сохранить выбранную область страницы как PNG - сохраняет выделенную область страницы как PNG-изображение,
Сохранить фрейм на странице как PNG - сохраняет фреймы на странице как PNG-изображение,
Сохранить видимую часть страницы как PNG - сохраняет видимую область страницы как PNG-изображение,
Сохранить всю страницу как PNG - сохраняет страницу как  PNG-изображение(делает скриншот страницы), не сохранит всю страницу если страница слишком большая но сохранит часть страницы,
Сохранить всю страницу как PDF - сохраняет страницу как PDF файл, через сервис http://pdfmyurl.com./,
Добавить url и сохранить страницу - добавляет вверху странички ссылку на её адрес и вызывает диалог сохранения странички.
Сохранить выделенный текст как txt файл - добавляет вверху странички ссылку на её адрес, сохраняет выделенный текст в текстовой txt файл, если текст не выделен сохраняет весь текст на странице в txt файл,
Запомнить изображение как base64, в контекстном меню -  добавляет в контекстного меню изображений новый пункт 'Запомнить изображение как base64',
Сохранить выделенный текст в файл, в контекстном меню - добавляет в контекстного меню выделенного текста новый пункт 'Сохранить выделенный текст в файл'. Новый пункта позволяет сохранить выделенный текст в .txt файл на рабочем столе без запроса и с добавлением текста к тексту который уже был сохранен ранее,
Открыть выделенный текст в внешнем редакторе, в контекстном меню - добавляет в контекстного меню выделенного текста новый пункт 'Открыть выделенный текст в внешнем редакторе'. Новый пункта позволяет открыть выделенный текст из страницы или текстового поля в внешнем текстовом редакторе, который у вас по умолчанию открывает теkстовые(.txt) файлы.

Дополнительные возможности;
Если нажать правой клавишей мыши пункт Сохранить изображение как… в контекстном меню изображений на странице, изображение будет сохранено как base64 код в буфере обмена. Это очень удобно когда ищешь иконки для CB кнопок.


ЛКМ => Открыть меню кнопки.

Если через ctrl+S сохраняет без кода но всегда нужно вибирать сохранить в тхт.  Хотел нажать и сохранить .

Мастер bunda1 посмотрите кнопку save
Постоянно сохраняет какой то код даже если сохраняю пустой без текста. вот тот код он всегда в шапке.

Выделить код

Код:

data:text/html;base64,PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz48dGl0bGU+Tm90ZXBhZDwvdGl0bGU+CjxoZWFkPgogPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsQUFBQkFBRUFFUkVBQUFFQUlBRHdCQUFBRmdBQUFDZ0FBQUFSQUFBQUlnQUFBQUVBSUFBQUFBQUF5QVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVCQWdBQUFBQXBLU2xSUmtaR2gwQkFRSHhCUVVGK1FVRkJma0ZCUVg1QlFVRitRRUJBZkVaR1JvZ2FHaG8xQUFBQUFBQUJBQUVDQWdJQ0FnSUNBZ1FFQkFVQUFBQUFNVEV3V2VMaTRmLy8vLy8vK3ZyNi8vcjYrdi82K3ZyLy9QejgvL3Y3Ky8vNStmbisrL3Y3LzdDd3NQZE5UVTJoQVFFQkFnQUFBQUFBQUFBQUF3TURCQUFBQUFCdmJtK3g4dkh5LytEZjRQZmk0K1A3NnVicisrTGg0dnZrNU9UNy9mMzkrLy8vLy92Ly8vLzc3L0R2L2F5c3JQOEJFQUVsS25nbnhEQ0RMZEV2Z1N6T0xYOHF5MEdUUHUxWnExYi9XYXRXL2xhc1UvOW9wMmYveGNQRi84UEV3Ly9pNStMLzh2ZngvL0gyNy8vcDYrbi9xcXFxL0VTYVFPUzY3YTcvdGVpcC9yYnBxdiszNnF2L3N1U20vNnpmb1ArczM2RC90ZU9vLzRiTmZQOTNzM2IvMzliZi85WFkxZi81L1BqLytQdjIvK3ZzNi8rcXFhci9UNlJLOGJ2anNQNnQycVQ4c055bS9MRGNwdnl4M2FmK3N0Nm8vN0xlcVArdzNhYi92dWF6LzFtcVZQKzJ3N2IvM2R2ZC8vRDA3Ly80Ky9mLzYrenIvNnFxcXY4Qk53RnZuZGlVLzhEanQveTM0YS8vdWVHdy83bmhzUCs1NGJEL3VlR3cvN2pnci8vQjVMai9tdFNTLzNxMWV2L1d6TmIvNHVmaC8vZjc5Zi9wNituL3FxcXEvd0FBQUFOSGswUGJ6dS9GLzczZ3RQM0E0N2Yvd09PMy84RGp0Ly9BNDdmL3dPTzQvNzNpdGYvRDVybi9ZN0plLzcvTXdQL2s0ZVAvK2YzNS8rdnM2LytxcXFyL0FBQUFBQUF6QUdhcDRLUC96ZWJHKzhUa3Z2L0c1Yi8veHVTLy84Ymx2Ly9GNWI3L3Z1SzIvOExrdVArVTBZdi9aYUJsLzk3VzN2L3U5ZTMvNiszci82cXFxdjhEQVFNQUFBQUFCRTZYUytEYjhkVC95dVBEL2N6bXh2L041c2Yvek9iRy84Ymx2Ly9BNDdqL3QrQ3UvN3Zqc1A5bnVXUC91TVc1Lyt6cjYvL3M3K3ovcWFtcS93QUNBQVFBQUFBQUFUUUJaclRpci8vYTZkWDcwdWZOLzlQb3p2L041c2YveHVTLy84RGp0Lys0NEsvL3UrT3cvNHpOZ3Y5dXFXNy82K1RyLytydTZ2K3FxYXIvQUFBQUFRTUJBd0FBQUFBSFZKaFMyT3IyNXYvVzU5TDkxT2pQLzh6bXh2L0c1Yi8vd09PMy83cmhzUCt3M2FiL3R1U3AvMWlzVS8rdnZhLy82K3JxLzZxcXF2OEFBQUFBQVFJQkF3QUFBQUFFTlFSa3YrUzcvK1ByM3Z2UjU4ei96T2JHLzhia3YvKy80cmYvdWVDdy83SGVwLyt6NEtmL2g4MTgvM0t1Y3YvcjR1di9xS3FvL2dBQUFBQUFBQUFCQXdFREFBQUFBQXBWbDFUVTdQYm8vOUhselAzUDU4ai94dVMvLzhManVmKzY0YkgvczkrcC82dmNvUCt0NEtEL1dxNVUvOGJTeC8yM3RMZjlBQUFBQUFBQUFBQUJBZ0VEQUFBQUFBazNDV2FxMzZiLzF1blIrY0xqdlB6RjVyNzh0K0N2L0xYZ3JQMnczNmI4b2RtVy9LemduLzF5eEdmN2dMS0EvNTJTbmUwQUFBQUFBQUFBQUFBQUFBRUNBUUlBQUFFQURVT0NRY2R3dDIzL1phdGk4MkdyWHZWanJXRDRYS2xZOUZxcFZ2WmFxbFgzVXFaTjgxT25UdnhZYkZuZEd4Y2JOQUFBQUFBQUFBQUFBQUFBQUFBQkFRRUFBQUFBRkJBVUhUQXpNR2NxS2lwUkpTY2xVUzh3TDE0bkp5Wk5LQ3NwVnk0dUxsc2lKQ0pLTmpVMmFRUUFCQU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9InR5cGU9ImltYWdlL3gtaWNvbiI+CjwvaGVhZD4KCjxURVhUQVJFQT48L1RFWFRBUkVBPgo8c3R5bGU+CgpodG1sIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsKICBvdmVyZmxvdzogaGlkZGVuOwp9CnRleHRhcmVhIHsKICBiYWNrZ3JvdW5kOiAjMzgzODM4OwogIG92ZXJmbG93LXk6IGF1dG87CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIGJvcmRlci1yYWRpdXM6IDJweDsKICBib3JkZXI6IDJweCBpbnNldCB3aGl0ZTsKICBjb2xvcjogMTk4Mzg0OwogIGZvbnQtZmFtaWx5OiBhcmlhbDsKZm9udC1zaXplOiAxMnB0Cn0KPC9zdHlsZT4K
broker пишет

Мастер bunda1 посмотрите кнопку save

Ты пытаешся сохранить текст из вкладки которую открывает кнопка Блокнот в вкладке Опиши свои действия при сохранение текста кнопкой Save.

bunda1

ЛК мыши "блокнот во вкладке" открывается вкладка, жму на кнопку save выбираю Сохранить выделенный текст как тхт файл. Открывается диалоговое окно куда сохранить выбираю рабочий стол. Сохраняется текстовый файл false  00·29·10.txt. вот так не зависимо пустой блокнот или с инфой первые строки сохраняется какой то код ниже инфа.

broker пишет

bunda1
ЛК мыши "блокнот во вкладке" открывается вкладка, жму на кнопку save выбираю Сохранить выделенный текст как тхт файл. Открывается диалоговое окно куда сохранить выбираю рабочий стол. Сохраняется текстовый файл false  00·29·10.txt. вот так не зависимо пустой блокнот или с инфой первые строки сохраняется какой то код ниже инфа.

Понятно. Буду исправлять.

bunda1
Если из контекстного меню выбрать "сохранить выделенный текст в файл" все хорошо то есть без кода. [firefox]48 такой геморрой слов нет:mad: но зато HTML5 canvas performance test на 20 попугаев больше выдает и легче шевелиться на моем буке хз может плацебо:dumb:

и она сохраняет с текстом и ище код какой то

Этот код - адрес страницы. :) Да и поскольку еще и заголовка у страницы блокнота нет - заметка "false" называться будет. :) Замените в коде кнопки "Save+":

Выделить код

Код:

// создать название файла из заголовка страницы и текущего времени и сохранить текст ....
     var fileTitle = (getDocTitle() ? getDocTitle() : self.label) + '  ' + (new Date()).toLocaleFormat("%H·%M·%S");
     saveURL("data:text/plain," + encodeURIComponent((content.location.href.startsWith('data:') ? "" : (content.location.href + "\r\n\r\n")) + getSelect()), 
                                  fileTitle + ".txt", null, false, false, null, content.document);

turbot
Спасибо :D работает.

Уважаемый turbot, спасибо за Вашу "Раскукоживатель коротких ссылок(Firefox 24+), от 26.07.2016." - работает, как доктор прописал.
Но у меня есть несколько маленьких предложений.
1. Если сокращённая ссылка текст, а не линк (не кликабельна), то её надо выделять. Нельзя ли сделать, чтобы просто по клику - без выделения?
2. Нельзя ли добавить обратный сервис, т.е. скукоживатель с выбором скукоживателя (сократителя) в каскадном контекстном меню?
Спасибо

difabor
1. Наверное, нет. Если никто не подскажет, как сделать с минимальным ущербом для производительности. Там и так сомнительная конструкция, которая дергается на выделенном тексте, а если оно еще и вообще при каждом открытии меню будет...

(Кстати, Dumby, если не лень будет, не посмотрите, что более щадяще будет: текущая конструкция или такая:

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

Выделить код

Код:

((cntxtMenu, elm, mItem) => {
  mItem.id = "cb-unshorten-url";
  mItem.setAttribute("label", "Раскукожить ссылку");
  mItem.setAttribute("class", "menuitem-iconic");
  mItem.setAttribute("image", self.image);
  elm.parentNode.insertBefore(mItem, elm);

  const alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);

  var url, link, isUnshortened,
      // Сервисы сокращения ссылок. Можно добавлять свои. Работать, в теории, должно с любыми
      shortenerServices = [
        "tinyurl.com",
        "po.st",
        "img.ly",
        "bit.ly",
        "goo.gl",
        "youtu.be",
        "t.co",
        "db.tt",
        "u.to",
        "shortlinks.de"
      ],
      // Опции:
      options = {
        replaceShortenedLinks: true, // Заменять адрес ссылки на странице раскукоженной
        showAlert: true, // Показывать всплывающие уведомления
        clickAlertToOpen: true, // Клик по уведомлению с раскукоженной ссылкой - откроет ее в новой вкладке
        showOnShortenedTextLinks: true, // Показывать пункт контекстного меню на выделенных текстовых ссылках
        promptDialogForTextLinks: true, // Показывать диалог с результатом для текстовых ссылок
        copyToClipboard: true, // Копировать раскукоженную ссылку в буфер обмена
        changeColorForUnshortenedLinks: true, // Индикация цветом ссылки ожидания ответа и результата
        changeColorBackAfterTimeout: false, // Возвращать цвет ссылок к исходному, после паузы
        unshortenedLinksColor: "lightgreen" // Цвет раскукоженных ссылок
      },
      isFF32 = (parseFloat(Services.appinfo.platformVersion) >= 32);

  function isShortenedURL(aURL) {
    if (aURL && (gContextMenu && (gContextMenu.onLink && !gContextMenu.isTextSelected || gContextMenu.onPlainTextLink)
                 || !aURL.match(/\s/) && !!aURL.match(/\//))) {

      if (!aURL.startsWith('http')) aURL = 'http://' + aURL.split(/^((\w+)?:\/\/)?(.+)/)[3];

      var host = aURL.split(/http(s)?:\/\/([\w\.-]+)/)[2];

      if (shortenerServices.indexOf(host) !== -1) {
        url = aURL;
        return true;
      }
    }
    return false;
  };

  function promptDialog(aURL) {
    var input = {value: aURL};
    var prompt = Services.prompt.prompt(null, options.copyToClipboard ? "Раскукоженная ссылка скопирована!" : "Ссылка раскукожена!",
                                        "Отредактировать и открыть в новой вкладке?",
                                        input, null, {value: false});
    if (prompt)
      gBrowser.selectedTab = gBrowser.addTab(input.value);
  };

  function xhr(aURL, cb) {
    let reURL = null;
    let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
    let alertListener = {
      observe: function(aSubject, aTopic, aData) {
        if (aTopic != 'alertclickcallback') return;
        gBrowser.selectedTab = gBrowser.addTab(aData);
      }
    }

    let handler = ev => {
      evf(m => xhr.removeEventListener(m, handler, !1));
      switch (ev.type) {
        case 'load':
          if (xhr.status == 200 || (isFF32 ? xhr.responseURL : xhr.channel.URI.spec) != aURL) {
            reURL = isFF32 ? xhr.responseURL : xhr.channel.URI.spec;
            cb(reURL);
            options.showAlert && (options.clickAlertToOpen
                                  ? alertsService.showAlertNotification(self.image, self.label,
                                                                        'Ссылка раскукожена!\nНажмите, чтобы открыть в новой вкладке:\n' + (reURL.length > 100 ? ([reURL.slice(0,45), reURL.slice(-45)]).join('...') : reURL),
                                                                        true, reURL, alertListener, "")
                                  : alertsService.showAlertNotification(self.image, self.label,
                                                                        'Ссылка раскукожена:\n' + (reURL.length > 100 ? ([reURL.slice(0,45), reURL.slice(-45)]).join('...') : reURL),
                                                                        false, "", null, ""));
            break;
          }

        default:
          cb(reURL);
          options.showAlert && alertsService.showAlertNotification(self.image, self.label,
                                                                   'Ошибка при попытке получить ссылку: ' + xhr.statusText + ' [' + ev.type + ':' + xhr.status + ']',
                                                                   false, "", null, "");
          break;
      }
    };

    let evf = f => ['load', 'error', 'abort'].forEach(f);
    evf(m => xhr.addEventListener(m, handler, false));

    try {
      xhr.mozBackgroundRequest = true;
      xhr.open('HEAD', aURL, true);
      xhr.channel.loadFlags |= Ci.nsIRequest.LOAD_ANONYMOUS | Ci.nsIRequest.LOAD_BYPASS_CACHE | Ci.nsIRequest.INHIBIT_CACHING;
      xhr.setRequestHeader("User-Agent", "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)", false);
      xhr.setRequestHeader("Accept", "text/html,text/xml", false);
      xhr.send(null);
    }
    catch (ex) {
      cb(reURL);
      options.showAlert && alertsService.showAlertNotification(self.image, self.label,
                                                               'Неправильная ссылка: ' + (ex.toString().length > 100 ? ([ex.toString().slice(0,45), ex.toString().slice(-45)]).join('...') : ex.toString()),
                                                               false, "", null, "");
    }
  };

  function shouldDisplay() {
    mItem.label = "Раскукожить ссылку";

    if (gContextMenu.onLink && !gContextMenu.isTextSelected) {
      url = gContextMenu.getLinkURL();
      link = gContextMenu.link;
      isUnshortened = link.getAttribute("cb-short-url");
      if (isUnshortened) mItem.label = "Скукожить ссылку";
    }

    if (gContextMenu.onPlainTextLink) {
      url = gContextMenu.linkURL;
    }

    if (!gContextMenu.onPlainTextLink && gContextMenu.isTextSelected) {
      url = document.commandDispatcher.focusedWindow.content.document.getSelection().toString().trim();
    }

    mItem.hidden = !((gContextMenu.onLink || (gContextMenu.onPlainTextLink || gContextMenu.isTextSelected)
                      && options.showOnShortenedTextLinks) && isShortenedURL(url)
                     || gContextMenu.onLink && isUnshortened);
  };
  cntxtMenu.addEventListener("popupshowing", shouldDisplay, false);
  addDestructor(()=> {
    cntxtMenu.removeEventListener("popupshowing", shouldDisplay, false);
    cntxtMenu.removeChild(mItem);
  });

  mItem.onclick =()=> {
    if (gContextMenu.onLink && !gContextMenu.isTextSelected) {
      if (!isUnshortened) {
        if (options.changeColorForUnshortenedLinks) {
          var linkClr = link.style.getPropertyValue('color');
          linkClr && link.style.setProperty('-cb-old-color', linkClr, link.style.getPropertyPriority('color'));
          var oldClr = link.style.getPropertyValue('-cb-old-color');
          var oldClrPrrt = link.style.getPropertyPriority('-cb-old-color');
          link.style.setProperty("color", "orangered", "important");
        }

        xhr(url, reURL => {
          if (!reURL) {
            options.changeColorForUnshortenedLinks
              && (oldClr ? (link.style.setProperty("color", oldClr, oldClrPrrt),
                            link.removeProperty('-cb-old-color')) : link.style.removeProperty("color"));
            return;
          }

          if (options.changeColorForUnshortenedLinks) {
            link.style.setProperty("color", options.unshortenedLinksColor, "important");
            options.changeColorBackAfterTimeout
              && setTimeout(()=> oldClr ? (link.style.setProperty("color", oldClr, oldClrPrrt),
                                           link.removeProperty('-cb-old-color')) : link.style.removeProperty("color"), 1000);
          }

          options.copyToClipboard && gClipboard.write(reURL);

          options.replaceShortenedLinks && (link.setAttribute("cb-short-url", link.href),
                                            link.setAttribute("href", reURL));
        })
      }
      else {
        oldClr ? (link.style.setProperty("color", oldClr, oldClrPrrt),
                  link.removeProperty('-cb-old-color')) : link.style.removeProperty("color");

        link.setAttribute("href", isUnshortened);
        link.removeAttribute("cb-short-url");
      }
    }
    else {
      xhr(url, reURL => {
        if (!reURL) return;

        options.copyToClipboard && gClipboard.write(reURL);
        options.promptDialogForTextLinks && promptDialog(reURL);
      })
    }
  };

  this._handleClick =()=> {
    url = gClipboard.read();

    if (!url || !isShortenedURL(url)) {
      options.showAlert && alertsService.showAlertNotification(self.image, self.label,
                                                               'Неправильная ссылка!', false, "", null, "");
      return;
    }

    xhr(url, reURL => {
      if (!reURL) return;

      options.copyToClipboard && gClipboard.write(reURL);
      promptDialog(reURL);
    })
  };
  this.tooltipText = "ПКМ: Раскукожить ссылку в буфере обмена";
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-open"), document.createElement("menuitem"));


)

2. Нет. Во-первых, не желаю. Я противник использования коротких ссылок. А во-вторых, лень. Универсально не выйдет. Для каждого нужно использовать их API, получать левый ключ (либо вам регистрироваться, получать свой и прописывать в код) и т.д.

turbot пишет

что более щадяще будет

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

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

Выделить код

Код:

var count = 4000;
var links = [...content.document.links].map(link => link.href);
if (!links.length) return;

var url, shortenerServices = "tinyurl.com po.st img.ly bit.ly goo.gl youtu.be t.co db.tt u.to".split(" ");
function test(func, start = Cu.now(), short = 0) {
    for(var ind = 0, stop = count/links.length; ind < stop; ind++)
        for(var url of links) short += func(url);
    return [func.name, short, Cu.now() - start].join("\t");
}
alert(test(isShortenedURL_OLD) + "\n" + test(isShortenedURL_NEW));



  function isShortenedURL_OLD(aURL) {
    if (aURL && !aURL.match(/\s/)) {
      var uri;
      try {
        uri = makeURI(aURL);
      }
      catch(ex) {
        aURL = 'http://' + aURL;
        uri = makeURI(aURL);
      }
      finally {
        if (uri && (uri.scheme == "http" || uri.scheme == "https") && shortenerServices.indexOf(uri.host) !== -1) {
          url = aURL;
          return true;
        }
      }
    }
    return false;
  };

  function isShortenedURL_NEW(aURL) {
    if (aURL && (gContextMenu && (gContextMenu.onLink && !gContextMenu.isTextSelected || gContextMenu.onPlainTextLink)
                 || !aURL.match(/\s/) && !!aURL.match(/\//))) {

      if (!aURL.startsWith('http')) aURL = 'http://' + aURL.split(/^((\w+)?:\/\/)?(.+)/)[3];

      var host = aURL.split(/http(s)?:\/\/([\w\.-]+)/)[2];

      if (shortenerServices.indexOf(host) !== -1) {
        url = aURL;
        return true;
      }
    }
    return false;
  };

В 48 не работает сохранение изображения без запроса в указанную папку. Поправьте плз.

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

Выделить код

Код:

// Сохранять изображение без запроса в указанную папку ..............    
((contextMenu, viewimage) => {
   var path = 'C:\\qwerty';
   var arr = path.split("\\");
   var menuItem = contextMenu.insertBefore(document.createElement("menuitem"), viewimage);
   menuItem.setAttribute("label", "Сохранить в указанную папку: " + arr[arr.length-1]);
   addDestructor(()=> menuItem.remove() );
   addEventListener("popupshowing", e=> menuItem.hidden = viewimage.hidden, false, contextMenu); 
   menuItem.onclick =()=> {
      var {get} = Application.prefs, run = get("browser.download.folderList"),
           dwnPath = get("browser.download.dir"), p, r;
      if ( dwnPath ) p = dwnPath.value, dwnPath.value = path;
      else Application.prefs.setValue("browser.download.dir", path);
      r = run.value, run.value = 2;
      saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
      run.value = r; if (dwnPath) dwnPath.value = p;
   }
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-viewimageinfo"));


bunda1, большое спасибо. Работает.

Uxapb пишет

В 48 не работает сохранение изображения без запроса в указанную папку. Поправьте плз.

:/

Выделить код

Код:

// Сохранять изображение без запроса в указанную папку, из контекстного меню, от 28.08.2016. ................   
((contextMenu, viewimage) => {
   var path = 'C:\\qwerty';
   
   var menuItem = contextMenu.insertBefore(document.createElement("menuitem"), viewimage);
   menuItem.setAttribute("label", "Сохранить в указанную папку: " + path.split("\\").pop());
   addDestructor(()=> menuItem.remove());
   addEventListener("popupshowing", e=> menuItem.hidden = viewimage.hidden, false, contextMenu); 
   
   menuItem.onclick =()=> {
      var run = cbu.getPrefs("browser.download.folderList");
      var use = cbu.getPrefs("browser.download.useDownloadDir");
      try { var dir = Services.prefs.getComplexValue("browser.download.dir", Ci.nsISupportsString).data } 
      catch(e) { var dir = Services.downloads.defaultDownloadsDirectory.path };
                
      cbu.setPrefs("browser.download.folderList", 2);
      cbu.setPrefs("browser.download.useDownloadDir", true);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", path));
      
      saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
      
      cbu.setPrefs("browser.download.folderList", run);
      cbu.setPrefs("browser.download.useDownloadDir", use);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", dir));
   }
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-viewimageinfo"));
Dumby пишет

Потом расскажешь.

Ну, своего я точно не напишу. :) Так что по результатам этого теста заменил на новый вариант. Почти пятикратная разница во времени исполнения. Спасибо.

День добрый. А в связи с выходом DownThemAll! 3.02 можно изменить кнопку под новые реалии??

Mishania пишет

День добрый. А в связи с выходом DownThemAll! 3.02 можно изменить кнопку под новые реалии??

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EDTA%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAA0AAAAPCAYAAAA/I0V3AAAAAXNSR0IArs4c6QAAAcdJREFUKM990s9LG1EQwPHve9lN1PzYNU1SXaOXpKQU2ouhB6G3Iin0T+gxIOZfKPbQ4r+QIs2xf4PQXAsFqYdehZZqQaHG1bdxN6bZ3bweJEUtZC7DMPOZwzCCGzG/ufMW2OL/eHfxfuPNpJB3mlvSukfNGvLUcnloXZGw8sRGavPmkHF35QLnlOlhE+Axh88sR6SYihY5Z5ke8/goMiiyHLEwHd3ngiXhUsAjzZBTbWFSnI5KKMqcUUQxy4hjCphE01FBeCzisoSLSURBeCSIp6M8Pg4uy5yigTyXGIxvI7v1YRvEOgA6xiKghCJRjCn1FBYBgzhh263O12uiuxLEapBzqkHOqTesQzJckTUGUHlA1hiQZsjz3C8jyDn1IOdUQaxK1W420v2TPUCZRCQJ0RmBqK2hM4Ik4eQQKt0/2VPtZkMCTKBEK4lGGyBra9cZjUT/A7feSLWbjd1+Zegzg4hgfPAFEYHPDLuXVX8CAITd6jiROfdsnDAtJzzeWREuXWsb6lXY/86695rfMs9PWd6QcegZ4eCzALBbHTNMZiovk99WnsQHLwJpvIpSyYLxZ3SWHkcf98WjT93o8aE58n+odjP8C6dbrAZXOS2pAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................%0Athis.onclick%20%3De%3D%3E%20%7B%0A%0A%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041B%u041A%u041C%20....%0A%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%0A%20%20%20%20%20%20%20%20%20document.getElementById%28%27dtaToolsDTA%27%29.click%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u0421%u041A%u041C%20....%20%20%20%20%0A%20%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20gFindBar.hidden%20%3F%20gFindBar.onFindCommand%28%29%20%3A%20gFindBar.close%28%29%3B%0A%20%20%20%20%20%20%20%20%20document.getElementById%28%27dtaToolsManager%27%29.click%28%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%0A%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041F%u041A%u041C%20....%20%20%20%20%0A%20%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20document.getElementById%28%27dtaToolsPrefs%27%29.click%28%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%0A%0Athis.tooltipText%20%3D%20self.label%20+%20%22%5Cn%u041B%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043E%u043A%u043E%u0448%u043A%u043E%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u044F%20%u0437%u0430%u043A%u0430%u0447%u0435%u043A%20%u0434%u043B%u044F%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%5Cn%u0421%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u0435%u0434%u0436%u0435%u0440%20%u0437%u0430%u043A%u0430%u0447%u0435%u043A%20%5Cn%u041F%3A%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%5CnCtrl+%u041F%3A%20%u0421%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%22%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Огромное спасибо! Благодаря вашим трудам, пользоваться браузером в разы приятней.

Приветствую.
Не работают следующие кнопки:
FF Exp Imp CB
Extension List Generator

скрытый текст
Инициализация

Выделить код

Код:

/*
 *  This Source Code Form is subject to the terms of the Mozilla Public
 *  License, v. 2.0. If a copy of the MPL was not distributed with this
 *  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 *  Contributor(s):
 *  - LouCypher (original code)
 */

var xul = this.Help;
this.type = "menu";
this.tooltipText += "\nGenerate list of enabled extensions to selected output:"
                  + "\nHTML, Markdown, BBCode, or plain text."

var menupopup = this.appendChild(document.createElement("menupopup"));
menupopup.setAttribute("oncommand", "generate(event);");
menupopup.generate = generate.bind();

["HTML", "Markdown", "BBCode", "Plain text"].forEach(function(format) {
  var menuitem = menupopup.appendChild(document.createElement("menuitem"));
  menuitem.setAttribute("label", format);
})

menupopup.appendChild(document.createElement("menuseparator"));

var optionsMenu = menupopup.appendChild(document.createElement("menuitem"));
optionsMenu.setAttribute("label", "Options");
optionsMenu.setAttribute("oncommand", "openOptions();");
optionsMenu.openOptions = openOptions.bind();

var rptCurrentDate, rptAddonsURLs, rptAddonsDescs, rptThemeScreenshot,
    rptInsideSpoiler;

initPrefs();

function generate(aEvent) {
  if (aEvent.target.getAttribute("label") == "Options") return;
  initPrefs();
  AddonManager.getAddonsByTypes(["theme", "extension"], function(addons) {
    var theme;
    var extArray = [];
    addons.forEach(function(addon) {
      if (addon.isActive) {
        if (addon.type == "theme") theme = addon;
        else extArray.push(addon);
      }
    })
    extArray.sort(function(a, b) {
      a = a.name.toLowerCase();
      b = b.name.toLowerCase();
      if (a < b) return -1;
      if (a > b) return 1;
      return 0;
    })
    var title = "My " + Application.name + " information";
    var date = new Date();
    switch (aEvent.target.getAttribute("label")) {
      case "HTML": generateHTML(title, date, theme, extArray); break;
      case "Markdown": generateMarkdown(title, date, theme, extArray); break;
      case "BBCode": generateBBCode(title, date, theme, extArray); break;
      case "Plain text": generateText(title, date, theme, extArray);
    }
  })
}

function generateHTML(aTitle, aDate, aTheme, aArray) {
  var extensions = '<!doctype html><html itemscope="itemscope"'
                 + ' itemtype="http://schema.org/WebPage"><head>'
                 + '<meta charset="utf-8"><meta itemprop="description"'
                 + ' content="' + aTitle + '"><meta name="description"'
                 + ' content="' + aTitle + '"><title>' + aTitle + '</title>'
                 + '</head><body><h1>' + aTitle + '</h1>'
                 + (rptCurrentDate ? "<p>Last updated: " + aDate + "</p>" : "")
                 + "<h2>User agent</h2><p>" + navigator.userAgent
                 + "</p><h2>Theme</h2><p>"
                 + (rptAddonsURLs && !isDefaultTheme(aTheme)
                    ? '<a href="' + getThemeURL(aTheme) + '">' + aTheme.name + '</a>'
                    : aTheme.name)
                 + "</p>"
                 + (rptThemeScreenshot && !isDefaultTheme(aTheme) &&
                    aTheme.screenshots && !/getpersonas/.test(aTheme.screenshots)
                    ? '<p><img src="' + aTheme.screenshots[0].url +
                      '" alt="' + aTheme.name + '"/></p>'
                    : "")
                 + "<h2>Extensions</h2>"
                 + '<ol class="column">';
  aArray.forEach(function(addon) {
    extensions += '<li style="margin-bottom:1em">'
                + (rptAddonsURLs
                   ? ((addon.reviewURL
                      ? '<a href="' + getAMOPage(addon.reviewURL) + '">'
                      : addon.homepageURL
                        ? '<a href="' + addon.homepageURL + '">'
                        : '<a href="http://www.google.com/search?q="' +
                          encodeURIComponent(addon.name + " extension") +
                          '">')
                      + addon.name + '</a>')
                   : addon.name)
                + (addon.version ? " " + addon.version : "")
                + (rptAddonsDescs ? "<br/>" + addon.description : "")
                + "</li>";
  })
  extensions += "</ol></body></html>";
  doSomething(extensions, "text/html");
}

function generateMarkdown(aTitle, aDate, aTheme, aArray) {
  var idx = 0;
  var extensions = "# " + aTitle
                 + (rptCurrentDate ? "\n\nLast updated: " + aDate : "")
                 + "\n\n## User agent\n\n" + navigator.userAgent
                 + "\n\n## Theme\n\n"
                 + (rptAddonsURLs && !isDefaultTheme(aTheme)
                    ? "[" + aTheme.name + "](" + getThemeURL(aTheme) + ")"
                    : aTheme.name)
                 + (rptThemeScreenshot && !isDefaultTheme(aTheme) &&
                    aTheme.screenshots && !/getpersonas/.test(aTheme.screenshots)
                    ? "\n\n![" + aTheme.name + "](" + aTheme.screenshots[0].url + ")"
                    : "")
                 + "\n\n## Extensions";
  aArray.forEach(function(addon) {
    idx++;
    extensions += "\n\n" + idx + ". "
                + (rptAddonsURLs
                   ? ((addon.reviewURL
                      ? "[" + addon.name + "](" + getAMOPage(addon.reviewURL)
                      : addon.homepageURL
                        ? "[" + addon.name + "](" + addon.homepageURL
                        : "[" + addon.name + "](" +
                          "http://www.google.com/search?q=" +
                          encodeURIComponent(addon.name + " extension"))
                      + ")")
                   : addon.name)
                + (addon.version ? " " + addon.version : "")
                + (rptAddonsDescs ? "  \n" + addon.description : "")
  })
  doSomething(extensions, "text/plain", "%0A%0A.md");
}

function generateBBCode(aTitle, aDate, aTheme, aArray) {
  var extensions = (rptInsideSpoiler ? "[spoiler=" + aTitle + "]" : "")
                 + (rptCurrentDate ? "[b]Last updated: [/b]" + aDate : "")
                 + "\n\n[b]User agent:[/b] " + navigator.userAgent
                 + "\n\n[b]Theme:[/b] "
                 + (rptAddonsURLs && !isDefaultTheme(aTheme)
                    ? "[url=" + getThemeURL(aTheme) + "]" + aTheme.name + "[/url]"
                    : aTheme.name)
                 + (rptThemeScreenshot && !isDefaultTheme(aTheme) &&
                    aTheme.screenshots && !/getpersonas/.test(aTheme.screenshots)
                    ? "\n[img]" + aTheme.screenshots[0].url + "[/img]"
                    : "")
                 + "\n\n[b]Extensions:[/b]\n[list=1]"
  aArray.forEach(function(addon) {
    extensions += "[*]"
                + (rptAddonsURLs
                   ? ((addon.reviewURL
                       ? "[url=" + getAMOPage(addon.reviewURL)
                       : addon.homepageURL
                         ? "[url=" + addon.homepageURL
                         : "[url=http://www.google.com/search?q=" +
                           encodeURIComponent(addon.name + " extension"))
                       + "]" + addon.name + "[/url]")
                   : addon.name)
                + (addon.version ? " " + addon.version : "")
                + (rptAddonsDescs ? "\n" + addon.description : "");
  })
  extensions += rptInsideSpoiler ? "[/list][/spoiler]" : "[/list]";
  doSomething(extensions, "text/plain");
}

function generateText(aTitle, aDate, aTheme, aArray) {
  var idx = 0;
  var extensions = aTitle + "\n"
  for (var i = 0; i < aTitle.length; i++) {
    extensions += "=";
  }
  extensions += (rptCurrentDate ? "\n\nLast updated: " + aDate : "")
              + "\n\nUser agent: " + navigator.userAgent
              + "\n\nTheme: " + aTheme.name + "\n\nExtensions\n----------";
  aArray.forEach(function(addon) {
    idx++;
    extensions += "\n" + idx + ". " + addon.name
                + (addon.version ? " " + addon.version : "")
                + (rptAddonsDescs ? "\n" + addon.description : "")
                + (rptAddonsURLs
                   ? "\n" + (addon.reviewURL ? getAMOPage(addon.reviewURL)
                                             : addon.homepageURL
                                               ? addon.homepageURL
                                               : "")
                   : "")
                + (rptAddonsDescs || rptAddonsURLs ? "\n" : "");
  })
  doSomething(extensions, "text/plain");
}

function isDefaultTheme(aTheme) {
  return aTheme.id == "{972ce4c6-7e08-4474-a285-3208198ce6fd}" ||
         aTheme.id == "modern@themes.mozilla.org";
}

function getAMOPage(aReviewURL) {
  var url = aReviewURL.replace(/\/reviews\/.*$/, "/")
                      .replace(/mozilla.org\/.*\/addon\//, "mozilla.org/addon/");
  url += "?src=external-extension-list-generator";
  return url;
}

function getThemeURL(aAddon) {
  var url;
  if (aAddon.reviewURL) {
    return getAMOPage(aAddon.reviewURL);
  } else {
    var id = aAddon.id.match(/\d+/).toString();
    if (/getpersonas/.test(aAddon.screenshots[0].url)) {
      url = "http://getpersonas.com/persona/" + id;
    } else {
      url = "http://addons.mozilla.org/addon/" + id;
    }
  }
  url += "/?src=external-extension-list-generator";
  return url;
}

function doSomething(aString, aContentType, aExt) {
  var doWhat = custombuttons.confirmBox3(self.name,
                                        "Extension list has been generated.",
                                        "Copy", "Cancel", "View");
  switch (doWhat) {
    case 0: // Copy
      cbu.gClipboard.write(aString);
      Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService).
      showAlertNotification("chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png",
                            self.name, "Copied to clipboard!", false, "", null);
      break;
    case 2: // View
      var url = "data:" + aContentType + ";charset=utf-8,"
              + encodeURIComponent(aString) + (aExt ? aExt : "");
      if (Application.id == "{3550f703-e582-4d05-9a08-453d09bdfdc6}") {
        // Thunderbird
        openContentTab(url, "tab", "^https?:");
      } else {
        switchToTabHavingURI(url, true);
      }
    default: // Close
  }
}

function getBoolPref(aPrefName, aDefVal) {
  var prefRoot = "custombuttons.extension-list-generator.report.";
  var prefBranch = cbu.ps.getBranch(prefRoot);
  try {
    return prefBranch.getBoolPref(aPrefName);
  } catch(ex) {
    prefBranch.setBoolPref(aPrefName, aDefVal);
    return aDefVal;
  }
}

function initPrefs() {
  rptCurrentDate = getBoolPref("currentDate", true);
  rptAddonsURLs = getBoolPref("addonsURLs", true);
  rptAddonsDescs = getBoolPref("addonsDescriptions", false);
  rptThemeScreenshot = getBoolPref("themeScreenshot", true);
  rptInsideSpoiler = getBoolPref("insideSpoiler", false);
}

function openOptions() {
  var em = Services.ww.getWindowEnumerator();
  var winName = "extension-list-generator-options";
  var index = 1;
  while (em.hasMoreElements()) {
    let win = em.getNext();
    if(win.name == winName) {
      win.focus();
      return;
    }
    index++
  }
  openDialog("data:application/vnd.mozilla.xul+xml;base64," +
             encodeURIComponent(btoa(xul)), winName,
             "chrome, dialog, centerscreen, close");
}

Справка

Выделить код

Код:

<?xml version="1.0"?>
<!--
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
    file, You can obtain one at http://mozilla.org/MPL/2.0/.

    Contributor(s):
    - LouCypher (original code)
-->

<?xml-stylesheet href="chrome://global/skin/"?>
<?xml-stylesheet href="data:text/css;base64,YnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdIHsKICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CiAgY29sb3I6ICNGRkY7CiAgYm9yZGVyOiAxcHggc29saWQgIzNBNEVFRTsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgbGlzdC1zdHlsZS1pbWFnZTogdXJsKCJjaHJvbWU6Ly9tb3phcHBzL3NraW4vZXh0ZW5zaW9ucy9oZWFydC5wbmciKTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkY3M0VGOwogIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHJnYmEoMjUxLCAyNTIsIDI1MywgMC43MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyNDYsIDI0NywgMjQ4LCAwLjI3KSA0OSUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyMzEsIDIzMiwgMjMzLCAwLjI1KSA1MSUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyMjUsIDIyNiwgMjI5LCAwLjEpKTsKICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgIGxpbmVhci1ncmFkaWVudChyZ2JhKDI1MSwgMjUyLCAyNTMsIDAuNzApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjQ2LCAyNDcsIDI0OCwgMC4yNykgNDklLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjMxLCAyMzIsIDIzMywgMC4yNSkgNTElLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjI1LCAyMjYsIDIyOSwgMC4xKSk7Cn0KYnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdIC5idXR0b24tYm94IHsgcGFkZGluZzogMCA2cHggMXB4IDZweDsgfQpidXR0b25bZGxndHlwZT0iZXh0cmEyIl0gLmJ1dHRvbi1pY29uIHsgLW1vei1tYXJnaW4tZW5kOiAzcHg7IH0KYnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdOm5vdCg6YWN0aXZlKTpob3ZlciB7CiAgYm9yZGVyLWNvbG9yOiAjNDI3MUZGOwogIGJhY2tncm91bmQtY29sb3I6ICMwNDU5Rjc7CiAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAwIDMuNXB4IGhzbCgxOTAsIDkwJSwgODAlKTsKICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDAgMy41cHggaHNsKDE5MCwgOTAlLCA4MCUpOwogIC1tb3otdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAuNHMgZWFzZS1pbiwKICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvciAuM3MgZWFzZS1pbiwKICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3cgLjNzIGVhc2UtaW47CiAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIC40cyBlYXNlLWluLAogICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yIC4zcyBlYXNlLWluLAogICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyAuM3MgZWFzZS1pbjsKfQpidXR0b25bZGxndHlwZT0iZXh0cmEyIl06YWN0aXZlOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOEZBMUMxOwogIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjY1KSByZ2JhKDAsIDAsIDAsIDAuNTUpIHJnYmEoMCwgMCwgMCwgMC41KTsKICAtbW96LWJveC1zaGFkb3c6IDAgMCA2LjVweCByZ2JhKDAsIDAsIDAsIDAuNCkgaW5zZXQsCiAgICAgICAgICAgICAgICAgICAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC40KSBpbnNldCwKICAgICAgICAgICAgICAgICAgIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOwogICAgICAgYm94LXNoYWRvdzogMCAwIDYuNXB4IHJnYmEoMCwgMCwgMCwgMC40KSBpbnNldCwKICAgICAgICAgICAgICAgICAgIDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjQpIGluc2V0LAogICAgICAgICAgICAgICAgICAgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7Cn0%3D"?>

<prefwindow
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  id="extension-list-generator-options" title="Extension List Generator Options"
  buttons="extra2, accept, cancel"
  buttonlabelextra2="Contribute"
  ondialogextra2="contribute(); close();"
  onload="sizeToContent();">

  <script type="application/x-javascript"><![CDATA[
    function contribute() {
      var url = "http://loucypher.github.io/userscripts/donate.html"
              + "?Extension+List+Generator"
      var win = window.opener;
      if ("openContentTab" in win) {
        win.openContentTab(url, "tab");
      } else {
        win.openLinkIn(url, "tabshifted", {}); // Requires utilityOverlay.js
      }
    }
  ]]></script>

  <prefpane id="prefpane-menu" label="Prefpane menu">

    <preferences>
      <preference id="date"
                  name="custombuttons.extension-list-generator.report.currentDate"
                  type="bool"/>
      <preference id="addonsURLs"
                  name="custombuttons.extension-list-generator.report.addonsURLs"
                  type="bool"/>
      <preference id="addonsDescriptions"
                  name="custombuttons.extension-list-generator.report.addonsDescriptions"
                  type="bool"/>
      <preference id="themeScreenshot"
                  name="custombuttons.extension-list-generator.report.themeScreenshot"
                  type="bool"/>
      <preference id="spoilerTag"
                  name="custombuttons.extension-list-generator.report.insideSpoiler"
                  type="bool"/>
    </preferences>

    <groupbox>
      <caption>Select which informations to include</caption>
      <checkbox label="Current date" preference="date"/>
      <checkbox label="Add-ons URLs" preference="addonsURLs"/>
      <checkbox label="Add-ons Descriptions" preference="addonsDescriptions"/>
      <checkbox label="Theme screenshot (for non-default theme)"
                preference="themeScreenshot"/>
    </groupbox>

    <groupbox>
      <caption>BBCode ouput</caption>
      <checkbox label="Inside [spoiler] tag" preference="spoilerTag"/>
      <label>Not all forum softwares support this tag.</label>
    </groupbox>

  </prefpane>

</prefwindow>


Почините, если возможно.
Кнопки, использующие Справку работают. CB правил через cbbuttonimpl.js

Uxapb пишет

Приветствую.
Не работают следующие кнопки:

:/ FF Exp Imp CB

bunda1
Спасибо - очень нужная кнопка!

bunda1 пишет

:/ FF Exp Imp CB

Спасибо.
А с Extension List Generator не поможете ?

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EExtension%20List%20Generator%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABVUlEQVQ4y2P4//8/AyWYoALpQsb9ftPM/4tnM+4nywCQ5s5jRf8d+7T+k2VAxHzH/TUHkv57TDMgzgWyJYz74xZ6/E9Y4vU/ZaXv/9Jd0f/LDkb+j13v8N9xmtp/oy6J/xqN/P+5Ihj2YzUApHnxtb7/My83/e8+W/C/9nj8//yD/v+T99j/D99u8N9nk/J/h9Vi/+Vq2P5jNQBkMz7NTuvE/1ut5v0vV8+M3QCQs3Fptlsh+l93Ktd/pTaW/wKpjAgDYFEFCjCQn3HZDNLME8tYANLDEcrgADcAFlWg0AYFGC5nK3ew/McaC6BEAopnUFSBQhubZpMVbP81JrFgdwEyBkUVup9BNoM0681hBdMYYYCMQfGMzc8gGqQZ5BIQxhkLoEQCimeQs0E2IcuB+CDNxkvZ/ktX4jAAlMJAiQRkA8iZML+CaBAfJA7SDOTvJyovEMIAruB4gKjNkYMAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*%0A%20*%20%20This%20Source%20Code%20Form%20is%20subject%20to%20the%20terms%20of%20the%20Mozilla%20Public%0A%20*%20%20License%2C%20v.%202.0.%20If%20a%20copy%20of%20the%20MPL%20was%20not%20distributed%20with%20this%0A%20*%20%20file%2C%20You%20can%20obtain%20one%20at%20http%3A//mozilla.org/MPL/2.0/.%0A%20*%0A%20*%20%20Contributor%28s%29%3A%0A%20*%20%20-%20LouCypher%20%28original%20code%29%0A%20*/%0A%0Avar%20xul%20%3D%20this.Help%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.tooltipText%20+%3D%20%22%5CnGenerate%20list%20of%20enabled%20extensions%20to%20selected%20output%3A%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5CnHTML%2C%20Markdown%2C%20BBCode%2C%20or%20plain%20text.%22%0A%0Avar%20menupopup%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Amenupopup.setAttribute%28%22oncommand%22%2C%20%22generate%28event%29%3B%22%29%3B%0Amenupopup.generate%20%3D%20generate.bind%28%29%3B%0A%0A%5B%22HTML%22%2C%20%22Markdown%22%2C%20%22BBCode%22%2C%20%22Plain%20text%22%5D.forEach%28function%28format%29%20%7B%0A%20%20var%20menuitem%20%3D%20menupopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20menuitem.setAttribute%28%22label%22%2C%20format%29%3B%0A%7D%29%0A%0Amenupopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0A%0Avar%20optionsMenu%20%3D%20menupopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0AoptionsMenu.setAttribute%28%22label%22%2C%20%22Options%22%29%3B%0AoptionsMenu.setAttribute%28%22oncommand%22%2C%20%22openOptions%28%29%3B%22%29%3B%0AoptionsMenu.openOptions%20%3D%20openOptions.bind%28%29%3B%0A%0Avar%20rptCurrentDate%2C%20rptAddonsURLs%2C%20rptAddonsDescs%2C%20rptThemeScreenshot%2C%0A%20%20%20%20rptInsideSpoiler%3B%0A%0AinitPrefs%28%29%3B%0A%0Afunction%20generate%28aEvent%29%20%7B%0A%20%20if%20%28aEvent.target.getAttribute%28%22label%22%29%20%3D%3D%20%22Options%22%29%20return%3B%0A%20%20initPrefs%28%29%3B%0A%20%20AddonManager.getAddonsByTypes%28%5B%22theme%22%2C%20%22extension%22%5D%2C%20function%28addons%29%20%7B%0A%20%20%20%20var%20theme%3B%0A%20%20%20%20var%20extArray%20%3D%20%5B%5D%3B%0A%20%20%20%20addons.forEach%28function%28addon%29%20%7B%0A%20%20%20%20%20%20if%20%28addon.isActive%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28addon.type%20%3D%3D%20%22theme%22%29%20theme%20%3D%20addon%3B%0A%20%20%20%20%20%20%20%20else%20extArray.push%28addon%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%0A%20%20%20%20extArray.sort%28function%28a%2C%20b%29%20%7B%0A%20%20%20%20%20%20a%20%3D%20a.name.toLowerCase%28%29%3B%0A%20%20%20%20%20%20b%20%3D%20b.name.toLowerCase%28%29%3B%0A%20%20%20%20%20%20if%20%28a%20%3C%20b%29%20return%20-1%3B%0A%20%20%20%20%20%20if%20%28a%20%3E%20b%29%20return%201%3B%0A%20%20%20%20%20%20return%200%3B%0A%20%20%20%20%7D%29%0A%20%20%20%20var%20title%20%3D%20%22My%20%22%20+%20Application.name%20+%20%22%20information%22%3B%0A%20%20%20%20var%20date%20%3D%20new%20Date%28%29%3B%0A%20%20%20%20switch%20%28aEvent.target.getAttribute%28%22label%22%29%29%20%7B%0A%20%20%20%20%20%20case%20%22HTML%22%3A%20generateHTML%28title%2C%20date%2C%20theme%2C%20extArray%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22Markdown%22%3A%20generateMarkdown%28title%2C%20date%2C%20theme%2C%20extArray%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22BBCode%22%3A%20generateBBCode%28title%2C%20date%2C%20theme%2C%20extArray%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22Plain%20text%22%3A%20generateText%28title%2C%20date%2C%20theme%2C%20extArray%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%29%0A%7D%0A%0Afunction%20generateHTML%28aTitle%2C%20aDate%2C%20aTheme%2C%20aArray%29%20%7B%0A%20%20var%20extensions%20%3D%20%27%3C%21doctype%20html%3E%3Chtml%20itemscope%3D%22itemscope%22%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%20itemtype%3D%22http%3A//schema.org/WebPage%22%3E%3Chead%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3Cmeta%20charset%3D%22utf-8%22%3E%3Cmeta%20itemprop%3D%22description%22%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%20content%3D%22%27%20+%20aTitle%20+%20%27%22%3E%3Cmeta%20name%3D%22description%22%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%20content%3D%22%27%20+%20aTitle%20+%20%27%22%3E%3Ctitle%3E%27%20+%20aTitle%20+%20%27%3C/title%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3C/head%3E%3Cbody%3E%3Ch1%3E%27%20+%20aTitle%20+%20%27%3C/h1%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptCurrentDate%20%3F%20%22%3Cp%3ELast%20updated%3A%20%22%20+%20aDate%20+%20%22%3C/p%3E%22%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3Ch2%3EUser%20agent%3C/h2%3E%3Cp%3E%22%20+%20navigator.userAgent%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3C/p%3E%3Ch2%3ETheme%3C/h2%3E%3Cp%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%20%26%26%20%21isDefaultTheme%28aTheme%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%27%3Ca%20href%3D%22%27%20+%20getThemeURL%28aTheme%29%20+%20%27%22%3E%27%20+%20aTheme.name%20+%20%27%3C/a%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20aTheme.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3C/p%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptThemeScreenshot%20%26%26%20%21isDefaultTheme%28aTheme%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aTheme.screenshots%20%26%26%20%21/getpersonas/.test%28aTheme.screenshots%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%27%3Cp%3E%3Cimg%20src%3D%22%27%20+%20aTheme.screenshots%5B0%5D.url%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%22%20alt%3D%22%27%20+%20aTheme.name%20+%20%27%22/%3E%3C/p%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3Ch2%3EExtensions%3C/h2%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3Col%20class%3D%22column%22%3E%27%3B%0A%20%20aArray.forEach%28function%28addon%29%20%7B%0A%20%20%20%20extensions%20+%3D%20%27%3Cli%20style%3D%22margin-bottom%3A1em%22%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%28%28addon.reviewURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%27%3Ca%20href%3D%22%27%20+%20getAMOPage%28addon.reviewURL%29%20+%20%27%22%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%27%3Ca%20href%3D%22%27%20+%20addon.homepageURL%20+%20%27%22%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%27%3Ca%20href%3D%22http%3A//www.google.com/search%3Fq%3D%22%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%28addon.name%20+%20%22%20extension%22%29%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%22%3E%27%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20addon.name%20+%20%27%3C/a%3E%27%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28addon.version%20%3F%20%22%20%22%20+%20addon.version%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%3F%20%22%3Cbr/%3E%22%20+%20addon.description%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3C/li%3E%22%3B%0A%20%20%7D%29%0A%20%20extensions%20+%3D%20%22%3C/ol%3E%3C/body%3E%3C/html%3E%22%3B%0A%20%20doSomething%28extensions%2C%20%22text/html%22%29%3B%0A%7D%0A%0Afunction%20generateMarkdown%28aTitle%2C%20aDate%2C%20aTheme%2C%20aArray%29%20%7B%0A%20%20var%20idx%20%3D%200%3B%0A%20%20var%20extensions%20%3D%20%22%23%20%22%20+%20aTitle%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptCurrentDate%20%3F%20%22%5Cn%5CnLast%20updated%3A%20%22%20+%20aDate%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%23%23%20User%20agent%5Cn%5Cn%22%20+%20navigator.userAgent%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%23%23%20Theme%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%20%26%26%20%21isDefaultTheme%28aTheme%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5B%22%20+%20aTheme.name%20+%20%22%5D%28%22%20+%20getThemeURL%28aTheme%29%20+%20%22%29%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20aTheme.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptThemeScreenshot%20%26%26%20%21isDefaultTheme%28aTheme%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aTheme.screenshots%20%26%26%20%21/getpersonas/.test%28aTheme.screenshots%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Cn%5Cn%21%5B%22%20+%20aTheme.name%20+%20%22%5D%28%22%20+%20aTheme.screenshots%5B0%5D.url%20+%20%22%29%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%23%23%20Extensions%22%3B%0A%20%20aArray.forEach%28function%28addon%29%20%7B%0A%20%20%20%20idx++%3B%0A%20%20%20%20extensions%20+%3D%20%22%5Cn%5Cn%22%20+%20idx%20+%20%22.%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%28%28addon.reviewURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5B%22%20+%20addon.name%20+%20%22%5D%28%22%20+%20getAMOPage%28addon.reviewURL%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5B%22%20+%20addon.name%20+%20%22%5D%28%22%20+%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%5B%22%20+%20addon.name%20+%20%22%5D%28%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22http%3A//www.google.com/search%3Fq%3D%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%28addon.name%20+%20%22%20extension%22%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%29%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28addon.version%20%3F%20%22%20%22%20+%20addon.version%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%3F%20%22%20%20%5Cn%22%20+%20addon.description%20%3A%20%22%22%29%0A%20%20%7D%29%0A%20%20doSomething%28extensions%2C%20%22text/plain%22%2C%20%22%250A%250A.md%22%29%3B%0A%7D%0A%0Afunction%20generateBBCode%28aTitle%2C%20aDate%2C%20aTheme%2C%20aArray%29%20%7B%0A%20%20var%20extensions%20%3D%20%28rptInsideSpoiler%20%3F%20%22%5Bspoiler%3D%22%20+%20aTitle%20+%20%22%5D%22%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptCurrentDate%20%3F%20%22%5Bb%5DLast%20updated%3A%20%5B/b%5D%22%20+%20aDate%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%5Bb%5DUser%20agent%3A%5B/b%5D%20%22%20+%20navigator.userAgent%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%5Bb%5DTheme%3A%5B/b%5D%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%20%26%26%20%21isDefaultTheme%28aTheme%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Burl%3D%22%20+%20getThemeURL%28aTheme%29%20+%20%22%5D%22%20+%20aTheme.name%20+%20%22%5B/url%5D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20aTheme.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptThemeScreenshot%20%26%26%20%21isDefaultTheme%28aTheme%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aTheme.screenshots%20%26%26%20%21/getpersonas/.test%28aTheme.screenshots%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Cn%5Bimg%5D%22%20+%20aTheme.screenshots%5B0%5D.url%20+%20%22%5B/img%5D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%5Bb%5DExtensions%3A%5B/b%5D%5Cn%5Blist%3D1%5D%22%0A%20%20aArray.forEach%28function%28addon%29%20%7B%0A%20%20%20%20extensions%20+%3D%20%22%5B*%5D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%28%28addon.reviewURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Burl%3D%22%20+%20getAMOPage%28addon.reviewURL%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Burl%3D%22%20+%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%5Burl%3Dhttp%3A//www.google.com/search%3Fq%3D%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%28addon.name%20+%20%22%20extension%22%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5D%22%20+%20addon.name%20+%20%22%5B/url%5D%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28addon.version%20%3F%20%22%20%22%20+%20addon.version%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%3F%20%22%5Cn%22%20+%20addon.description%20%3A%20%22%22%29%3B%0A%20%20%7D%29%0A%20%20extensions%20+%3D%20rptInsideSpoiler%20%3F%20%22%5B/list%5D%5B/spoiler%5D%22%20%3A%20%22%5B/list%5D%22%3B%0A%20%20doSomething%28extensions%2C%20%22text/plain%22%29%3B%0A%7D%0A%0Afunction%20generateText%28aTitle%2C%20aDate%2C%20aTheme%2C%20aArray%29%20%7B%0A%20%20var%20idx%20%3D%200%3B%0A%20%20var%20extensions%20%3D%20aTitle%20+%20%22%5Cn%22%0A%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aTitle.length%3B%20i++%29%20%7B%0A%20%20%20%20extensions%20+%3D%20%22%3D%22%3B%0A%20%20%7D%0A%20%20extensions%20+%3D%20%28rptCurrentDate%20%3F%20%22%5Cn%5CnLast%20updated%3A%20%22%20+%20aDate%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5CnUser%20agent%3A%20%22%20+%20navigator.userAgent%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5CnTheme%3A%20%22%20+%20aTheme.name%20+%20%22%5Cn%5CnExtensions%5Cn----------%22%3B%0A%20%20aArray.forEach%28function%28addon%29%20%7B%0A%20%20%20%20idx++%3B%0A%20%20%20%20extensions%20+%3D%20%22%5Cn%22%20+%20idx%20+%20%22.%20%22%20+%20addon.name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28addon.version%20%3F%20%22%20%22%20+%20addon.version%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%3F%20%22%5Cn%22%20+%20addon.description%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Cn%22%20+%20%28addon.reviewURL%20%3F%20getAMOPage%28addon.reviewURL%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%7C%7C%20rptAddonsURLs%20%3F%20%22%5Cn%22%20%3A%20%22%22%29%3B%0A%20%20%7D%29%0A%20%20doSomething%28extensions%2C%20%22text/plain%22%29%3B%0A%7D%0A%0Afunction%20isDefaultTheme%28aTheme%29%20%7B%0A%20%20return%20aTheme.id%20%3D%3D%20%22%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D%22%20%7C%7C%0A%20%20%20%20%20%20%20%20%20aTheme.id%20%3D%3D%20%22modern@themes.mozilla.org%22%3B%0A%7D%0A%0Afunction%20getAMOPage%28aReviewURL%29%20%7B%0A%20%20var%20url%20%3D%20aReviewURL.replace%28/%5C/reviews%5C/.*%24/%2C%20%22/%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace%28/mozilla.org%5C/.*%5C/addon%5C//%2C%20%22mozilla.org/addon/%22%29%3B%0A%20%20url%20+%3D%20%22%3Fsrc%3Dexternal-extension-list-generator%22%3B%0A%20%20return%20url%3B%0A%7D%0A%0Afunction%20getThemeURL%28aAddon%29%20%7B%0A%20%20var%20url%3B%0A%20%20if%20%28aAddon.reviewURL%29%20%7B%0A%20%20%20%20return%20getAMOPage%28aAddon.reviewURL%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20var%20id%20%3D%20aAddon.id.match%28/%5Cd+/%29.toString%28%29%3B%0A%20%20%20%20if%20%28/getpersonas/.test%28aAddon.screenshots%5B0%5D.url%29%29%20%7B%0A%20%20%20%20%20%20url%20%3D%20%22http%3A//getpersonas.com/persona/%22%20+%20id%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20url%20%3D%20%22http%3A//addons.mozilla.org/addon/%22%20+%20id%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20url%20+%3D%20%22/%3Fsrc%3Dexternal-extension-list-generator%22%3B%0A%20%20return%20url%3B%0A%7D%0A%0Afunction%20doSomething%28aString%2C%20aContentType%2C%20aExt%29%20%7B%0A%20%20var%20doWhat%20%3D%20custombuttons.confirmBox3%28self.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Extension%20list%20has%20been%20generated.%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Copy%22%2C%20%22Cancel%22%2C%20%22View%22%29%3B%0A%20%20switch%20%28doWhat%29%20%7B%0A%20%20%20%20case%200%3A%20//%20Copy%0A%20%20%20%20%20%20cbu.gClipboard.write%28aString%29%3B%0A%20%20%20%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29.%0A%20%20%20%20%20%20showAlertNotification%28%22chrome%3A//mozapps/skin/xpinstall/xpinstallItemGeneric.png%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.name%2C%20%22Copied%20to%20clipboard%21%22%2C%20false%2C%20%22%22%2C%20null%29%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%202%3A%20//%20View%0A%20%20%20%20%20%20var%20url%20%3D%20%22data%3A%22%20+%20aContentType%20+%20%22%3Bcharset%3Dutf-8%2C%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20encodeURIComponent%28aString%29%20+%20%28aExt%20%3F%20aExt%20%3A%20%22%22%29%3B%0A%20%20%20%20%20%20if%20%28Application.id%20%3D%3D%20%22%7B3550f703-e582-4d05-9a08-453d09bdfdc6%7D%22%29%20%7B%0A%20%20%20%20%20%20%20%20//%20Thunderbird%0A%20%20%20%20%20%20%20%20openContentTab%28url%2C%20%22tab%22%2C%20%22%5Ehttps%3F%3A%22%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20switchToTabHavingURI%28url%2C%20true%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20default%3A%20//%20Close%0A%20%20%7D%0A%7D%0A%0Afunction%20getBoolPref%28aPrefName%2C%20aDefVal%29%20%7B%0A%20%20var%20prefRoot%20%3D%20%22custombuttons.extension-list-generator.report.%22%3B%0A%20%20var%20prefBranch%20%3D%20cbu.ps.getBranch%28prefRoot%29%3B%0A%20%20try%20%7B%0A%20%20%20%20return%20prefBranch.getBoolPref%28aPrefName%29%3B%0A%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20prefBranch.setBoolPref%28aPrefName%2C%20aDefVal%29%3B%0A%20%20%20%20return%20aDefVal%3B%0A%20%20%7D%0A%7D%0A%0Afunction%20initPrefs%28%29%20%7B%0A%20%20rptCurrentDate%20%3D%20getBoolPref%28%22currentDate%22%2C%20true%29%3B%0A%20%20rptAddonsURLs%20%3D%20getBoolPref%28%22addonsURLs%22%2C%20true%29%3B%0A%20%20rptAddonsDescs%20%3D%20getBoolPref%28%22addonsDescriptions%22%2C%20false%29%3B%0A%20%20rptThemeScreenshot%20%3D%20getBoolPref%28%22themeScreenshot%22%2C%20true%29%3B%0A%20%20rptInsideSpoiler%20%3D%20getBoolPref%28%22insideSpoiler%22%2C%20false%29%3B%0A%7D%0A%0Afunction%20openOptions%28%29%20%7B%0A%20%20var%20em%20%3D%20Services.ww.getWindowEnumerator%28%29%3B%0A%20%20var%20winName%20%3D%20%22extension-list-generator-options%22%3B%0A%20%20var%20index%20%3D%201%3B%0A%20%20while%20%28em.hasMoreElements%28%29%29%20%7B%0A%20%20%20%20let%20win%20%3D%20em.getNext%28%29%3B%0A%20%20%20%20if%28win.name%20%3D%3D%20winName%29%20%7B%0A%20%20%20%20%20%20win.focus%28%29%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20index++%0A%20%20%7D%0A%20%20openDialog%28%22data%3Aapplication/vnd.mozilla.xul+xml%3Bbase64%2C%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%28btoa%28xul%29%29%2C%20winName%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%22chrome%2C%20dialog%2C%20centerscreen%2C%20close%22%29%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%26lt%3B%3Fxml%20version%3D%221.0%22%3F%26gt%3B%0A%26lt%3B%21--%0A%20%20%20%20This%20Source%20Code%20Form%20is%20subject%20to%20the%20terms%20of%20the%20Mozilla%20Public%0A%20%20%20%20License%2C%20v.%202.0.%20If%20a%20copy%20of%20the%20MPL%20was%20not%20distributed%20with%20this%0A%20%20%20%20file%2C%20You%20can%20obtain%20one%20at%20http%3A//mozilla.org/MPL/2.0/.%0A%0A%20%20%20%20Contributor%28s%29%3A%0A%20%20%20%20-%20LouCypher%20%28original%20code%29%0A--%26gt%3B%0A%0A%26lt%3B%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%3F%26gt%3B%0A%26lt%3B%3Fxml-stylesheet%20href%3D%22data%3Atext/css%3Bbase64%2CYnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdIHsKICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CiAgY29sb3I6ICNGRkY7CiAgYm9yZGVyOiAxcHggc29saWQgIzNBNEVFRTsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgbGlzdC1zdHlsZS1pbWFnZTogdXJsKCJjaHJvbWU6Ly9tb3phcHBzL3NraW4vZXh0ZW5zaW9ucy9oZWFydC5wbmciKTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkY3M0VGOwogIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHJnYmEoMjUxLCAyNTIsIDI1MywgMC43MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyNDYsIDI0NywgMjQ4LCAwLjI3KSA0OSUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyMzEsIDIzMiwgMjMzLCAwLjI1KSA1MSUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyMjUsIDIyNiwgMjI5LCAwLjEpKTsKICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgIGxpbmVhci1ncmFkaWVudChyZ2JhKDI1MSwgMjUyLCAyNTMsIDAuNzApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjQ2LCAyNDcsIDI0OCwgMC4yNykgNDklLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjMxLCAyMzIsIDIzMywgMC4yNSkgNTElLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjI1LCAyMjYsIDIyOSwgMC4xKSk7Cn0KYnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdIC5idXR0b24tYm94IHsgcGFkZGluZzogMCA2cHggMXB4IDZweDsgfQpidXR0b25bZGxndHlwZT0iZXh0cmEyIl0gLmJ1dHRvbi1pY29uIHsgLW1vei1tYXJnaW4tZW5kOiAzcHg7IH0KYnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdOm5vdCg6YWN0aXZlKTpob3ZlciB7CiAgYm9yZGVyLWNvbG9yOiAjNDI3MUZGOwogIGJhY2tncm91bmQtY29sb3I6ICMwNDU5Rjc7CiAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAwIDMuNXB4IGhzbCgxOTAsIDkwJSwgODAlKTsKICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDAgMy41cHggaHNsKDE5MCwgOTAlLCA4MCUpOwogIC1tb3otdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAuNHMgZWFzZS1pbiwKICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvciAuM3MgZWFzZS1pbiwKICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3cgLjNzIGVhc2UtaW47CiAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIC40cyBlYXNlLWluLAogICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yIC4zcyBlYXNlLWluLAogICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyAuM3MgZWFzZS1pbjsKfQpidXR0b25bZGxndHlwZT0iZXh0cmEyIl06YWN0aXZlOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOEZBMUMxOwogIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjY1KSByZ2JhKDAsIDAsIDAsIDAuNTUpIHJnYmEoMCwgMCwgMCwgMC41KTsKICAtbW96LWJveC1zaGFkb3c6IDAgMCA2LjVweCByZ2JhKDAsIDAsIDAsIDAuNCkgaW5zZXQsCiAgICAgICAgICAgICAgICAgICAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC40KSBpbnNldCwKICAgICAgICAgICAgICAgICAgIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOwogICAgICAgYm94LXNoYWRvdzogMCAwIDYuNXB4IHJnYmEoMCwgMCwgMCwgMC40KSBpbnNldCwKICAgICAgICAgICAgICAgICAgIDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjQpIGluc2V0LAogICAgICAgICAgICAgICAgICAgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7Cn0%253D%22%3F%26gt%3B%0A%0A%26lt%3Bprefwindow%0A%20%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%20%20id%3D%22extension-list-generator-options%22%20title%3D%22Extension%20List%20Generator%20Options%22%0A%20%20buttons%3D%22extra2%2C%20accept%2C%20cancel%22%0A%20%20buttonlabelextra2%3D%22Contribute%22%0A%20%20ondialogextra2%3D%22contribute%28%29%3B%20close%28%29%3B%22%0A%20%20onload%3D%22sizeToContent%28%29%3B%22%26gt%3B%0A%0A%20%20%26lt%3Bscript%20type%3D%22application/x-javascript%22%26gt%3B%26lt%3B%21%5BCDATA%5B%0A%20%20%20%20function%20contribute%28%29%20%7B%0A%20%20%20%20%20%20var%20url%20%3D%20%22http%3A//loucypher.github.io/userscripts/donate.html%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3FExtension+List+Generator%22%0A%20%20%20%20%20%20var%20win%20%3D%20window.opener%3B%0A%20%20%20%20%20%20if%20%28%22openContentTab%22%20in%20win%29%20%7B%0A%20%20%20%20%20%20%20%20win.openContentTab%28url%2C%20%22tab%22%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20win.openLinkIn%28url%2C%20%22tabshifted%22%2C%20%7B%7D%29%3B%20//%20Requires%20utilityOverlay.js%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%5D%5D%26gt%3B%26lt%3B/script%26gt%3B%0A%0A%20%20%26lt%3Bprefpane%20id%3D%22prefpane-menu%22%20label%3D%22Prefpane%20menu%22%26gt%3B%0A%0A%20%20%20%20%26lt%3Bpreferences%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22date%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.currentDate%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22addonsURLs%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.addonsURLs%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22addonsDescriptions%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.addonsDescriptions%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22themeScreenshot%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.themeScreenshot%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22spoilerTag%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.insideSpoiler%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%26lt%3B/preferences%26gt%3B%0A%0A%20%20%20%20%26lt%3Bgroupbox%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcaption%26gt%3BSelect%20which%20informations%20to%20include%26lt%3B/caption%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Current%20date%22%20preference%3D%22date%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Add-ons%20URLs%22%20preference%3D%22addonsURLs%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Add-ons%20Descriptions%22%20preference%3D%22addonsDescriptions%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Theme%20screenshot%20%28for%20non-default%20theme%29%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20preference%3D%22themeScreenshot%22/%26gt%3B%0A%20%20%20%20%26lt%3B/groupbox%26gt%3B%0A%0A%20%20%20%20%26lt%3Bgroupbox%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcaption%26gt%3BBBCode%20ouput%26lt%3B/caption%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Inside%20%5Bspoiler%5D%20tag%22%20preference%3D%22spoilerTag%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Blabel%26gt%3BNot%20all%20forum%20softwares%20support%20this%20tag.%26lt%3B/label%26gt%3B%0A%20%20%20%20%26lt%3B/groupbox%26gt%3B%0A%0A%20%20%26lt%3B/prefpane%26gt%3B%0A%0A%26lt%3B/prefwindow%26gt%3B%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Uxapb

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EExtension%20List%20Generator%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABVUlEQVQ4y2P4//8/AyWYoALpQsb9ftPM/4tnM+4nywCQ5s5jRf8d+7T+k2VAxHzH/TUHkv57TDMgzgWyJYz74xZ6/E9Y4vU/ZaXv/9Jd0f/LDkb+j13v8N9xmtp/oy6J/xqN/P+5Ihj2YzUApHnxtb7/My83/e8+W/C/9nj8//yD/v+T99j/D99u8N9nk/J/h9Vi/+Vq2P5jNQBkMz7NTuvE/1ut5v0vV8+M3QCQs3Fptlsh+l93Ktd/pTaW/wKpjAgDYFEFCjCQn3HZDNLME8tYANLDEcrgADcAFlWg0AYFGC5nK3ew/McaC6BEAopnUFSBQhubZpMVbP81JrFgdwEyBkUVup9BNoM0681hBdMYYYCMQfGMzc8gGqQZ5BIQxhkLoEQCimeQs0E2IcuB+CDNxkvZ/ktX4jAAlMJAiQRkA8iZML+CaBAfJA7SDOTvJyovEMIAruB4gKjNkYMAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*%0A%20*%20%20This%20Source%20Code%20Form%20is%20subject%20to%20the%20terms%20of%20the%20Mozilla%20Public%0A%20*%20%20License%2C%20v.%202.0.%20If%20a%20copy%20of%20the%20MPL%20was%20not%20distributed%20with%20this%0A%20*%20%20file%2C%20You%20can%20obtain%20one%20at%20http%3A//mozilla.org/MPL/2.0/.%0A%20*%0A%20*%20%20Contributor%28s%29%3A%0A%20*%20%20-%20LouCypher%20%28original%20code%29%0A%20*/%0A%0Avar%20xul%20%3D%20this.Help%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.tooltipText%20+%3D%20%22%5CnGenerate%20list%20of%20enabled%20extensions%20to%20selected%20output%3A%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5CnHTML%2C%20Markdown%2C%20BBCode%2C%20or%20plain%20text.%22%0A%0Avar%20menupopup%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Amenupopup.setAttribute%28%22oncommand%22%2C%20%22generate%28event%29%3B%22%29%3B%0Amenupopup.generate%20%3D%20generate.bind%28%29%3B%0A%0A%5B%22HTML%22%2C%20%22Markdown%22%2C%20%22BBCode%22%2C%20%22Plain%20text%22%5D.forEach%28function%28format%29%20%7B%0A%20%20var%20menuitem%20%3D%20menupopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20menuitem.setAttribute%28%22label%22%2C%20format%29%3B%0A%7D%29%0A%0Amenupopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0A%0Avar%20optionsMenu%20%3D%20menupopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0AoptionsMenu.setAttribute%28%22label%22%2C%20%22Options%22%29%3B%0AoptionsMenu.setAttribute%28%22oncommand%22%2C%20%22openOptions%28%29%3B%22%29%3B%0AoptionsMenu.openOptions%20%3D%20openOptions.bind%28%29%3B%0A%0Avar%20rptCurrentDate%2C%20rptAddonsURLs%2C%20rptAddonsDescs%2C%20rptThemeScreenshot%2C%0A%20%20%20%20rptInsideSpoiler%3B%0A%0AinitPrefs%28%29%3B%0A%0Afunction%20generate%28aEvent%29%20%7B%0A%20%20if%20%28aEvent.target.getAttribute%28%22label%22%29%20%3D%3D%20%22Options%22%29%20return%3B%0A%20%20initPrefs%28%29%3B%0A%20%20AddonManager.getAddonsByTypes%28%5B%22theme%22%2C%20%22extension%22%5D%2C%20function%28addons%29%20%7B%0A%20%20%20%20var%20theme%3B%0A%20%20%20%20var%20extArray%20%3D%20%5B%5D%3B%0A%20%20%20%20addons.forEach%28function%28addon%29%20%7B%0A%20%20%20%20%20%20if%20%28addon.isActive%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28addon.type%20%3D%3D%20%22theme%22%29%20theme%20%3D%20addon%3B%0A%20%20%20%20%20%20%20%20else%20extArray.push%28addon%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%0A%20%20%20%20extArray.sort%28function%28a%2C%20b%29%20%7B%0A%20%20%20%20%20%20a%20%3D%20a.name.toLowerCase%28%29%3B%0A%20%20%20%20%20%20b%20%3D%20b.name.toLowerCase%28%29%3B%0A%20%20%20%20%20%20if%20%28a%20%3C%20b%29%20return%20-1%3B%0A%20%20%20%20%20%20if%20%28a%20%3E%20b%29%20return%201%3B%0A%20%20%20%20%20%20return%200%3B%0A%20%20%20%20%7D%29%0A%20%20%20%20var%20title%20%3D%20%22My%20%22%20+%20Services.appinfo.name%20+%20%22%20%22%20+%20Services.appinfo.version%20+%20%22%20information%22%3B%0A%20%20%20%20var%20date%20%3D%20new%20Date%28%29%3B%0A%20%20%20%20switch%20%28aEvent.target.getAttribute%28%22label%22%29%29%20%7B%0A%20%20%20%20%20%20case%20%22HTML%22%3A%20generateHTML%28title%2C%20date%2C%20theme%2C%20extArray%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22Markdown%22%3A%20generateMarkdown%28title%2C%20date%2C%20theme%2C%20extArray%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22BBCode%22%3A%20generateBBCode%28title%2C%20date%2C%20theme%2C%20extArray%29%3B%20break%3B%0A%20%20%20%20%20%20case%20%22Plain%20text%22%3A%20generateText%28title%2C%20date%2C%20theme%2C%20extArray%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%29%0A%7D%0A%0Afunction%20generateHTML%28aTitle%2C%20aDate%2C%20aTheme%2C%20aArray%29%20%7B%0A%20%20var%20extensions%20%3D%20%27%3C%21doctype%20html%3E%3Chtml%20itemscope%3D%22itemscope%22%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%20itemtype%3D%22http%3A//schema.org/WebPage%22%3E%3Chead%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3Cmeta%20charset%3D%22utf-8%22%3E%3Cmeta%20itemprop%3D%22description%22%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%20content%3D%22%27%20+%20aTitle%20+%20%27%22%3E%3Cmeta%20name%3D%22description%22%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%20content%3D%22%27%20+%20aTitle%20+%20%27%22%3E%3Ctitle%3E%27%20+%20aTitle%20+%20%27%3C/title%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3C/head%3E%3Cbody%3E%3Ch1%3E%27%20+%20aTitle%20+%20%27%3C/h1%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptCurrentDate%20%3F%20%22%3Cp%3ELast%20updated%3A%20%22%20+%20aDate%20+%20%22%3C/p%3E%22%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3Ch2%3EUser%20agent%3C/h2%3E%3Cp%3E%22%20+%20navigator.userAgent%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3C/p%3E%3Ch2%3ETheme%3C/h2%3E%3Cp%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%20%26%26%20%21isDefaultTheme%28aTheme%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%27%3Ca%20href%3D%22%27%20+%20getThemeURL%28aTheme%29%20+%20%27%22%3E%27%20+%20aTheme.name%20+%20%27%3C/a%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20aTheme.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3C/p%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptThemeScreenshot%20%26%26%20%21isDefaultTheme%28aTheme%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aTheme.screenshots%20%26%26%20%21/getpersonas/.test%28aTheme.screenshots%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%27%3Cp%3E%3Cimg%20src%3D%22%27%20+%20aTheme.screenshots%5B0%5D.url%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%22%20alt%3D%22%27%20+%20aTheme.name%20+%20%27%22/%3E%3C/p%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3Ch2%3EExtensions%3C/h2%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%27%3Col%20class%3D%22column%22%3E%27%3B%0A%20%20aArray.forEach%28function%28addon%29%20%7B%0A%20%20%20%20extensions%20+%3D%20%27%3Cli%20style%3D%22margin-bottom%3A1em%22%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%28%28addon.reviewURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%27%3Ca%20href%3D%22%27%20+%20getAMOPage%28addon.reviewURL%29%20+%20%27%22%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%27%3Ca%20href%3D%22%27%20+%20addon.homepageURL%20+%20%27%22%3E%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%27%3Ca%20href%3D%22http%3A//www.google.com/search%3Fq%3D%22%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%28addon.name%20+%20%22%20extension%22%29%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%22%3E%27%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20addon.name%20+%20%27%3C/a%3E%27%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28addon.version%20%3F%20%22%20%22%20+%20addon.version%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%3F%20%22%3Cbr/%3E%22%20+%20addon.description%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3C/li%3E%22%3B%0A%20%20%7D%29%0A%20%20extensions%20+%3D%20%22%3C/ol%3E%3C/body%3E%3C/html%3E%22%3B%0A%20%20doSomething%28extensions%2C%20%22text/html%22%29%3B%0A%7D%0A%0Afunction%20generateMarkdown%28aTitle%2C%20aDate%2C%20aTheme%2C%20aArray%29%20%7B%0A%20%20var%20idx%20%3D%200%3B%0A%20%20var%20extensions%20%3D%20%22%23%20%22%20+%20aTitle%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptCurrentDate%20%3F%20%22%5Cn%5CnLast%20updated%3A%20%22%20+%20aDate%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%23%23%20User%20agent%5Cn%5Cn%22%20+%20navigator.userAgent%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%23%23%20Theme%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%20%26%26%20%21isDefaultTheme%28aTheme%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5B%22%20+%20aTheme.name%20+%20%22%5D%28%22%20+%20getThemeURL%28aTheme%29%20+%20%22%29%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20aTheme.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptThemeScreenshot%20%26%26%20%21isDefaultTheme%28aTheme%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aTheme.screenshots%20%26%26%20%21/getpersonas/.test%28aTheme.screenshots%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Cn%5Cn%21%5B%22%20+%20aTheme.name%20+%20%22%5D%28%22%20+%20aTheme.screenshots%5B0%5D.url%20+%20%22%29%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%23%23%20Extensions%22%3B%0A%20%20aArray.forEach%28function%28addon%29%20%7B%0A%20%20%20%20idx++%3B%0A%20%20%20%20extensions%20+%3D%20%22%5Cn%5Cn%22%20+%20idx%20+%20%22.%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%28%28addon.reviewURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5B%22%20+%20addon.name%20+%20%22%5D%28%22%20+%20getAMOPage%28addon.reviewURL%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5B%22%20+%20addon.name%20+%20%22%5D%28%22%20+%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%5B%22%20+%20addon.name%20+%20%22%5D%28%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22http%3A//www.google.com/search%3Fq%3D%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%28addon.name%20+%20%22%20extension%22%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%29%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28addon.version%20%3F%20%22%20%22%20+%20addon.version%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%3F%20%22%20%20%5Cn%22%20+%20addon.description%20%3A%20%22%22%29%0A%20%20%7D%29%0A%20%20doSomething%28extensions%2C%20%22text/plain%22%2C%20%22%250A%250A.md%22%29%3B%0A%7D%0A%0Afunction%20generateBBCode%28aTitle%2C%20aDate%2C%20aTheme%2C%20aArray%29%20%7B%0A%20%20var%20extensions%20%3D%20%28rptInsideSpoiler%20%3F%20%22%5Bspoiler%3D%22%20+%20aTitle%20+%20%22%5D%22%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptCurrentDate%20%3F%20%22%5Bb%5DLast%20updated%3A%20%5B/b%5D%22%20+%20aDate%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%5Bb%5DUser%20agent%3A%5B/b%5D%20%22%20+%20navigator.userAgent%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%5Bb%5DTheme%3A%5B/b%5D%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%20%26%26%20%21isDefaultTheme%28aTheme%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Burl%3D%22%20+%20getThemeURL%28aTheme%29%20+%20%22%5D%22%20+%20aTheme.name%20+%20%22%5B/url%5D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20aTheme.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptThemeScreenshot%20%26%26%20%21isDefaultTheme%28aTheme%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aTheme.screenshots%20%26%26%20%21/getpersonas/.test%28aTheme.screenshots%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Cn%5Bimg%5D%22%20+%20aTheme.screenshots%5B0%5D.url%20+%20%22%5B/img%5D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5Cn%5Bb%5DExtensions%3A%5B/b%5D%5Cn%5Blist%3D1%5D%22%0A%20%20aArray.forEach%28function%28addon%29%20%7B%0A%20%20%20%20extensions%20+%3D%20%22%5B*%5D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%28%28addon.reviewURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Burl%3D%22%20+%20getAMOPage%28addon.reviewURL%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Burl%3D%22%20+%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%5Burl%3Dhttp%3A//www.google.com/search%3Fq%3D%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%28addon.name%20+%20%22%20extension%22%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5D%22%20+%20addon.name%20+%20%22%5B/url%5D%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.name%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28addon.version%20%3F%20%22%20%22%20+%20addon.version%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%3F%20%22%5Cn%22%20+%20addon.description%20%3A%20%22%22%29%3B%0A%20%20%7D%29%0A%20%20extensions%20+%3D%20rptInsideSpoiler%20%3F%20%22%5B/list%5D%5B/spoiler%5D%22%20%3A%20%22%5B/list%5D%22%3B%0A%20%20doSomething%28extensions%2C%20%22text/plain%22%29%3B%0A%7D%0A%0Afunction%20generateText%28aTitle%2C%20aDate%2C%20aTheme%2C%20aArray%29%20%7B%0A%20%20var%20idx%20%3D%200%3B%0A%20%20var%20extensions%20%3D%20aTitle%20+%20%22%5Cn%22%0A%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20aTitle.length%3B%20i++%29%20%7B%0A%20%20%20%20extensions%20+%3D%20%22%3D%22%3B%0A%20%20%7D%0A%20%20extensions%20+%3D%20%28rptCurrentDate%20%3F%20%22%5Cn%5CnLast%20updated%3A%20%22%20+%20aDate%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5CnUser%20agent%3A%20%22%20+%20navigator.userAgent%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%5CnTheme%3A%20%22%20+%20aTheme.name%20+%20%22%5Cn%5CnExtensions%5Cn----------%22%3B%0A%20%20aArray.forEach%28function%28addon%29%20%7B%0A%20%20%20%20idx++%3B%0A%20%20%20%20extensions%20+%3D%20%22%5Cn%22%20+%20idx%20+%20%22.%20%22%20+%20addon.name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28addon.version%20%3F%20%22%20%22%20+%20addon.version%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%3F%20%22%5Cn%22%20+%20addon.description%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsURLs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22%5Cn%22%20+%20%28addon.reviewURL%20%3F%20getAMOPage%28addon.reviewURL%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20addon.homepageURL%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%28rptAddonsDescs%20%7C%7C%20rptAddonsURLs%20%3F%20%22%5Cn%22%20%3A%20%22%22%29%3B%0A%20%20%7D%29%0A%20%20doSomething%28extensions%2C%20%22text/plain%22%29%3B%0A%7D%0A%0Afunction%20isDefaultTheme%28aTheme%29%20%7B%0A%20%20return%20aTheme.id%20%3D%3D%20%22%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D%22%20%7C%7C%0A%20%20%20%20%20%20%20%20%20aTheme.id%20%3D%3D%20%22modern@themes.mozilla.org%22%3B%0A%7D%0A%0Afunction%20getAMOPage%28aReviewURL%29%20%7B%0A%20%20var%20url%20%3D%20aReviewURL.replace%28/%5C/reviews%5C/.*%24/%2C%20%22/%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace%28/mozilla.org%5C/.*%5C/addon%5C//%2C%20%22mozilla.org/addon/%22%29%3B%0A%20%20url%20+%3D%20%22%3Fsrc%3Dexternal-extension-list-generator%22%3B%0A%20%20return%20url%3B%0A%7D%0A%0Afunction%20getThemeURL%28aAddon%29%20%7B%0A%20%20var%20url%3B%0A%20%20if%20%28aAddon.reviewURL%29%20%7B%0A%20%20%20%20return%20getAMOPage%28aAddon.reviewURL%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20var%20id%20%3D%20aAddon.id.match%28/%5Cd+/%29.toString%28%29%3B%0A%20%20%20%20if%20%28/getpersonas/.test%28aAddon.screenshots%5B0%5D.url%29%29%20%7B%0A%20%20%20%20%20%20url%20%3D%20%22http%3A//getpersonas.com/persona/%22%20+%20id%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20url%20%3D%20%22http%3A//addons.mozilla.org/addon/%22%20+%20id%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20url%20+%3D%20%22/%3Fsrc%3Dexternal-extension-list-generator%22%3B%0A%20%20return%20url%3B%0A%7D%0A%0Afunction%20doSomething%28aString%2C%20aContentType%2C%20aExt%29%20%7B%0A%20%20var%20doWhat%20%3D%20custombuttons.confirmBox3%28self.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Extension%20list%20has%20been%20generated.%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Copy%22%2C%20%22Cancel%22%2C%20%22View%22%29%3B%0A%20%20switch%20%28doWhat%29%20%7B%0A%20%20%20%20case%200%3A%20//%20Copy%0A%20%20%20%20%20%20cbu.gClipboard.write%28aString%29%3B%0A%20%20%20%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29.%0A%20%20%20%20%20%20showAlertNotification%28%22chrome%3A//mozapps/skin/xpinstall/xpinstallItemGeneric.png%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.name%2C%20%22Copied%20to%20clipboard%21%22%2C%20false%2C%20%22%22%2C%20null%29%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%202%3A%20//%20View%0A%20%20%20%20%20%20var%20url%20%3D%20%22data%3A%22%20+%20aContentType%20+%20%22%3Bcharset%3Dutf-8%2C%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20encodeURIComponent%28aString%29%20+%20%28aExt%20%3F%20aExt%20%3A%20%22%22%29%3B%0A%20%20%20%20%20%20if%20%28Services.appinfo.ID%20%3D%3D%20%22%7B3550f703-e582-4d05-9a08-453d09bdfdc6%7D%22%29%20%7B%0A%20%20%20%20%20%20%20%20//%20Thunderbird%0A%20%20%20%20%20%20%20%20openContentTab%28url%2C%20%22tab%22%2C%20%22%5Ehttps%3F%3A%22%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20switchToTabHavingURI%28url%2C%20true%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20default%3A%20return%3B%0A%20%20%7D%0A%7D%0A%0Afunction%20getBoolPref%28aPrefName%2C%20aDefVal%29%20%7B%0A%20%20var%20prefRoot%20%3D%20%22custombuttons.extension-list-generator.report.%22%3B%0A%20%20var%20prefBranch%20%3D%20cbu.ps.getBranch%28prefRoot%29%3B%0A%20%20try%20%7B%0A%20%20%20%20return%20prefBranch.getBoolPref%28aPrefName%29%3B%0A%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20prefBranch.setBoolPref%28aPrefName%2C%20aDefVal%29%3B%0A%20%20%20%20return%20aDefVal%3B%0A%20%20%7D%0A%7D%0A%0Afunction%20initPrefs%28%29%20%7B%0A%20%20rptCurrentDate%20%3D%20getBoolPref%28%22currentDate%22%2C%20true%29%3B%0A%20%20rptAddonsURLs%20%3D%20getBoolPref%28%22addonsURLs%22%2C%20true%29%3B%0A%20%20rptAddonsDescs%20%3D%20getBoolPref%28%22addonsDescriptions%22%2C%20false%29%3B%0A%20%20rptThemeScreenshot%20%3D%20getBoolPref%28%22themeScreenshot%22%2C%20true%29%3B%0A%20%20rptInsideSpoiler%20%3D%20getBoolPref%28%22insideSpoiler%22%2C%20false%29%3B%0A%7D%0A%0Afunction%20openOptions%28%29%20%7B%0A%20%20var%20em%20%3D%20Services.ww.getWindowEnumerator%28%29%3B%0A%20%20var%20winName%20%3D%20%22extension-list-generator-options%22%3B%0A%20%20var%20index%20%3D%201%3B%0A%20%20while%20%28em.hasMoreElements%28%29%29%20%7B%0A%20%20%20%20let%20win%20%3D%20em.getNext%28%29%3B%0A%20%20%20%20if%28win.name%20%3D%3D%20winName%29%20%7B%0A%20%20%20%20%20%20win.focus%28%29%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20index++%0A%20%20%7D%0A%20%20openDialog%28%22data%3Aapplication/vnd.mozilla.xul+xml%3Bbase64%2C%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%28btoa%28xul%29%29%2C%20winName%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%22chrome%2C%20dialog%2C%20centerscreen%2C%20close%22%29%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%26lt%3B%3Fxml%20version%3D%221.0%22%3F%26gt%3B%0A%26lt%3B%21--%0A%20%20%20%20This%20Source%20Code%20Form%20is%20subject%20to%20the%20terms%20of%20the%20Mozilla%20Public%0A%20%20%20%20License%2C%20v.%202.0.%20If%20a%20copy%20of%20the%20MPL%20was%20not%20distributed%20with%20this%0A%20%20%20%20file%2C%20You%20can%20obtain%20one%20at%20http%3A//mozilla.org/MPL/2.0/.%0A%0A%20%20%20%20Contributor%28s%29%3A%0A%20%20%20%20-%20LouCypher%20%28original%20code%29%0A--%26gt%3B%0A%0A%26lt%3B%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%3F%26gt%3B%0A%26lt%3B%3Fxml-stylesheet%20href%3D%22data%3Atext/css%3Bbase64%2CYnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdIHsKICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CiAgY29sb3I6ICNGRkY7CiAgYm9yZGVyOiAxcHggc29saWQgIzNBNEVFRTsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgbGlzdC1zdHlsZS1pbWFnZTogdXJsKCJjaHJvbWU6Ly9tb3phcHBzL3NraW4vZXh0ZW5zaW9ucy9oZWFydC5wbmciKTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkY3M0VGOwogIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHJnYmEoMjUxLCAyNTIsIDI1MywgMC43MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyNDYsIDI0NywgMjQ4LCAwLjI3KSA0OSUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyMzEsIDIzMiwgMjMzLCAwLjI1KSA1MSUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSgyMjUsIDIyNiwgMjI5LCAwLjEpKTsKICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgIGxpbmVhci1ncmFkaWVudChyZ2JhKDI1MSwgMjUyLCAyNTMsIDAuNzApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjQ2LCAyNDcsIDI0OCwgMC4yNykgNDklLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjMxLCAyMzIsIDIzMywgMC4yNSkgNTElLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYmEoMjI1LCAyMjYsIDIyOSwgMC4xKSk7Cn0KYnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdIC5idXR0b24tYm94IHsgcGFkZGluZzogMCA2cHggMXB4IDZweDsgfQpidXR0b25bZGxndHlwZT0iZXh0cmEyIl0gLmJ1dHRvbi1pY29uIHsgLW1vei1tYXJnaW4tZW5kOiAzcHg7IH0KYnV0dG9uW2RsZ3R5cGU9ImV4dHJhMiJdOm5vdCg6YWN0aXZlKTpob3ZlciB7CiAgYm9yZGVyLWNvbG9yOiAjNDI3MUZGOwogIGJhY2tncm91bmQtY29sb3I6ICMwNDU5Rjc7CiAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAwIDMuNXB4IGhzbCgxOTAsIDkwJSwgODAlKTsKICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDAgMy41cHggaHNsKDE5MCwgOTAlLCA4MCUpOwogIC1tb3otdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAuNHMgZWFzZS1pbiwKICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvciAuM3MgZWFzZS1pbiwKICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3cgLjNzIGVhc2UtaW47CiAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIC40cyBlYXNlLWluLAogICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yIC4zcyBlYXNlLWluLAogICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyAuM3MgZWFzZS1pbjsKfQpidXR0b25bZGxndHlwZT0iZXh0cmEyIl06YWN0aXZlOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOEZBMUMxOwogIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjY1KSByZ2JhKDAsIDAsIDAsIDAuNTUpIHJnYmEoMCwgMCwgMCwgMC41KTsKICAtbW96LWJveC1zaGFkb3c6IDAgMCA2LjVweCByZ2JhKDAsIDAsIDAsIDAuNCkgaW5zZXQsCiAgICAgICAgICAgICAgICAgICAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC40KSBpbnNldCwKICAgICAgICAgICAgICAgICAgIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOwogICAgICAgYm94LXNoYWRvdzogMCAwIDYuNXB4IHJnYmEoMCwgMCwgMCwgMC40KSBpbnNldCwKICAgICAgICAgICAgICAgICAgIDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjQpIGluc2V0LAogICAgICAgICAgICAgICAgICAgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7Cn0%253D%22%3F%26gt%3B%0A%0A%26lt%3Bprefwindow%0A%20%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%20%20id%3D%22extension-list-generator-options%22%20title%3D%22Extension%20List%20Generator%20Options%22%0A%20%20buttons%3D%22extra2%2C%20accept%2C%20cancel%22%0A%20%20buttonlabelextra2%3D%22Contribute%22%0A%20%20ondialogextra2%3D%22contribute%28%29%3B%20close%28%29%3B%22%0A%20%20onload%3D%22sizeToContent%28%29%3B%22%26gt%3B%0A%0A%20%20%26lt%3Bscript%20type%3D%22application/x-javascript%22%26gt%3B%26lt%3B%21%5BCDATA%5B%0A%20%20%20%20function%20contribute%28%29%20%7B%0A%20%20%20%20%20%20var%20url%20%3D%20%22http%3A//loucypher.github.io/userscripts/donate.html%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%3FExtension+List+Generator%22%0A%20%20%20%20%20%20var%20win%20%3D%20window.opener%3B%0A%20%20%20%20%20%20if%20%28%22openContentTab%22%20in%20win%29%20%7B%0A%20%20%20%20%20%20%20%20win.openContentTab%28url%2C%20%22tab%22%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20win.openLinkIn%28url%2C%20%22tabshifted%22%2C%20%7B%7D%29%3B%20//%20Requires%20utilityOverlay.js%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%5D%5D%26gt%3B%26lt%3B/script%26gt%3B%0A%0A%20%20%26lt%3Bprefpane%20id%3D%22prefpane-menu%22%20label%3D%22Prefpane%20menu%22%26gt%3B%0A%0A%20%20%20%20%26lt%3Bpreferences%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22date%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.currentDate%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22addonsURLs%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.addonsURLs%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22addonsDescriptions%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.addonsDescriptions%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22themeScreenshot%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.themeScreenshot%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bpreference%20id%3D%22spoilerTag%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22custombuttons.extension-list-generator.report.insideSpoiler%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3D%22bool%22/%26gt%3B%0A%20%20%20%20%26lt%3B/preferences%26gt%3B%0A%0A%20%20%20%20%26lt%3Bgroupbox%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcaption%26gt%3BSelect%20which%20informations%20to%20include%26lt%3B/caption%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Current%20date%22%20preference%3D%22date%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Add-ons%20URLs%22%20preference%3D%22addonsURLs%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Add-ons%20Descriptions%22%20preference%3D%22addonsDescriptions%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Theme%20screenshot%20%28for%20non-default%20theme%29%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20preference%3D%22themeScreenshot%22/%26gt%3B%0A%20%20%20%20%26lt%3B/groupbox%26gt%3B%0A%0A%20%20%20%20%26lt%3Bgroupbox%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcaption%26gt%3BBBCode%20ouput%26lt%3B/caption%26gt%3B%0A%20%20%20%20%20%20%26lt%3Bcheckbox%20label%3D%22Inside%20%5Bspoiler%5D%20tag%22%20preference%3D%22spoilerTag%22/%26gt%3B%0A%20%20%20%20%20%20%26lt%3Blabel%26gt%3BNot%20all%20forum%20softwares%20support%20this%20tag.%26lt%3B/label%26gt%3B%0A%20%20%20%20%26lt%3B/groupbox%26gt%3B%0A%0A%20%20%26lt%3B/prefpane%26gt%3B%0A%0A%26lt%3B/prefwindow%26gt%3B%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

turbot, большое спасибо.
имхо, кнопка заслуживает место в готовых. )

Есть кнопка для запуска VBscript, а такой же только с перламутр для скриптов .js нету?
Поясню, а то может у меня проблема с названиями.  Есть скрипт который иногда используется. Включаю командную строку (ctrl+shift+k), вставляю и жму ввод. А чтоб лишних движений не делать?

Mishania
Bookmarklet сделайте или во вкладку "Код" CB положите - код будет выполнятся при нажатии закладки/кнопки.

turbot
Спасибо. Букмарклет сработал, кнопка нет.

Mishania пишет

кнопка нет

Код, естественно, поправить нужно, чтоб сработала. Как минимум, позаменять document на window.content.document.

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

скрытый текст
// ------  Очистка searchbar по ПКМ на иконке лупы

var sbar = document.getElementById("searchbar");
var butt  = document.getAnonymousElementByAttribute(sbar, "anonid", "search-go-button");

var attr = '\
    if (event.button == 2) { event.preventDefault(); this.parentNode.parentNode.value = ""; }\
    else handleSearchCommand(event);';

butt.setAttribute("onclick", attr);

// ------ Фикс открытия новой вкладки при ЛКМ по лупе
(bar => {
    if (!bar) return;
    var btn = document.getAnonymousElementByAttribute(bar, "anonid", "search-go-button");
    var prfx = 'event.button == 0 && gPrefService.getBoolPref("browser.search.openintab")\n\t'
        + '? doSearch(value, event.shiftKey ? "tabshifted" : "tab")\n\t: ';
    function setAttr(arg) btn.setAttribute("onclick", (arg ? "" : prfx) + "handleSearchCommand(event);");
    setAttr(); addDestructor(setAttr);
})(BrowserSearch.searchBar);

В ESR 45.4.0 перестала работать Menuitem hider

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EMenuitem%20hider%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz/fHx8/3t7e/97e3v/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/6Gkyf9HWOP/OEas//f3+v////////////////////////////////////////////Ly8///////fHx8/3x8fP9ueNT/Rlzs/x810P+/xe///////////////////////////////////////9fX3f+Mjbb//////3x8fP98fHz/V2HM/0FZ5P8xRt3/P02w/3d6jv6FhYX+hYWF/oWFhf6FhYX+hYWF/oWFhf5HSZH/T1B6/oWFhf58fHz/fHx8/5me8v80TN3/HDfd/ztIu//IzfL///////////////////////////+6u87/NULL/+Dg5P//////fHx8/3x8fP/o6PX/VGPS/xYy2P8aMMv/ra3A///////////////////////o6Or/NUjT/3uCvP///////////3x8fP98fHz/hYWF/nd4k/4xRtb/Ei7a/yQwpv9ycXT+hYWF/oWFhf6AgYP+OUOb/yE1yf95eXz+hYWF/oWFhf58fHz/fHx8////////////e36v/x820P8QLd7/VVur//T09P//////cXjC/xs27v+qrMj/////////////////fHx8/3x8fP///////////42Njf+7vfX/ITjT/x444P9dZLD/YWq3/xUy8/9lb8P//////////////////////3x8fP98fHz/hYWF/oWFhf6FhYX+hYWF/nl7oP4aLbj/DSbT/w4r4f8sOrP/e3uC/oWFhf6FhYX+hYWF/oWFhf58fHz/fHx8////////////jY2N//T09v+ho9X/FCzS/wki2/8DHNP/OknJ/8fN9v//////////////////////fHx8/3x8fP///////////2xtf/9dZ7//GDPk/wcn6/8vQtH/ZnDX/wke0f8+S7n/ys7n/////////////////3x8fP98fHz/dXV7/mNolP9reeT/VGr5/0BX9f8yRMn/cHGG/oWFhf5rb7L+KkPy/zE8of9mZnT+hYWF/oWFhf58fHz/e3t8/2Vy0P+JmPj/h5b6/3qK9v9/idz/3Nzl/////////////////9na+P+Ik/j/Y27S/5CSrP/y8vP/fHx8/3x8fP+WpPn/coPp/4OP3/+ws9f/9vb6////////////////////////////+fn9/8XH+P+Mk+//ZWmq/3t7e/98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20ids%20%3D%20%5B%0A%22%23context-viewsource%22%2C%20/*%20%u0418%u0441%u0445%u043E%u0434%u043D%u044B%u0439%20%u043A%u043E%u0434%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B*/%0A%22%23lpt_lpcontentareacontextmenu%22%2C%20/*%20LastPass*/%0A%22%23lpt_lpfillformsmenu4%22%2C%20/*%20LastPass%20%u0437%u0430%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u0435%20%u0444%u043E%u0440%u043C*/%0A%22%23context-viewbgimage%22%2C%20/*%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0444%u043E%u043D%u043E%u0432%u043E%u0435%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435*/%0A%22%23context-viewinfo%22%2C%20/*%20%u0418%u043D%u0444%u043E%u0440%u043C%u0430%u0446%u0438%u044F%20%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435*/%0A%22%23context-sep-viewsource%22%2C%20/*%20menuseparator*/%0A%0A%22%23context-openlinkintab%22%2C%20/*%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435*/%0A%22%23context-openlinkprivate%22%2C%20/*%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u043D%u043E%u0432%u043E%u043C%20%u043F%u0440%u0438%u0432%u0430%u0442%u043D%u043E%u043C%20%u043E%u043A%u043D%u0435*/%0A%22%23context-openlink%22%2C%20/*%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u043D%u043E%u0432%u043E%u043C%20%u043E%u043A%u043D%u0435*/%0A%0A%22%23context-bookmarklink%22%2C%20/*%20%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0438*/%0A%22%23context-setDesktopBackground%22%2C%20/*%20%u0421%u0434%u0435%u043B%u0430%u0442%u044C%20%u0444%u043E%u043D%u043E%u0432%u044B%u043C%20%u0440%u0438%u0441%u0443%u043D%u043A%u043E%u043C%20%u0440%u0430%u0431%u043E%u0447%u0435%u0433%u043E%20%u0441%u0442%u043E%u043B%u0430%u2026*/%0A%22%23context-sendimage%22%2C%20/*%20%u041E%u0442%u043F%u0440%u0430%u0432%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u043F%u043E%20%u043F%u043E%u0447%u0442%u0435%u2026*/%0A%22%23context-copyimage-contents%22%2C%20/*%20%u041A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435*/%0A%22%23context-saveimage%22%2C%20/*%20%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u043A%u0430%u043A%u2026*/%0A%22%23context-bookmarkpage%22%2C%20/*%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0443*/%0A%22%23toggle_lpt_lastpass-toolbar%22%2C%20/*%20%u041F%u0430%u043D%u0435%u043B%u044C%20%u0438%u043D%u0441%u0442%u0440%u0443%u043C%u0435%u043D%u0442%u043E%u0432%20LastPass*/%0A%22%23toggle_Gismeteo-toolbar%22%2C%20/*%20Gismeteo.Bar*/%0A%22%23toggle_Overlay_Toolbar%22%2C%20/*%20SimpleTV%20Toolbar*/%0A%0A%5D//menuitem%20hider%20mark%0A%0Avar%20button%20%3D%20this%2C%20currentImage%20%3D%20this.image%3B%0Aconst%20imgFalse%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHz/fHx8/3t7e/97e3v/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/6Gkyf9HWOP/OEas//f3+v////////////////////////////////////////////Ly8///////fHx8/3x8fP9ueNT/Rlzs/x810P+/xe///////////////////////////////////////9fX3f+Mjbb//////3x8fP98fHz/V2HM/0FZ5P8xRt3/P02w/3d6jv6FhYX+hYWF/oWFhf6FhYX+hYWF/oWFhf5HSZH/T1B6/oWFhf58fHz/fHx8/5me8v80TN3/HDfd/ztIu//IzfL///////////////////////////+6u87/NULL/+Dg5P//////fHx8/3x8fP/o6PX/VGPS/xYy2P8aMMv/ra3A///////////////////////o6Or/NUjT/3uCvP///////////3x8fP98fHz/hYWF/nd4k/4xRtb/Ei7a/yQwpv9ycXT+hYWF/oWFhf6AgYP+OUOb/yE1yf95eXz+hYWF/oWFhf58fHz/fHx8////////////e36v/x820P8QLd7/VVur//T09P//////cXjC/xs27v+qrMj/////////////////fHx8/3x8fP///////////42Njf+7vfX/ITjT/x444P9dZLD/YWq3/xUy8/9lb8P//////////////////////3x8fP98fHz/hYWF/oWFhf6FhYX+hYWF/nl7oP4aLbj/DSbT/w4r4f8sOrP/e3uC/oWFhf6FhYX+hYWF/oWFhf58fHz/fHx8////////////jY2N//T09v+ho9X/FCzS/wki2/8DHNP/OknJ/8fN9v//////////////////////fHx8/3x8fP///////////2xtf/9dZ7//GDPk/wcn6/8vQtH/ZnDX/wke0f8+S7n/ys7n/////////////////3x8fP98fHz/dXV7/mNolP9reeT/VGr5/0BX9f8yRMn/cHGG/oWFhf5rb7L+KkPy/zE8of9mZnT+hYWF/oWFhf58fHz/e3t8/2Vy0P+JmPj/h5b6/3qK9v9/idz/3Nzl/////////////////9na+P+Ik/j/Y27S/5CSrP/y8vP/fHx8/3x8fP+WpPn/coPp/4OP3/+ws9f/9vb6////////////////////////////+fn9/8XH+P+Mk+//ZWmq/3t7e/98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/fHx8/3x8fP98fHz/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Aconst%20pn%20%3D%20%22custombutton.menuitem_hider.active%22%3B%0Avar%20prefs%20%3D%20Application.prefs%3B%0Aif%20%28%20%21prefs.has%28pn%29%20%29%20prefs.setValue%28%20pn%2C%20true%20%29%3B%0Avar%20pref%20%3D%20prefs.get%28%20pn%20%29%3B%0A%0Avar%20ios%20%3D%20Cc%5B%27@mozilla.org/network/io-service%3B1%27%5D.getService%28Ci.nsIIOService%29%3B%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Aconst%20us%20%3D%20sss.USER_SHEET%3B%0A%0Afunction%20makeCssURI%28%29%20%7B%0A%20%20%20%20%20%20%20%20cssStr%20%3D%20ids%20+%20%22%20%7B%20display%3A%20none%20%21important%20%7D%22%0A%20%20%20%20%20%20%20%20return%20ios.newURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28cssStr%29%2C%20null%2C%20null%29%3B%0A%7D%0Avar%20currCssURI%20%3D%20makeCssURI%28%29%3B%0Aif%20%28%20pref.value%20%29%20regSheet%28%20currCssURI%2C%20true%20%29%3B%0A%0Afunction%20regSheet%28newCssURI%2C%20reg%29%20%7B%0A%0A%09if%20%28sss.sheetRegistered%28currCssURI%2C%20us%29%29%20sss.unregisterSheet%28currCssURI%2C%20us%29%3B%0A%09if%20%28%21reg%29%20return%3B%0A%09if%20%28%21sss.sheetRegistered%28newCssURI%2C%20us%29%29%20sss.loadAndRegisterSheet%28newCssURI%2C%20us%29%3B%0A%09currCssURI%20%3D%20newCssURI%3B%0A%7D%0Afunction%20onClick%28e%29%20%7B%0A%09if%20%28e.button%20%21%3D%201%29%20return%3B%0A%09var%20target%20%3D%20e.target%3B%0A%09var%20nn%20%3D%20target.nodeName%3B%0A%09if%20%28nn%20%21%3D%20%22menuitem%22%20%26%26%20nn%20%21%3D%20%22menu%22%20%26%26%20nn%20%21%3D%20%22menuseparator%22%29%20return%3B%0A%09var%20id%20%3D%20target.id%3B%0A%09if%20%28%21id%29%20return%3B%0A%09var%20label%20%3D%20target.label%20%7C%7C%20target.nodeName%3B%0A%0A%09var%20link%20%3D%20custombuttons.makeButtonLink%28%22edit%22%2C%20button.id%29%3B%0A%09var%20param%20%3D%20custombuttons.cbService.getButtonParameters%28link%29%3B%0A%09param%20%3D%20param.wrappedJSObject%20%7C%7C%20param%3B%0A%09var%20init%20%3D%20param.initCode%3B%0A%09var%20index%20%3D%20init.indexOf%28%22%5Cn%5D//menuitem%20hider%20mark%22%29%3B%0A%09var%20part1%20%3D%20init.substring%280%2C%20index%29%3B%0A%09var%20part2%20%3D%20init.substring%28index%2C%20init.length%29%3B%0A%09param.initCode%20%3D%20part1%20+%20%27%22%23%27%20+%20id%20+%20%27%22%2C%20/*%20%27%20+%20label%20+%20%27%5C*%5C/%27%20+%20%27%5Cn%27%20+%20part2%3B%0A%09custombuttons.cbService.installButton%28param%29%3B%09%0A%7D%0AaddEventListener%28%22click%22%2C%20onClick%2C%20false%29%3B%0A%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%09removeEventListener%28%22click%22%2C%20onClick%2C%20false%29%3B%0A%09regSheet%28currCssURI%2C%20false%29%3B%0A%09if%20%28reason%20%3D%3D%20%22delete%22%29%20pref.reset%28%29%3B%0A%7D%0Abutton.onclick%20%3D%20function%28e%29%20%7B%0A%09if%20%28e.button%29%20return%3B%0A%09pref.value%20%3D%20%21pref.value%3B%0A%09button.image%20%3D%20pref.value%20%3F%20currentImage%20%3A%20imgFalse%3B%0A%09pref.value%20%3F%20button.init%28%29%20%3A%20button.onDestroy%28%29%3B%0A%7D%0Abutton.image%20%3D%20pref.value%20%3F%20currentImage%20%3A%20imgFalse%3B%0Aif%20%28%20%21pref.value%20%29%20button.onDestroy%28%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Mishania пишет

В ESR 45.4.0 перестала работать Menuitem hider

Menuitem hider( Firefox24+ ) от 07.06.2016.

Mishania
У меня работает нормалек на ESR

Ранее советовали код для скрытия панели в заголовке All-in-one sidebar, но сейчас он не работает. Может кто нибудь подправить?
http://s016.radikal.ru/i334/1609/7e/2c457781e422.png

_zt пишет

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

Выделить код

Код:

// Очистка searchbar по ПКМ на иконке лупы
// Фикс открытия новой вкладки при ЛКМ по лупе
(bar => {
   if (!bar) return;
   var btn = document.getAnonymousElementByAttribute(bar, "anonid", "search-go-button");
    
   btn.setAttribute('onclick', '\
      event.button == 0 && gPrefService.getBoolPref("browser.search.openintab")\
      ? doSearch(value, event.shiftKey ? "tabshifted" : "tab")\
      : event.preventDefault(); BrowserSearch.searchBar.value = "";\
   ');
    
   addDestructor(()=> btn.setAttribute('onclick', 'handleSearchCommand(event);') );
    
})(BrowserSearch.searchBar);

Не работает кнопка менеджера загрузок в FF, в PM работает нормально.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EDownloads%20in%20tab%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACmElEQVR42oyU3UtUQRiHn9k9c47Ho+4uhrkthmUfkHeB91GJ1paiJl0EQZd9U3f+E1EX0b8QEUQX0ScZWd0E3VhBrWJFuZuEqyLsOTtnznSxx9rSzPdq5p13nhl+729GTBXL/BUJwAFcwAZEnDdAFagAARDVb7JYHQ6QBTKsHWWgGAPXBblAZu/ubTdUQ6YnKWslWoVIv/z6zYeZ08DCRkA2QPOW7T2dXTuwLAsMhDrk03Shp77mfyABkE6laGluRgiBACJjSKXSf9T8D1RbsBJIy0IIgcGQMAYrKfhn/b9BFtKWv1sWGZKJ5LqgJNAQiyyB1hpI4ti/pYiiCEvKlWlrbIcwFt23YkgH4NWf4DV5OI4DQmCMwWiN53n1FsnF42Xgq5gqljPA9u7OjjvupmxHUypF++Z2duzsIp3O1DQyhkhr5svzFAoFSsUSy0uL6KW5z29nZkeAaSt2a/Xy2Nit8RevLmS3bJUtqRSNXiOOLX+BwlCTTmfY091NLpujNPtF5fvP3IxdrizAB2bPnjt/r21zm3g6PnHe3tQqGxwHy5KIhMBEBoTCMQalAsJqJTh18sS1oeFjD32liysaaWDRV3pydPQ4rtMQPh6fuNjouo7luiREgshEGBPhhyHzc9+DwXz/1YGh4fu+0u+ARUCvtD8EFnylJ/MDg5G0ZfT42cSlnN3peF4TRkWoasCPuWLl6OH+a4fyRx4ENUg5vsgfPgqBcqD0u96+wwYET5+/vNjWnnONiSh9+1rJ9x28cqC3/1Gg9Pt6yFqG1EC5Gur3vX2HsG2pbt+5exYDI0OD1/ftP/ikGq6GAIg1/iNik6Ydmdzl2nI3QKWqPgRKf4xfvt7oE9HAQqD0ZKB0Ic75sYv1Wht+DgB8pQ6678CoOAAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................................................%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%0A%20%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041B%u041A%u041C%20....%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20document.getElementById%28%27sidebar-box%27%29.getAttribute%28%27sidebarcommand%27%29%20%3F%20toggleSidebar%28%29%20%3A%20openWebPanel%28%22Downloads%22%2C%20downTabUrl%20%29%3B%20%20%20%20%20%09%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u0421%u041A%u041C%20....%20%20%20%20%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20var%20windows%20%3D%20Components.%20classes%20%5B%27@mozilla.org/appshell/window-mediator%3B1%27%5D.getService%28Components.%20interfaces.%20nsIWindowMediator%29.getEnumerator%20%28null%29%3B%0A%20%20%20%20%20%20%20%20%20%20while%28%20windows.%20hasMoreElements%28%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20win%20%3D%20windows.getNext%20%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20win.document.documentURI%20%3D%3D%20%22chrome%3A//mozapps/content/downloads/downloads.xul%22%29%20%7B%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.close%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20BrowserDownloadsUI%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0434%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041F%u041A%u041C%20....%20%20%20%20%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20downloadManagerInTab%28%20true%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%0A%0A%0A//%20%u041E%u0431%u044A%u044F%u0432%u043B%u044F%u0435%u043C%20%u043F%u0435%u0440%u0435%u043C%u0435%u043D%u043D%u044B%u0435%20%u0434%u043B%u044F%20%u044D%u0442%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20...................................................................%0Avar%20downTabUrl%20%3D%20%27chrome%3A//mozapps/content/downloads/downloads.xul%27%3B%0A%0A//%20%u0438%u043A%u043E%u043D%u043A%u0438%20%u0434%u043B%u044F%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%20....%0Aconst%20trueDownloadsImg%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAIAAAMACyIAEGyoLtVqpyrVDSIADwAAAgABAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIAAgAAAgALHwAPZaAmwsXxnv+t63n/XpwbwAcUAA0AAAIAAQIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwADAAACAAwgAA9loyXFv+2W/7/wl/yg52b8n+Nj/1OJG8EBCAAMAAACAAECAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAIAAAIADCEADmSiI8Sx4oX/suWH+7HmhP+T3FX/i9dK+5LZUv9RhxnAAQkADAAAAgABAgACAAAAAAAAAAAAAAAAAQIAAgAAAgANIQANY6Eiw6nbfP+l23f7p913/6fed/+I0kj/gs5A/37KPvuL0Ev/UIYYvwIJAAsAAAIAAQIAAgAAAAABAQABAAABAAsgAA1gnh/BoNJy/5vSa/qe1W3/odhx/5/Ybv+Cy0H/fsg8/3zFOv92vjX6g8VD/0yCFL0BCAALAAABAAABAAEAAAEACRUAEmqmKcyn2Hr/n9Ry/Z3Tbv+Yz2b/mtJp/5nRZv99xDz/ecI3/3e/Nv97wT7/e78//YvKT/9Xjhy/BAwACQAAAQAAAAEAFCkAL2CUKdxhkTDXXI4o1m+mN/KWzGb/ksth/pLLX/93vTn/croz/nm9Pf9noizyVoog1lqNJtlbkx/TDyAAHwAAAQAAAAAAAAAAAAAAAAACAwEEAAAAAD5oFqeXz2X/icFY+4rDWP9ytjX/bLEu+3/CQv8+ZxSnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAEAAQEBAQEDBAMEAAAAAEFqFqeSyV7/g7pR+4S8Uf9usDP/aKsr+3u9Pv9AaRSnAAAAAAMEAgQBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeNxVj/fbRK+3+2Sv9rqzD/ZaYo+3m5PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeJwlT/eLBF+3qyRv9qqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeHwFD/da5B+3exQv9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeEv03/cqw8+3WvPv9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFKeCvkn/cKs4+3OuO/9pqS7/ZKQo+3m4PP8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAD9oE6d+vET/bKky+2+sNf9oqCv/Y6Mm+3e3Ov8/aBOnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwEEAAAAAEBpFaeDv0v/cKw5+3OvPP9vqzX/aqcx+3+8RP9AaRSnAAAAAAIDAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAEAAAAADlkCox1szT/a6Yv+W2oMPxspy78aqQt+XSyMv85ZAqMAAAAAAECAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%3B%0Aconst%20falseDownloadsImg%20%3D%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACmElEQVR42oyU3UtUQRiHn9k9c47Ho+4uhrkthmUfkHeB91GJ1paiJl0EQZd9U3f+E1EX0b8QEUQX0ScZWd0E3VhBrWJFuZuEqyLsOTtnznSxx9rSzPdq5p13nhl+729GTBXL/BUJwAFcwAZEnDdAFagAARDVb7JYHQ6QBTKsHWWgGAPXBblAZu/ubTdUQ6YnKWslWoVIv/z6zYeZ08DCRkA2QPOW7T2dXTuwLAsMhDrk03Shp77mfyABkE6laGluRgiBACJjSKXSf9T8D1RbsBJIy0IIgcGQMAYrKfhn/b9BFtKWv1sWGZKJ5LqgJNAQiyyB1hpI4ti/pYiiCEvKlWlrbIcwFt23YkgH4NWf4DV5OI4DQmCMwWiN53n1FsnF42Xgq5gqljPA9u7OjjvupmxHUypF++Z2duzsIp3O1DQyhkhr5svzFAoFSsUSy0uL6KW5z29nZkeAaSt2a/Xy2Nit8RevLmS3bJUtqRSNXiOOLX+BwlCTTmfY091NLpujNPtF5fvP3IxdrizAB2bPnjt/r21zm3g6PnHe3tQqGxwHy5KIhMBEBoTCMQalAsJqJTh18sS1oeFjD32liysaaWDRV3pydPQ4rtMQPh6fuNjouo7luiREgshEGBPhhyHzc9+DwXz/1YGh4fu+0u+ARUCvtD8EFnylJ/MDg5G0ZfT42cSlnN3peF4TRkWoasCPuWLl6OH+a4fyRx4ENUg5vsgfPgqBcqD0u96+wwYET5+/vNjWnnONiSh9+1rJ9x28cqC3/1Gg9Pt6yFqG1EC5Gur3vX2HsG2pbt+5exYDI0OD1/ftP/ikGq6GAIg1/iNik6Ydmdzl2nI3QKWqPgRKf4xfvt7oE9HAQqD0ZKB0Ic75sYv1Wht+DgB8pQ6678CoOAAAAABJRU5ErkJggg%3D%3D%22%3B%0A%0A%0A%0A/*%20%u041E%u0442%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%20%u0432%20%u0442%u0430%u0431%u0435%20%u0438%u043B%u0438%20%u043F%u0435%u0440%u0435%u043C%u0435%u0441%u0442%u0438%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%20%u0440%u044F%u0434%u043E%u043C%20%u0441%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u043E%u0439%20%0A%20%20%20%u0435%u0441%u043B%u0438%20%u0437%u0430%u0433%u0440%u0443%u0437%u0438%20%u0443%u0436%u0435%20%u043E%u0442%u043A%u0440%u044B%u0442%u044B%20%u0438%20%u0437%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u0441%u0435%20%u043B%u0438%u0448%u043D%u0438%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%20%20..........................................*/%0Afunction%20downloadManagerInTab%28%20foregroundTab%20%29%20%7B%20%20%20%20%20%20%20%20%20%20%0A%20%20%0A%20%20%20%20%20setTimeout%28function%28%29%20%7B%20closeDownloadManager%28%29%20%7D%2C%200%29%3B%20//%20%u0437%u0430%u043A%u0440%u044B%u0442%u044C%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u044B%u0439%20%u043C%u0435%u043D%u0435%u0434%u0436%u0435%u0440%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0437%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%20%u043A%u0440%u043E%u043C%u0435%20%u043F%u0435%u0440%u0432%u043E%u0439%20....%0A%20%20%20%20%20var%20downTab%20%3D%20null%3B%0A%20%20%20%20%20Array.slice%28%20gBrowser.tabs%20%29.forEach%28function%28tab%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20if%20%28%20tab.linkedBrowser.currentURI.spec%20%21%3D%3D%20downTabUrl%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%21downTab%20%3F%20downTab%20%3D%20tab%20%3A%20gBrowser.removeTab%28tab%29%3B%0A%20%20%20%20%20%7D%29%0A%20%20%20%0A%20%20%20%20%20//%20%u043F%u0435%u0440%u0435%u043C%u0435%u0441%u0442%u0438%u0442%u044C%20%u0438%u043B%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%20%u0440%u044F%u0434%u043E%u043C%20%u0441%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u043E%u0439%20....%0A%20%20%20%20%20var%20selTab%20%3D%20gBrowser.selectedTab%3B%0A%20%20%20%20%20if%20%28%20downTab%20%21%3D%3D%20selTab%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20downTab%20%26%26%20gBrowser.visibleTabs.indexOf%28%20downTab%20%29%20%3D%3D%20-1%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20TabView.moveTabTo%28%20downTab%2C%20TabView._window.GroupItems._activeGroupItem.id%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20downTab%20%3D%20downTab%20%7C%7C%20gBrowser.addTab%28%20downTabUrl%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20pos%20%3D%20selTab._tPos%20+%20%28%20downTab._tPos%20%3E%20selTab._tPos%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20gBrowser.moveTabTo%28%20downTab%2C%20pos%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20downTab%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%7D%20%0A%7D%3B%0A%0A%0A%0A//%20%u0410%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u043C%u0435%u043D%u044F%u0435%u043C%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u0434%u043B%u044F%20%u0442%u0430%u0431%u0430%20%22%u0417%u0430%u0433%u0440%u0443%u0437%u043A%u0438%22%20.........................................................%0AaddEventListener%28%22TabAttrModified%22%2C%20function%28e%29%20%7B%20%0A%20%20%20%20%20if%20%28%20e.target.linkedBrowser.currentURI.spec%20%3D%3D%20downTabUrl%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20tabIndex%20%3D%20gBrowser.getBrowserIndexForDocument%28%20e.target.linkedBrowser.contentDocument%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20tab%20%3D%20gBrowser.mTabContainer.childNodes%5BtabIndex%5D%3B%0A%20%20%20%20%20%20%20%20%20%20LOG%28tab.label%29%0A%20%20%20%20%20%20%20%20%20%20tab.image%20%3D%20%28%20tab.label%20%3D%3D%20%22%u0417%u0430%u0433%u0440%u0443%u0437%u043A%u0438%22%20%29%3F%20falseDownloadsImg%3A%20trueDownloadsImg%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%0A%7D%2C%20true%2C%20gBrowser.tabContainer%29%3B%0A%0A%0A%0A//%20%u041E%u0442%u0441%u043B%u0435%u0436%u0438%u0432%u0430%u0442%u044C%20%u0432%u0441%u0435%20%u043A%u043E%u043C%u0430%u043D%u0434%u044B%20%u0441%u0432%u044F%u0437%u043D%u044B%u0435%20%u0441%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u043E%u0439%20%u0438%20%u0437%u0430%u043F%u0443%u0441%u043A%u0430%u0442%u044C%20%u043D%u0443%u0436%u043D%u044B%u0435%20%u0444%u0443%u043D%u043A%u0446%u0438%u0438%20%u0438%20%u043A%u043E%u043C%u0430%u043D%u0434%u044B%20%20........%0Afunction%20getCommand%28e%29%20%7B%0A%20%20%20%20%20var%20command%20%3D%20e.target.getAttribute%28%22oncommand%22%29%3B%0A%20%20%20%20%20if%20%28%20command%20%3D%3D%20%22performCommand%28%27cmd_removeFromList%27%29%3B%22%20%7C%7C%20command%20%3D%3D%20%27clearDownloadList%28%29%3B%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20content.document.location%20%3D%3D%20downTabUrl%29%20document.getElementById%28%22Browser%3AReload%22%29.doCommand%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20document.getElementById%28%27sidebar-box%27%29.getAttribute%28%27sidebarcommand%27%29%20%29%20openWebPanel%28%22Downloads%22%2C%20downTabUrl%20%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%09%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%7D%3B%20%20%20%20%20%0AaddEventListener%28%22command%22%2C%20getCommand%2C%20true%2C%20window%29%3B%0A%0A%0A%0A//%20%u0418%u0441%u043F%u0440%u0430%u0432%u043B%u044F%u0435%u043C%20%u043E%u0448%u0438%u0431%u043A%u0438%20.......................................................................................%0Afunction%20setFakeArguments%28e%29%20%7B%0A%20%20%20%20%20if%20%28%20e.target.location.href%20%3D%3D%20%27chrome%3A//mozapps/content/downloads/downloads.xul%27%20%29%20%7B%0A%20%20%20%20%20var%20win%20%3D%20e.target.defaultView%3B%0A%20%20%20%20%20win%20%3D%20win.wrappedJSObject%20%7C%7C%20win%3B%0A%20%20%20%20%20win.arguments%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%7D%0A%7D%3B%0AaddEventListener%28%22TabClose%22%2C%20setFakeArguments%2C%20true%2C%20gBrowser%29%3B%0AaddEventListener%28%22DOMContentLoaded%22%2C%20setFakeArguments%2C%20true%2C%20gBrowser%29%3B%0AaddEventListener%28%22DOMContentLoaded%22%2C%20setFakeArguments%2C%20true%2C%20document.getElementById%28%27sidebar-box%27%29%29%3B%0A%0A%0A%0A%0A//%20%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u044B%u0439%20%u043C%u0435%u043D%u0435%u0434%u0436%u0435%u0440%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%20....................................................................%0Afunction%20closeDownloadManager%28%29%20%7B%0A%20%20%20%20%20var%20wm%20%3D%20Cc%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D.getService%28Ci.nsIWindowMediator%29%3B%0A%20%20%20%20%20var%20dm%20%3D%20wm.getMostRecentWindow%28%22Download%3AManager%22%29%3B%0A%20%20%20%20%20if%20%28%20dm%20%29%20dm.close%28%29%3B%20%20%0A%7D%3B%0A%0A%0A%09%09%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20.....................................................................................%0Athis.tooltipText%20%3D%20%22L%3A%20Download%20Manager%20in%20the%20Sidebar%5CnM%3A%20Download%20Manager%20%5CnR%3A%20Download%20Manager%20in%20the%20Tab%5CnCtrl+R%3A%20CB%20menu%20%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

И если можно поменять ЛКМ и ПКМ местами.

foxboy пишет

Не работает кнопка менеджера загрузок в FF

На каком именно FF?

bunda1 пишет
foxboy пишет

Не работает кнопка менеджера загрузок в FF

На каком именно FF?

45 ESR, 38 ESR. PM 24, 25, 25 работает. Т.е. отрывается во вкладке, но загрузок там нет.

bunda1
О-о спасибо.

Код для скрытия панели в заголовке All-in-one sidebar сам нашел по аналогии. Уверен, что понадобится не только мне.

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

Выделить код

Код:

this._handleClick =()=> {
   setToolbarVisibility(bar, bar.collapsed);
   cbu.setPrefs('CB.extra-bar.hidden', bar.collapsed);
};
var bar = document.getElementById("sidebar-header");
bar.collapsed = cbu.getPrefs('CB.navBar.hidden');

bunda1
Может подумаете об оформлении этой кнопки в топике готовых кнопок? Ведь это самый простой способ для скрытия чего угодно. Все вопросы из серии - "а как скрыть ..." можно перенаправлять на эту кнопку.

Приветствую!
В последних ночнушках поломалась кнопка Restore Previous Session
Сейчас там стоит такой код инициализации:

Выделить код

Код:

this.setAttribute('command', 'Browser:RestoreLastSession');
this.setAttribute('onncommand', 'doCommand();');

Прошу помочь с починкой.

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

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

Выделить код

Код:

(function(){
  const PREFID = '@mozilla.org/preferences-service;1';
  const nsIPrefBranch = Components.interfaces.nsIPrefBranch
  const PREF = Components.classes[PREFID].getService(nsIPrefBranch);
if('TM_init' in window) return;
if('MultipleTabService' in window &&
   PREF.getBoolPref('extensions.multipletab.show.multipletab-context-duplicate')) return;

gBrowser.duplicateTab = function(aTab) {
  var ss = Components.classes["@mozilla.org/browser/sessionstore;1"].getService(Components.interfaces.nsISessionStore);
  var state = ss.getWindowState(aTab.ownerDocument.defaultView);
  state = JSON.parse(state);
  state.windows[0].tabs = state.windows[0].tabs.splice(aTab._tPos, 1);
  ss.setWindowState(window, JSON.stringify(state), false);

  return document.getAnonymousElementByAttribute(this, "linkedpanel", this.mPanelContainer.lastChild.id);
};

gBrowser.duplicateTabInContextMenu = function(event){
  const PREFID = '@mozilla.org/preferences-service;1';
  const nsIPrefBranch = Components.interfaces.nsIPrefBranch
  const PREF = Components.classes[PREFID].getService(nsIPrefBranch);
  var tabs = [];
  tabs.push(gBrowser.mContextTab);

  for (var i= 0; i < tabs.length; i++){
    var tab = gBrowser.duplicateTab(tabs[i]);
    if((function(){try{return PREF.getBoolPref('userChrome.openDuplicateNext',false)}catch(e){return false}})())
      tab = gBrowser.moveTabTo(tab, tabs[i]._tPos + 1);
    if(i == 0 &&
       !(function(){try{return PREF.getBoolPref('userChrome.openDuplicateInBackground',false)}catch(e){return false}})())
      gBrowser.selectedTab = tab;
  }
}

//tab context menu
const locale = Components.classes["@mozilla.org/preferences-service;1"]
            .getService(Components.interfaces.nsIPrefBranch2).getCharPref("general.useragent.locale");
var tabContext = document.getAnonymousElementByAttribute(
                        gBrowser, "anonid", "tabContextMenu") ||
                 gBrowser.tabContainer.contextMenu;
var menuitem = document.createElement("menuitem")
menuitem.id = "duplicateTabContext";
menuitem.setAttribute("label", locale.indexOf("ja") == -1?"Клонировать вкладку":"\u30bf\u30d6\u3092\u8907\u88fd");//タブを複製
menuitem.setAttribute("oncommand", "gBrowser.duplicateTabInContextMenu(event);" );
tabContext.insertBefore(menuitem,tabContext.firstChild.nextSibling);
})();


Заметил опечатку:
Раскукоживатель коротких ссылок ошибка в тултипе кнопки, ПКМ вместо ЛКМ для работы с буфером (в самом конце инц).

_zt пишет

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

:/

Выделить код

Код:

// "Дублировать таб" в контекстном меню вкладки, от 27.09.2016. .................
(tabContextMenu => {
   var menuitem = document.createElement("menuitem");                
   menuitem.setAttribute("label", "Дублировать вкладку");
   menuitem.onclick =()=> gBrowser.selectedTab = gBrowser.duplicateTab(gBrowser.mCurrentTab);
   tabContextMenu.insertBefore(menuitem, tabContextMenu.children[1]); // [1] определяет место нахождение пункта меню
   addDestructor(()=> menuitem.remove());   
})(document.getElementById("tabContextMenu"));

27-09-2016 20:09:05

_zt пишет

bunda1
Может подумаете об оформлении этой кнопки в топике готовых кнопок?

Подумаю.

27-09-2016 20:10:26

IDDQDesnik пишет

Приветствую!
В последних ночнушках поломалась кнопка Restore Previous Session

У меня на последних ночнушках Сustom Buttons вообще не работает.

bunda1 пишет

У меня на последних ночнушках Сustom Buttons вообще не работает.

Работает исправленная №10462

bunda1 пишет

У меня на последних ночнушках Сustom Buttons вообще не работает.

Сам СВ работает, кнопка на тулбаре висит, но при нажатии ничего не происходит :(

bunda1
Спасибо. Что то мне подсказывало, что там много лишнего. :)

Можно еще у вас попросить две кнопки для панелей?:
1. Обновить страницу вне зависимости от кеша, страница должна полностью обновится из сети.
2. Перейти назад до первой страницы открытой в этой вкладке. Т.е. до первой страницы в истории вкладки.

_zt пишет

Можно еще у вас попросить две кнопки для панелей?:
1. Обновить страницу вне зависимости от кеша, страница должна полностью обновится из сети.

Выделить код

Код:

BrowserReloadSkipCache();
_zt пишет

2. Перейти назад до первой страницы открытой в этой вкладке. Т.е. до первой страницы в истории вкладки.

Выделить код

Код:

if ( gBrowser.sessionHistory.index < 1 ) { 
     Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
     .showAlertNotification(self.image, self.label, "Нет истории в этой вкладке");
     return;
     }
gBrowser.gotoIndex(0);
IDDQDesnik пишет

В последних ночнушках поломалась кнопка Restore Previous Session

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ERestore%20Previous%20Session%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABEAAAASCAYAAAC9+TVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY3QUJBMTFDRkIwNzExRTNBQUNCOEJFNEQwOEIwRkExIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjY3QUJBMTFERkIwNzExRTNBQUNCOEJFNEQwOEIwRkExIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjdBQkExMUFGQjA3MTFFM0FBQ0I4QkU0RDA4QjBGQTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjdBQkExMUJGQjA3MTFFM0FBQ0I4QkU0RDA4QjBGQTEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6mV3xWAAACuUlEQVR42pxUP2gaYRT/9E5NNOopMYFgpQRtG6EEMoWCJSDoEEMHcal0SLcOdeoQoeDSMUPaoUinLt1bsGsolJZgHSy0OrQklFSM8U/U0/PuzN3l94mGaBIoffB4333fu9/7vd/77nSaphFqs7OzLxVFyep0und6vZ70+32CtR3nCzjWsC4jthAH+aPYaDQIS4Y2MzPjNRgMj5rNZgNgB1g/MZlMayzLOvCCpqpqUxTFT7Isv0H6zxEItXMQbLY5jlOMRuN2p9Mh09PTCwATwUqgx5Qszh92u90QCm0B9MMlkCGQaLPZiNlsNmC9H41Gd/1+/x9BELRisXgrk8kEwNA5NTW1Xa1WawD6MgaCihpcYRhGRuyDNpbMPhi93djYUJFiDAaD95PJ5HMAzeP5GQp9Q5T1F4iwVGS4CleQqEun00/X19djoVBIqtfrfCAQ+Li5ufkKLYnQ6044HL43IDBCaLfbX1H1BC4PvevxeMTl5eXHqVRq3mq1ErRF7Hb7ewhcgl7s0tLSylg7Ozs7ryORyB4ocnhUz+mxLNVoUCwWi5FsNtuDwG3sa5IkOcZA4vG4jLA3ZKdd1Js+FwoFksvlCCZjA4iTDgHaSZemMzc39wK9hqjAZMKGehG0lUGr82DS8vl8v8ZAAGDF6FbQ8xHuikwv2CQQtDD3er04APqLi4sHEPr7JJObAGEdDscR7koH41WvADHiInowuV4ikciA9eEYCA4eQMCW0+k8gfNXgZyenjKlUuk3xny4urr6GVvdgWhoIwKAIL6d2y6Xq+x2u8sQTiDXGIS1INzI5/M/8PHtViqVHIv+t0D/GCDH0KOJlkTooVwHQlut1Wp/kX+X53kftnIsLk0B07BALAk9M0DmrhL1ouEdBsUFr9dLNeF0w//JGvl/a4+EbcEtE5fsX4zm82cCDACBqSbnY+m8dgAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BrestoreLastSession%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Спасибо. А можно еще Scroll  left / right, но только "Scroll  up / down", а лучше 2 в одном (без модификаторов - Scroll  up / down, а с shift-ом - Scroll  left / right). А вообще в идеале, если еще сделать прокрутку вниз / вверх, при долгом клике ЛКМ / ПКМ.

И еще Close this toolbar(Firefox) не работает, можете исправить? Или предложить аналог.

bunda1
К сожалению, тоже не работает :(

_zt пишет

bunda1
Scroll  left / right еще сделать прокрутку вниз / вверх, при долгом клике ЛКМ / ПКМ.

Прокрутка страницы

Нужно скопом добавить все открытые вкладки в закладки. В отдельную новую папку на панель закладок.
Есть такая кнопка?

ifln пишет

Нужно скопом добавить все открытые вкладки в закладки. В отдельную новую папку на панель закладок.
Есть такая кнопка?

Quick bookmarks

bunda1
Велосипед изобретен уже давно, только я не в курсе. :)
Спасибо!

bunda1
Можно сделать, чтобы при каждом новом нажатии она создавала новую папку, а не пихала закладки в существующую? Проблем с созданием одноименных папок ведь нет.

ifln пишет

bunda1
Можно сделать, чтобы при каждом новом нажатии она создавала новую папку, а не пихала закладки в существующую? Проблем с созданием одноименных папок ведь нет.

:/

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u043D%u0430%20%u043F%u0430%u043D%u0435%u043B%u0438%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAEFBwcD5TTywYtQTQHAAAAAAECAgAAAAABAgEDAAAAACZKJaoakiP/K4A0ywIAAAIBAQAAAAAAAAAAAAAAAQEBAQAAAAwaIj8ZrvD9GLr382eet7eKfnt7SkI9PBgQCg4CAAUAJGYouiDSL/87r0DbCgMABwAAAQACAgICAAAAAQMDBAAXFRYjGh8mahGR2O8fx///Ic3//obh/P+s2PD/W7HZ6CKe4NcvmWr7Ercb/0+6P++PTBBXCwUAAwAAAQAAAAAABQYHAxodHzcaFBdLDHrD3ifN//8oxvf6Hsb/+xeLff0FjED/DqRQ/x+hM/8KkhX/Qb1J+nS3UOtUoUjRNHg9vw0NDgEjIiUUIBMRHBstN0sep9/pLNH//y/O+v430v//E3pB/xClAP440zf9Ps1I/zekQv9EpE7/S79j/2jQeP9dpmL/DQ0OAR4jJxAfZoJ2I73u7i/T//8y0Pz+NdT8/zrX//8yp4r/O7ps/2jXlP9/5Iz/YdRr/2KoZf51mWP/Y4JY6ERbR70AAAAAGmV6ckbo//9D5v7+ONf+/jbV/P482f3/P9z9/0Df//9x4/7/fuP//2rTm/903Hj/Zp1f++q7jP+XelyoAAAAAAEBAQEAAQEBECQkITR8h3tJx+DZTN///0Hd/P5D4P3/YOf8/670/P+l8///asiV/3fKev9xnG7778qc/5yDY6gAAAAAAAAAAAAAAAAAAQEBAAAAAAAGBwA0oMfGTOn//4fs/PzN+P//l/D8/7T8//96u5//ZZVl/4Ocfvv84Lz/nIRkqAAAAAAAAAAAAAAAAAECAgIBBgcIAAAAAESAm6Jv5///1vv9++38///u+Pr/3PDz/+Di2v/j1rr/6Ne8+//v0P+ei3KoAAAAAAAAAAAAAAAAAAAAAAIDAwMAAAAAiJiho2zT///L9/z7+f3+//77+v/u7O7/7+Ta///qzP/35Mn7//PX/6KUgagAAAAAAAAAAAAAAAAAAAAAAwMDBAAAAACuqKWijdv//87t+Pv/////+fv7/+zu8P/t5dz//OrQ//np0fv/+d//o5eGqAAAAAAAAAAAAAAAAAAAAAADAwMEAAAAAKampaL/////+vr6+////v/8/Pv/7e7v/+/n3v//79f//O3Y+//+6P+kmoqoAAAAAAAAAAAAAAAAAAAAAAMDAwQAAAAApKSkoP/////4+fj5/f39/v39/f7z9Pb/8Oni///z4P/88eD7///y/6SdkKgAAAAAAAAAAAAAAAAAAAAAAwMDBAAAAACrq6ui//////v7+/v///////////7///728ez8+vHi/Prz5fn///n/pJ6VpwAAAAAAAAAAAAAAAAAAAAACAgIDAAAAAF5eXlrGxsXE0tLS0erq6un6+vr5////////////////+/v4+/////+opZ2oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwICExMTEisrKylHR0dFaGdnZYmKi4inpqam19TP2pGOiI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..............%0Athis._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20var%20folderName%20%3D%20new%20Date%28%29.toLocaleFormat%28%22%25d.%25m.%25Y%20%25H%3A%25M%3A%25S%22%29%3B%0A%20%20%20PlacesUtils.bookmarks.createFolder%283%2C%20folderName%2C%20-1%29%3B%0A%20%20%20%0A%20%20%20var%20folderId%20%3D%20getBookFolderId%28folderName%29%3B%20%20%20%20%20%20%20%20%20%0A%0A%20%20%20getTabsInfo%28%29.forEach%28m%3D%3E%20%0A%20%20%20%20%20%20PlacesUtils.bookmarks.insertBookmark%28folderId%2C%20m.uri%2C%20-1%2C%20m.label%29%29%3B%0A%0A%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20.showAlertNotification%28self.image%2C%20self.label%2C%20%22%u0414%u043E%u0431%u0430%u0432%u0438%u043B%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%3A%20%22%20+%20folderName%29%3B%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20id%20%u043F%u0430%u043F%u043A%u0438%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20..............%20%0Afunction%20getBookFolderId%28folderName%29%20%7B%0A%20%20%20var%20id%2C%20folder%20%3D%20PlacesUtils.getFolderContents%283%29.root%3B%0A%20%20%20%0A%20%20%20for%20%28%20var%20i%20%3D%200%3B%20i%20%3C%20folder.childCount%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20child%20%3D%20folder.getChild%28i%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20child.title%20%3D%3D%20folderName%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20id%20%3D%20child.itemId%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%0A%20%20%20%20return%20id%3B%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043C%u0430%u0441%u0441%u0438%u0432%20%u0441%20%u0430%u0434%u0440%u0435%u0441%u0430%u043C%u0438%20%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044F%u043C%u0438%20%u0432%u043A%u043B%u0430%u0434%u043E%u043A%20..............%20%0Afunction%20getTabsInfo%28%29%20%7B%0A%20%20%20var%20array%20%3D%20%5B%5D%2C%20seenURIs%20%3D%20%5B%5D%3B%0A%20%20%20%0A%20%20%20%5B...gBrowser.tabs%5D.forEach%28tab%3D%3E%20%7B%0A%20%20%20%20%20%20var%20label%20%3D%20tab.label%3B%0A%20%20%20%20%20%20var%20uri%20%3D%20tab.linkedBrowser.currentURI.spec%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20seenURIs%5Buri%5D%20%29%20return%3B%20//%20%u0441%u0442%u043E%u043F%20%u0435%u0441%u043B%u0438%20%u0442%u0430%u043A%u043E%u0439%20%u0430%u0434%u0440%u0435%u0441%20%u0443%u0436%u0435%20%u0431%u044B%u043B%0A%20%20%20%20%20%20seenURIs%5Buri%5D%20%3D%20true%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20array.push%28%7B%20uri%3A%20Services.io.newURI%28uri%2C%20null%2C%20null%29%2C%20label%3A%20label%20%7D%29%3B%0A%20%20%20%7D%29%3B%0A%0A%20%20%20return%20array%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
А как бы самому задать путь создания папок?

bunda1 пишет

:/

С временем создания еще лучше.
Большое спасибо!

voqabuhe пишет

bunda1
А как бы самому задать путь создания папок?

Это как?

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

voqabuhe пишет

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAEFBwcD5TTywYtQTQHAAAAAAECAgAAAAABAgEDAAAAACZKJaoakiP/K4A0ywIAAAIBAQAAAAAAAAAAAAAAAQEBAQAAAAwaIj8ZrvD9GLr382eet7eKfnt7SkI9PBgQCg4CAAUAJGYouiDSL/87r0DbCgMABwAAAQACAgICAAAAAQMDBAAXFRYjGh8mahGR2O8fx///Ic3//obh/P+s2PD/W7HZ6CKe4NcvmWr7Ercb/0+6P++PTBBXCwUAAwAAAQAAAAAABQYHAxodHzcaFBdLDHrD3ifN//8oxvf6Hsb/+xeLff0FjED/DqRQ/x+hM/8KkhX/Qb1J+nS3UOtUoUjRNHg9vw0NDgEjIiUUIBMRHBstN0sep9/pLNH//y/O+v430v//E3pB/xClAP440zf9Ps1I/zekQv9EpE7/S79j/2jQeP9dpmL/DQ0OAR4jJxAfZoJ2I73u7i/T//8y0Pz+NdT8/zrX//8yp4r/O7ps/2jXlP9/5Iz/YdRr/2KoZf51mWP/Y4JY6ERbR70AAAAAGmV6ckbo//9D5v7+ONf+/jbV/P482f3/P9z9/0Df//9x4/7/fuP//2rTm/903Hj/Zp1f++q7jP+XelyoAAAAAAEBAQEAAQEBECQkITR8h3tJx+DZTN///0Hd/P5D4P3/YOf8/670/P+l8///asiV/3fKev9xnG7778qc/5yDY6gAAAAAAAAAAAAAAAAAAQEBAAAAAAAGBwA0oMfGTOn//4fs/PzN+P//l/D8/7T8//96u5//ZZVl/4Ocfvv84Lz/nIRkqAAAAAAAAAAAAAAAAAECAgIBBgcIAAAAAESAm6Jv5///1vv9++38///u+Pr/3PDz/+Di2v/j1rr/6Ne8+//v0P+ei3KoAAAAAAAAAAAAAAAAAAAAAAIDAwMAAAAAiJiho2zT///L9/z7+f3+//77+v/u7O7/7+Ta///qzP/35Mn7//PX/6KUgagAAAAAAAAAAAAAAAAAAAAAAwMDBAAAAACuqKWijdv//87t+Pv/////+fv7/+zu8P/t5dz//OrQ//np0fv/+d//o5eGqAAAAAAAAAAAAAAAAAAAAAADAwMEAAAAAKampaL/////+vr6+////v/8/Pv/7e7v/+/n3v//79f//O3Y+//+6P+kmoqoAAAAAAAAAAAAAAAAAAAAAAMDAwQAAAAApKSkoP/////4+fj5/f39/v39/f7z9Pb/8Oni///z4P/88eD7///y/6SdkKgAAAAAAAAAAAAAAAAAAAAAAwMDBAAAAACrq6ui//////v7+/v///////////7///728ez8+vHi/Prz5fn///n/pJ6VpwAAAAAAAAAAAAAAAAAAAAACAgIDAAAAAF5eXlrGxsXE0tLS0erq6un6+vr5////////////////+/v4+/////+opZ2oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwICExMTEisrKylHR0dFaGdnZYmKi4inpqam19TP2pGOiI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0423%u043A%u0430%u0436%u0438%u0442%u0435%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0434%u043B%u044F%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0438%20%u043F%u043E%u0434%u043F%u0430%u043F%u043E%u043A%20%u0441%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u043D%u044B%u043C%u0438%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u043C%u0438%20..........%0Avar%20parentFolderName%20%3D%20%22%22%3B%0A%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%0Athis._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20var%20parentFolderId%20%3D%20%28parentFolderName%20%3D%3D%20%22%22%29%20%3F%203%20%3A%20getBookFolderId%28parentFolderName%29%3B%0A%20%20%20var%20folderName%20%3D%20new%20Date%28%29.toLocaleFormat%28%22%25d.%25m.%25Y%20%25H%3A%25M%3A%25S%22%29%3B%20%20%20%20%20%0A%20%20%20PlacesUtils.bookmarks.createFolder%28parentFolderId%2C%20folderName%2C%20-1%29%3B%0A%0A%20%20%20var%20folderId%20%3D%20getBookFolderId%28folderName%29%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20getTabsInfo%28%29.forEach%28m%3D%3E%20%0A%20%20%20%20%20%20PlacesUtils.bookmarks.insertBookmark%28folderId%2C%20m.uri%2C%20-1%2C%20m.label%29%29%3B%0A%0A%20%20%20var%20parentFolder%20%3D%20%28parentFolderId%20%3D%3D%203%29%20%3F%20%22%u041F%u0430%u043D%u0435%u043B%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%22%20%3A%20parentFolderName%3B%0A%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20.showAlertNotification%28self.image%2C%20self.label%2C%20%22%u0414%u043E%u0431%u0430%u0432%u0438%u043B%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%3A%20%22%20+%20parentFolder%20+%20%22%20%3E%20%22%20+%20folderName%29%3B%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20id%20%u043F%u0430%u043F%u043A%u0438%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20..........%20%0Afunction%20getBookFolderId%28folderName%2C%20id%20%3D%201%29%20%7B%0A%20%20%20var%20folder%20%3D%20PlacesUtils.getFolderContents%28id%29.root%3B%0A%0A%20%20%20for%20%28%20var%20i%20%3D%200%3B%20i%20%3C%20folder.childCount%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20child%20%3D%20folder.getChild%28i%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20%21PlacesUtils.nodeIsFolder%28child%29%20%29%20continue%3B%20%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20child.title%20%3D%3D%20folderName%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.result%20%3D%20child.itemId%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getBookFolderId%28folderName%2C%20child.itemId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%0A%20%20%20return%20self.result%3B%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043C%u0430%u0441%u0441%u0438%u0432%20%u0441%20%u0430%u0434%u0440%u0435%u0441%u0430%u043C%u0438%20%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044F%u043C%u0438%20%u0432%u043A%u043B%u0430%u0434%u043E%u043A%20..........%20%0Afunction%20getTabsInfo%28%29%20%7B%0A%20%20%20var%20array%20%3D%20%5B%5D%2C%20seenURIs%20%3D%20%5B%5D%3B%0A%20%20%20%0A%20%20%20%5B...gBrowser.tabs%5D.forEach%28tab%3D%3E%20%7B%0A%20%20%20%20%20%20var%20label%20%3D%20tab.label%3B%0A%20%20%20%20%20%20var%20uri%20%3D%20tab.linkedBrowser.currentURI.spec%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20seenURIs%5Buri%5D%20%29%20return%3B%20//%20%u0441%u0442%u043E%u043F%20%u0435%u0441%u043B%u0438%20%u0442%u0430%u043A%u043E%u0439%20%u0430%u0434%u0440%u0435%u0441%20%u0443%u0436%u0435%20%u0431%u044B%u043B%0A%20%20%20%20%20%20seenURIs%5Buri%5D%20%3D%20true%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20array.push%28%7B%20uri%3A%20Services.io.newURI%28uri%2C%20null%2C%20null%29%2C%20label%3A%20label%20%7D%29%3B%0A%20%20%20%7D%29%3B%0A%0A%20%20%20return%20array%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Ага, спасибо. А как бы ещё сделать, чтобы папки создавалась вверху списка закладок?

voqabuhe пишет

bunda1
Ага, спасибо. А как бы ещё сделать, чтобы папка создавалась вверху списка закладок?

Выделить код

Код:

PlacesUtils.bookmarks.createFolder(parentFolderId, folderName, -1);

на

Выделить код

Код:

PlacesUtils.bookmarks.createFolder(parentFolderId, folderName, 0);

bunda1
Здравствуйте, можно реализовать ету кнопку как "Добавить закладки в" или "Собрать закладки в" когда в меню ПКМ правим кликом пишем назву папки?
вот код кнопки которой я пользуюсь, имеется ввиду кнопка которая обсуждалась выше Quick bookmarks. только не закладку в папку а закладки.

Выделить код

Код:

// "Добавить как закладку в папку" в контекстном меню на странице, от 11.06.2016. ..................
((contextMenu, pref)=> {
   
   // Создать новый пункт в контекстном меню на странице ....
   var menuitem = contextMenu.appendChild(document.createElement("menuitem"));   
   menuitem.setAttribute("id", "context-addBookmark");
   menuitem.setAttribute("label", "Добавить закладку в: " + getFolderName());  
   addDestructor(()=> menuitem.remove());
   
   
   // Обрабатывать клики на пункте меню ....    
   addEventListener("click", e=> {     
      if ( e.button == 0 ) {  // ЛКМ добавить закладку
           gContextMenu.onLink 
           ? addBookmark(gContextMenu.getLinkURI(), gContextMenu.linkText(), gContextMenu.onLink) // на ссылке
           : addBookmark(gBrowser.selectedBrowser.webNavigation.currentURI, getDocTitle());       // на странице
           } 
      
      if ( e.button == 2 ) {  // ПКМ изменить папку для закладок 
           contextMenu.hidePopup();
                    
           var val = custombuttons.promptBox(menuitem.label, 'Отмена вернёт значение по умолчанию');
           var newFolder = val[0] ? val[1] : defaultFolder;           

           cbu.setPrefs(pref, convertFromUnicode("UTF-8", newFolder));
           menuitem.setAttribute("label", "Добавить закладку в: " + newFolder);            
           
           Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService).
           showAlertNotification("chrome://global/skin/icons/information-16.png", newFolder, "Папка для добавления закладок");           
           }                  
   }, false, menuitem);


   // Получить заголовк страницы или название вкладки ....
   function getDocTitle() {
      var docTitle = content.document.title || gBrowser.mCurrentTab.label;       
      var docTitle = docTitle.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
      return docTitle.substring(0, 50);
   };
   
   
   // Получить из 'about:config' название папки для добавления закладок ....
   function getFolderName() {
      try { return Services.prefs.getComplexValue(pref, Ci.nsISupportsString).data } 
      catch(e) { return "Новая папка" }; // папка по умолчанию 
   };


   // Получить Id нужной папки закладок .... 
   function getBookFolderId(folderName, parentId = 3, res = false) {
      var parentFolder = PlacesUtils.getFolderContents(parentId).root;
      for ( var i = 0; i < parentFolder.childCount; i++ ) {
            var child = parentFolder.getChild(i);            
            if ( child.title == folderName ) {
                 res = child.itemId;
                 break;
                 }
            }      
      return res; 
   }; 
   
            
   // Добавить текущую страницу или ссылку в папку закладок ....
   function addBookmark(url, label, link) {
      var folderName = getFolderName();
      var folderId = getBookFolderId(folderName);
      
      !folderId && PlacesUtils.bookmarks.createFolder(3, folderName, -1); // создать папку если не существует
      PlacesUtils.bookmarks.insertBookmark(folderId, url, 0, label);
 
      var image = gBrowser.mCurrentTab.image || "chrome://global/skin/icons/information-16.png";
      Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService).
      showAlertNotification(image, label, 'Добавил закладку в папку: ' + folderName);
   };
   
})(document.getElementById("contentAreaContextMenu"), "CB.bookmarkFolderForSaving");
broker пишет

bunda1
Здравствуйте, можно реализовать ету кнопку как "Добавить закладки в" или "Собрать закладки в" когда в меню ПКМ правим кликом пишем назву папки?

Не понял.

bunda1
Выше я отредактировал вопрос.

bunda1 пишет

на

Спасибо.

broker пишет

bunda1
Здравствуйте, можно реализовать ету кнопку как "Добавить закладки в" или "Собрать закладки в" когда в меню ПКМ правим кликом пишем назву папки?
вот код кнопки которой я пользуюсь, имеется ввиду кнопка которая обсуждалась выше Quick bookmarks. только не закладку в папку а закладки.

:/

Выделить код

Код:

// "Добавить закладки в" в контекстном меню на странице, от 05.10.2016. ..................
(()=> {
   var pref = "CB.bookmarkFolderForSaving";
   var image = "chrome://global/skin/icons/information-16.png";
   var contextMenu = document.getElementById("contentAreaContextMenu"); 
   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);    
  
  
   // Создать новый пункт в контекстном меню на странице ....
   var menuitem = contextMenu.appendChild(document.createElement("menuitem"));   
   menuitem.setAttribute("id", "context-addBookmark");
   menuitem.setAttribute("label", "Добавить закладки в: " + getFolderName());  
   addDestructor(()=> menuitem.remove());
   
   
   // Обрабатывать клики на пункте меню ....    
   addEventListener("click", e=> {     
      
      // ЛКМ добавляет все открытие вкладки в папку закладок
      if ( e.button == 0 ) {  
           var folderName = getFolderName();
           var folderId = getBookFolderId(folderName);
      
           if ( !folderId ) {          // создать папку если не существует
                PlacesUtils.bookmarks.createFolder(3, folderName, -1); 
                var folderId = getBookFolderId(folderName);
                }

           getTabsInfo().forEach(m=> 
              PlacesUtils.bookmarks.insertBookmark(folderId, m.uri, -1, m.label));
 
           alertsService.showAlertNotification(image, 'Добавил все открытие вкладки в папку закладок:', folderName);
           } 
      
      // ПКМ устанавливает папку для сохранение закладок 
      if ( e.button == 2 ) {  
           contextMenu.hidePopup();
                    
           var val = custombuttons.promptBox(menuitem.label, 'Отмена вернёт предыдущую папку');
           var newFolder = val[0] ? val[1] : getFolderName();           

           cbu.setPrefs(pref, convertFromUnicode("UTF-8", newFolder));
           menuitem.setAttribute("label", "Добавить закладки в: " + newFolder);            
           
           alertsService.showAlertNotification(image, "Папка для добавления закладок:", newFolder);           
           }
                  
   }, false, menuitem);
   
   
   // Получить из 'about:config' название папки для добавления закладок ....
   function getFolderName() {
      try { return Services.prefs.getComplexValue(pref, Ci.nsISupportsString).data } 
      catch(e) { return "Новая папка" }; // папка по умолчанию 
   };


   // Получить id папки закладок .... 
   function getBookFolderId(folderName, id = 1) {
      var folder = PlacesUtils.getFolderContents(id).root;

      for ( var i = 0; i < folder.childCount; i++ ) {
            var child = folder.getChild(i);
            if ( !PlacesUtils.nodeIsFolder(child) ) continue; 

            if ( child.title == folderName ) {
                 self.result = child.itemId;         
                 break;
                 }
            else 
                 getBookFolderId(folderName, child.itemId);
            }
  
      return self.result; 
   };


   // Получить массив с адресами и названиями вкладок .... 
   function getTabsInfo() {
      var array = [], seenURIs = [];
   
      [...gBrowser.tabs].forEach(tab=> {
         var label = tab.label;
         var uri = tab.linkedBrowser.currentURI.spec;
      
         if ( seenURIs[uri] ) return; // стоп если такой адрес уже был
         seenURIs[uri] = true;
      
         array.push({ uri: Services.io.newURI(uri, null, null), label: label });
      });

      return array;
   };
   
})();

О спасибо:D мастер bunda1

bunda1
В кнопке Открыть выделенный текст в внешнем текстовом редакторе имеется небольшой недочет:
если начать выделять текст в поле одного code и закончить в поле другого, то получаем в редакторе огрызок последнего,
если начать выделять текст в поле одного code и закончить за пределами второго, в пределах сообщения, то в редакторе получаем текст который не был выделен и идет сразу после выделения, или вообще абракадабру,,
если начать выделять текст в поле одного code и закончить за пределами второго, до каонца сообщения, то получаем сообщение "В начале выделите текст".
Ну и так далее. Проверял только на своем профиле, так что возможно конфликт. Ну, а если нет, то может получится пофиксить?

Может кто-нить посмотреть почему эта кнопка на ХП работает нормально  , а на W7 ... тоже работает, но неправильно. Заместо регулировки яркости - регулирует "бледность", чтоли.
Кнопка колесиком мыша регулируется яркость страницы, по СКМ - сбросс :

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

Выделить код

Код:

/* Initialization 
 *  This Source Code Form is subject to the terms of the Mozilla Public
 *  License, v. 2.0. If a copy of the MPL was not distributed with this
 *  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

/*
    Based on 'Global - Pseudo Brightness Control' userstyle
    http://userstyles.org/styles/45663
    by luckymouse
    http://userstyles.org/users/14255
    License under Public Domain Dedication
    http://creativecommons.org/publicdomain/zero/1.0/
*/

const prefName = "custombutton.darken.darkLevel";

function getDarkLevel() {
  try {
    return cbu.ps.getIntPref(prefName);
  } catch (ex) {
    return 0;
  }
}

function getOpacity(aDarkLevel) {
  var opacity = 0;
  if (aDarkLevel === 50)
    opacity = aDarkLevel / 100;
  else
    opacity = (100 - aDarkLevel) / 100;
  return opacity;
}

function mouseWheel(aEvent) {
  var darkLevel = getDarkLevel();
  if (aEvent.detail > 0) {          // Scroll down
    if (darkLevel < 100)
      darkLevel++;                  // Increase number if value < 100
    else
      aEvent.stopPropagation();     // else stop (max = 100)
  }
  else {                            // Scroll up
    if (darkLevel > 0)
      darkLevel--;                  // Decrease number if value > 0
    else
      aEvent.stopPropagation();     // else stop (min = 0)
  }
  gBrowser.style.opacity = getOpacity(darkLevel);
  cbu.ps.setIntPref(prefName, darkLevel);
}

this.onclick = function onclick(aEvent) {
  if (aEvent.button !== 1)
    return;
  gBrowser.style.opacity = "1";
  cbu.ps.setIntPref(prefName, 0);
}

this.addEventListener("DOMMouseScroll", mouseWheel);

 var browser = document.getElementById("browser");
 browser.style.backgroundColor = "black";
gBrowser.style.opacity = getOpacity(getDarkLevel());

// this.tooltipText = this.name + "\n" + this.Help;
this.tooltipText = "ЛКМ(нажатие) Night Style - тёмный стиль для страниц\n\
\+\n\
Darken page - Затемнение страницы колесом\n\
Колесо Верх  - Ярче\n\
Колесо Вниз - Темнее\n\
-------------------------------------\n\
СКМ [middle-click ] - Сброс яркости ";

xoreax пишет

Может кто-нить посмотреть почему эта кнопка на ХП работает нормально  , а на W7 ... тоже работает, но неправильно.

Замени тему W7 на упрощенную или классическую. Или есть вот такая кнопка:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0423%u043C%u0435%u043D%u044C%u0448%u0438%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u043D%u0430%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%u0445%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Eykp/xgyMv8YMTH/GDEx/xgxMf8YMTH/GDEx/xgxMf8YMTH/GDEx/xgxMf8YMTH/GDIy/xMpKf8AAAD/AAAA/1Cop/9Nrqv/SKKf/0mkof9JpKH/SaSh/0mkof9JpKH/SaSh/0mkof9JpKH/SKKf/02uq/9QqKf/AAAA/wAAAP9OoqH/PpSQ/zWFgf83iIT/N4iE/zeIhP83iIT/N4iE/zeIhP83iIT/N4iE/zWFgf8+lJD/TqKh/wAAAP8AAAD/U6in/0WgnP88ko3/PpWQ/z6VkP8+lZD/PpWQ/z6VkP8+lZD/PpWQ/z6VkP88ko3/RaCc/1Oop/8AAAD/AAAA/1asrP9HpKD/PpaR/0CZlP9AmZT/QJmU/0CZlP9AmZT/QJmU/0CZlP9AmZT/PpaR/0ekoP9WrKz/AAAA/wAAAP9ZsLH/SKmj/0Calf9CnZj/Qp2Y/0KdmP9CnZj/Qp2Y/0KdmP9CnZj/Qp2Y/0Calf9IqaP/WbCx/wAAAP8AAAD/XLW1/0uuqP9Cn5n/RKKc/0SinP9Eopz/RKKc/0SinP9Eopz/RKKc/0SinP9Cn5n/S66o/1y1tf8AAAD/AwMD/2C4uv9OtK//RKWf/0aoov9GqKL/Rqii/0aoov9GqKL/Rqii/0aoov9GqKL/RKWf/060r/9guLr/AwMD/1NSUv9qw8T/V8XE/1O+u/9Uv73/VL+9/1S/vf9Uv73/VL+9/1S/vf9Uv73/VL+9/1O+u/9XxcT/asPE/1NSUv9XVlb/bcfI/1vLyv9XxML/WMXE/1jFxP9YxcT/WMXE/1jFxP9YxcT/WMXE/1jFxP9XxML/W8vK/23HyP9XVlb/VlVU/3DMzf9f0ND/WsnH/1vKyf9bysn/W8rJ/1vKyf9bysn/W8rJ/1vKyf9bysn/WsnH/1/Q0P9wzM3/VlVU/1ZUVP9zz9H/YtfV/13Qzf9e0c7/XtHO/17Rzv9e0c7/XtHO/17Rzv9e0c7/XtHO/13Qzf9i19X/c8/R/1ZUVP9WVFT/d9PW/2Xc2/9f1dP/YdbU/2HW1P9h1tT/YdbU/2HW1P9h1tT/YdbU/2HW1P9f1dP/Zdzb/3fT1v9WVFT/VlRU/3nV2P9j39z/XdjU/1/Z1f9f2dX/X9nV/1/Z1f9f2dX/X9nV/1/Z1f9f2dX/XdjU/2Pf3P951dj/VlRU/1ZUVP9/4+f/ePX2/3Xu7/927/D/du/w/3bv8P927/D/du/w/3bv8P927/D/du/w/3Xu7/949fb/f+Pn/1ZUVP9XVlb/YXt8/2aBg/9mgIL/ZoCC/2aAgv9mgIL/ZoCC/2aAgv9mgIL/ZoCC/2aAgv9mgIL/ZoGD/2F7fP9XVlb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041B%u041A%u041C%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20%u0441%u0442%u0438%u043B%u044C%20..........%0Athis._handleClick%20%3D%28%29%3D%3E%20setStyleForPages%28%20cbu.setPrefs%28s%2C%20%21cbu.getPrefs%28s%29%29%20%29%3B%0A%0A%0A//%20%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u0435%u043D%u044F%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0432%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%u0445%20%u0438%20%u0441%u0442%u0438%u043B%u0435%20..........%0Athis.onwheel%20%3De%3D%3E%7B%0A%20%20%20var%20i%20%3D%20cbu.getPrefs%28l%29%2C%0A%20%20%20%20%20%20%20i%20%3D%20e.deltaY%20%3C%200%20%3F%20i%20+%20step%20%3A%20i%20-%20step%3B%0A%20%20%20if%20%28%200%20%3C%3D%20i%20%26%26%20i%20%3C%3D%2099%20%29%20cbu.setPrefs%28l%2C%20i%29%3B%0A%0A%20%20%20setStyleForPages%28%20cbu.setPrefs%28s%2C%20true%29%20%29%3B%0A%7D%3B%0A%0A%0A//%20%u0418%u0441%u043F%u0440%u0430%u0432%u0438%u0442%u044C%20%u043F%u0440%u043E%u0431%u043B%u0435%u043C%u0443%20%u0441%20position%20%u0434%u043B%u044F%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0439%20..........%0AaddEventListener%28%22mouseover%22%2C%20e%3D%3E%7B%0A%20%20%20if%20%28%20e.button%20%7C%7C%20e.target.localName%20%21%3D%3D%20%27img%27%20%29%20return%3B%20%20%0A%20%20%20%0A%20%20%20var%20img%20%3D%20e.target%2C%20node%20%3D%20img%3B%0A%20%20%20if%20%28%20getPosition%28img%29%20%3D%3D%20%27absolute%27%29%20%7B%20img.setAttribute%28%27currentPosition%27%2C%20%27true%27%29%3B%20return%3B%20%7D%3B%20%20%0A%0A%20%20%20while%28%20node%20%3D%20node.parentNode%20%29%20%7B%0A%20%20%20%20%20%20if%20%28%20getPosition%28node%29%20%3D%3D%20%27relative%27%20%29%20break%3B%0A%20%20%20%20%20%20if%20%28%20getPosition%28node%29%20%3D%3D%20%27absolute%27%29%20%7B%20img.setAttribute%28%27parentPosition%27%2C%20%27true%27%29%3B%20break%3B%20%7D%3B%20%20%20%0A%20%20%20%7D%3B%0A%20%20%20%20function%20getPosition%28node%29%20%7B%20try%20%7B%20return%20getComputedStyle%28node%2C%20%27%27%29.position%20%7D%20catch%28e%29%20%7B%20return%20%22%22%20%7D%20%7D%3B%20%20%0A%20%20%20%3B%0A%7D%2C%20false%2C%20gBrowser%29%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20css%20%u043A%u043E%u0434%20%u0438%u0437%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u043F%u0440%u0430%u0432%u043A%u0430%20..........%0Avar%20step%20%3D%202%2C%0A%20%20%20%20s%20%3D%20%22CB.darken%22%2C%0A%20%20%20%20help%20%3D%20self.getAttribute%28%27Help%27%29%2C%0A%20%20%20%20l%20%3D%20%22CB.darken.level%22%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0432%20about%3Aconfig%20%u0435%u0441%u043B%u0438%20%u043E%u043D%u0438%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20..........%0Acbu.isPref%28l%2C%2028%29%3B%0Acbu.isPref%28s%2C%20false%29%3B%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u043D%u0430%u0441%u0442%u0440%u043E%u0435%u043A%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29.%0A%20%20%20src%20%3D%20%21cbu.getPrefs%28s%29%20%3F%20self.image%20%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/NTU1/z8/P/89PT3/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv89PT3/Pz8//zU1Nf8AAAD/AAAA/6Ghof+YmJj/ioqK/42Njf+NjY3/jY2N/42Njf+NjY3/jY2N/42Njf+NjY3/ioqK/5iYmP+hoaH/AAAA/wAAAP+dnZ3/hISE/3R0dP94eHj/eHh4/3h4eP94eHj/eHh4/3h4eP94eHj/eHh4/3R0dP+EhIT/nZ2d/wAAAP8AAAD/qKio/5OTk/+CgoL/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+CgoL/k5OT/6ioqP8AAAD/AAAA/6+vr/+ampr/iYmJ/42Njf+NjY3/jY2N/42Njf+NjY3/jY2N/42Njf+NjY3/iYmJ/5qamv+vr6//AAAA/wAAAP+1tbX/oqKi/5GRkf+VlZX/lZWV/5WVlf+VlZX/lZWV/5WVlf+VlZX/lZWV/5GRkf+ioqL/tbW1/wAAAP8CAgL/vb29/6mpqf+Xl5f/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+Xl5f/qamp/729vf8CAgL/AAAA/8PDw/+xsbH/n5+f/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/n5+f/7Gxsf/Dw8P/AAAA/zo6Ov/Pz8//xMTE/7a2tv+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7a2tv/ExMT/z8/P/zo6Ov9aWlr/2dnZ/9PT0//Jycn/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Jycn/09PT/9nZ2f9aWlr/U1NT/9/f3//a2tr/z8/P/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/z8/P/9ra2v/f39//U1NT/1RUVP/m5ub/4+Pj/9jY2P/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9jY2P/j4+P/5ubm/1RUVP9UVFT/7u7u/+3t7f/i4uL/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/i4uL/7e3t/+7u7v9UVFT/VFRU/+/v7//y8vL/5+fn/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fn//Ly8v/v7+//VFRU/1RUVP/8/Pz//////////////////////////////////////////////////////////////////Pz8/1RUVP9WVlb/kJCQ/5WVlf+VlZX/lpaW/5aWlv+Wlpb/lpaW/5aWlv+Wlpb/lpaW/5aWlv+VlZX/lZWV/5CQkP9WVlb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%22%3B%20%0A%7D%3B%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%29%3B%0A%0A%0A//%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20..........%0Afunction%20setStyleForPages%28%29%20%7B%0A%20%20%20var%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0A%20%20%20var%20css%20%3D%20help.replace%28/value/g%2C%20cbu.getPrefs%28l%29/100%20%29%3B%20%20%20%20%20%20%0A%20%20%20var%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%29%3B%20%0A%20%20%20%0A%20%20%20try%20%7B%20sss.unregisterSheet%28previousUri%20%7C%7C%20uri%2C%200%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20previousUri%20%3D%20uri%3B%0A%20%20%20%0A%20%20%20cbu.getPrefs%28s%29%20%26%26%20sss.loadAndRegisterSheet%28uri%2C%200%29%3B%0A%7D%3B%0Acbu.getPrefs%28s%29%20%26%26%20setStyleForPages%28%29%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%20%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%20%5Cn%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u043E%u0436%u043D%u043E%20%u043C%u0435%u043D%u044F%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B@-moz-document%20url-prefix%28http%3A//%29%2C%20url-prefix%28https%3A//%29%2C%20url-prefix%28ftp%3A//%29%2C%20url-prefix%28file%3A//%29%2C%0Aurl-prefix%28chrome%3A//%29%2C%20url-prefix%28about%29%20%7B%0A%20%20%20browser%7B%20background%3A%20LightGray%20%21important%3B%20%7D%20%20%20%0A%20%20%20%0A%20%20%20/*%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u0430%u0434%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%u0439%20%u0438%20%u0434%u0440%u0443%u0433%u0438%u043C%u0438%20%u044D%u043B%u0435%u043C%u0435%u043D%u0442%u0430%u043C%u0438%20%u043F%u0441%u0435%u0432%u0434%u043E%u044D%u043B%u0435%u043C%u0435%u043D%u0442%20%u0441%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u043D%u043E%u0439%20%u043F%u0440%u043E%u0437%u0440%u0430%u0447%u043D%u043E%u0441%u0442%u044C%u044E%20*/%0A%20%20%20html%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0432%u0435%u0431%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%20%u043D%u0435%u043A%u043E%u0442%u043E%u0440%u044B%u0435%20about%3A%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%2C%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20DOM%20%u0438%20%u0441%u0442%u0438%u043B%u0435%u0439%20*/%0A%20%20%20%23appbar-content%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u043F%u0430%u043D%u0435%u043B%u044C%20%u0441%u0432%u0435%u0440%u0445%u0443%20%u043D%u0430%20youtube%20*/%0A%20%20%20%23txbTextNodeValue%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0440%u0430%u0448%u0438%u0440%u0435%u043D%u0438%u0435%20DOM%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20*/%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23editor%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20DOM%20%u0438%20%u0441%u0442%u0438%u043B%u0435%u0439%20*/%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23profiles-list%3Aafter%2C%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23options-panel%3Aafter%2C%0A%20%20%20window%3Anot%28%5Bclass%3D%22theme-dark%22%5D%29%20%23editor%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23style-editor-chrome%3Aafter%2C%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23network-inspector-view%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20.cbeditor-textbox%3Aafter%2C%20%23newtab-window%3Aafter%2C%20%20%20%20%20%20%20%20%20%20/*%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%20%u0421%u0412%20%u043A%u043D%u043E%u043F%u043A%u0438%2C%20%u043D%u043E%u0432%u0430%u044F%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%20*/%0A%20%20%20treecols%3Anot%28%5Bid%3D%22placeContentColumns%22%5D%29%3Aafter%2C%20%20%20%20%20%20%20%20%20/*%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0438%2C%20%u0438%u0441%u0442%u043E%u0440%u0438%u044F%2C%20%u0431%u0438%u0431%u043B%u0438%u043E%u0442%u0435%u043A%u0430%2C%20about%3Aconfig%20*/%0A%20%20%20%23devtools-webconsole%3Aafter%2C%20%23ConsoleBox%3Aafter%2C%20%20%20%20%20%20%20%20%20%20/*%20%u043A%u043E%u043D%u0441%u043E%u043B%u044C%20%u043E%u0448%u0438%u0431%u043E%u043A%2C%20%u0432%u0435%u0431%20%u043A%u043E%u043D%u0441%u043E%u043B%u044C%20%u043E%u0448%u0438%u0431%u043E%u043A%20*/%0A%20%20%20%5Btitle%3D%22%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%22%5D%5BhasBrowserHandlers%3D%22true%22%5D%3Aafter%2C%20%20%20/*%20%u0440%u0430%u0437%u043D%u044B%u0435%20about%3A%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20*/%0A%20%20%20%5Bid%3D%22permissions-page%22%5D%3Aafter%2C%20%5Bid%20%3D%22tabsList%22%5D%3Aafter%2C%0A%20%20%20%5Bid%3D%22contentAreaDownloadsView%22%5D%3Aafter%2C%20%5Bid%3D%22addons-page%22%5D%3Aafter%20%20%20%0A%20%20%20%7B%0A%20%20%20%20%20content%3A%20%22%22%20%21important%3B%0A%20%20%20%20%20position%3A%20fixed%20%21important%3B%0A%20%20%20%20%20top%3A%200%3B%20bottom%3A%200%3B%20left%3A%200%3B%20right%3A%200%3B%0A%20%20%20%20%20background%3A%20%23000%20%21important%3B%0A%20%20%20%20%20z-index%3A%2099999999%20%21important%3B%0A%20%20%20%20%20pointer-events%3A%20none%20%21important%3B%0A%20%20%20%20%20opacity%3A%20value%20%21important%3B%0A%20%20%20%7D%0A%20%20%20%0A%20%20%20/*%20%u043E%u0442%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0443%u043C%u0435%u043D%u044C%u0448%u0435%u043D%u0438%u0435%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u043A%u0438%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u0437%u0430%u0442%u0435%u043C%u043D%u0435%u043D%u0438%u044F%20%20*/%0A%20%20%20%23comments-test-iframe%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u043A%u043E%u043C%u0435%u043D%u0442%u0430%u0440%u0438%u0438%20%u043D%u0430%20youtube%20*/%0A%20%20%20%0A%20%20%20/*%20%u043E%u0442%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0443%u043C%u0435%u043D%u044C%u0448%u0435%u043D%u0438%u0435%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0439%20%u043F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20*/%0A%20%20%20svg%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22img%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22rel%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22ytp-thumbnail%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bid%3D%22watch7-sidebar-modules%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22right_block%20video_right%20video_today%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22photo%22%5D%3Ahover%2C%0A%20%20%20img%3Ahover%3Anot%28%5Bparentposition%5D%29%3Anot%28%5Bcurrentposition%5D%29%3Anot%28%5Bid%3D%22keyboard_picture%22%5D%29%3Anot%28%5Bid%3D%22mpiv-preview%22%5D%29%3Anot%28%5Bid%3D%22splashoverlay%22%5D%29%3Anot%28%5Bclass%3D%22prew%22%5D%29%3Anot%28%5Bclass%3D%22rel%22%5D%29%0A%20%20%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20position%3A%20relative%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%20%20%20img%5Bparentposition%5D%3Ahover%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20position%3A%20relative%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%20left%3A%200px%3B%20bottom%3A%200px%3B%0A%20%20%20%7D%0A%20%20%20img%5Bcurrentposition%5D%3Ahover%20%7B%20%0A%20%20%20%20%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%0A%20%20%20/*%20%u043F%u043E%u043B%u043E%u0441%u0430%20%u043F%u043E%u0438%u0441%u043A%u0430%20%u043D%u0430%20youtube%20*/%0A%20%20%20%23yt-masthead-container%20%7B%20background%3A%20LightGray%20%21important%3B%20%7D%0A%0A%20%20%20/*%20%u0438%u0441%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0432%u0438%u0434%u0435%u043E%20*/%0A%20%20%20embed%5Bflashvars%5D%2C%20%20%0A%20%20%20div%5Bclass%3D%22html5-video-container%22%5D%2C%0A%20%20%20*%5Btype*%3D%22application/x-silverlight%22%5D%2C%0A%20%20%20*%5Btype*%3D%22application/x-shockwave-flash%22%5D%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%7D%0A%0A/*%20%u0438%u0441%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043D%u0435%u043A%u043E%u0442%u043E%u0440%u044B%u0435%20%u044D%u043B%u0435%u043C%u0435%u043D%u0442%u044B%20%u043D%u0430%20%u043F%u0440%u043E%u0431%u043B%u0435%u043C%u043D%u044B%u0445%20%u0441%u0430%u0439%u0442%u0430%u0445%20%u0434%u043B%u044F%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u043A%u0438%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u0437%u0430%u0442%u0435%u043C%u043D%u0435%u043D%u0438%u044F%20*/%20%0A@-moz-document%20domain%28politobzor.net%29%20%7B%20%0A%20%20%20html%5Bxmlns%3D%22http%3A//www.w3.org/1999/xhtml%22%5D%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%20%20%20.item%20%7B%20background%3A%20LightGray%20%21important%3B%20%7D%0A%7D%0A@-moz-document%20url-prefix%28http%3A//translate.google.com/translate%29%20%7B%20%0A%20%20%20html%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%7D%0A@-moz-document%20url%28about%3Ahealthreport%29%2C%20url%28about%3Asessionrestore%29%2C%20url%28about%3Awelcomeback%29%20%7B%20%0A%20%20%20html%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%7D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

xoreax
Поглядите этот вариант. Использую на Win7, правда не знаю что он регулирует : яркость или бледность :)

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

Выделить код

Код:

/*
 *  This Source Code Form is subject to the terms of the Mozilla Public
 *  License, v. 2.0. If a copy of the MPL was not distributed with this
 *  file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

/*
    Based on 'Global - Pseudo Brightness Control' userstyle
    http://userstyles.org/styles/45663
    by luckymouse
    http://userstyles.org/users/14255
    License under Public Domain Dedication
    http://creativecommons.org/publicdomain/zero/1.0/
*/

const prefName = "custombutton.darken.darkLevel";

var domain = content.location.hostname;

var css = '@-moz-document domain("' + domain + '") {\
html > scrollbar { background: #A9A9A9 !important; }\
html { background: #005500 !important; opacity: .99 !important; }\
}';

function getDarkLevel() {
  try {
    return cbu.ps.getIntPref(prefName);
  } catch (ex) {
    return 0;
  }
}

function getOpacity(aDarkLevel) {
  var opacity = 0;
  if (aDarkLevel === 50)
    opacity = aDarkLevel / 100;
  else
    opacity = (100 - aDarkLevel) / 100;
  return opacity;
}

function mouseWheel(aEvent) {
  var darkLevel = getDarkLevel();
  if (aEvent.detail > 0) {          // Scroll down
    if (darkLevel < 100)
      darkLevel++;                  // Increase number if value < 100
    else
      aEvent.stopPropagation();     // else stop (max = 100)
  }
  else {                            // Scroll up
    if (darkLevel > 0)
      darkLevel--;                  // Decrease number if value > 0
    else
      aEvent.stopPropagation();     // else stop (min = 0)
  }
  gBrowser.style.opacity = getOpacity(darkLevel);
  cbu.ps.setIntPref(prefName, darkLevel);
}

this.onclick = function onclick(aEvent) {
  if (aEvent.button !== 1)
    return;
  gBrowser.style.opacity = "1";
  cbu.ps.setIntPref(prefName, 0);
}

this.addEventListener("DOMMouseScroll", mouseWheel);

var browser = document.getElementById("browser");
browser.style.backgroundColor = "black";
gBrowser.style.opacity = getOpacity(getDarkLevel());

this.tooltipText = this.name + "\n" + this.Help;

Понятно. Все так и есть, если убрать Аеро , работает кнопка. Причина в Аеро.

Coroner - работает! Класс! тоже нет, если с Аеро. будем думать.
Благодарю.

xoreax
Не может быть в цветовом профиле дело ? Не меняли его ( gfx.color_management.display_profile ) ?
Может попробовать gfx.color_management.mode в 0 выставить ?

Подскажите, почему у меня кнопка Save snapshot to html  https://forum.mozilla-russia.org/viewtopic.php?pid=588588#p588588, как-то непонятно работает?
Когда выделяю всю страницу, то сохраняется только (как правило) шапка ну или верхушка. Но если начать выделять не всю страницу, а части или даже всю но не затрагивая часть макушки, то сохраняет как надо.
Уже достало каждый раз мышкой выкорчевывать какие-то части, чтобы страница скопировалась, как надо. Кнопка очень удобная но эти глюки все портят.

andry252 пишет

выделяю всю страницу

Попробуй ничего не выделять. Просто нажми кнопку для сохранения всей страницы.

Coroner пишет

Не может быть в цветовом профиле дело ? Не меняли его ( gfx.color_management.display_profile ) ?
Может попробовать gfx.color_management.mode в 0 выставить ?

пробовал все, ничего не работает. В w7 с Aero невозможно применить цвет к .... не знаю как правильно, "свойству" или "элементу" browser, этим способом.

Выделить код

Код:

...
var browser = document.getElementById("browser");
browser.style.backgroundColor = "#000";  // вот тут и не применяется цвет к элементу.
gBrowser.style.opacity = getOpacity(getDarkLevel());
...

Я сделал кнопку  отдельную, в качестве эксперимента - и она работает в случае Aero :

Выделить код

Код:

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);  

  var uri = makeURI("data:text/css," + encodeURIComponent("browser{background-color:#000 !important;opacity:.88;"));


   if ( sss.sheetRegistered(uri, sss.AGENT_SHEET) ) sss.unregisterSheet(uri, sss.AGENT_SHEET);
     else 
        sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);

Пытаюсь объединить , но получается слабо :)  мало знаний-опыта. Получается, надо грузить цвет для browser с AGENT_SHEET :sick:  ибо кнопка регулирует значение прозрачности правильно - цвет не применяется просто (в случае Aero).

Кнопка bunda1 работает всегда. Но там по-другому все сделано. Благодарю, bunda1.

Здравствуйте, не работает пункт "Сохранить всю страницу как PNG" и другие пункти связаные с PNG.  Почините пожалуйста FF48.

Выделить код

Код:

// Save+, от 01.03.2015. ................................

// Настройка функций кликов мыши ................................
this.onclick = function(e) {      
     if ( e.button == 0 ) menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft"); 
};



// Объявляем настройки и переменные для этой вкладки ................................
var addSiteNameToShortcuts = false; // true => добавлять название домена к названию ярлыка

var button = this;
const file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
const iosService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
const alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
const directoryService = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties);
const foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);


 
// Создать меню для кнопки ................................
var array = [
       { label: "Добавить url и сохранить страницу в html", func: "savePage", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAyMjIzwyMjFeLi0tVS8vLlcuLy9XLS4uVywsLFUuLi5aKSkpUggICBMAAAAAAgICAQAAAAAAAAAAAAAAABQTEyOgoJ/yysvL/s3Pz/7Z293/4OPk/+bp6f/t7u7/5eXl/LOysv97e3vLFRUWJQAAAAACAgIDAAAAAAAAAAA8PDxSz9HT/83Qz/fLx8T8z7+5/M/AsPzez8n89e3r/PDx8fyusLL43dzc/52dndMWFhY2AAAAAAICAgIAAAAAODg5T8bEv/+9o476vIR1/7WDcv+uj3v/spCA/8Wqk//Gtab/rqyq/+Pk5fn19fX+np6e4BQUFCgAAAAAAAAAAC4uJU29oYj/wLao+tLDqf/Mv7P/yLik/7zEvP/F0cr/v62Y/6+Kef/Z2NP/6Ors+d3c3P97e3vNBAQEDgIDAAZhRCuYxaSb/8Gvqfu2inL/vIF0/7FmUv+ygG//waaX/8m8tP/CoIn/vqOF/9zg3//l5ef7ycnJ/zY2Nm0hFw08rGJD/6BlYf2mWUD/rW9g/7aNff+ZRyL/pmxR/7RyWv+qaEz/uYR0/69kSf/k1tD//////Ozs6/1iYmK4WTMck61mVv+Yemj8hjsg/51bQ/+wem//n084/6+pq/+3p6H/l0Ux/4lFOf+gWDr/zq2X//b7/fzo6Oj/YWBgsXpXSbnMsp//wNC8/I9jWv+WX1X/tn5w/7iKfv/Tzc7/ztXc/513bf+MSjH/rWJG/7iRd//o7Oz85OPl/2BgYLN1aFqu2tO+/7ejnvyohYD/ybGb/7q1ov/HwrX/7/Lr//T19v/Hzs3/p4V0/6hvW/+6gHf/4uDh/N3e3v9hYWC0dWNPuaVXRP6cfWv8w7Gz/8vHsv/U2dP/4OHf//b08//9/Pv/3drZ/7rBw/+0ppv/wZ2F/9zc3PzW1tj/ZWRktE1HPW2oa1f/lX1t/cTP0v/Ew8T/3Nvd/9LR0//W1tf/5OXl/+/t6v/i6vD/wK+i/8y2o//b3t/81NTU/2FhYbMMDAsPsZ2a1tDX2P++vL390c/P/+Dh4P/b29r/09PS/9rY1//6+Pf/8PP3/8Kqlf/c0sv/3N7g/NTU1P9iYmKyAAAAAEY6MmXozcP/5ezt+OHk6Pzt7Oz9+Pj4/urq6/zs7/T8+f///NXGsPzey8P87vDy/OXm5vnf39//ZWVlrgAAAAAGBQQQdFdHy8Wfhv/d18797e7w/+3t7P/y8u7/7N/G/7unff+/uqT/4+Tl/97d3v/c3Nz/sLCw+h8fH0IBAQABAAEBABEVFx8vJB1cWy8ciZNrU8itknHrkWdIxUsqFnEnJSBRMjQ3WS8uL1csLCtVMjIyXiIiIj4BAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="},
       { label: "Сохранить всю страницу как PDF", func: "savePageToPDF", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYUw4pJt3V/+Rb1D8lnFP/55zTf+VcVH/lXJS/5VyUv+VclL/lXJS/5VyUv+VclL/k3BR/J56Wv9cRzSkAAAAAJNvUKTto2L/4ppe/uehZf/Pmmr/noZv/9Scav/Wl17/1plh/9eZYf/XmWH/15lh/9eZYf/WmGD/2Jlg/suRXP9mRiuk8rWA/397dP1akKn/rqqi/3LF3f8Mntj/4dLJ///+9f/48u3/9e7n//bt5v/47+f/+O/n//jv5//rvZP/1ZJX/a9/VP9+lrD8AIvz/xOt+f8Douv/ALb6/wC28/9tmar/z8jJ//Lq5/////7//v////n9///6/P3//////+Ta0P/PjVP/pnpT/IWds/+aiXj/5efl/8Px//951/3/LMz//wCx8/8GltL/NIu3/4ycqf/l29L////+//n6+//8/v//3tXM/8+OVP+oe1P/6K57/86QWP/r6Ob////////++v/r9/z/oOb9/zDL//8Arf//AI/r/ydysv+hpqr//PTr///////d1Mz/0I5U/6h7U//osH//wo5g/+fm5P/7/f//9vf5//z7+////vv/9/r8/5Dc/P8Oqv7/AJf//wF02v9ffZ7/8Ojh/+Ha1P/NjFL/qHtT/+ewf//Ej1//7O3r///////+/v7//v7+//f5+v/6+vv////8/8Tq/f8hp/7/AJH//wB18/8/bqj/1MGu/9mXXv+leVH/569+/8iSYv+/tKn/wLew/8O5sf/P0M////////7+/v/3+fv////7/9Hv/v8hoP3/AIn//wB4/v84ZqL/w4NH/619VP/nsYD/x45c/9W5of/bv6j/0Jxt/6J/YP+spqD/2N3i//7////6+/3///76/8vr/v8Slv7/AIb+/wBz//83VH7/nW1B/+ewfv/Fjl7/7Ozr///////9+/r/9d7K/9Ghdv+jd1D/pJ6Y/+jt8f/9///////7/6fb/v8Ahv7/AYD//wRp6f95YlT/57B//8SOXv/n5uT//v7///r7/P/8/v////////XRsv/DhEv/loBu/9DX3P/9/v/////7/2O6/f8Afv//FnTU/5JtTf/nsH//xY9e/+jn5f/+/f//+fj5//n4+P/5+Pn/+/////Xbxf/Wj1D/nX1h/+Ll6P////7/3+/3/w+V//8tcbP/qHJB/+WuffzCjV7/5efn///////+/v7//////////////v7///////XRsP/TnW3/8fT3//////////z/ddD//0Nxl/+zdkH88LmH/9CRWP2+qJT/0M7N/8/Jxv/Pysf/z8rH/8/Kxv/Py8n/zsO6/7+pmP/PzMv/zsnG/9bNyP+nsK7/h4R3/b2BT/+Sb1Ck7qxw/9GSW/69hlb/wYhX/8CIV//AiFf/wIhX/8CIVv/BiVj/xI1d/8CIVv/BiFf/vYZW/9STW/7ppmv/bE80pAAAAACUd16k+sui/+7AmPzwwpr/8MKa//DCmv/wwpr/8MKa//DCmf/vwZj/8MKa//DCmv/uwJj8+cui/5N3XaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить выделенный текст как txt файл", func: "saveSelectionToTxt", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAQE6AAAAZAAAAGgAAAJmAAACZgAAAGYAAABmAAAAZgAAAGYAAABmAAAAZgAAAGYAAABlAAAAaQABAmYAAQEjAAAAADlVkOdVcKHxVXKi8kdklPJLZpfyU3Cg8lJvn/JRbZ7yUW+g8lFun/JRbp/yUG6e8lVyofFVdKjzLkV45wAAAFABAQEAaIzF/3y34v9wsuL/cJe0/0lpgv9bjLP/dLLh/2+v3v9sq9v/cK3d/3Gv3v9sqtv/b7Df/4G77P9VcqT2AAAAVAMDAQBnir/+ZqfU/pDB4/7a3uD+j46N/kxYXv6To6/+1er4/tXp+P7J3/D+1ej4/svg8v6Gut/9aqzd/lhxnvAAAABSAwIBAGaIvv9pptX/ocfj//f4/P/P0tX/g4CA/1xZWf+Woqr/2uz8/9Hl+f/W5fT/2Of3/5fC4v5tq93/Vm+e8QAAAFIDAgEAaYm+/3mw2/+iyeX/9Pn8/+z0+//IzNL/d3h5/0tMTv+Mkpn/xdvs/9Hp/f/O4PL/msXk/nmz4/9XcJ/xAAAAUgMDAQBti7//k7/h/6fL5v/v9fn/4u73/9Dk9P+8wMT/YGpx/zJJWv94iJf/ztzo/9Pp/P+ZwuD+gLfk/1dwnvEAAABSAwMBAHOPwf+myub/sNHp//j7/P/6/P3/8fr///r39P+sxdP/IXWq/xJJcv+NjZD/0+Lu/6TN7f6Ft+L/WXGf8QAAAFIDAwEAd5LD/7PR6/+ZxOP/0ePx/97r9f/Y5/L/3e32/8Tc7f9gseT/CHK3/zBYdv+HiY7/lL/f/pLE7/9bcJ3xAAAAUgMDAQB4k8P/xNvx/5/F5f+kyOX/qMrn/6TH5f+kyOX/sM/q/5e51P9Mm83/GHm3/xxIav9fdYf+pMvs/1x1pfIAAABTAwMBAHmSxf/O4/T/y9/y/8Hb9P/C3PX/wNv0/7vW7/+93ff/utDm/42fsf9Gjbn/EXS2/ytSbv6Fj5r/WnGc8gAAAFICAwEBepPE/tHk9f/S5PX/vMjV/7fCzP+3w8//uMPP/7XBzP+6ytf/qa+4/3h/hv9Ghaz/JoO+/jNXdP82PVnyAAAAVgACAgCBmcb/2+r3/dHh8fyPkpX/kI6N/5yam/+dnJ3/paWk/6enpf+sr6//mpSR/3Bubf9SjbD8H4C+/QsrSvcCAAB/AAAAA3yVx//j8///3u/7/52gpf6pqKf+uLm5/rq7u/7Ly8v+ycnI/paWlf6LjY/+np2f/Xh+g/5gnL7/MX+y/xcgJ80BAgNNN1OUs6W84fDA1O73mJyj/ainpv+2trb/t7e4/8fHyP/Fxsb/kZGQ/4eGhP+vucT/j6G+/W53k/NlkbnwNoOv/AgiNb8CCBsQDRo/YwsaO3B0d33arKyp9q2trfWvr6/2u7u79ru7vPawr7H1sbCt9nJ2gOQIGD6bFCFEYB0qPE1Bf6SpEz9cggAAAAMCAQEBAQAAADIyMmlDQ0ONQUFBhUFBQYVCQkGFQkJBhUhISIRNTU2OKysrZAEAAAUBAQAAAgEAAAkEAAEDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить всю страницу как PNG", func: "WebScreenShot.captureAll", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAiAcFBa4KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwsJCaECAQE/BQMDAAAAAJUgICD4V1ZW/2FhYf5hYWH/YmFh/2BgYP9fX1//X19f/19fX/9gYGD/YmFh/2FhYf9gYGD+ZmVl/1RSUuIVFBQtCgkJy1paWv+Li4v9h4eH/oiIiP6FhYX+i4uL/pKSkv6Sk5P+kpKS/ouLi/6FhYX+iIiI/oiIiP6Hh4f7lZaW/25tbYQNDQ3OcHBw/5KSkv6Li4v/i4uL/5mZmf+EhIT/ZGRk/1tbWv9kZGT/hISE/5mZmf+Li4v/jY2N/4yMjPyWl5f/iomJjQ4NDc13d3f/m5ub/pWVlf+goKD/XFxc/ygoKP8fHyD/GBsb/yAhIv8pKSn/W1tb/6CgoP+Wlpb/lpaW/J6env+Jh4eMDg4OzX1+fv+ioqL+qqqq/1hYWP8ZGRn/Ghwb/x4dHP8mIh//FhQR/xUWF/8aGhr/WFhY/6urq/+cnJz8pKSk/4qJiYwPDg7Ng4OD/7W1tf6MjIz/Ghoa/xYYGP8uKCb/ZEAo/5xyOP++saL/RD45/xISE/8bGxv/jY2N/6+vr/ypqan/ioiIjA8PD82IiIj/xMTE/l1cXP8LDAz/JiId/1o3LP9ADgD/mGog//Dt6P/VysX/Ih4Z/wsMDf9eXl7/v7+//K6urv+KiYmMEA8PzY+Pj//Kysr+SEhH/wEDBv9MPi7/hlES/3dCAP+VZAn/tJVO/7eVXf9OQTL/AAIE/0pJSf/FxcX8tLS0/4qJiYwQEBDNm5ub/9/e3/5SUlL/AAAA/0M7Mf/aya7/ybiO/5RmEf9aIAD/cjkX/z80KP8AAAD/U1JS/9nZ2fzAwMD/i4qKjBEREc2oqKn/8O/w/oeGhv8AAAD/DAsK/6qkof/17uj/nW8l/14eCf9hPTr/ExUU/wAAAP+Hh4f/6urq/MzMzf+Mi4uMERERzbCwsv/r6uz+3Nzd/yoqKv8AAAD/ExEP/2heU/9yWjv/UD0u/xcXFv8AAAD/Kioq/93d3v/l5eb81NTV/4yLi4wSERHNuLm5/+/v8P7z8/P/xsbG/yAgIP8AAAD/AQEB/wAAAP8BAQH/AAAA/yAgIP/Gxsb/9PT0/+np6vzb29v/jIuLjBIREc2+vb7/+Pj5/uvr7P/7+/v/4ODg/3Nyc/8uLi7/Hh4d/y0sLP9zc3P/4ODg//v7+//s7O3/8/P0/OHg4f+Mi4uLFBMTyMPDw//////7+Pj4/ff29v38/Pz9/////fr6+v3u7u79+vr6/f////38/Pz99/b2/fn5+f37+/v53t7e/5KSko4GBgZ7m5yc//j4+P/w8fH/8fLy//Dw8P/u7u7/8vLy//X19f/y8vL/7u7u//Dw8P/x8vL/8vLy/uXl5f/BwcH+k5GRUAAAAAQeHR1yb25uxn59fcZ9fHzGfXx8xn18fMZ9e3vGfHt7xn17e8Z9fHzGfXx8xn18fMZ9fHzGgH9/xYmIiGVaV1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить видимую часть страницы как PNG", func: "WebScreenShot.capturePage", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAiAcFBa4KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwsJCaECAQE/BQMDAAAAAJUgICD4V1ZW/2FhYf5hYWH/YmFh/2BgYP9fX1//X19f/19fX/9gYGD/YmFh/2FhYf9gYGD+ZmVl/1RSUuIVFBQtCgkJy1paWv+Li4v9h4eH/oiIiP6FhYX+i4uL/pKSkv6Sk5P+kpKS/ouLi/6FhYX+iIiI/oiIiP6Hh4f7lZaW/25tbYQNDQ3OcHBw/5KSkv6Li4v/i4uL/5mZmf+EhIT/ZGRk/1tbWv9kZGT/hISE/5mZmf+Li4v/jY2N/4yMjPyWl5f/iomJjQ4NDc13d3f/m5ub/pWVlf+goKD/XFxc/ygoKP8fHyD/GBsb/yAhIv8pKSn/W1tb/6CgoP+Wlpb/lpaW/J6env+Jh4eMDg4OzX1+fv+ioqL+qqqq/1hYWP8ZGRn/Ghwb/x4dHP8mIh//FhQR/xUWF/8aGhr/WFhY/6urq/+cnJz8pKSk/4qJiYwPDg7Ng4OD/7W1tf6MjIz/Ghoa/xYYGP8uKCb/ZEAo/5xyOP++saL/RD45/xISE/8bGxv/jY2N/6+vr/ypqan/ioiIjA8PD82IiIj/xMTE/l1cXP8LDAz/JiId/1o3LP9ADgD/mGog//Dt6P/VysX/Ih4Z/wsMDf9eXl7/v7+//K6urv+KiYmMEA8PzY+Pj//Kysr+SEhH/wEDBv9MPi7/hlES/3dCAP+VZAn/tJVO/7eVXf9OQTL/AAIE/0pJSf/FxcX8tLS0/4qJiYwQEBDNm5ub/9/e3/5SUlL/AAAA/0M7Mf/aya7/ybiO/5RmEf9aIAD/cjkX/z80KP8AAAD/U1JS/9nZ2fzAwMD/i4qKjBEREc2oqKn/8O/w/oeGhv8AAAD/DAsK/6qkof/17uj/nW8l/14eCf9hPTr/ExUU/wAAAP+Hh4f/6urq/MzMzf+Mi4uMERERzbCwsv/r6uz+3Nzd/yoqKv8AAAD/ExEP/2heU/9yWjv/UD0u/xcXFv8AAAD/Kioq/93d3v/l5eb81NTV/4yLi4wSERHNuLm5/+/v8P7z8/P/xsbG/yAgIP8AAAD/AQEB/wAAAP8BAQH/AAAA/yAgIP/Gxsb/9PT0/+np6vzb29v/jIuLjBIREc2+vb7/+Pj5/uvr7P/7+/v/4ODg/3Nyc/8uLi7/Hh4d/y0sLP9zc3P/4ODg//v7+//s7O3/8/P0/OHg4f+Mi4uLFBMTyMPDw//////7+Pj4/ff29v38/Pz9/////fr6+v3u7u79+vr6/f////38/Pz99/b2/fn5+f37+/v53t7e/5KSko4GBgZ7m5yc//j4+P/w8fH/8fLy//Dw8P/u7u7/8vLy//X19f/y8vL/7u7u//Dw8P/x8vL/8vLy/uXl5f/BwcH+k5GRUAAAAAQeHR1yb25uxn59fcZ9fHzGfXx8xn18fMZ9e3vGfHt7xn17e8Z9fHzGfXx8xn18fMZ9fHzGgH9/xYmIiGVaV1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить фрейм на странице как PNG", func: "WebScreenShotByClick.init", image: "data:image/x-icon;base64,AAABAAEAIBkAAAEAIAAMDQAAFgAAACgAAAAgAAAAMgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29fT/2tra/8jIyP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8jIyP/a2tr/9vX0/+zs7P/ak0b/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/9qTRv/s7Oz/7Ozs/+J9Dv/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+/6SdmP/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r/+vn4//z7+v/6+fj/4n0O/+zs7P/s7Oz/4n0O//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r/aFtT//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//j39v/ifQ7/7Ozs/+zs7P/ifQ7/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P9oW1P/7+zq/+/s6v/v7Or/8O3r//Dt6//w7ev/8O3r//Dt6//w7ev/8O3r/+/s6v/w7ev/9fTy/+J9Dv/s7Oz/7Ozs/+J9Dv/49/b/+Pf2//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4/2hbU//q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/y8O//4n0O/+zs7P/s7Oz/4n0O//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/aFtT/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe//Dt6//ifQ7/7Ozs/+zs7P/ifQ7/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P9oW1P/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/7uro/+J9Dv/s7Oz/7Ozs/+J9Dv/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx/2hbU//x7+3/8vDv//Hv7f/x7+3/8e/t//Lw7//x7+3/8e/t//Lw7//x7+3/8vDv//Hv7f/29fT/4n0O/+zs7P/s7Oz/4n0O//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//aFtT/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/8vGwf/ifQ7/7Ozs/+zs7P/ifQ7/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f9nWlL/aFtT/2hbU/9nWlL/Z1pS/2hbU/9oW1P/Z1pS/2daUv9oW1P/aFtT/2hbU/9nWlL/pJyX/+J9Dv/s7Oz/7Ozs/+J9Dv/w7ev/8O3r//Dt6//w7ev/8O3r//Dt6//x7+3/8O3r//Dt6//w7ev/8e/t//Dt6//w7ev/8O3r//Hv7f/w7ev/8O3r//Dt6//x7+3/8O3r//Dt6//w7ev/8e/t//Dt6//w7ev/8O3r//Dt6//w7ev/4n0O/+zs7P/s7Oz/4n0O/+/s6v/v7Or/7uro/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/u6uj/7+zq/+/s6v/ifQ7/7Ozs/+zs7P/ifQ7/7uro/+7q6P/u6uj/7uro/+zo5v/u6uj/7uro/+7q6P/s6Ob/7uro/+7q6P/u6uj/7Ojm/+7q6P/u6uj/7uro/+zo5v/u6uj/7uro/+7q6P/s6Ob/7uro/+7q6P/u6uj/7Ojm/+7q6P/u6uj/7Ojm/+J9Dv/s7Oz/7Ozs/+J9Dv/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/4n0O/+zs7P/s7Oz/4n0O/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/ifQ7/7Ozs/+zs7P/ifQ7/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+J9Dv/s7Oz/7Ozs/+J9Dv/m4d7/5uHe/+bh3v/p5eL/5uHe/+bh3v/m4d7/6eXi/+bh3v/m4d7/5uHe/+nl4v/m4d7/5uHe/+bh3v/p5eL/5uHe/+bh3v/m4d7/6eXi/+bh3v/m4d7/5uHe/+nl4v/m4d7/5uHe/+bh3v/p5eL/4n0O/+zs7P/s7Oz/4n0O/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/ifQ7/7Ozs/+zs7P/ifQ7/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+J9Dv/s7Oz/7Ozs/+J9Dv/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/k39z/4n0O/+zs7P/s7Oz/4n0O/+Lc2f/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/ifQ7/7Ozs/+zs7P/ifQ7/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+J9Dv/s7Oz/9fTy/+J9Dv/8+/r/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/4n0O//X08v/8+/r/6KFU/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ooVT//Pv6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { label: "Сохранить выбранную область страницы как PNG", func: "WebScreenShotByClipping.init", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAADDn2Hfz5pE/8eVQP7IlkH/yJZB/8iWQf/IlUH/yJVA/8iVQP/IlED/yJQ//8iUP//IlD//yJM+/8iTPv/Hkj3/nI1w//bDbP//8OH//+zW///s1///69b//+rV///p1P//59L//+XQ///izf//38n//9vG///ZxP//1b///dG////Prf/KlkX/88N4/v37///99Pj//fT6//vy9v/68fT/+u/y//rt8P/66u3/+ufq//rl6P/64eT/+93h//3a3//71d7//9LK/86XR//0xHb//vv////18///9fT///f5///4////9f7///P8///v+f//7Pb//+nz///m8f//4eb//9vZ//3Y2v//1Mb/zphH//TGd//+/////Pj1///7///Q58r/m9aV/6TZnv+i15r/otWY/6LTlv+j0pb/mc6M/9DXuf//3+P//Nnc///Wyf/OmUf/9MZ3//7////8+/j//////53WnP+Y5pn/rvGv/6PvpP+e7p//me6b/5nvm/95533/mM+L///j7f/629z//9jL/86ZR//0xnf//v////z9+v//////qtup/8Xzxf/a/tn/z/vO/8n7yf/D+sL/xPvD/6Hzo/+j05b//+Tu//re3///2cz/zplI//XGeP/+/////P36//////+n26f/uvC6/9T71P/K+Mr/xvjG/8D3wP+/+L//nfCf/6LTlf//5u//+t/g///cz//OmUj/9MZ3//7////8/fr//////6rcqv/G9MX/3//f/9n92f/V/NX/0PzQ/9H+0P+s9a7/pdSY///o8f/64OL//9zP/86aSP/0xnf//v////z9+f//////ndid/5TjlP+v7q//qeyp/6jsqf+k7KX/p+6n/4Tlh/+Z0Y7//+r0//rh4v//3tH/zppI//TGd//+/////v77///////Y8Nj/p9+n/6/jr/+t4a3/rd2p/67bpv+u2ab/p9Wc/9jgx///6Oz//OPl///e0f/Omkj/9MV1//7//////fr///78///+/f///////////////////P////j////0+///8fn//+vu///m4v/94+P//97P/86ZSP/zx3v//v/////+/f///////f////v////7////+/////v+///7+///+/f///vz/P/98Pr//+33//3p9///5OL/zppL//a1Sv/0xoL/9cR7//XEfP/1xHz/9cR8//XEfP/1xH3/9cR8//XCev/1wXr/9b94//W9d//1u3X/87l0//y6bP/Llj7/+pMA/vWBAP/1gwD/9YMA//WDAP/1gwD/9YMA//WDAP/1gwD/9YQA//WEAP/1hAD/9YQA//WEAP/zhAH//okA/8qLIv3xpzP/4ptV/+OdU//jnVP/451T/+OdU//jnVP/451T/+OdU//jnVL/451S/+OdUv/jnVL/451S/+GdVf/qnUf/2aRJ/9q0c9/8yn7/98V5/vjGev/4xnr/+MZ6//jGev/4xnr/+MZ6//jGev/4xnr/+MZ6//jGev/4xnr/+MZ6/vrIe/+jj2y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
       { separator: ''},
       { label: "Сохранить значок веб-сайта", func: "saveFavicon", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACPVBMVEX09ff////C3L+Uq8+Vq8+Uqs+Zr9CZrtCZr9Gfu+ear8+mt9JRf8ORxl3t8vfF06+Twojs8/d9otl8o9s+aquZrs/X9KLp8Pft8fZhisf//+DBzN2hveihv+pii8hti9pgicl6oNlojs1zncNsi836/P2duebx8/eYyWqBp+Gn0IKBvlKHsm9qmaVuk8zt7/FEbauEv1Tp7/JdhL9oi9Pl8e2LwlmdsdD7/P76+/3H7ofo8+peh8eHwFaSteZ0pkp2gl7q8/Ohy5OApt2by2eZuOqbuOWaezWuvtd7nN2HvWxul9Ty9feQxV5ljcqBp+JEcLCVtOOo0nR7odx5n9suX6Z1mtBzmtSXyGPv9PewzfOzx+O6zu/s8fd9o95Xfrthi8lYhMN5oNnw9ffw9Pjw9Pf8/f6ewO/m8O9zmdE6aapsjdyUwouPxWPDzd6XteOSs9B5nNVpnpqHt7h/s6F6n9d7ntSTttGHwVh4qp+Ev1HH7ox6qk5wj+Hm8e3t9fOm0IKAtqOBpNrx+P9ljcyhs9FpkM2hv+/u8/fF0eOLu4N+vFKgzX3p9OSFqN13qExekIl4n9j7/P3x9PhxmNDm8e9Vg8Zfkozr8veq0YTX9qL//92AtamOwnHFz96Fot1diMh+pd13ntmatu+YyW/3+/+Tqs5UgcShzJNbhsdTf8GHs7bo8PaXtuqMr+Ty8/SZt+SUqs7r7Ox3ndb9/f7t8feZyXGYyWWCpNbz9PRuiteNtNDn7/V4ntjx8fGo3JqNAAAAv3RSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AEVuhDkAAAD+SURBVBhXY5jHzcUMAqxAICq9bx8D96adDFAgaGQOFOBaH7h7zoqZDTlFyptncAAFWBjyi52CXCI0unRLxcECPhsatbbzmlXMnS60hg0kkOxW0uNrq93tNaFpD1ggUm21QK532ZQdSm1hmXKdDCwdnOWVOi1RjNGMQCCrwMDMJ8NZ4LAynVGPkXFp8zpJBubYmn579wXtqhZb0iwn9a1iWLaViYmJ3891obOwYtLEvcYMGyWAAkwJdv6accEhi8LjGVr11SenpC5f61g3NcO0vjCAIc+DjZ2dnWexddWSbYa9nlkM+8BgWsxsK7FZ1VLzRaACNokmtdnyu1QMQgF7Rlh4zWWTAwAAAABJRU5ErkJggg=="},
       { label: "Запомнить значок веб-сайта как base64", func: "copyFaviconData", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAI2bv/9RVpf/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAACIkvD/Jia6/ywpq/8AAAAAAAAAAAAAAAAAAAD/AAAA/wbwAf90qpv/Ymic/1RWqP9OUKr/W2Ch/2dumf9YYKT/Ly/B/xQP3/8MB9P/JCGb/wAAAAAAAAAAAAAAAAAAAP8G8AH/U5ea/ycr8f8VIP3/HiP4/ywo8v8sIvb/LCL2/ywi9v8KBOj/BQDe/wQAtv8tK4P/AAAAAAAAAAAAAAD/BvAB/3Sqm/9iaJz/Tim3/0UuuP9GPrT/R0ex/zk8uf8gIMz/FRDe/xEMzv8jIJz/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAP8AAAD/SqOR/yImvP8sLKj/AAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAD/AAAA/wAAAP8AAAD/BvAB/3Sqm/9KW5r/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAAAAAAAAAAAAAAAAAAABvAB/wbwAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BvAB/wbwAf8G8AH/AAAAAAAAAAAAAAAAAAAAAAAAAAAG8AH/AAAAAAAAAP8G8AH/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BvAB/wbwAf8AAAAAAAAA/wAAAP8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAAAG8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOesQQBjrEGAAaxBwACsQcABrEHDg6xBwAesQcAPrEHAD6xBw8+sQcPprEHD8axBwAGsQQABrEGAAaxB//+sQQ=="},  
       { separator: ''},
       { label: "Сохранить ярлык страницы как…", func: "saveShortcuts('true')", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP8E/yT/BP8k/5XLDv/zqgD/86oA//I1///yNf//86oA//OqAP/zqgD/86oA//OqAP+Vyw7/lcsO/wT/JP8E/yT/BP8k/5XLDv+Vyw7/86oA//OqAP/yNf//8jX///OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//02AP/9NgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/9NgD//TYA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA/wA31v8AN9b/86oA//9If///SH//86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP8AN9b/ADfW//OqAP//SH///0h///OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/5XLDv+Vyw7/86oA//OqAP/zqgD/86oA/0CA//9AgP//86oA/07+9f9O/vX/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP9AgP//QID///OqAP9O/vX/Tv71//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ=="},
       { label: "Сохранить ярлык страницы без запроса на сохранение", func: "saveShortcuts", image:"data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP8E/yT/BP8k/5XLDv/zqgD/86oA//I1///yNf//86oA//OqAP/zqgD/86oA//OqAP+Vyw7/lcsO/wT/JP8E/yT/BP8k/5XLDv+Vyw7/86oA//OqAP/yNf//8jX///OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//02AP/9NgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/9NgD//TYA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA/wA31v8AN9b/86oA//9If///SH//86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP8AN9b/ADfW//OqAP//SH///0h///OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/5XLDv+Vyw7/86oA//OqAP/zqgD/86oA/0CA//9AgP//86oA/07+9f9O/vX/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP9AgP//QID///OqAP9O/vX/Tv71//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ=="},
       { separator: ''},
       { label: "Запомнить изображение как base64, в контекстном меню", value: "Save.WebScreenShotOnImage"},
       { label: "Сохранить выделенный текст в файл, в контекстном меню", value: "Save.SelectionToFile" },
       { label: "Открыть выделенный текст в внешнем редакторе, в контекстном меню", value: "Save.TextToEditor"},
            ];

var menuPopup = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m ) {
     if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
     var mItem = document.createElement("menuitem");
     mItem.setAttribute("label", m.label);
     mItem.setAttribute("class", "menuitem-iconic");
     if ( "image" in m ) mItem.setAttribute("image", m.image);
     if ( "value" in m ) { 
          mItem.setAttribute('type', 'checkbox');
          mItem.setAttribute('checked', custombuttons.getPrefs(m.value) );
          mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))');                                                      
          }              
     if ( "func" in m ) mItem.addEventListener("command", function(e) { eval(m.func + '(' + ')') }, false);
     menuPopup.appendChild( mItem );
});
addDestructor(function() { menuPopup.parentNode.removeChild( menuPopup ) });



// Сохранить как PNG ................................
WebScreenShot = {
        capture : function(win, x, y, width, height, isCopy){
                var mainWindow = document.getElementById('main-window');
                var scrollbox = document.createElement('scrollbox');
                scrollbox.width = '1';
                scrollbox.height = '1';
                mainWindow.appendChild(scrollbox);
                var canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
                canvas.style.display = 'inline';
                canvas.width = width;
                canvas.height = height;
                scrollbox.appendChild(canvas);

                var ctx = canvas.getContext("2d");
                try {
                    ctx.clearRect(0, 0, width, height);
                    ctx.save();
                    ctx.scale(1.0, 1.0);
                    ctx.drawWindow(win, x, y, width, height, "rgb(255,255,255)");
                    ctx.restore();
                    }
                 catch(e) {
                           alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", button.label, "Не могу сохранить, слишком большая страница", false, "", null, ""); 
                           mainWindow.removeChild(scrollbox);
                           }
                 var url = canvas.toDataURL("image/png");
                 var url = iosService.newURI(url, null, null);
                 var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
                 fp.init(window, "Сохранить как…", fp.modeSave);
                 fp.appendFilters( fp.filterImages );
                 fp.defaultExtension = "png";
                 fp.defaultString = getDocTitle() + ".png";
                 if ( fp.show() == fp.returnCancel || !fp.file ) return;
                 var wbp = Cc['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'].createInstance(Ci.nsIWebBrowserPersist);
                 parseInt(Application.version) < 36
                 ? wbp.saveURI(url, null, null, null, null, fp.file, null)
                 : wbp.saveURI(url, null, null, null, null, null, fp.file, null); // если FF36+
        },
        captureAll : function() {
                var win = content;
                WebScreenShot.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY);
        },
        capturePage : function() {
                var win = content, doc = win.document, body = doc.body, html = doc.documentElement;
                var scrX = (body.scrollLeft || html.scrollLeft) - html.clientLeft;
                var scrY = (body.scrollTop || html.scrollTop) - html.clientTop;
                WebScreenShot.capture(win, scrX, scrY, win.innerWidth, win.innerHeight);
        },
        // Запомнить изображение на странице как base64 ....
        onImage : function(image) {
                var canvas = document.createElementNS(xhtmlns, 'canvas');
                canvas.width = image.naturalWidth;
                canvas.height = image.naturalHeight;
                var ctx = canvas.getContext('2d');
                ctx.drawImage(image, 0, 0);
                var base64 = canvas.toDataURL();
                gClipboard.write( base64 );
                
                // стиль для изображение на сплывающей подсказке ....
                var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
                var uri = makeURI('data:text/css,'+ encodeURIComponent('#alertImage { height: 25px !important; width: 25px !important; }'));
                sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
                // обработчик удаляет стиль если сплывающая подсказка закрывается ....
                var listener = {
                         observe: function(subject, topic, data) {
                            if ( topic == 'alertfinished') sss.unregisterSheet(uri, sss.USER_SHEET);
                         }
                }
                // всплывающая подсказка ....
                alertsService.showAlertNotification( base64, button.label, "Запомнил изображение как base64", false, "data", listener, "");
         },
};
// Сохранить выбранную область страницы как PNG ....
WebScreenShotByClipping = {
        capture : WebScreenShot.capture,
        handleEvent : function(event){
                if (event.button != 0) return false;
                event.preventDefault();
                event.stopPropagation();
                switch(event.type){
                        case 'mousedown':
                                this.downX = event.pageX;
                                this.downY = event.pageY;
                                this.bs.left = this.downX + 'px';
                                this.bs.top  = this.downY + 'px';
                                this.body.appendChild(this.box);
                                this.flag = true;
                                break;
                        case 'mousemove':
                                if (!this.flag) return;
                                this.moveX = event.pageX;
                                this.moveY = event.pageY;
                                if (this.downX > this.moveX) this.bs.left = this.moveX + 'px';
                                if (this.downY > this.moveY) this.bs.top  = this.moveY + 'px';
                                this.bs.width  = Math.abs(this.moveX - this.downX) + 'px';
                                this.bs.height = Math.abs(this.moveY - this.downY) + 'px';
                                break;
                        case 'mouseup':
                                this.uninit();
                                break;
                }
        },
        init : function(){
                this.win = document.commandDispatcher.focusedWindow;
                if (this.win == window) this.win = content;
                this.doc = this.win.document;
                this.body = this.doc.body;
                if (!this.body instanceof HTMLBodyElement){
                        alert("Can not capture.");
                        return false;
                }
                this.flag = null;
                this.box = this.doc.createElement('div');
                this.bs = this.box.style;
                this.bs.border = '#0f0 dashed 2px';
                this.bs.position = 'absolute';
                this.bs.zIndex = '2147483647';
                this.defaultCursor = getComputedStyle(this.body, '').cursor;
                this.body.style.cursor = 'crosshair';
                this.doc.addEventListener('mousedown', this, true);
                this.doc.addEventListener('mousemove', this ,true);
                this.doc.addEventListener('mouseup', this ,true);
                this.doc.addEventListener('click', this, true);
        },
        uninit : function(){
                var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)];
                this.doc.removeEventListener('mousedown', this, true);
                this.doc.removeEventListener('mousemove', this, true);
                this.doc.removeEventListener('mouseup', this, true);
                this.doc.removeEventListener('click', this, true);
                this.body.style.cursor = this.defaultCursor;
                this.body.removeChild(this.box);
                this.capture.apply(this, pos);
        },
};
// Сохранить фрейм на странице как PNG ....
WebScreenShotByClick = {
        capture : WebScreenShot.capture,
        getPosition : function(){
                var html = this.doc.documentElement;
                var body = this.doc.body;
                var rect = this.target.getBoundingClientRect();
                return [
                        this.win
                        , Math.round(rect.left) + (body.scrollLeft || html.scrollLeft) - html.clientLeft
                        , Math.round(rect.top) + (body.scrollTop || html.scrollTop) - html.clientTop
                        , parseInt(rect.width)
                        , parseInt(rect.height)
                ];
        },
        highlight : function(){
                this.orgStyle = this.target.hasAttribute('style')? this.target.style.cssText : false;
                this.target.style.cssText += 'outline: red 2px solid; outline-offset: 2px; -moz-outline-radius: 2px;';
        },
        lowlight : function(){
                if (this.orgStyle) this.target.style.cssText = this.orgStyle;
                else this.target.removeAttribute('style'); 
        },
        handleEvent : function(event){
                switch(event.type){
                        case 'click':
                                if (event.button != 0) return;
                                event.preventDefault();
                                event.stopPropagation();
                                this.lowlight();
                                var pos = this.getPosition();
                                this.capture.apply(this, pos);
                                this.uninit();
                                break;
                        case 'mouseover':
                                if (this.target) this.lowlight();
                                this.target = event.target;
                                this.highlight();
                                break;
                }
        },
        init : function(){
                this.win = content;
                this.doc = content.document;
                this.doc.addEventListener('mouseover', this, true);
                this.doc.addEventListener('click', this, true);
        },
        uninit : function(){
                this.doc.removeEventListener('mouseover', this, true);
                this.doc.removeEventListener('click', this, true);
        },
};


 
// Сохранить ярлык страницы в указанную папку или в последнюю папку сохранения ................................
function saveShortcuts( saveAs ) {
  
     // блокируем создание ярлыков для внутреных страниц FF ....  
     if ( !getDocTitle() ) {   
          alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", button.label, "Не поддерживается", false, "", null, "");
          return;
          }
          
     var pref = "Save.pathToSaveShortcuts";
     var fileName = saveAs ? pathToFile( pref ) : false;
     if ( saveAs && !fileName ) return;        
                  
     // если у таба есть иконка сохранить иконку таба в установленную папку ....
     var favicon = /\.jpg/.test(content.location) ? false : gBrowser.mCurrentTab.image;
     var faviconName = "favicon" + Math.round(Math.random()*1000000000);     
     if ( favicon ) saveFaviconToFolder( faviconName );
     
     /* получить путь для сохранения из 'about:config', добавытъ заголовок страницы и название домена 
        или установленное вручную имя файла и создать ярлык ....*/
     var pathToFolder = Application.prefs.getValue( pref, 0);
     var siteName = addSiteNameToShortcuts ? getSiteName() : "";
     var shortcutName = (!!fileName) ? fileName : ( siteName + getDocTitle() + getCurrentTopicNumber() );
     var path = pathToFolder + shortcutName + ".url";     
     file.initWithPath( path ); 
    
     // адрес страницы в UTF-8 если это протокол 'file' или в 'Punycode' если это .рф домен .... 
     var url = content.document.location;   
     if ( url.protocol == 'file:' ) var url = convertFromUnicode("UTF-8", url);   
     else if ( url.host.slice(-3) == '.рф') var url = Services.io.newURI(url, null, null).asciiSpec;
     
     // текст ярлыка из адреса страницы и пути к иконке таба( если она была ) ....     
     var shortcut = "[InternetShortcut]" + "\r\n" + "URL=" + url;
     var faviconPath = "IconFile=C:\\Documents and Settings\\Favicon\\" + faviconName + ".ico" + "\r\n";
     if ( !favicon ) var faviconPath = "";
     var data = shortcut + "\r\n" + faviconPath + "IconIndex=0";      

     // записать текст в ярлык ....
     foStream.init(file, 0x02|0x08|0x20, 0666, 0);
     foStream.write(data, data.length);
     foStream.close();

     // подсказка ....
     var notification = 'Сохранил ярлык страницы в ' + pathToFolder;
     var image = favicon ? favicon : button.image;
     alertsService.showAlertNotification( image, getDocTitle(), notification, false, "", null, "" );
};



// Установка пути и названия для сохранения ярлыка через диалог сохранения, если отмена отдаст 'false' ................................
function pathToFile( pref ) {     

     // получить предыдущий путь для сохранения из 'about:config' или диск C: ....
     var pathToFile = Application.prefs.getValue( pref, 0 );
     var pathToFile = ( pathToFile == 0 )? "C:\\": pathToFile;

     // диалог создания и установки пути ....     
     var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
     fp.init(window, "Укажите путь к файлу и его название!", fp.modeSave);
     fp.appendFilters( fp.filterAll );
     fp.defaultString = getSiteName() + getDocTitle() + getCurrentTopicNumber();
     file.initWithPath( pathToFile );
     fp.displayDirectory = file;
     
     if ( fp.show() == fp.returnCancel ) return false;
          // убрать название файла из пути к файлу и записать путь в 'about:config' ....
          var filePath = fp.file.path.toString();
          var fileName = fp.file.leafName.toString();
          Application.prefs.setValue( pref, filePath.replace( fileName, "" ) );
         
          return fileName;
};



// Сохранить в указаную папку иконку таба как .ico и без диалога сохранения ................................
function saveFaviconToFolder( faviconName ) {

     var path = "C:\\Documents and Settings\\Favicon\\";
     var favicon = gBrowser.mCurrentTab.image;
     var uri = iosService.newURI( favicon, null, null );

     // создать папку если не существует ....
     file.initWithPath( path );
     if ( !file.exists() || !file.isDirectory() ) file.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
     
     // конвертировать в .ico файл иконку таба и сохранить, спасибо Dumby за этот код ....  
     var path = path + faviconName + ".ico";
     const xhtml = "http://www.w3.org/1999/xhtml";
     var img = document.createElementNS(xhtml, "img");
     var canvas = document.createElementNS(xhtml, "canvas");
     img.src = uri.spec;
     img.onload = function() {

     var width = img.width, height = img.height;
     if (width > 255 || height > 255) return;
     canvas.width = width; canvas.height = height;
     var context = canvas.getContext("2d");
     context.drawImage(img, 0, 0);
     var arr = context.getImageData(0, 0, width, height).data;

     var data = [];
     for ( var y = 0, l = height * 4; y < l; y += 4 ) {
           for ( var x = width * 4; x > 0; x -= 4 ) {
             var pos = x + y * width - 1;
             data.unshift(arr[pos - 1], arr[pos - 2], arr[pos - 3], arr[pos])
             }
        }
     function byte(num) {
            var str = num.toString(2);
            var l = str.length;
            var bytes = [];
            for ( var i = 1; i <= 3; i++ ) {
              var sub = str.substring(l - i * 8, l - (i - 1) * 8);
                  if ( !sub ) sub = "0";
              bytes[i] = parseInt(sub, 2);
              }
          return bytes;
        }
     var bytesLength = byte(data.length + 40);
     var bytesHeight = byte(height * 2);

     var header = [0,0, 1,0, 1,0, img.width, img.height, 0, 0, 1,0, 0,0 , bytesLength[1],bytesLength[2],bytesLength[3],0, 22,0,0,0];
     var info = [40,0,0,0,img.width,0,0,0,bytesHeight[1],bytesHeight[2],0,0,1,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
     var ico = header.concat(info, data);
     file.initWithPath(path);
     var bStream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);
     foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0);
     bStream.setOutputStream( foStream );
     bStream.writeByteArray(ico, ico.length);
     bStream.close();
     foStream.close();
     }
};



// Добавить адрес наверху страницы и открыть диалог сохранения страницы ................................
function savePage() {
     var sURL = gURLBar.value;
     content.document.body.innerHTML = "<table width=100%><tr><td align=left><small><a target=_blank href=" + 
                                        sURL + ">"+ sURL + "</a></small>\n</td></tr></table>" + content.document.body.innerHTML;
     saveDocument(window.content.document);
};



// Сохранить иконку текущего сайта с диалогом сохранения ................................
function saveFavicon() { saveImageURL(gBrowser.mCurrentTab.image, "save", null, false, false, null, content.document) };



// Скопировать иконку текущего сайта как base64 код ................................
function copyFaviconData() PlacesUtils.favicons.getFaviconDataForPage(
   gBrowser.currentURI,
   function( uri, len, arr, mmt ) {
      if ( !len ) {
           alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", "Save", "Не поддерживается");
           return;
           }
       var base64 = "data:" + mmt + ";base64," + btoa(String.fromCharCode.apply(null, arr))
       gClipboard.write( base64 );
       alertsService.showAlertNotification(base64, "Save", "Запомнил значок веб-сайта как base64");
    }
);



// Сохранить выделенный текст или весь текст на странице как txt файл ................................
function saveSelectionToTxt() {
 
     var sel = getSelect();
     if ( !sel ) document.getElementById("cmd_selectAll").doCommand(); 
     
          // создать название файла из заголовка страницы и текущего времени и сохранить текст ....
     var fileTitle = (getDocTitle() ? getDocTitle() : self.label) + '  ' + (new Date()).toLocaleFormat("%H·%M·%S");
     saveURL("data:text/plain," + encodeURIComponent((content.location.href.startsWith('data:') ? "" : (content.location.href + "\r\n\r\n")) + getSelect()), 
                                  fileTitle + ".txt", null, false, false, null, content.document);

     if ( !sel ) goDoCommand("cmd_selectNone"); 
};



// Сохраняет страницу как PDF файл через сервис 'pdfmyurl.com' ................................
function savePageToPDF() {
   // разрешить страницу для расширения NoScript ....   
   if ( "noscriptUtil" in window ) {
        var autoReload = custombuttons.getPrefs("noscript.autoReload");
        if ( autoReload ) custombuttons.setPrefs("noscript.autoReload", false);
        noscriptOverlay.allowPage();
        if ( autoReload ) setTimeout(function() { custombuttons.setPrefs("noscript.autoReload", true) }, 10)
        }
   // сохранить ....     
   var loc = content.location;
   if (loc.protocol.slice(0, 4) == "http")
   loadURI("http://pdfmyurl.com?url=" + loc);
};    


 
// Добавляем в контекстного меню страницы новые пункты ................................
var contextMenu = document.getElementById("contentAreaContextMenu");

// блокировать дублирование новых пунктов
try { ["baseItem", "saveItem", "editorItem"].forEach(function(n) { contextMenu.removeChild( document.getElementById("content-" + n ) ) }); }
catch(e) { }; 
                              
// в контекстного меню изображений ....
var baseItem = document.createElement("menuitem");
baseItem.id = "content-baseItem";
baseItem.setAttribute("label", "Запомнить изображение как base64");
baseItem.setAttribute("oncommand", "WebScreenShot.onImage( gContextMenu.target )");
contextMenu.appendChild( baseItem ); // как последний пункт меню 

// в контекстного меню выделенного текста ....
var saveItem = document.createElement("menuitem");
saveItem.id = "content-saveItem";
saveItem.setAttribute("label", "Сохранить выделенный текст в файл");
saveItem.setAttribute("oncommand", "document.getElementById('" + this.id + "').saveSelectionToFile()");
contextMenu.insertBefore( saveItem, document.getElementById("context-sep-open") ); // как первый пункт меню 

var editorItem = document.createElement("menuitem");
editorItem.id = "content-editorItem";
editorItem.setAttribute("label", "Открыть выделенный текст в внешнем редакторе");
editorItem.setAttribute("oncommand", "document.getElementById('" + this.id + "').textToEditor()");
contextMenu.insertBefore( editorItem, document.getElementById("context-sep-open") ); // как первый пункт меню 

// устанавливаем где и при каких настройках показывать новые пункты контекстного меню ....
function handlePopupshowing(e) {
   if ( e.target != e.currentTarget ) return;
   var sel = gContextMenu.isTextSelected;;
   saveItem.hidden = !sel || !cbu.getPrefs("Save.SelectionToFile");
   editorItem.hidden = !sel || !cbu.getPrefs("Save.TextToEditor"); 
   baseItem.hidden =  !gContextMenu.onImage || !cbu.getPrefs("Save.WebScreenShotOnImage"); 
}        
addEventListener('popupshowing', handlePopupshowing, false, contextMenu );



// Запомнить изображение как base64 если нажать правой kлавышей мыши в контекстном меню на пункт 'Сохранить изображение как' ................
function handleClick(e) {
   if ( e.button !== 2 ) return;
   WebScreenShot.onImage( gContextMenu.target );
   document.getElementById("contentAreaContextMenu").hidePopup();
};
addEventListener("click", handleClick, false, document.getElementById("context-saveimage") );



// Сохранить выделенный текст в файл на рабочем столе ................................
this.saveSelectionToFile = function() {
     var text = convertFromUnicode("UTF-8", getSelect() ); 
     var textTitle = convertFromUnicode("UTF-8", getDocTitle() ); 
     var time = (new Date()).toLocaleFormat("%H:%M:%S");
     
     // адрес страницы( в UTF-8 если это .рф домен ) ....
     var url = content.document.location;
     if ( /\.рф/.test( url.host ) ) var url = convertFromUnicode("UTF-8", url );
     
     /* создать текст для записи из заголовка страницы и текущего времени,
        адреса страницы и выделенного текста .... */    
     var line = "............................................................................" + "\n";
     var text = line + textTitle + " - " + time + "\n" + url + "\n\n" + text + "\n\n\n";

     // путь к файлу и название файла....
     var file = directoryService.get("Desk", Components.interfaces.nsIFile); 
     file.append("Save - " + (new Date()).toLocaleFormat("%d.%m.%Y") + ".txt");
          
     // создать файл с текстом или добавлять текст в файл ...
     !file.exists() ? foStream.init(file, 0x02|0x08|0x20, 0666, 0) : foStream.init(file, 0x02 | 0x10, 0664, 0);
     foStream.write(text, text.length);
     foStream.close();

     // всплывающая подсказка дает возможность открыть файл если кликнуть на подсказке ....
     var listener = {
         observe: function(subject, topic, data) {
              if ( topic == 'alertclickcallback') file.launch(); // oткрыть файл
         }
     };
     var notification = 'Сохранил выделенный текст в файл на рабочий стол'; 
     var image = gBrowser.mCurrentTab.image ? gBrowser.mCurrentTab.image : button.image;
     alertsService.showAlertNotification( image, notification, "Открыть файл", true, "", listener, "" );
};



/* Функция создаст текстовой файл в папке custombuttons в папке профиля 
   и запишет в файл выделенный текст и откроет файл в редакторе ................................ */
this.textToEditor = function() {
     var text = convertFromUnicode("UTF-8", getSelect() ); 
   
     // устанавить путь к файлу, записать текст, открыть файл ....
     var file = directoryService.get("ProfD", Ci.nsIFile);
     file.append("custombuttons");
     file.append("TextToEditor.txt");     
     foStream.init(file, 0x02|0x08|0x20, 0666, 0);
     foStream.write(text, text.length);
     foStream.close();     
     file.launch(); 
};



// Получить название домена с заглавным первым символом и без приставок( типа .ru и .com ) ................................
function getSiteName() {
     try { var domain = Cc['@mozilla.org/network/effective-tld-service;1'].getService(Ci.nsIEffectiveTLDService)
                                  .getBaseDomain( content.document.documentURIObject ) }
     catch(e) { return "" };                                                                                        
     
     var num = domain.length;     
     if ( domain.slice(num-3, num-2) == '.' ) var siteName = domain.slice(0, num-3); 
     if ( domain.slice(num-4, num-3) == '.' ) var siteName = domain.slice(0, num-4);

     var siteName = siteName.charAt(0).toUpperCase() + siteName.slice(1);

     return siteName + " "; 
};



// Получить номер топика из текущей страницы если он есть иначе ничего ................................
function getCurrentTopicNumber() {
     var currUrl = content.location.toString();
     var array = currUrl.split('=');
     var num = array.length

     if ( num == 1 ) return '';
     
          var val = ( ((num > 2)? ('  ' + array[num-2]): '') + ' - ' + array[num-1]);          
          // заменить недопустимые символы и удалить лишние пробелы 
          var val = val.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");          
          
          return val;
};



/* Получить заголовк страницы или название домена если заголовка у страницы нет
   или название вкладки если домена нет ................................ */
function getDocTitle() {
     var protocol = content.location.protocol;
     if ( ["about:", "chrome:", "jar:", "data:"].indexOf( protocol ) !== -1 ) return false;  
          var docTitle = content.document.title || content.document.domain || gBrowser.mCurrentTab.label;       
          
          // заменить недопустимые символы и удалить лишние пробелы 
          var docTitle = docTitle.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " "); 

          return docTitle.slice(0, 50);
};


    
// Функция отдаст выделенный текст из страницы или текстового поля, если текст не выделен отдаст 'false' ................................
function getSelect() {
     // выделенный текст из страницы ....
     var selection = document.commandDispatcher.focusedWindow.getSelection();
     var anchor = (selection.anchorNode !== null)? selection.anchorNode: false;

     // выделенный текст из 'PRE' ....
     if ( anchor && anchor.parentNode.tagName == 'PRE' ) { 
          var node = selection.focusNode;
          var startPos = selection.anchorOffset;
          var endPos = selection.focusOffset;
          var selection = node.data.substring(startPos, endPos); 
          }
     // выделенный текст из текстового поля ....
     if ( selection.toString().length == 0 ) {
          var theBox = document.commandDispatcher.focusedElement;
         
          if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { 
               var startPos = theBox.selectionStart;
           var endPos = theBox.selectionEnd;
           var selection = theBox.value.substring(startPos, endPos);  
               }
          }
     // исправляем проблему с переносом текста новую строку в стандартном win блокноте ....
     if ( selection.toString().length !== 0 ) {
          var selection = selection.toString();
          var selection = selection.replace(/\u000A/g, "\u000D\u000A");
          var selection = selection.replace(/\u000D\u000D\u000A/g, "\u000D\u000A");     
          }
    
     return ( selection == '') ? false : selection;
};

broker, давно исправили. Поищи Save+, от 13.09.2016.

manuk
Не знал,спасибо за подсказку.

В [firefox]50 перестало работать перетаскивание закладок в [CB] Session Manager :( Чертовски неудобно стало. Нельзя ли поправить?

bezuma пишет

В [firefox]50 перестало работать перетаскивание закладок в [CB] Session Manager

А где можно найти [CB] Session Manager?

bunda1
Пардон, Session Bookmarks https://forum.mozilla-russia.org/viewtopic.php?id=57871
Update Проблема решена

Перешел на FF50.0.1. Поставил кнопку для переназначения newtab.

Выделить код

Код:

var url = "about:blank";
BrowserOpenTab =()=> openUILinkIn(url, "tab"); 

addEventListener("TabClose", e=> {  
   var tab = e.target;
   if ( tab == gBrowser.mCurrentTab && tab.hasAttribute('first-tab') ) 
        setTimeout(()=> gBrowser.loadURI(url), 0);
}, true, gBrowser.mTabContainer);

Работает, но странно. После закрытия вкладки, следующая оказывается пустой. Надо жать Back, чтобы добраться до следующей.
Что-то с кнопкой или с custombuttons?

ifln пишет

Перешел на FF50.0.1. Поставил кнопку для переназначения newtab.

:/

Выделить код

Код:

var url = "about:blank";
BrowserOpenTab =()=> openUILinkIn(url, "tab");

addEventListener("TabClose", e=> {  
   var tab = e.target;
   if ( tab == gBrowser.mCurrentTab && !gBrowser.visibleTabs.length ) 
        setTimeout(()=> gBrowser.loadURI(url), 0);
}, true, gBrowser.tabContainer);

bunda1, :beer:
Большое спасибо!

И еще несколько кнопок капризничают. Срабатывают, но по внешнему виду не видно.
Вроде этой:

Выделить код

Код:

this._handleClick =()=> {
   [
    "dom.storage.enabled"
   ].forEach((pref)=> cbu.setPrefs(pref, !cbu.getPrefs(pref)) );
};


var s = "dom.storage.enabled";
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) ); 
function toggleImage() self.style.filter = !cbu.getPrefs(s) ? grayscale : '';
var grayscale = parseInt(Application.version) < 36 ? 'url("chrome://mozapps/skin/extensions/extensions.svg#greyscale")' : 'grayscale(1)';
toggleImage();
ifln пишет

Поставил кнопку для переназначения newtab.

При закрытии последней вкладки вылезает about:newtab

ifln пишет
ifln пишет

Поставил кнопку для переназначения newtab.

При закрытии последней вкладки вылезает about:newtab

А если так:

Выделить код

Код:

var url = "about:blank";
BrowserOpenTab =()=> openUILinkIn(url, "tab");

addEventListener("TabClose", e=> {  
   var tab = e.target;
   if ( tab == gBrowser.mCurrentTab && gBrowser.visibleTabs.length == 1 )
        setTimeout(()=> gBrowser.loadURI(url), 0);
}, true, gBrowser.tabContainer);

30-11-2016 22:00:31

ifln пишет

И еще несколько кнопок капризничают. Срабатывают, но по внешнему виду не видно.
Вроде этой:

Выделить код

Код:

this._handleClick =()=> {
   [
    "dom.storage.enabled"
   ].forEach((pref)=> cbu.setPrefs(pref, !cbu.getPrefs(pref)) );
};


var s = "dom.storage.enabled";
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) ); 
function toggleImage() self.style.filter = !cbu.getPrefs(s) ? grayscale : '';
var grayscale = parseInt(Services.appinfo.version) < 36 ? 'url("chrome://mozapps/skin/extensions/extensions.svg#greyscale")' : 'grayscale(1)';
toggleImage();

bunda1, спасибо большое.
Можно переползать на 50.0.1 :)

bunda1

ifln пишет

Поставил кнопку для переназначения newtab.

bunda1 пишет

А если так:

Теперь вместе с предпоследней вкладкой закрывается и последняя, вернее в последней открывается about:blank и надо Back жать. :/

ifln
Как насчёт стандартного переназначения about:newtab, типа

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

Выделить код

Код:

((ants, url = "about:blank") => {
    if (ants.newTabURL != url) ants.newTabURL = url;
    addDestructor(reason => reason[5] == "e" && ants.newTabURL == url && ants.resetNewTabURL());
})(aboutNewTabService);

Dumby пишет

Как насчёт стандартного переназначения about:newtab, типа

Отлично. Спасибо!

как то в этой ветке была собрана замечательная кнопка,
назначение - если файл скачивается во временную папку ОС, то после скачивания,
из Диспетчера загрузок FIrefox, информация о нем, сразу удаляется.
(очень актуально, например для ссылки торрентов)
       к сожалению после обновления FIrefox до v.49.0.3
       кнопка работать перестала.
       поправьте пожалуйста.

код кнопки

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

Выделить код

Код:

gBrowser.currentURI.spec != "about:customizing" && (() => {
    var id = _id + "-" + Components.stack.lineNumber;
    var mod = Cu.import("resource:///modules/DownloadsLogger.jsm", {});
    if (mod[id]) return; mod[id] = true;
    addDestructor(() => delete mod[id]);
    var err = Cu.reportError, tmp = OS.Constants.Path.tmpDir + "\\";
    Task.spawn(function() {

        var list = yield Downloads.getList(Downloads.ALL), view = {};
        view.onDownloadAdded = view.onDownloadChanged = download =>
            download.progress == 100
            && download.target.path.startsWith(tmp)
            && setTimeout(() => {
                var uri = makeURI(download.source.url);
                PlacesUtils.bhistory.removePage(uri);
                list.remove(download).then(null, err);
            }, 1e3);
        yield list.addView(view);
        setTimeout(() => delete view.onDownloadAdded, 5e3);
        addDestructor(() => list.removeView(view).then(null, err));

    }).then(null, err);
})();

polk90
Что-то модуль аж с FF41 не находится. Может так

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

Выделить код

Код:

(tmp => {
    var id = _id + "-" + Components.stack.lineNumber, err = Cu.reportError;
    var mod = Cu.import("resource:///modules/DownloadsCommon.jsm", {});
    if (mod[id]) return; mod[id] = true;
    addDestructor(reason => reason[5] == "e" && delete mod[id]);
    Task.spawn(function() {

        var list = yield Downloads.getList(Downloads.ALL), view = {};
        view.onDownloadAdded = view.onDownloadChanged = download =>
            download.progress == 100
            && download.target.path.startsWith(tmp)
            && setTimeout(() => {
                var uri = makeURI(download.source.url);
                PlacesUtils.bhistory.removePage(uri);
                list.remove(download).then(null, err);
            }, 1e3);
        yield list.addView(view);
        setTimeout(() => delete view.onDownloadAdded, 5e3);
        addDestructor(() => list.removeView(view).then(null, err));

    }).then(null, err);
})(OS.Path.join(OS.Constants.Path.tmpDir, "_").slice(0, -1));

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

Есть ли работающий вариант BBCode не из контекстного меню, например, похожий на этот https://forum.mozilla-russia.org/viewto … 73#p612473 ? Что ни пробую, ничего не работает.

shadow_user пишет

Что ни пробую, ничего не работает.

А эта №6367?

И эта не работает.

Выделить код

Код:

cbu.setPrefs("general.useragent.override", navigator.userAgent + " u01-04");

получается так

850145b0b2178c1aff65dc11980a94b8.jpeg

Помогите исправить. Спасибо :)

shadow_user пишет

И эта не работает.

А она рабочая. Ищи причину у себя. CB какая версия?

CB v0.0.5.8. Копирую код, вставляю в поле "Код". При клике на кнопке ничего не происходит, нет никакой реакции. Может, что не так делаю? Где должна появиться панель BBCode, или выпадающее меню, или в контекстном меню?
Обновил до 0.0.5.8.9, не помогло.

Kiril__777 пишет
Выделить код

Код:

cbu.setPrefs("general.useragent.override", navigator.userAgent + " u01-04");

получается так

http://i87.fastpic.ru/thumb/2017/0101/b … a94b8.jpeg

Помогите исправить. Спасибо :)

В данном случае проще всего вот так:

Выделить код

Код:

var add = " u01-04";
cbu.setPrefs("general.useragent.override", navigator.userAgent.replace(add, "") + add);
shadow_user пишет

Копирую код, вставляю в поле "Код". При клике на кнопке ничего не происходит, нет никакой реакции. Может, что не так делаю? Где должна появиться панель BBCode, или выпадающее меню, или в контекстном меню?

Код из №6367 надо скопировать и запустить в адресной строке, дальше там вроде будет всё понятно, вот инструкция, если чё №1. Панель должна появляться при нажатие на кнопку.

Infocatcher
Не помогает почему то :(

voqabuhe пишет

Код из №6367 надо скопировать и запустить в адресной строке

Я чуть не упал, а из адресной строки кнопка установилась и работает! А способы-то равнозначные, что из адресной строки, что в поле "код".
Кажется, это модификация кнопки от tolikdryg, очень уж похожа. Спасибо! :beer:
Ad
Из инструкции по созданию кнопок:

Код кнопки:
тут код получаемый по ПКМ - Копировать код в буфер

Код: тут код из вкладки Код(если он есть)

Инициализация:
тут код из вкладки Инициализация(если он есть)

В чем разница между Кодом и Кодом кнопки, и в какие поля их вставлять?
2017-01-02_104459.1483346725.png

shadow_user пишет
voqabuhe пишет

Код из №6367 надо скопировать и запустить в адресной строке

Я чуть не упал, а из адресной строки кнопка установилась и работает! А способы-то равнозначные, что из адресной строки, что в поле "код".
Кажется, это модификация кнопки от tolikdryg, очень уж похожа. Спасибо! :beer:
Ad
Из инструкции по созданию кнопок:

Код кнопки:
тут код получаемый по ПКМ - Копировать код в буфер

Код: тут код из вкладки Код(если он есть)

Инициализация:
тут код из вкладки Инициализация(если он есть)

В чем разница между Кодом и Кодом кнопки, и в какие поля их вставлять?
http://ipic.su/img/img7/fs/2017-01-02_1 … 346725.png

Код должен вставляться во вкладку "Код"
Код кнопки - наверное имеется ввиду код, вставляемый в поле "Изображение (M)"

xseed пишет

Код должен вставляться во вкладку "Код"
Код кнопки - наверное имеется ввиду код, вставляемый в поле "Изображение (M)"

Имеются разночтения, в одном посту так, в другом эдак.
-------------------------
Ага, "а один из ПВО заменяет их всех трех" :)

xseed пишет

Код кнопки - наверное имеется ввиду код, вставляемый в поле "Изображение (M)"

Код кнопки в адресную строку + enter.

Привет!
Как сделать окно "косоли ошибок" "всегда сверху"(поверх окон).
Я могу запускать другие внутренние плюшки бравзера так:

Выделить код

Код:

// окно настроек всегда "наверху"
window.openDialog("about:config", "Настройки", "alwaysRaised,resizable=yes", window);

Но консоль вызывается кнопкой с кодом

Выделить код

Код:

toJavaScriptConsole();

ибо если я запишу

Выделить код

Код:

window.openDialog("chrome://global/content/console.xul", "Ошибки", "alwaysRaised,resizable=yes", window);

запускается как нада(поверх), но нет панели с кнопками "Все, Ошибки, Предупреждения, Сообщения, Очистить" и т.д.  Догадываюсь, что в случае с "консолью ошибок", надобно еще какие-то параметры окна дописывать, не знаю какие :sick:
или
может есть простой способ, сделать окно "консоли ошибок"(вызванное из toJavaScriptConsole();) "всегда сверху", конкретное окно, средствами CB?

xoreax
Custom Buttons • Просмотр темы - Browser Console in Sidebar/Tab

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

xoreax пишет

Как сделать окно "косоли ошибок" "всегда сверху"(поверх окон).

Может так

Выделить код

Код:

toOpenWindowByType("global:console", "chrome://global/content/console.xul", "chrome,toolbar,resizable,alwaysRaised");

bunda1
там BrowserConsole. но, тож полезно, очень. пасиб. :beer:
Dumby
Да! :rock:

Установил v51 отвалилась часть функционала кнопки turbotа Быстрое переключение параметров
Перестали отображаться подменю с выбором из нескольких параметров.
Можно починить?

Ultima2m пишет

Установил v51 отвалилась часть функционала кнопки turbotа Быстрое переключение параметров
Перестали отображаться подменю с выбором из нескольких параметров.
Можно починить?

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EQuick%20toggle%20for%20about%3Aconfig%20preferences%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB6klEQVQ4jZWTv2tUQRDHv8ntd28GLLQQfwS5VkuDSgRF/wlRiIiCQQQhhZ1VII1/wDUWkkLTBAsbC0FJYZGQ3NuZRcHYW6UQEQzoeXkW791xXh5CptodZr8z85kd4BBWRJwDgB5wyoCjh3mLbfK8C/ddW11XJlduNgYaeTFpvJWA0+P+BBx3Cf2sLEy5m4WrS8A0AGANaBUSrgKAKzdcY5k0PF4HJGm47NK6nSUMXOIXAEgSrrnG0oU/AGDKNb6qHe9c+Ms1lqbxqws/uoTfWVp3ksRll/DTJM6bcMWEn1KbDysBCW+zsnSNpWssTbg3PNf3uw7MuHDgym8uoW8aX496SxKXs7J0iTsFObcGRBfey8rShP1EXthSnDHhShJ0vM0H1uYiAKBSHWZqLYyDc+H7sSpeNlMX9l1jWWebEAgjgSxcbRRYB46YhCcVxH9bqDP3nbyUBB0XPk+Cjgnvj1qoqohvJqDtTUBdcGAmSzgIEQBM2R0fY/U41GPkwNpcTBKfmnDPNN4w4TOX+NnbfAQAWAKmXcMVAMgaNqrM1UfqkbMmrXkT/nGJO1XF4Xod8/0Ak4KcKzTe3AROjPs/AMdM2M8atk25a8IXAKYawTZZj5jNEvZN2TVldg3Ny/RfkYizALAFnByu819tzvCRWXKqTwAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0411%u044B%u0441%u0442%u0440%u043E%u0435%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0435%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%20about%3Aconfig%20%u043E%u0442%2024.07.2016%0Athis._handleClick%20%3D%28%29%3D%3E%20menuPopup.openPopup%28this%2C%20%22after_start%22%29%3B%0A%0Avar%20menuPopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%0AmenuPopup.id%20%3D%20%27quick-aboutconfig-menupopup%27%3B%0A%0A//%20%u0418%u0437%u043C%u0435%u043D%u0438%u0442%u044C%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043F%u0440%u0438%20%u043D%u0435%u0441%u043E%u043E%u0442%u0432%u0435%u0442%u0441%u0442%u0432%u0438%u0435%20%u043B%u044E%u0431%u043E%u0433%u043E%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430%20%u043F%u043E%u043B%u044C%u0437%u043E%u0432%u0430%u0442%u0435%u043B%u044C%u0441%u043A%u043E%u043C%u0443%20%u043F%u0440%u0435%u0434%u043F%u043E%u0447%u0442%u0435%u043D%u0438%u044E%20%28%u0441%u043C.%20%u043D%u0438%u0436%u0435%29.%0A//%20%u0418%u043A%u043E%u043D%u043A%u0430%20%u043C%u0435%u043D%u044F%u0435%u0442%u0441%u044F%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u0438%u0438%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%20%u0447%u0435%u0440%u0435%u0437%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%2C%20%u043B%u0438%u0431%u043E%20%u043F%u043E%u0441%u043B%u0435%20%u0435%u0433%u043E%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u044F.%0Avar%20s%20%3D%20%27CB.hasNotUserChoice%27%3B%0Afunction%20toggleImage%28%29%20%7B%0A%20%20var%20val%20%3D%20custombuttons.getPrefs%28s%29%3B%0A%20%20self.image%20%3D%20val%0A%20%20%20%20%3F%20%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB6klEQVQ4jZWTv2tUQRDHv8ntd28GLLQQfwS5VkuDSgRF/wlRiIiCQQQhhZ1VII1/wDUWkkLTBAsbC0FJYZGQ3NuZRcHYW6UQEQzoeXkW791xXh5CptodZr8z85kd4BBWRJwDgB5wyoCjh3mLbfK8C/ddW11XJlduNgYaeTFpvJWA0+P+BBx3Cf2sLEy5m4WrS8A0AGANaBUSrgKAKzdcY5k0PF4HJGm47NK6nSUMXOIXAEgSrrnG0oU/AGDKNb6qHe9c+Ms1lqbxqws/uoTfWVp3ksRll/DTJM6bcMWEn1KbDysBCW+zsnSNpWssTbg3PNf3uw7MuHDgym8uoW8aX496SxKXs7J0iTsFObcGRBfey8rShP1EXthSnDHhShJ0vM0H1uYiAKBSHWZqLYyDc+H7sSpeNlMX9l1jWWebEAgjgSxcbRRYB46YhCcVxH9bqDP3nbyUBB0XPk+Cjgnvj1qoqohvJqDtTUBdcGAmSzgIEQBM2R0fY/U41GPkwNpcTBKfmnDPNN4w4TOX+NnbfAQAWAKmXcMVAMgaNqrM1UfqkbMmrXkT/nGJO1XF4Xod8/0Ak4KcKzTe3AROjPs/AMdM2M8atk25a8IXAKYawTZZj5jNEvZN2TVldg3Ny/RfkYizALAFnByu819tzvCRWXKqTwAAAABJRU5ErkJggg%3D%3D%27%0A%20%20%20%20%3A%20%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAACXBIWXMAAABnAAAAZwHVKNQmAAADGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6egY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBA3y7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBwgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJAwMDg3N+QWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8EgX3xMw8BUMDVQYqg4jIKAX08EGIIUByaVEZhMXIwMDAoM2Qw7CDkY8xi/EskynTYmYR5i4WFpZGVibWNjYetmnsyuybOVw5bnIWcHFyLeV24n7E08KrwXuOr4xfnv+0QIWguuANoS5hO+EvIqtFU8TkxW6Jz5AIlxSXvCE1RzpBRk3mrexWuXp5LwUxhSeKm5SalENU1FR+qp5TW6JerRGsqaPFpvVIe5/ObN0qvSh9KwMZg3+Gj4yOG68xmWxaZZZs7mNhbqlkxWf12/qlzQ3bE3Y77Vc7zHWc6NTqXOVS4JruFuce7hHg6eXl6u3oY+dr7WfpbxFgEWgRZBlsHWIX6hTmFu4dERgZHhUfnR5TEFsZ1xzflzArcVnS5uSDKedT76W9S/+XKZClmG2S454bnZef31owq3Bj0YniByU/ygTLtStcKxOqaqpn1GytvVT3oYG/Ua/Jrzm/ZULrprYr7d87pbvsu5N7OnvX9V3t/zNRZZLP5JIp86aemPZphuxMz1mlsxfOOT/3z3ztBVELOxftXPxqqfQyn+V1KzaufLJaYo3P2sZ129a/2ai0KXLzxC0ntjFut9pRvHPtrhd7lPbG7Zu1/9pB4UOBh/uPnD3Gc9z7RPfJM6d5zvidnXDu0gXRixGX5lx+cFXlWtb19Te+3rK53Xzn1D2h+9EPljx8+9j8SePTM8/FXyS9XPfq9xuPt1PfPf5g+LHh0/kv8l/zv+3/IfAz6deWP2x/I/6t/v8fAATCIM0IpJTRAAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAEOSURBVHjabJGtS0MBFMXPJojBMMPwC1nV6FCZoGj/ZVGYiIJDBOEFm3XFP2DFIAu6ZrAYBM0OREEUnN20ICI40OfbsTzYB48b7oF74J4PWUnDjMU4GSv5PEubCo/UuwjMs8FEjLOEPNCkRloWAyxb3GEOGWKRTSLeLFYwXyLFBeaGH8w7z/yyRZlvilR5YV+kuMYY04r3NpNEfBByaYksZUyDAoPsYELmmKJKjj0CS0QYU4rl3WLMeceRCBMItW7CMEd9LxbIcUqOXQJLFld9Iks9Ii0qPTYjAo5pscYJrxzIIs1SV1B5ivzRsFjFfHaiLrDOaIxHCLmnyRmp5LLytKnw1FNWH2XaYoyM9T8AOvnw3YUOg90AAAAASUVORK5CYII%3D%27%3B%0A%7D%3B%0AtoggleImage%28%29%3B%0AServices.prefs.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20Services.prefs.removeObserver%28s%2C%20toggleImage%29%29%3B%0A%0A//%20nodeName%3A%20menuitem%20-%20%u0434%u043B%u044F%20%u043B%u043E%u0433%u0438%u0447%u0435%u0441%u043A%u0438%u0445%28boolean%29%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%2C%20menu%20-%20%u0434%u043B%u044F%20%u0446%u0435%u043B%u044B%u0445%28integer%29%20%u0438%20%u0441%u0442%u0440%u043E%u043A%u043E%u0432%u044B%u0445%28string%29.%20menuseparator%20-%20%u0434%u043B%u044F%20%u0440%u0430%u0437%u0434%u0435%u043B%u0438%u0442%u0435%u043B%u044F.%0A//%20pref%20-%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%20about%3Aconfig.%0A//%20%u041F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u044B%20%u0438%u043C%u0435%u044E%u0449%u0438%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u044F%20%u043E%u0442%u043B%u0438%u0447%u043D%u044B%u0435%20%u043E%u0442%20%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u044B%u0445%20-%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u044B%20%u0436%u0438%u0440%u043D%u044B%u043C%20%u0441%u0442%u0438%u043B%u0435%u043C%20%u0442%u0435%u043A%u0441%u0442%u0430.%0A//%20restart%20%28%u0437%u0430%u0434%u0430%u0432%u0430%u0442%u044C%20%u0441%20%u043F%u0443%u0441%u0442%u044B%u043C%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%u043C.%20%u0442.%u0435.%2C%20restart%3A%20%22%22%29%20-%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0432%u043E%u0437%u043C%u043E%u0436%u043D%u043E%u0441%u0442%u044C%20%u043F%u0435%u0440%u0435%u0437%u0430%u043F%u0443%u0441%u043A%u0430%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%0A//%20%28%u0441%20%u043F%u043E%u0434%u0442%u0432%u0435%u0440%u0436%u0434%u0435%u043D%u0438%u0435%u043C%20%u0432%20%u0434%u0438%u0430%u043B%u043E%u0433%u043E%u0432%u043E%u043C%20%u043E%u043A%u043D%u0435%29%20%u043F%u043E%u0441%u043B%u0435%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430.%0A//%20key%20-%20%u0437%u0430%u0434%u0430%u0435%u0442%20accesskey%20-%20%u043A%u043B%u0430%u0432%u0438%u0448%u0438%20%u0434%u043B%u044F%20%u0431%u044B%u0441%u0442%u0440%u043E%u0439%20%u043D%u0430%u0432%u0438%u0433%u0430%u0446%u0438%u0438%20%u043F%u043E%20%u043C%u0435%u043D%u044E.%0A//%20userChoice%20-%20%u0437%u0430%u0434%u0430%u0435%u0442%20%u043F%u0440%u0435%u0434%u043F%u043E%u0447%u0438%u0442%u0430%u0435%u043C%u043E%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u0438%20%u0435%u0441%u043B%u0438%20%u0442%u0435%u043A%u0443%u0449%u0435%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u0441%20%u043D%u0438%u043C%20%u043D%u0435%20%u0441%u043E%u0432%u043F%u0430%u0434%u0430%u0435%u0442%2C%20%u043F%u0443%u043D%u043A%u0442%20%u043C%u0435%u043D%u044E/%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043C%u0435%u043D%u044E%20%u043F%u043E%u043C%u0435%u0447%u0430%u044E%u0442%u0441%u044F%20%u043A%u0440%u0430%u0441%u043D%u044B%u043C%20%u0446%u0432%u0435%u0442%u043E%u043C.%0A//%20%u0422%u0430%u043A%u0436%u0435%20%u043C%u043E%u0436%u043D%u043E%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043F%u0440%u0435%u0434%u0443%u043F%u0440%u0435%u0436%u0434%u0430%u044E%u0449%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u0434%u043B%u044F%20%u0442%u0430%u043A%u0438%u0445%20%u043F%u0443%u043D%u043A%u0442%u043E%u0432.%20%u0421%u043C.%20%u0441%u0442%u0438%u043B%u044C%20%u0432%20%u043F%u043E%u0441%u0442%u0435%20%u043A%u043A%u043D%u043E%u043F%u043A%u0438.%0A//%20%u0410%20%u0442%u0430%u043A%u0436%u0435%20%u043C%u0435%u043D%u044F%u0435%u0442%u0441%u044F%20%u0438%u043A%u043E%u043D%u043A%u0430%20%u0441%u0430%u043C%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%20%28%u0441%u043C.%20%u0432%u044B%u0448%u0435%29.%0A//%20strValues%20-%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u044F%20%u0438%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0430%u0435%u043C%u043E%u0435%20%u0432%20%u043C%u0435%u043D%u044E%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u044F.%20%u0417%u0430%u0434%u0430%u0432%u0430%u0442%u044C%20%u0434%u043B%u044F%20%u0446%u0435%u043B%u044B%u0445%28integer%29%20%u0438%20%u0441%u0442%u0440%u043E%u043A%u043E%u0432%u044B%u0445%28string%29%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432.%0A//%20%u0417%u0430%u0434%u0430%u0435%u0442%u0441%u044F%20%u0432%20%u0432%u0438%u0434%u0435%3A%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%2C%2C%2C%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%2C%2C%2Caccesskey%7C%7C%7C%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u04352%2C%2C%2C%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u04352%2C%2C%2Caccesskey2%7C%7C%7C%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u04353%2C%2C%2C%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u04353%20%u0438%20%u0442.%u0434.%20%28accesskey%20-%20%u0437%u0430%u0434%u0430%u0435%u0442%u0441%u044F%20%u043E%u043F%u0446%u0438%u043E%u043D%u0430%u043B%u044C%u043D%u043E%29%0A//%20%u041F%u043E%u043B%u043D%u043E%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0430%u0435%u0442%u0441%u044F%20%u0432%20%u043F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%u0445%2C%20%u043F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043D%u0430%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043F%u043E%u0434%u043C%u0435%u043D%u044E/%u043F%u0443%u043D%u043A%u0442%20%u043F%u043E%u0434%u043C%u0435%u043D%u044E.%0A//%20%u0414%u043B%u044F%20%u043B%u043E%u0433%u0438%u0447%u0435%u0441%u043A%u0438%u0445%28boolean%29%20-%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0430%u0435%u0442%u0441%u044F%20%u0441%u0440%u0430%u0437%u0443%20%u043F%u043E%u0441%u043B%u0435%20%u0441%u0430%u043C%u043E%u0433%u043E%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430%20%28%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20true%20-%20%u0442%u0430%u043A%u0436%u0435%20%u0441%u0442%u0430%u0432%u0438%u0442%20%u0433%u0430%u043B%u043E%u0447%u043A%u0443%20%u0434%u043B%u044F%20%u043D%u0435%u0433%u043E%29.%0A//%20%u041B%u041A%u041C%20%u043F%u043E%20%u043F%u0443%u043D%u043A%u0442%u0430%u043C%20%u043C%u0435%u043D%u044E%20-%20%u043F%u0435%u0440%u043A%u043B%u044E%u0447%u0430%u0435%u0442%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u044F%20%u0434%u043B%u044F%20%u043B%u043E%u0433%u0438%u0447%u0435%u0441%u043A%u0438%u0445%28boolean%29%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%2C%0A//%20%u043B%u044E%u0431%u0430%u044F%20%u043A%u043D%u043E%u043F%u043A%u0430%20%u043F%u043E%20%u043F%u0443%u043D%u043A%u0442%u0430%u043C%20%u0432%20%u0441%u0443%u0431%u043C%u0435%u043D%u044E%20-%20%u0437%u0430%u0434%u0430%u0435%u0442%20%u044D%u0442%u043E%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u0434%u043B%u044F%20%u0446%u0435%u043B%u044B%u0445%28integer%29%20%u0438%20%u0441%u0442%u0440%u043E%u043A%u043E%u0432%u044B%u0445%28string%29%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432.%0A//%20%u041F%u041A%u041C%20%u043F%u043E%20%u043F%u0443%u043D%u043A%u0442%u0430%u043C%20%u043C%u0435%u043D%u044E%20%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044E%20%u0441%u0443%u0431%u043C%u0435%u043D%u044E%20-%20%u0441%u0431%u0440%u0430%u0441%u044B%u0432%u0430%u0435%u0442%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430%20%u0432%20%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u043E%u0435.%0A//%20%u041A%u043B%u0430%u0432%u0438%u0430%u0442%u0443%u0440%u0430%3A%20Enter%20-%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0435%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u0430.%0A//%20%u0421%u043F%u0435%u0446%u043A%u043B%u0430%u0432%u0438%u0448%u0430%20%u0432%u044B%u0437%u043E%u0432%u0430%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0433%u043E%20%u043C%u0435%u043D%u044E%20/%20Shift+Enter%20-%20%u0441%u0431%u0440%u043E%u0441%20%u0432%20%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u043E%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435.%0A//%20Alt%20+%20M%20-%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438.%20%28%u0421%u043E%u0447%u0435%u0442%u0430%u043D%u0438%u0435%20%u043C%u043E%u0436%u043D%u043E%20%u0441%u043C%u0435%u043D%u0438%u0442%u044C%20%u043D%u0430%20%u0441%u0432%u043E%u0435.%20%u0421%u043C.%20%u0432%20%u043A%u043E%u043D%u0446%u0435%20%u043A%u043E%u0434%u0430%29%0A%5B%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22dom.workers.enabled%22%2C%20key%3A%20%27w%27%2C%20userChoice%3A%20%22false%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22dom.indexedDB.enabled%22%2C%20key%3A%20%27d%27%7D%2C%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22dom.storage.enabled%22%2C%20key%3A%20%27s%27%7D%2C%0A%20%20%7BnodeName%3A%20%22menuitem%22%2C%20pref%3A%20%22javascript.enabled%22%2C%20key%3A%20%27j%27%2C%20userChoice%3A%20%22true%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menuseparator%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menu%22%2C%20pref%3A%20%22general.useragent.override%22%2C%20key%3A%20%27u%27%2C%20userChoice%3A%20%22Mozilla/5.0%20%28X11%3B%20U%3B%20Linux%20x86_64%3B%20rv%3A48.0%29%20Gecko/20100101%20Firefox/48.0%22%2C%20strValues%3A%20%22Mozilla/5.0%20%28X11%3B%20U%3B%20Linux%20x86_64%3B%20rv%3A48.0%29%20Gecko/20100101%20Firefox/48.0%2C%2C%2CFirefox48/Linux%7C%7C%7CMozilla/5.0%20%28Windows%20NT%206.1%3B%20WOW64%3B%20rv%3A45.0%29%20Gecko/20100101%20Firefox/45.0%2C%2C%2CFirefox45/Windows%7C%7C%7C%2C%2C%2C%u041F%u0443%u0441%u0442%u043E%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menu%22%2C%20pref%3A%20%22general.useragent.locale%22%2C%20key%3A%20%27l%27%2C%20restart%3A%20%22%22%2C%20strValues%3A%20%22en-US%2C%2C%2CEnglish%2C%2C%2Ce%7C%7C%7Cru%2C%2C%2C%u0420%u0443%u0441%u0441%u043A%u0438%u0439%2C%2C%2Cr%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menu%22%2C%20pref%3A%20%22browser.display.document_color_use%22%2C%20key%3A%20%27c%27%2C%20userChoice%3A%20%220%22%2C%20strValues%3A%20%220%2C%2C%2CAutomatic%2C%2C%2C0%7C%7C%7C1%2C%2C%2CAlways%2C%2C%2C1%7C%7C%7C2%2C%2C%2CNever%2C%2C%2C2%22%7D%2C%0A%20%20%7BnodeName%3A%20%22menu%22%2C%20pref%3A%20%22CB.TEST%22%2C%20key%3A%20%27t%27%2C%20userChoice%3A%20%22C%3A%5C%5CDownloads%5C%5CTEST1%22%2C%20strValues%3A%20%22C%3A%5C%5CDownloads%5C%5CTEST1%2C%2C%2CTEST1%2C%2C%2C1%7C%7C%7CC%3A%5C%5CDownloads%5C%5CTEST2%2C%2C%2CTEST2%2C%2C%2C2%22%7D%0A%5D.forEach%28function%28m%29%20%7B%0A%20%20var%20mItem%20%3D%20document.createElement%28m.nodeName%29%3B%0A%20%20var%20browserRestart%20%3D%20%27%27%3B%0A%0A%20%20if%20%28%22restart%22%20in%20m%29%20browserRestart%20%3D%20%27%20if%20%28custombuttons.confirmBox%28null%2C%20%22Restart%3F%22%2C%20%22Yes%22%2C%20%22Cancel%22%29%29%20Services.startup.quit%28Services.startup.eAttemptQuit%20%7C%20Services.startup.eRestart%29%3B%27%3B%0A%0A%20%20if%20%28%22pref%22%20in%20m%29%20%7B%0A%20%20%20%20mItem.setAttribute%28%27closemenu%27%2C%20%27none%27%29%3B%0A%20%20%20%20mItem.setAttribute%28%27oncontextmenu%27%2C%20%27event.preventDefault%28%29%3B%20custombuttons.clearPrefs%28%22%27%20+%20m.pref%20+%20%27%22%29%3B%27%20+%20browserRestart%29%3B%0A%20%20%7D%0A%0A%20%20if%20%28%22key%22%20in%20m%29%20mItem.setAttribute%28%27accesskey%27%2C%20m.key%29%3B%0A%0A%20%20if%20%28m.nodeName%20%3D%3D%3D%20%22menuitem%22%29%20%7B%0A%20%20%20%20mItem.setAttribute%28%27type%27%2C%20%27checkbox%27%29%3B%0A%20%20%20%20mItem.setAttribute%28%27oncommand%27%2C%20%27custombuttons.setPrefs%28%22%27%20+%20m.pref%20+%20%27%22%2C%20%21custombuttons.getPrefs%28%22%27%20+%20m.pref%20+%20%27%22%29%29%3B%20if%20%28event.shiftKey%20%26%26%20event.keyCode%20%3D%3D%20event.DOM_VK_RETURN%29%20%7Bevent.preventDefault%28%29%3B%20custombuttons.clearPrefs%28%22%27%20+%20m.pref%20+%20%27%22%29%7D%3B%27%20+%20browserRestart%29%3B%0A%20%20%7D%0A%0A%20%20if%20%28m.nodeName%20%3D%3D%3D%20%22menu%22%29%20%7B%0A%20%20%20%20mItem.setAttribute%28%27class%27%2C%20%27menu-iconic%27%29%3B%0A%0A%20%20%20%20var%20subMenu%20%3D%20mItem.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%0A%20%20%20%20for%20%28var%20value%20of%20m.strValues.split%28%27%7C%7C%7C%27%29%29%20%7B%0A%20%20%20%20%20%20var%20submItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20%20var%20smVal%20%3D%20value.split%28%27%2C%2C%2C%27%29%5B0%5D%3B%0A%20%20%20%20%20%20var%20smValConv%20%3D%20convertFromUnicode%28%22UTF-8%22%2C%20smVal%29%3B%0A%20%20%20%20%20%20var%20smName%20%3D%20value.split%28%27%2C%2C%2C%27%29%5B1%5D%3B%0A%20%20%20%20%20%20var%20key%20%3D%20value.split%28%27%2C%2C%2C%27%29%5B2%5D%3B%0A%0A%20%20%20%20%20%20key%20%26%26%20submItem.setAttribute%28%27accesskey%27%2C%20key%29%3B%0A%20%20%20%20%20%20submItem.setAttribute%28%27type%27%2C%20%27radio%27%29%3B%0A%20%20%20%20%20%20submItem.setAttribute%28%27label%27%2C%20smName%29%3B%0A%20%20%20%20%20%20submItem.setAttribute%28%27tooltiptext%27%2C%20smVal%29%3B%0A%20%20%20%20%20%20submItem.setAttribute%28%27closemenu%27%2C%20%27none%27%29%3B%0A%20%20%20%20%20%20submItem.setAttribute%28%27oncommand%27%2C%20%27try%7Bcustombuttons.setPrefs%28%22%27%20+%20m.pref%20+%20%27%22%2C%20%22%27%20+%20smValConv.replace%28/%5C%5C/g%2C%20%27%5C%5C%5C%5C%27%29%20+%20%27%22%29%7D%20catch%28e%29%20%7BServices.prefs.setIntPref%28%22%27%20+%20m.pref%20+%20%27%22%2C%20%22%27%20+%20smValConv%20+%20%27%22%29%7D%3B%27%20+%20browserRestart%29%3B%0A%0A%20%20%20%20%20%20subMenu.appendChild%28submItem%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20menuPopup.appendChild%28mItem%29%3B%0A%0A%20%20//%20%u041B%u0438%u0441%u0442%u0435%u043D%u0435%u0440%u044B%20%u043E%u0442%u0441%u043B%u0435%u0436%u0438%u0432%u0430%u044E%u0449%u0438%u0435%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0435%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%0A%20%20//%20%u0438%20%u0443%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u044E%u0449%u0438%u0435%20%u0441%u043E%u043E%u0442%u0432%u0435%u0442%u0441%u0442%u0432%u0443%u044E%u0449%u0438%u0435%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044F%20%u0438%20%u0447%u0435%u043A%u0431%u043E%u043A%u0441%u044B%20%u0434%u043B%u044F%20%u043F%u0443%u043D%u043A%u0442%u043E%u0432%20%u043C%u0435%u043D%u044E%20%u043F%u0440%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0438%20%u043C%u0435%u043D%u044E%20%u0438%20%u043A%u043B%u0438%u043A%u0430%u0445%0A%20%20for%20%28var%20type%20of%20%5B%27command%27%2C%20%27popupshowing%27%2C%20%27contextmenu%27%5D%29%20%7B%0A%20%20%20%20addEventListener%28type%2C%20%28e%29%3D%3E%20%7B%0A%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%22pref%22%20in%20m%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20val%2C%20def%3B%0A%0A%20%20%20%20%20%20%20%20%20%20def%20%3D%20Services.prefs.prefHasUserValue%28m.pref%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20val%20%3D%20Services.prefs.getComplexValue%28m.pref%2C%20Ci.nsISupportsString%29.data%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28Services.prefs.getPrefType%28m.pref%29%20%3D%3D%2064%29%20val%20%3D%20custombuttons.getPrefs%28m.pref%29.toString%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20val%20%3D%20custombuttons.getPrefs%28m.pref%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20def%20%3F%20mItem.style.setProperty%28%27font-weight%27%2C%20%27bold%27%2C%20%27important%27%29%20%3A%20mItem.style.removeProperty%28%27font-weight%27%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28m.nodeName%20%3D%3D%3D%20%27menuitem%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27checked%27%2C%20val%29%3B%0A%20%20%20%20%20%20%20%20%20%20mItem.label%20%3D%20m.pref%20+%20%27%3B%27%20+%20val%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28%22userChoice%22%20in%20m%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7Bvar%20usrChc%20%3D%20%28val.toString%28%29%20%3D%3D%3D%20m.userChoice%29%7D%20catch%28e%29%20%7BusrChc%20%3D%20false%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27user-choice%27%2C%20usrChc%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20usrChc%20%3F%20mItem.style.removeProperty%28%27color%27%29%20%3A%20mItem.style.setProperty%28%27color%27%2C%20%27orangered%27%2C%20%27important%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28subMenu%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20smitem%20of%20subMenu.getElementsByTagName%28%27menuitem%27%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20smval%20%3D%20smitem.getAttribute%28%27tooltiptext%27%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20smitem.setAttribute%28%27checked%27%2C%20%28val%20%3D%3D%3D%20smval%29%20%3F%20true%20%3A%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28m.nodeName%20%3D%3D%3D%20%22menu%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20vname%3B%0A%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20vname%20%3D%20subMenu.getElementsByAttribute%28%27checked%27%2C%20%27true%27%29%5B0%5D.getAttribute%28%27label%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21Services.prefs.prefHasUserValue%28m.pref%29%29%20vname%20%3D%20%27Default%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20vname%20%3D%20%27Other%27%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27label%27%2C%20m.pref%20+%20%27%20-%20%27%20+%20vname%29%3B%0A%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27tooltiptext%27%2C%20val%20%7C%7C%20%27This%20preferences%20has%20null%20value%20or%20does%20not%20exist.%27%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28%22userChoice%22%20in%20m%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20smUsrChc%20%3D%20%28val%20%3D%3D%3D%20m.userChoice.toString%28%29%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20mItem.setAttribute%28%27user-choice%27%2C%20smUsrChc%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20smUsrChc%20%3F%20mItem.style.removeProperty%28%27color%27%29%20%3A%20mItem.style.setProperty%28%27color%27%2C%20%27orangered%27%2C%20%27important%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28%22userChoice%22%20in%20m%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20hasNotUserChoice%20%3D%20menuPopup.getElementsByAttribute%28%27user-choice%27%2C%20%27false%27%29%5B0%5D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20custombuttons.setPrefs%28s%2C%20hasNotUserChoice%20%3F%20true%20%3A%20false%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%2C%200%29%0A%20%20%20%20%7D%2C%20false%2C%20menuPopup%29%0A%20%20%7D%0A%7D%29%3B%0A%0A//%20%u041B%u0438%u0441%u0442%u0435%u043D%u0435%u0440%20%u043F%u043E%u0437%u0432%u043E%u043B%u044F%u044E%u0449%u0438%u0439%20%u0441%u0431%u0440%u043E%u0441%20%u043F%u0430%u0440%u0430%u043C%u0435%u0442%u0440%u043E%u0432%20%u0441%20%u0441%u0443%u0431%u043C%u0435%u043D%u044E%20%u043F%u043E%20Shift%20+%20Enter%0A//%20%u0417%u0430%20%u043A%u043E%u0434%20%u0441%u043F%u0430%u0441%u0438%u0431%u043E%20Dumby%0AaddEventListener%28%22popupshown%22%2C%20%7B%0A%20%20handleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20this%5Be.type%5D%28e%29%3B%0A%20%20%7D%2C%0A%20%20popupshown%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e.target%20%21%3D%20menuPopup%29%20return%3B%0A%20%20%20%20menuPopup.addEventListener%28%22popuphidden%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20window.addEventListener%28%22keydown%22%2C%20this%2C%20true%29%3B%0A%20%20%7D%2C%0A%20%20popuphidden%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e.target%20%21%3D%20menuPopup%29%20return%3B%0A%20%20%20%20menuPopup.removeEventListener%28%22popuphidden%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20window.removeEventListener%28%22keydown%22%2C%20this%2C%20true%29%3B%0A%20%20%7D%2C%0A%20%20popupshowing%3A%20function%28e%29%20%7B%0A%20%20%20%20e.target.parentNode.removeEventListener%28%22popupshowing%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%7D%2C%0A%20%20get%20old%28%29%20%7B%0A%20%20%20%20delete%20this.old%3B%0A%20%20%20%20this.e%20%3D%20new%20MouseEvent%28%22contextmenu%22%2C%20%7B%7D%29%3B%0A%20%20%20%20return%20this.old%20%3D%20parseInt%28Services.appinfo.platformVersion%29%20%3C%2025%3B%0A%20%20%7D%2C%0A%20%20get%20prop%28%29%20%7B%0A%20%20%20%20delete%20this.prop%3B%0A%20%20%20%20if%20%28%22key%22%20in%20KeyboardEvent.prototype%29%20this.prop%20%3D%20%22key%22%2C%20this.val%20%3D%20%22Enter%22%3B%0A%20%20%20%20else%20this.prop%20%3D%20%22keyCode%22%2C%20this.val%20%3D%20KeyboardEvent.DOM_VK_RETURN%3B%0A%20%20%20%20return%20this.prop%3B%0A%20%20%7D%2C%0A%20%20keydown%3A%20function%28e%29%20%7B%0A%20%20%20%20if%20%28%21e.shiftKey%20%7C%7C%20e.ctrlKey%20%7C%7C%20e.altKey%20%7C%7C%20e%5Bthis.prop%5D%20%21%3D%20this.val%29%20return%3B%0A%20%20%20%20var%20target%20%3D%20menuPopup.querySelector%28%22menu%5B_moz-menuactive%5D%3Anot%28%5Bopen%5D%29%22%29%3B%0A%20%20%20%20if%20%28%21target%29%20return%3B%0A%0A%20%20%20%20this.old%20%3F%20target.addEventListener%28%22popupshowing%22%2C%20this%2C%20false%29%20%3A%20e.stopPropagation%28%29%3B%0A%20%20%20%20target.dispatchEvent%28this.e%29%3B%0A%20%20%20%20menuPopup.dispatchEvent%28this.e%29%3B%0A%20%20%7D%0A%7D%2C%20false%2C%20menuPopup%29%3B%0A%0A//%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u043E%20%u0441%u043E%u0447%u0435%u0442%u0430%u043D%u0438%u044E%20%u043A%u043B%u0430%u0432%u0438%u0448%20Alt%20+%20M%20%28%u043D%u0435%20%u0437%u0430%u0432%u0438%u0441%u0438%u0442%20%u043E%u0442%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0440%u0430%u0441%u043A%u043B%u0430%u0434%u043A%u0438%20%u043A%u043B%u0430%u0432%u0438%u0430%u0442%u0443%u0440%u044B%29%0A//%20%u041F%u043E%u0441%u043C%u043E%u0442%u0440%u0435%u0442%u044C%20%u043A%u043E%u0434%u044B%20%u043A%u043B%u0430%u0432%u0438%u0448%20%u043C%u043E%u0436%u043D%u043E%20%u0437%u0434%u0435%u0441%u044C%3A%20https%3A//developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode%23Constants_for_keyCode_value%0AaddEventListener%28%27keyup%27%2C%20%28e%29%3D%3E%20%7B%0A%20%20if%20%28e.altKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20e.keyCode%20%3D%3D%2077%29%20%7B%0A%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%20%20%7D%0A%7D%2C%20false%2C%20window%29%3B%0A%0A//%20%u041A%u043E%u043D%u0432%u0435%u0440%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u044E%u043D%u0438%u043A%u043E%u0434%20.............%0Afunction%20convertFromUnicode%28charset%2C%20str%29%20%7B%0A%20%20%20var%20converter%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%20%20%20converter.charset%20%3D%20charset%3B%0A%20%20%20str%20%3D%20converter.ConvertFromUnicode%28str%29%3B%0A%20%20%20return%20str%20+%20converter.Finish%28%29%3B%0A%7D%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

вопрос по кнопке Save, от 27.11.2016
при сохранении ярлыка страницы выдается алерт
h_1485357368_5222661_adf1f1ff71.png
при этом ярлык спокойно сохраняется. естественно при запуске от админа этого алерта нет, но никто в здравом уме ФФ от админа запускать не будет. При смене в коде кнопки диска С на D алерт тоже не появляется но в корне диска D создается папка Documents and Settings с дубликатами ярлыков, которых я изначально сохраняю на рабочий стол. можно что нибудь сделать - или не выводить алерт (в принципе не мешает, но...), или не создавать папку в корне диска, или переопределить путь или еще чего-нибудь?
52 бета.

25-01-2017 18:31:36
:D это я начал на 52-ю бетку, будущую ЕСР переходить
отвалилась Поиск по сайту в Google( Firefox24+ ) от 23.01.2016.

sonyas75 пишет

это я начал на 52-ю бетку, будущую ЕСР переходить
отвалилась Поиск по сайту в Google( Firefox24+ ) от 23.01.2016.

Попробуй Поиск по сайту в Google( Firefox24+ ) от 25.01.2017.

работает :) спасибо.
в общем к моему великому удивлению все 15 кнопок перенеслись вполне корректно, считая, что в одной из них напихано больше десятка разных кодов. только этот алерт, но это фигня вообще )))
а еще 23 расширения, стили и скрипты. и все фурычат. на 45 ЕСР переход был в разы тяжелее :D

sonyas75 пишет

вопрос по кнопке Save, от 27.11.2016
При смене в коде кнопки диска С на D алерт тоже не появляется но в корне диска D создается папка Documents and Settings с дубликатами ярлыков, которых я изначально сохраняю на рабочий стол.

Это не дубликаты ярлыков на диске D > Documents and Settings, а иконки для создание ярлыков на рабочим столе, без такой папки ярлыки будут без иконок сайта. Но если тебе мешает эта папка можешь в строке кода инициализации кнопки:

Выделить код

Код:

var path = disk + ":\\Documents and Settings\\Favicon\\" + faviconName + ".ico";

указать другую папку.

ага, ясно. это в секции

Выделить код

Код:

// Сохранить в указанную папку иконку таба как .ico и без диалога сохранения ..............

я туда не добрался :(
спасибо :)
юпд. отлично. сработало. переопределил путь в дебри нехоженные диска D

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

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

Выделить код

Код:

// путь к файлу и название файла
   var file = Services.dirsvc.get("Desk", Ci.nsIFile); 
   file.append("Save - " + (new Date()).toLocaleFormat("%d.%m.%Y") + ".txt");


на
скрытый текст

Выделить код

Код:

// путь к файлу и название файла....
   var pathToFile = "E:\\Inet\\From Mozilla Firefox\\ButtonSave\\";
   file.initWithPath( pathToFile + "ButtonSave.txt" );


не работает ((
Спасибо.

Uxapb пишет

bunda1, помогите плз с вашей кнопкой Save
Нужно, чтоб пункт выпадающего меню "Сохранить выделенный текст в файл" отправлял текст всегда в один и тот же файл, находящийся по пути, указанному мной.

:/

Выделить код

Код:

// путь к файлу и название файла
   var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
   file.initWithPath("E:\\Inet\\From Mozilla Firefox\\ButtonSave\\ButtonSave.txt");
   if ( !file.exists() ) file.create(file.NORMAL_FILE_TYPE, 448);
          
   // создать файл с текстом или добавлять текст в файл
   var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
   foStream.init(file, 0x02 | 0x10, 0664, 0);
   foStream.write(text, text.length);
   foStream.close();

bunda1
А как бы сделать так чтобы только чистый выделенный текст был, без сайта, времени, типа такого.

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

Согласно предполагаемому сценарию, произойдет ожидаемое увеличение курса рубля в 2016 на 10,7-10,9%, а 2017 порадует повышением еще на 3,6%.


По пессимистичным анализам нефтяные котировки будут стойко держаться на низком уровне (33-35 $), такое положение продлится вплоть до 2018. По мнению экспертов при таком раскладе в 2017 году долларовый курс может составлять 82-83 рубля.

villa7 пишет

bunda1
А как бы сделать так чтобы только чистый выделенный текст был, без сайта, времени, типа такого.

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

Согласно предполагаемому сценарию, произойдет ожидаемое увеличение курса рубля в 2016 на 10,7-10,9%, а 2017 порадует повышением еще на 3,6%.


По пессимистичным анализам нефтяные котировки будут стойко держаться на низком уровне (33-35 $), такое положение продлится вплоть до 2018. По мнению экспертов при таком раскладе в 2017 году долларовый курс может составлять 82-83 рубля.

Замени:   

Выделить код

Код:

var text = "..............................................................\n"
            + title + " - " + time + "\n" + url + "\n\n" + text + "\n\n\n";

на:

Выделить код

Код:

var text = convertFromUnicode("UTF-8", (getSelect() + "\n\n\n"));

bunda1
Всё замечатально, единственное как бы заметку от заметки отделить с новой строки, сейчас у меня они подряд идут, или по другому как нибудь, если можно. Типа:

блаблабла
-----------------
блаблабла

а сейчас у меня так

блаблабла  блаблабла

villa7 пишет

bunda1
Всё замечатально, единственное как бы заметку от заметки отделить с новой строки, сейчас у меня они подряд идут, или по другому как нибудь, если можно. Типа:

блаблабла
-----------------
блаблабла

а сейчас у меня так

блаблабла  блаблабла

А если так:

Выделить код

Код:

var text = convertFromUnicode("UTF-8", (getSelect() + "\n.................................\n"));

и не исползуй win блокнот.

bunda1, спасибо. Всё работает как надо.
Вот тут пришлось кодировку поменять на UTF-8, т.к. текст корябушками открывался.
Может быть это что-то локальное, конечно. Notepad ++.
// Создать текстовой файл с выделенным текстом в папке профиля и открыть в редакторе .............
   function textToEditor() {
   var text = convertFromUnicode("UTF-16", getSelect());

bunda1
Извиняюсь, мой косяк. Проверял на Блокноте, на Notepad++ всё замечательно, даже без замены кода. Спасибо. Давно такое хотел, да стеснялся спросить. Блин, сколько времени мучился, сохраняя заметки. Сейчас сижу как идиот, выделяю, клацаю, наслаждаюсь:)
Спасибо ещё раз.

bunda1
Удалить куки текущего сайта( Firefox24+ ) от 27.01.2017.
кнопка удаляет куки текущего сайта и обновляет страницу или все вкладки текущего сайта.
http://forum.mozilla-russia.org/viewtopic.php?pid=729832#p729832

Не все куки удаляет (
Объясняю: Установил Web Storage Viewer http://addons.mozilla.org/ru/firefox/addon/web-storage-viewer/
В Настройки - Приватность  - появилась кнопка
Очищаю куки с помощью кнопки от 27.01.2017 - смотрю в Web Storage Viewer  и DOM куки не удалены!(((

Все куки удаляет http://addons.mozilla.org/ru/firefox/addon/remove-cookies-button/?src=api
Возьмите часть кода из этого дополнения и вставьте в кнопку, чтобы куки удалялись везде для конкретного домена.
Спасибо!

Кнопка google-translate https://forum.mozilla-russia.org/viewto … 30#p591530
Как в ней увеличить размер всплывающего окна с переводом выделенного текста и размер шрифта в этом окне?

firepox пишет

bunda1
Удалить куки текущего сайта( Firefox24+ ) от 27.01.2017.
Не все куки удаляет (
Все куки удаляет http://addons.mozilla.org/ru/firefox/addon/remove-cookies-button/?src=api
Возьмите часть кода из этого дополнения и вставьте в кнопку, чтобы куки удалялись везде для конкретного домена.

Удалить куки текущего сайта( Firefox24+ ) от 02.02.2017.

bunda1
Отлично, спасибо!

04-02-2017 07:38:58
bunda1

AppData\Roaming\Macromedia\Flash Player\#SharedObjects\*
здесь еще остаются куки, можно в кнопку добавить, чтобы удалялись флэш куки сайта.

firepox пишет

bunda1
AppData\Roaming\Macromedia\Flash Player\#SharedObjects\*
здесь еще остаются куки, можно в кнопку добавить, чтобы удалялись флэш куки сайта.

Ну а если удалить все Flash куки: Удалить куки текущего сайта( Firefox24+ ) от 04.02.2017.

bunda1
ок, пусть все удаляются)

Не помню чья кнопка, в поиске к сожалению не нашел. Кто-нибудь может поправить её?
Периодически кнопка сбивается и показываются дублирующие пункты (см. спойлер), например такое бывает при открытии\закрытии меню "Customize".

скрытый текст
115fLoF.png

Выделить код

Код:

var tabMenu = gBrowser.tabContainer.contextMenu || document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");

if (tabMenu) {
    var insertPos = tabMenu.lastChild.previousSibling;

    var ele = document.createElement("menuitem");
    ele = document.createElement("menuitem");
    ele.setAttribute("label", "Закрыть дубликаты вкладок");
    ele.setAttribute("tooltiptext", "Закрывает дубликаты вкладок с одинаковыми URL и оставляет только по одной из них");
    ele.setAttribute("id", "closy-dupe");
    ele.setAttribute("oncommand", "document.getElementById('" + self.id + "').closeDuplicateTabs();");
    tabMenu.insertBefore(ele, insertPos);


    ele = document.createElement("menuitem");
    ele.setAttribute("label", "Закрыть другие вкладки этого сайта");
    ele.setAttribute("tooltiptext", "Закрывает все вкладки того же сайта, что и вкладка по которой вы щелкнули");
    ele.setAttribute("id", "closy-host");
    ele.setAttribute("oncommand", "document.getElementById('" + self.id + "').closeHost();");
    tabMenu.insertBefore(ele, insertPos);
}

// closes all other tabs from the host of the right clicked tab
this.closeHost = function() {
    var tab = getTabClicked();
    var host = false;
    // host for about:blank will fail
    try {
        host = tab.linkedBrowser.currentURI.host;
    } catch (e) {}
    if (host) {
        var tabs = getTabs();
        for (var i = tabs.length - 1; i >= 0; i--) {
            var tabhost = false;
            // host for about:blank will fail
            try {
                tabhost = getBrowser().getBrowserAtIndex(i).currentURI.host;
            } catch (e) {}
            if (tabhost && tabhost == host) {
                // dont close the right clicked tab
                if (tab != tabs[i]) {
                    // if we close the selected tab first select the previous tab
                    if (i && getBrowser().selectedTab == tabs[i]) {
                        getBrowser().mTabContainer.advanceSelectedTab(-1, true);
                    }
                    getBrowser().removeTab(tabs[i]);
                }
            }
        }
    }
}

// closes duplicate tabs
this.closeDuplicateTabs = function(aThisOneOnly) {
    var urlclose = new Array();
    var urlhash = new Object();
    var thisuri = false;
    if (aThisOneOnly) {
        thisuri = getTabClicked().linkedBrowser.currentURI.spec;
    }
    var tabs = getTabs();
    for (var i = tabs.length - 1; i >= 0; i--) {
        var uri = getBrowser().getBrowserAtIndex(i).currentURI.spec;
        if (thisuri) {
            if (thisuri == uri) {
                if (urlhash[uri]) {
                    urlclose[urlclose.length] = i;
                } else {
                    urlhash[uri] = true;
                }
            }
        } else {
            if (urlhash[uri]) {
                urlclose[urlclose.length] = i;
            } else {
                urlhash[uri] = true;
            }
        }
    }
    for (var i = 0, max = urlclose.length; i < max; i++) {
        getBrowser().removeTab(tabs[urlclose[i]]);
    }
}

// private
function getTabMenu() {
    var ret = document.getAnonymousElementByAttribute(getBrowser(), "anonid", "tabContextMenu");
    if (!ret) {
        ret = gBrowser.tabContextMenu;
    }
    return ret;
}

function getTabClicked() {
    var tab = getBrowser().mContextTab;
    if (tab.localName != "tab") {
        tab = getBrowser().mCurrentTab;
    }
    return tab;
}

function getTabs() {
    var tabs = getBrowser().mTabContainer.childNodes;
    return tabs;
}
Northtech пишет

Не помню чья кнопка, в поиске к сожалению не нашел. Кто-нибудь может поправить её?
Периодически кнопка сбивается и показываются дублирующие пункты (см. спойлер), например такое бывает при открытии\закрытии меню "Customize".

Выделить код

Код:

var tabMenu = gBrowser.tabContainer.contextMenu || document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");

if (tabMenu) {
    var insertPos = tabMenu.lastChild.previousSibling;

    var ele1 = document.createElement("menuitem");
    ele1.setAttribute("label", "Закрыть дубликаты вкладок");
    ele1.setAttribute("tooltiptext", "Закрывает дубликаты вкладок с одинаковыми URL и оставляет только по одной из них");
    ele1.setAttribute("id", "closy-dupe");
    ele1.setAttribute("oncommand", "document.getElementById('" + self.id + "').closeDuplicateTabs();");
    tabMenu.insertBefore(ele1, insertPos);
    addDestructor(()=> ele1.remove() );

    var ele2 = document.createElement("menuitem");
    ele2.setAttribute("label", "Закрыть другие вкладки этого сайта");
    ele2.setAttribute("tooltiptext", "Закрывает все вкладки того же сайта, что и вкладка по которой вы щелкнули");
    ele2.setAttribute("id", "closy-host");
    ele2.setAttribute("oncommand", "document.getElementById('" + self.id + "').closeHost();");
    tabMenu.insertBefore(ele2, insertPos);
    addDestructor(()=> ele2.remove() );
}

// closes all other tabs from the host of the right clicked tab
this.closeHost = function() {
    var tab = getTabClicked();
    var host = false;
    // host for about:blank will fail
    try {
        host = tab.linkedBrowser.currentURI.host;
    } catch (e) {}
    if (host) {
        var tabs = getTabs();
        for (var i = tabs.length - 1; i >= 0; i--) {
            var tabhost = false;
            // host for about:blank will fail
            try {
                tabhost = getBrowser().getBrowserAtIndex(i).currentURI.host;
            } catch (e) {}
            if (tabhost && tabhost == host) {
                // dont close the right clicked tab
                if (tab != tabs[i]) {
                    // if we close the selected tab first select the previous tab
                    if (i && getBrowser().selectedTab == tabs[i]) {
                        getBrowser().mTabContainer.advanceSelectedTab(-1, true);
                    }
                    getBrowser().removeTab(tabs[i]);
                }
            }
        }
    }
}

// closes duplicate tabs
this.closeDuplicateTabs = function(aThisOneOnly) {
    var urlclose = new Array();
    var urlhash = new Object();
    var thisuri = false;
    if (aThisOneOnly) {
        thisuri = getTabClicked().linkedBrowser.currentURI.spec;
    }
    var tabs = getTabs();
    for (var i = tabs.length - 1; i >= 0; i--) {
        var uri = getBrowser().getBrowserAtIndex(i).currentURI.spec;
        if (thisuri) {
            if (thisuri == uri) {
                if (urlhash[uri]) {
                    urlclose[urlclose.length] = i;
                } else {
                    urlhash[uri] = true;
                }
            }
        } else {
            if (urlhash[uri]) {
                urlclose[urlclose.length] = i;
            } else {
                urlhash[uri] = true;
            }
        }
    }
    for (var i = 0, max = urlclose.length; i < max; i++) {
        getBrowser().removeTab(tabs[urlclose[i]]);
    }
}

// private
function getTabMenu() {
    var ret = document.getAnonymousElementByAttribute(getBrowser(), "anonid", "tabContextMenu");
    if (!ret) {
        ret = gBrowser.tabContextMenu;
    }
    return ret;
}

function getTabClicked() {
    var tab = getBrowser().mContextTab;
    if (tab.localName != "tab") {
        tab = getBrowser().mCurrentTab;
    }
    return tab;
}

function getTabs() {
    var tabs = getBrowser().mTabContainer.childNodes;
    return tabs;
}

bunda1
огромное спасибо, каждый раз выручаете. :beer:

bunda1
а можно получить кнопку?
при нажатии на которую вся страница сохраняется в PNG или Jpg.
и при сохранении, в название файла добавляется дата и время.
Спасибо.

05-02-2017 09:49:01
bunda1

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

Выделить код

Код:

var saveToFile = function (fileContent, fileName) {
    var uc = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    uc.charset = 'utf-8';
    fileContent = uc.ConvertFromUnicode(fileContent);

    var nsIFilePicker = Components.interfaces.nsIFilePicker;
    var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
    fp.init(window, '', fp.modeSave);
    fp.defaultString = fileName;
    fp.appendFilters(fp.filterHTML);
    fp.appendFilters(fp.filterAll);
    if(fp.show() == fp.returnCancel) return;
    var stream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
    stream.init(fp.file, 0x02|0x20|0x08, 0666, 0);
    stream.write(fileContent, fileContent.length);
    stream.close();
};
var resolveURL = function (url, base) {
    try {
        var ioService = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService);
        var baseURI = ioService.newURI(base, null, null);
        var absURI = ioService.newURI(url, null, baseURI);
        return absURI.spec;
    } catch (e) {}
};

var getSelWin = function (w) {
    if (w.getSelection().toString()) return w;
    for (var i = 0, f, r; f = w.frames[i]; i++) {
        try {
            if (r = getSelWin(f)) return r;
        } catch(e) {}
    }
};
var encodeImg = function (src, obj) {
    var canvas, img, ret = src;
    if (/^https?:\/\//.test(src)) {
        canvas = doc.createElement('canvas');
        if (!obj || obj.nodeName.toLowerCase() != 'img') {
            img = doc.createElement('img');
            img.src = src;
        } else {
            img = obj;
        };
        if (img.complete) try{
            canvas.width = img.width;
            canvas.height = img.height;
            canvas.getContext('2d').drawImage(img, 0, 0);
            ret = canvas.toDataURL((/\.jpe?g/i.test(src) ? 'image/jpeg' : 'image/png'));
        } catch (e) {};
        if (img != obj) img.src = 'about:blank';
    };
    return ret;
};
var toSrc = function (obj) {
    var strToSrc = function (str) {
        var chr, ret = '', i = 0, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\x22' : '\\\x22', '\\': '\\\\'};
        while (chr = str.charAt(i++)) {
            ret += meta[chr] || chr;
        };
        return '\x22' + ret + '\x22';
    },
    arrToSrc = function (arr) {
        var ret = [];
        for (var i = 0; i < arr.length; i++) {
            ret[i] = toSrc(arr[i]) || 'null';
        };
        return '[' + ret.join(',') + ']';
    },
    objToSrc = function (obj) {
        var val, ret = [];
        for (var prop in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, prop) && (val = toSrc(obj[prop]))) ret.push(strToSrc(prop) + ': ' + val);
        };
        return '{' + ret.join(',') + '}';
    };

    switch (Object.prototype.toString.call(obj).slice(8, -1)) {
        case 'Array': return arrToSrc(obj);
        case 'Boolean':
        case 'Function':
        case 'RegExp': return obj.toString();
        case 'Date': return 'new Date(' + obj.getTime() + ')';
        case 'Math': return 'Math';
        case 'Number': return isFinite(obj) ? String(obj) : 'null';
        case 'Object': return objToSrc(obj);
        case 'String': return strToSrc(obj);
        default: return obj ? (obj.nodeType == 1 && obj.id ? 'document.getElementById(' + strToSrc(obj.id) + ')' : '{}') : 'null';
    }
};

var mainWin = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content;
var selWin = getSelWin(mainWin), win = selWin || mainWin, doc = win.document, loc = win.location;
var ele, pEle, clone, reUrl = /(url\(\x22)(.+?)(\x22\))/g;

if (selWin) {
    var rng = win.getSelection().getRangeAt(0);
    pEle = rng.commonAncestorContainer;
    ele = rng.cloneContents();
} else {
    pEle = doc.documentElement;
    ele = (doc.body || doc.getElementsByTagName('body')[0]).cloneNode(true);
};
while (pEle) {
    if (pEle.nodeType == 1) {
        clone = pEle.cloneNode(false);
        clone.appendChild(ele);
        ele = clone;
    };
    pEle = pEle.parentNode
};
var sel = doc.createElement('div');
sel.appendChild(ele);

for (var el, all = sel.getElementsByTagName('*'), i = all.length; i--;) {
    el = all[i];
    if (el.style && el.style.backgroundImage) el.style.backgroundImage = el.style.backgroundImage.replace(reUrl, function (a, prev, url, next) {
        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, loc.href);
        return prev + encodeImg(url) + next;
    });
    switch (el.nodeName.toLowerCase()) {
        case 'link':
        case 'style':
        case 'script': el.parentNode.removeChild(el); break;
        case 'a': 
        case 'area': if (el.hasAttribute('href') && el.getAttribute('href').charAt(0) != '#') el.href = el.href; break;
        case 'img':
        case 'input': if (el.hasAttribute('src')) el.src = encodeImg(el.src, el); break;
        case 'audio':
        case 'video':
        case 'embed':
        case 'frame':
        case 'iframe': if (el.hasAttribute('src')) el.src = el.src; break;
        case 'object': if (el.hasAttribute('data')) el.data = el.data; break;
        case 'form': if (el.hasAttribute('action')) el.action = el.action; break;
    }
};

var head = ele.insertBefore(doc.createElement('head'), ele.firstChild);
var meta = doc.createElement('meta');
meta.httpEquiv = 'content-type';
meta.content = 'text/html; charset=utf-8';
head.appendChild(meta);
var title = doc.getElementsByTagName('title')[0];
if (title) head.appendChild(title.cloneNode(true));

head.copyScript = function (unsafeWin) {
    if ('$' in unsafeWin) return;
    var f = doc.createElement('iframe');
    f.src = 'about:blank';
    f.setAttribute('style', 'position:fixed;left:0;top:0;visibility:hidden;width:0;height:0;');
    doc.documentElement.appendChild(f);
    var str, script = doc.createElement('script');
    script.type = 'text/javascript';
    for (var name in unsafeWin) {
        if (name in f.contentWindow || !/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name)) continue;
        try {
            str = toSrc(unsafeWin[name]);
            if (!/\{\s*\[native code\]\s*\}/.test(str)) {
                script.appendChild(doc.createTextNode('var ' + name + ' = ' + str.replace(/<\/(script>)/ig, '<\\/$1') + ';\n'));
            }
        } catch (e) {};
    };
    f.parentNode.removeChild(f);
    if (script.childNodes.length) this.nextSibling.appendChild(script);
};
head.copyScript(win.wrappedJSObject || win);

head.copyStyle = function (s) {
    if (!s) return;
    var style = doc.createElement('style');
    style.type = 'text/css';
    if (s.media && s.media.mediaText) style.media = s.media.mediaText;
    try {
        for (var i = 0, rule; rule = s.cssRules[i]; i++) {
            if (rule.type != 3) {
                if((!rule.selectorText || rule.selectorText.indexOf(':') != -1) || (!sel.querySelector || sel.querySelector(rule.selectorText))) {
                    var css = !rule.cssText ? '' : rule.cssText.replace(reUrl, function (a, prev, url, next) {
                        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, s.href || loc.href);
                        if(rule.type == 1 && rule.style && rule.style.backgroundImage) url = encodeImg(url);
                        return prev + url + next;
                    });
                    style.appendChild(doc.createTextNode(css + '\n'));
                }
            } else {
                this.copyStyle(rule.styleSheet);
            }
        }
    } catch(e) {
        if (s.ownerNode) style = s.ownerNode.cloneNode(false);
    };
    this.appendChild(style);
};
var sheets = doc.styleSheets;
for (var j = 0; j < sheets.length; j++) head.copyStyle(sheets[j]);
head.appendChild(doc.createTextNode('\n'));

var doctype = '', dt = doc.doctype;
if (dt && dt.name) {
    doctype += '<!DOCTYPE ' + dt.name;
    if (dt.publicId) doctype += ' PUBLIC \x22' + dt.publicId + '\x22';
    if (dt.systemId) doctype += ' \x22' + dt.systemId + '\x22';
    doctype += '>\n';
};
var fileName = selWin ? win.getSelection().toString() : (title && title.text ? title.text : loc.pathname.split('/').pop());
fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '_').replace(/\s+/g, ' ').slice(0, 100).replace(/^\s+|\s+$/g, '');
fileName += (function () {
    var d = new Date(), z = function(n){return '_' + (n < 10 ? '0' : '') + n};
    return z(d.getHours()) + z(d.getMinutes()) + z(d.getSeconds());
})();
if(!/\.html?$/.test(fileName))fileName += '.html';

saveToFile(doctype + sel.innerHTML + '\n<!-- This document saved from ' + (loc.protocol != 'data:' ? loc.href : 'data:uri') + ' -->', fileName);


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

firepox пишет

а можно получить кнопку?
при нажатии на которую вся страница сохраняется в PNG или Jpg.
и при сохранении, в название файла добавляется дата и время.

Сохранить всю страницу как  PNG / PDF

firepox пишет

и при сохранении, в название файла добавляется дата и время.

Выделить код

Код:

var saveToFile = function (fileContent, fileName) {
    var uc = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    uc.charset = 'utf-8';
    fileContent = uc.ConvertFromUnicode(fileContent);

    var nsIFilePicker = Components.interfaces.nsIFilePicker;
    var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
    fp.init(window, '', fp.modeSave);
    fp.defaultString = fileName;
    fp.appendFilters(fp.filterHTML);
    fp.appendFilters(fp.filterAll);
    if(fp.show() == fp.returnCancel) return;
    var stream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
    stream.init(fp.file, 0x02|0x20|0x08, 0666, 0);
    stream.write(fileContent, fileContent.length);
    stream.close();
};
var resolveURL = function (url, base) {
    try {
        var ioService = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService);
        var baseURI = ioService.newURI(base, null, null);
        var absURI = ioService.newURI(url, null, baseURI);
        return absURI.spec;
    } catch (e) {}
};

var getSelWin = function (w) {
    if (w.getSelection().toString()) return w;
    for (var i = 0, f, r; f = w.frames[i]; i++) {
        try {
            if (r = getSelWin(f)) return r;
        } catch(e) {}
    }
};
var encodeImg = function (src, obj) {
    var canvas, img, ret = src;
    if (/^https?:\/\//.test(src)) {
        canvas = doc.createElement('canvas');
        if (!obj || obj.nodeName.toLowerCase() != 'img') {
            img = doc.createElement('img');
            img.src = src;
        } else {
            img = obj;
        };
        if (img.complete) try{
            canvas.width = img.width;
            canvas.height = img.height;
            canvas.getContext('2d').drawImage(img, 0, 0);
            ret = canvas.toDataURL((/\.jpe?g/i.test(src) ? 'image/jpeg' : 'image/png'));
        } catch (e) {};
        if (img != obj) img.src = 'about:blank';
    };
    return ret;
};
var toSrc = function (obj) {
    var strToSrc = function (str) {
        var chr, ret = '', i = 0, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\x22' : '\\\x22', '\\': '\\\\'};
        while (chr = str.charAt(i++)) {
            ret += meta[chr] || chr;
        };
        return '\x22' + ret + '\x22';
    },
    arrToSrc = function (arr) {
        var ret = [];
        for (var i = 0; i < arr.length; i++) {
            ret[i] = toSrc(arr[i]) || 'null';
        };
        return '[' + ret.join(',') + ']';
    },
    objToSrc = function (obj) {
        var val, ret = [];
        for (var prop in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, prop) && (val = toSrc(obj[prop]))) ret.push(strToSrc(prop) + ': ' + val);
        };
        return '{' + ret.join(',') + '}';
    };

    switch (Object.prototype.toString.call(obj).slice(8, -1)) {
        case 'Array': return arrToSrc(obj);
        case 'Boolean':
        case 'Function':
        case 'RegExp': return obj.toString();
        case 'Date': return 'new Date(' + obj.getTime() + ')';
        case 'Math': return 'Math';
        case 'Number': return isFinite(obj) ? String(obj) : 'null';
        case 'Object': return objToSrc(obj);
        case 'String': return strToSrc(obj);
        default: return obj ? (obj.nodeType == 1 && obj.id ? 'document.getElementById(' + strToSrc(obj.id) + ')' : '{}') : 'null';
    }
};

var mainWin = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content;
var selWin = getSelWin(mainWin), win = selWin || mainWin, doc = win.document, loc = win.location;
var ele, pEle, clone, reUrl = /(url\(\x22)(.+?)(\x22\))/g;

if (selWin) {
    var rng = win.getSelection().getRangeAt(0);
    pEle = rng.commonAncestorContainer;
    ele = rng.cloneContents();
} else {
    pEle = doc.documentElement;
    ele = (doc.body || doc.getElementsByTagName('body')[0]).cloneNode(true);
};
while (pEle) {
    if (pEle.nodeType == 1) {
        clone = pEle.cloneNode(false);
        clone.appendChild(ele);
        ele = clone;
    };
    pEle = pEle.parentNode
};
var sel = doc.createElement('div');
sel.appendChild(ele);

for (var el, all = sel.getElementsByTagName('*'), i = all.length; i--;) {
    el = all[i];
    if (el.style && el.style.backgroundImage) el.style.backgroundImage = el.style.backgroundImage.replace(reUrl, function (a, prev, url, next) {
        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, loc.href);
        return prev + encodeImg(url) + next;
    });
    switch (el.nodeName.toLowerCase()) {
        case 'link':
        case 'style':
        case 'script': el.parentNode.removeChild(el); break;
        case 'a': 
        case 'area': if (el.hasAttribute('href') && el.getAttribute('href').charAt(0) != '#') el.href = el.href; break;
        case 'img':
        case 'input': if (el.hasAttribute('src')) el.src = encodeImg(el.src, el); break;
        case 'audio':
        case 'video':
        case 'embed':
        case 'frame':
        case 'iframe': if (el.hasAttribute('src')) el.src = el.src; break;
        case 'object': if (el.hasAttribute('data')) el.data = el.data; break;
        case 'form': if (el.hasAttribute('action')) el.action = el.action; break;
    }
};

var head = ele.insertBefore(doc.createElement('head'), ele.firstChild);
var meta = doc.createElement('meta');
meta.httpEquiv = 'content-type';
meta.content = 'text/html; charset=utf-8';
head.appendChild(meta);
var title = doc.getElementsByTagName('title')[0];
if (title) head.appendChild(title.cloneNode(true));

head.copyScript = function (unsafeWin) {
    if ('$' in unsafeWin) return;
    var f = doc.createElement('iframe');
    f.src = 'about:blank';
    f.setAttribute('style', 'position:fixed;left:0;top:0;visibility:hidden;width:0;height:0;');
    doc.documentElement.appendChild(f);
    var str, script = doc.createElement('script');
    script.type = 'text/javascript';
    for (var name in unsafeWin) {
        if (name in f.contentWindow || !/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name)) continue;
        try {
            str = toSrc(unsafeWin[name]);
            if (!/\{\s*\[native code\]\s*\}/.test(str)) {
                script.appendChild(doc.createTextNode('var ' + name + ' = ' + str.replace(/<\/(script>)/ig, '<\\/$1') + ';\n'));
            }
        } catch (e) {};
    };
    f.parentNode.removeChild(f);
    if (script.childNodes.length) this.nextSibling.appendChild(script);
};
head.copyScript(win.wrappedJSObject || win);

head.copyStyle = function (s) {
    if (!s) return;
    var style = doc.createElement('style');
    style.type = 'text/css';
    if (s.media && s.media.mediaText) style.media = s.media.mediaText;
    try {
        for (var i = 0, rule; rule = s.cssRules[i]; i++) {
            if (rule.type != 3) {
                if((!rule.selectorText || rule.selectorText.indexOf(':') != -1) || (!sel.querySelector || sel.querySelector(rule.selectorText))) {
                    var css = !rule.cssText ? '' : rule.cssText.replace(reUrl, function (a, prev, url, next) {
                        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, s.href || loc.href);
                        if(rule.type == 1 && rule.style && rule.style.backgroundImage) url = encodeImg(url);
                        return prev + url + next;
                    });
                    style.appendChild(doc.createTextNode(css + '\n'));
                }
            } else {
                this.copyStyle(rule.styleSheet);
            }
        }
    } catch(e) {
        if (s.ownerNode) style = s.ownerNode.cloneNode(false);
    };
    this.appendChild(style);
};
var sheets = doc.styleSheets;
for (var j = 0; j < sheets.length; j++) head.copyStyle(sheets[j]);
head.appendChild(doc.createTextNode('\n'));

var doctype = '', dt = doc.doctype;
if (dt && dt.name) {
    doctype += '<!DOCTYPE ' + dt.name;
    if (dt.publicId) doctype += ' PUBLIC \x22' + dt.publicId + '\x22';
    if (dt.systemId) doctype += ' \x22' + dt.systemId + '\x22';
    doctype += '>\n';
};
var fileName = selWin ? win.getSelection().toString() : (title && title.text ? title.text : loc.pathname.split('/').pop());
fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '_').replace(/\s+/g, ' ').slice(0, 100).replace(/^\s+|\s+$/g, '');
fileName += ("  " + new Date().toLocaleFormat("%d.%m.%Y. %H:%M:%S"));
if(!/\.html?$/.test(fileName))fileName += '.html';

saveToFile(doctype + sel.innerHTML + '\n<!-- This document saved from ' + (loc.protocol != 'data:' ? loc.href : 'data:uri') + ' -->', fileName);

bunda1
Супер! Спасибо!

а подскажите есть ли кнопка которая обьеденяет в себе открытие, папки профеля,открытие папки загрузки, chrome\userChrome.css, папки chrome, prefs.js ,user.js. и  т д ?
на подобие кнопки About: Menu но тока с файлами и папками мозилы

mahtanoronra, есть у меня какая-то древняя, не помню даже где брал
h_1486966524_7429668_76b48c0e47.png
инициализация

скрытый текст
// Создать меню ............................................................................................
menuPopup = document.getElementById("mainPopupSet").appendChild(document.createElement("menupopup"));
menuPopup.setAttribute("id", "fileAndFolders-popup");
// добавляем массив с данными для создание меню ....
var lst = [
        {
          label:"Firefox",
          image:"chrome://branding/content/icon16.png",
          value:"CurProcD",
          command:OpenFirefoxFolder
        },
        {
          label:"Profile",
          image:"chrome://mozapps/skin/profile/profileicon.png",
          value:"ProfD",
          command:OpenFirefoxFolder
        },
        {
          label:"Download",
          image:"chrome://mozapps/skin/downloads/downloadIcon.png",
          command:OpenDownloadFolder
        },
        {
          label:"separator"
        },
        {
          label:"Extensions",
          image:"chrome://mozapps/skin/extensions/extensionGeneric-16.png",
          value:"ProfD,extensions",
          command:OpenFirefoxFolder,
        },
        {
          label:"Custom buttons",
          image:"chrome://custombuttons/skin/cbicon.png",
          value:"ProfD,custombuttons",
          command:OpenFirefoxFolder,
        },
        {
          label:"Bookmark backups",
          image:"chrome://custombuttons/skin/button.png",
          value:"ProfD,bookmarkbackups",
          command:OpenFirefoxFolder,
        },
        {
          label:"Search plugins(default)",
          style:"list-style-image:url('chrome://global/skin/icons/Search-glass.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"CurProcD,searchplugins",
          command:OpenFirefoxFolder,
        },
        {
          label:"Search plugins(user-defined)",
          style:"list-style-image:url('chrome://global/skin/icons/Search-glass.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"UsrSrchPlugns",
          command:OpenFirefoxFolder,
        },
        {
          label:"separator"
        },
        {
          label:"Chrome",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 32px, 16px, 16px) !important;",
          value:"UChrm",
          command:OpenFirefoxFolder,
        },
        {
          label:"userChrome.css",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"ProfD,chrome,userChrome.css",
          command:OpenFirefoxFolder,
        },
        {
          label:"userContent.css",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"ProfD,chrome,userContent.css", 
          command:OpenFirefoxFolder,
        }
        ];
// цикл по очереди добавляет из массива 'lst' нужные атрибуты к пунктам меню ....     
for( var i = 0, m; m = lst[i]; i++) {
     var menuItem = document.createElement("menuitem");
     menuItem.setAttribute("label", m.label);
     menuItem.setAttribute("class", "menuitem-iconic");
     if ("image" in m) menuItem.setAttribute("image", m.image);
     if ("style" in m) menuItem.setAttribute("style", m.style);
     if (m.label == "separator") menuItem = document.createElement("menuseparator");
     if ("value" in m) menuItem.setAttribute("value", m.value);
     menuItem.addEventListener("command", m.command, false);
     // не добавляете цекбоксы к пункту если уже добавлен "image" ....
     //if ("checked" in m) menuItem.setAttribute("type", "checkbox");
     //if ("checked" in m) menuItem.setAttribute("checked", m.checked);
     //menuItem.id = "menuItem-" + m.label.toString();
     menuPopup.appendChild(menuItem);
};

// Функция открывает папки и файлы Firefox, выбор завысит от параметра 'value' для функции ..................
function OpenFirefoxFolder(event) {
// получаем 'value' от нажатого пункта в меню ....
var menuitem = event.target;
var value = menuitem.getAttribute("value");

// создаем массив из слов в 'value' и получаем названия нужных папок и файлов ....
var array = value.split(",");
var directory = array[0];
var folders = (array[1])? array[1]: false;
var file = (array[2])? array[2]: false;

// указать нужный каталог ....
var dir = Components.classes['@mozilla.org/file/directory_service;1']
                    .getService(Components.interfaces.nsIProperties)
                    .get(directory, Components.interfaces.nsILocalFile);
// указать нужную подпапку если она записана в 'value' ....                   
if (folders) dir.append( folders );

// указать нужный файл если он записан в 'value' и открыть файл ....
if (file) dir.append( file ), dir.launch();

// открыть папку если в 'value' не записан файл ....
if (dir.exists() && !file ) dir.reveal();
};



// Функция открывает папку загрузки Firefox если папка существует ...........................................
function OpenDownloadFolder() {
// получить папку загрузки из 'about:config' ....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var dir = prefs.getComplexValue("browser.download.dir", Components.interfaces.nsISupportsString).data;
// открыть папку ....
var local = Components.classes["@mozilla.org/file/local;1"]. createInstance(Components.interfaces.nsILocalFile);
local.initWithPath( dir );
local.launch();
};



// Настройка функций кликов мыши(Mouse Click settings) ......................................................
this.onclick = function(event) {
     // действие при клике ЛКМ ....
     if ( event.button == 0 ) {
          // открыть меню ....
          document.getElementById("fileAndFolders-popup").showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
          };
}
//this.type = "menu";

sonyas75
вот прямо то что хотел))
но почему то не могу добавить prefs.js ,user.js

Выделить код

Код:

label:"userContent.css",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"ProfD,chrome,userContent.css", 
          command:OpenFirefoxFolder,
        },
        {
          label:"user.js",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"ProfD,user.js", 
          command:OpenFirefoxFolder,
        },
        {
          label:"prefs.js",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"ProfD,prefs.js", 
          command:OpenFirefoxFolder,
        }

а все надо было браузер перезапустить)отдуши)

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

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

Выделить код

Код:

Could not read chrome manifest 'file:///C:/Program%20Files%20(x86)/Mozilla%20Firefox/chrome.manifest'.
unreachable code after return statement[Подробнее]  bootstrap.js:1988:2
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
    __defineGetter__ self-hosted
    <анонимная> chrome://custombuttons/content/cbbuttonimpl.js:11:1
    toolbarbutton_XBL_Constructor chrome://custombuttons/content/toolbarbutton.xml:17:5
    CustomizableUIInternal.insertWidgetBefore resource://app/modules/CustomizableUI.jsm:1198:5
    CustomizableUIInternal.buildArea resource://app/modules/CustomizableUI.jsm:757:9
    CustomizableUIInternal.registerToolbarNode resource://app/modules/CustomizableUI.jsm:672:9
    this.CustomizableUI.registerToolbarNode resource://app/modules/CustomizableUI.jsm:3063:5
    _init chrome://browser/content/customizableui/toolbar.xml:85:11
    onReadyStateChange chrome://browser/content/customizableui/toolbar.xml:37:15
Object { stack: "", ещё 5… }  runner.js:166
Object { stack: "", ещё 5… }  Promise-backend.js:940
ReferenceError: setTimeout is not defined[Подробнее]  framescript.js:147:13
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
    custombutton.buttonDestroy chrome://custombuttons/content/cbbutton.js:116:10
    destroy chrome://custombuttons/content/cbbuttonimpl.js:8:2
    custombutton.buttonDestructor chrome://custombuttons/content/cbbutton.js:85:4
    toolbarbutton_XBL_Destructor chrome://custombuttons/content/toolbarbutton.xml:27:5
    CustomizeMode.prototype.wrapToolbarItem resource://app/modules/CustomizeMode.jsm:892:15
    CustomizeMode.prototype.deferredWrapToolbarItem/</< resource://app/modules/CustomizeMode.jsm:874:23
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
TypeError: oBtn._handlers is undefined[Подробнее]  cbbutton.js:116:10
TypeError: can't convert undefined to object  cbbuttonimpl.js:11:1
Предупреждение: «nsIOService::NewChannel()» является устаревшим, пожалуйста, используйте «nsIOService::NewChannel2()»  CustomButtonsService.js:1152:10
Key event недоступен на GTK2: ключ=«u» модификаторы=«accel,shift» id=«key_tm_mergeWin»  browser.xul
Key event недоступен при использовании некоторых раскладок клавиатуры: ключ=«n» модификаторы=«accel, alt» id=«key_tm_detachTab»  browser.xul
Key event недоступен при использовании некоторых раскладок клавиатуры: ключ=«t» модификаторы=«accel,alt» id=«key_tm_dupTab»  browser.xul
Key event недоступен при использовании некоторых раскладок клавиатуры: ключ=«r» модификаторы=«accel,alt» id=«toggleReaderMode»  browser.xul
Key event недоступен при использовании некоторых раскладок клавиатуры: ключ=«i» модификаторы=«accel,alt,shift» id=«key_browserToolbox»  browser.xul
Use of nsIFile in content process is deprecated.  loader.js:244:15
ReferenceError: setTimeout is not defined  framescript.js:147:13
Invalid chrome URI: /
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
A promise chain failed to handle a rejection. Did you forget to '.catch', or did you forget to 'return'?
See https://developer.mozilla.org/Mozilla/JavaScript_code_modules/Promise.jsm/Promise

Date: Thu Feb 16 2017 18:16:28 GMT+0300
Full Message: Error: page-thumbnail:error
Full Stack: observe@resource://gre/modules/BackgroundPageThumbs.jsm:116:22
BackgroundPageThumbs._onCaptureOrTimeout@resource://gre/modules/BackgroundPageThumbs.jsm:305:7
Capture.prototype._done/done@resource://gre/modules/BackgroundPageThumbs.jsm:451:7
Capture.prototype._done@resource://gre/modules/BackgroundPageThumbs.jsm:471:7
Capture.prototype.notify@resource://gre/modules/BackgroundPageThumbs.jsm:428:5
  BackgroundPageThumbs.jsm:116
TypeError: can't access dead object  framescript.js:139:9
NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIStreamListener.onStartRequest]  WebRequest.jsm:221
A promise chain failed to handle a rejection. Did you forget to '.catch', or did you forget to 'return'?
See https://developer.mozilla.org/Mozilla/JavaScript_code_modules/Promise.jsm/Promise

Date: Thu Feb 16 2017 18:16:58 GMT+0300
Full Message: Error: page-thumbnail:error
Full Stack: observe@resource://gre/modules/BackgroundPageThumbs.jsm:116:22
BackgroundPageThumbs._onCaptureOrTimeout@resource://gre/modules/BackgroundPageThumbs.jsm:305:7
Capture.prototype._done/done@resource://gre/modules/BackgroundPageThumbs.jsm:451:7
Capture.prototype._done@resource://gre/modules/BackgroundPageThumbs.jsm:471:7
Capture.prototype.notify@resource://gre/modules/BackgroundPageThumbs.jsm:428:5
  BackgroundPageThumbs.jsm:116
Загрузка смешанного (небезопасного) отображаемого содержимого «http://i.imgur.com/115fLoF.png» на защищённой странице[Подробнее]  viewtopic.php
Загрузка смешанного (небезопасного) отображаемого содержимого «http://storage5.static.itmages.ru/i/17/0213/h_1486966524_7429668_76b48c0e47.png» на защищённой странице[Подробнее]  viewtopic.php


Разрешил установку неподписанных дополнений в FF51, инсталлирую Browsec с оф. сайта, Firefox рапортует об успешной установке, в дополнениях появляется, а иконка на панели инструментов не появляется. Может эти проблемы как-то связаны? В чем может быть дело?
Win10 x64

xseed
24-01-2017 15:55:57

bunda1 пишет

Заработало, спасибо!

Вопрос: Можно ли кнопки поместить в меню?

xseed, посмотрите CB Button Utility
Эта кнопка очень многое делает. В том числе и меню кнопок

xseed пишет

Вопрос: Можно ли кнопки поместить в меню?

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

ищю кнопку. функция такая.
"вставить и перейти" это если правый клик по строке ввода адреса нажать.

mahtanoronra пишет

ищю кнопку. функция такая.
"вставить и перейти" это если правый клик по строке ввода адреса нажать.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0412%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u0438%20%u043F%u0435%u0440%u0435%u0439%u0442%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CAAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9Pt8xetPtu9FsfFNtu%252BTzvb2%252B%252Fne4dFJeBw0egA%252FfAJAfAA8ewBBegAAAAD%252B%252FPtft98Mp%252BwWsfAVsvEbs%252FQeqvF8xO7%252F%252F%252F63yqkxdgM7gwE%252FggM%252BfQA%252BegBDeQDe7PIbotgQufcMufEPtfIPsvAbs%252FQvq%252Bfz%252Bf%252F%252B%252B%252FZKhR05hgBBhQI8hgBAgAI9ewD0%252B%252Fg3pswAtO8Cxf4Kw%252FsJvvYAqupKsNv%252B%252Fv7%252F%252FP5VkSU0iQA7jQA9hgBDgQU%252BfQH%252F%252Ff%252FQ6fM4sM4KsN8AteMCruIqqdbZ7PH8%252Fv%252Fg6Nc%252Fhg05kAA8jAM9iQI%252BhQA%252BgQDQu6b97uv%252F%252F%252F7V8Pqw3eiWz97q8%252Ff%252F%252F%252F%252F7%252FPptpkkqjQE4kwA7kAA5iwI8iAA8hQCOSSKdXjiyflbAkG7u2s%252F%252B%252F%252F39%252F%252F7r8utrqEYtjQE8lgA7kwA7kwA9jwA9igA9hACiWSekVRyeSgiYSBHx6N%252F%252B%252Fv7k7OFRmiYtlAA5lwI7lwI4lAA7kgI9jwE9iwI4iQCoVhWcTxCmb0K%252BooT8%252Fv%252F7%252F%252F%252FJ2r8fdwI1mwA3mQA3mgA8lAE8lAE4jwA9iwE%252BhwGfXifWvqz%252B%252Ff%252F58u%252Fev6Dt4tr%252B%252F%252F2ZuIUsggA7mgM6mAM3lgA5lgA6kQE%252FkwBChwHt4dv%252F%252F%252F728ei1bCi7VAC5XQ7kz7n%252F%252F%252F6bsZkgcB03lQA9lgM7kwA2iQktZToPK4r9%252F%252F%252F9%252F%252F%252FSqYK5UwDKZAS9WALIkFn%252B%252F%252F3%252F%252BP8oKccGGcIRJrERILYFEMwAAuEAAdX%252F%252Ff7%252F%252FP%252B%252BfDvGXQLIZgLEWgLOjlf7%252F%252F%252F%252F%252F%252F9QU90EAPQAAf8DAP0AAfMAAOUDAtr%252F%252F%252F%252F7%252B%252Fu2bCTIYwDPZgDBWQDSr4P%252F%252Fv%252F%252F%252FP5GRuABAPkAA%252FwBAfkDAPAAAesAAN%252F%252F%252B%252Fz%252F%252F%252F64g1C5VwDMYwK8Yg7y5tz8%252Fv%252FV1PYKDOcAAP0DAf4AAf0AAfYEAOwAAuAAAAD%252F%252FPvi28ymXyChTATRrIb8%252F%252F3v8fk6P8MAAdUCAvoAAP0CAP0AAfYAAO4AAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BgURLBar.select%28%29%3B%0AgoDoCommand%28%27cmd_paste%27%29%3B%0AgURLBar.handleCommand%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

что то кнопка не сохроняет в png страницу :angry:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ........
this.onclick = function(e) {     
   
   if ( e.button == 0 ) savePageInPNG(); // ЛКМ
                     
   if ( e.button == 1 ) gShowPopup(this); // СКМ 
         
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { // ПКМ
        e.preventDefault();
        savePageToPDF();
        } 
};



// Сохраняет страницу как PDF файл через сервис 'pdfmyurl.com'
function savePageToPDF() {
   // разрешить страницу для расширения NoScript ....   
   if ( "noscriptUtil" in window ) {
        var autoReload = custombuttons.getPrefs("noscript.autoReload");
        if ( autoReload ) custombuttons.setPrefs("noscript.autoReload", false);
        noscriptOverlay.allowPage();
        if ( autoReload ) setTimeout(function() { custombuttons.setPrefs("noscript.autoReload", true) }, 10)
        }
   // сохранить если это веб страница ....     
   var loc = content.location;
   if (loc.protocol.slice(0, 4) == "http")
   loadURI("http://pdfmyurl.com?url=" + loc);
}; 



// Сохранить всю страницу как PNG ........
function savePageInPNG() {
   var canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
   canvas.width = Math.min(content.innerWidth + content.scrollMaxX, 32766);
   canvas.height = Math.min(content.innerHeight + content.scrollMaxY, 32766);
   var context = canvas.getContext("2d");
   context.drawWindow(content, 0, 0, canvas.width, canvas.height, "white");
   var uri = makeURI(canvas.toDataURL("image/png"));

   var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
   fp.init(window, "Save Screenshot As", fp.modeSave);
   fp.appendFilter("", "*.png");
   fp.appendFilters(fp.filterImages | fp.filterAll);
   fp.defaultExtension = "png";
   fp.defaultString = content.document.title + ".png";
   if (fp.show() == fp.returnCancel || !fp.file) return;

   Cc['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
   .createInstance(Ci.nsIWebBrowserPersist)
   .saveURI(uri, null, null, null, null, fp.file, null);
};



// Подсказка для кнопки ........
this.tooltipText = "L = Сохранить страницу как PNG-изображение \nM = Контекстное меню \nR = Сохранить страницу как PDF файл";
mahtanoronra пишет

что то кнопка не сохроняет в png страницу :angry:

Сохранить всю страницу как  PNG / PDF

bunda1, перестала работать кнопка: №148.
Ни с e10s, ни без него. [firefox] 52 ESR.
Посмотри, пожалуйста.

thrower
Все работает. Проверь на чистом профиле.

На 52 ESR не работает "Открыть в торрент"

Выделить код

Код:

//Открыть в uTorrent........................
 
(() => {
    const id = _id + "-" + Components.stack.lineNumber;
    if (Application.storage.get(id, null)) return;
    Application.storage.set(id, {});
    addDestructor(() => Application.storage.set(id, null));
 
    const topic = "http-on-examine-response";
    const cd = "Content-Disposition";
    var re = /^\s*attachment/i;
    function onResponse(channel) {
        try {
            channel.QueryInterface(Ci.nsIHttpChannel);
            var disp = channel.getResponseHeader(cd);
            channel.loadFlags & channel.LOAD_DOCUMENT_URI
            //&& channel.contentType == "application/x-bittorrent"
            && (
                channel.contentType == "application/x-bittorrent"
                || channel.URI.path.startsWith("/parse/d.rutor.org/download")
            )
            && re.test(disp)
            && channel.setResponseHeader(cd, disp.replace(re, "inline"), false);
        } catch(ex) {}
    }
    Services.obs.addObserver(onResponse, topic, false);
    addDestructor(() => Services.obs.removeObserver(onResponse, topic));
})();

Custom Buttons 0.0.5.8.9.3. Профиль с нуля.

Mishania пишет

На 52 ESR не работает "Открыть в торрент"

:/

Выделить код

Код:

// Открыть в uTorrent ........................
(() => {
    const id = _id + "-" + Components.stack.lineNumber;

    var storage = (function() {
        var global = Cu.import("resource://gre/modules/Services.jsm", {});
        var storage = global[id] || (global[id] = global.Object.create(null));
        return {
            get: function(key, defaultVal) {
                if(key in storage)
                    return storage[key];
                return defaultVal;
            },
            set: function(key, val) {
                if(key === null)
                    delete storage[key];
                else
                    storage[key] = val;
            }
        };
    })();
    
    if (storage.get(id, null)) return;
    storage.set(id, {});
    addDestructor(() => storage.set(id, null));
 
    const topic = "http-on-examine-response";
    const cd = "Content-Disposition";
    var re = /^\s*attachment/i;
    function onResponse(channel) {
        try {
            channel.QueryInterface(Ci.nsIHttpChannel);
            var disp = channel.getResponseHeader(cd);
            channel.loadFlags & channel.LOAD_DOCUMENT_URI
            //&& channel.contentType == "application/x-bittorrent"
            && (
                channel.contentType == "application/x-bittorrent"
                || channel.URI.path.startsWith("/parse/d.rutor.org/download")
            )
            && re.test(disp)
            && channel.setResponseHeader(cd, disp.replace(re, "inline"), false);
        } catch(ex) {}
    }
    Services.obs.addObserver(onResponse, topic, false);
    addDestructor(() => Services.obs.removeObserver(onResponse, topic));
})();

bunda1
Огромное спасибо, вы просто спаситель! Без таких как вы я бы давно уже сидел на edge. Как вы во всём этом разбираетесь? Тёмный лес.

Mishania пишет

Как вы во всём этом разбираетесь?

Просто у меня память хорошая на коды.

bunda1
У кнопки "Индикация текущей раскладки фоном поля ввода" - как у старого варианта, так и у недавно опубликованного исправленного - имеется проблема со строкой поиска по странице (Ctrl-F): в оригинале, когда после очередной набранной буквы текст перестаёт находиться на странице, в этой строке цвет меняется на "белым по красному". Из-за действия кнопки получается "белым по почти белому".

bunda1
у кнопки Переключить JavaScript для сайтов отвалилась перезагрузка страницы.
Поправь, пожалуйста

У меня ещё просьба, видимо с переустановкой что-то напутал. Раньше у меня стояла кнопка которая делала код установки кликабельным и сразу с иконкой. Сейчас приходится самому копировать. Не могу найти что это делало, а без этого отвык. Поделитесь.

Mishania пишет

Раньше у меня стояла кнопка которая

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

Выделить код

Код:

addEventListener(
    "DOMContentLoaded",
    function(e) {
        var doc = e.target;
        var win = doc.defaultView;
        if(win != win.top) // Ignore frames
            return;

if (doc.location.host=="forum.mozilla-russia.org"){
var boxes = [];
var pres = doc.getElementsByTagName("pre");

for(var i = 0, l = pres.length; i < l; ++i) {
        var pre = pres[i];
        if(pre.parentNode.parentNode.parentNode.className == "codebox")
            boxes.push(pre);
    }
for(var i = 0, l = boxes.length; i < l; ++i) {
        var box = boxes[i];
        if(box.hasAttribute("data-highlight-js-parsed"))
            continue;
        box.setAttribute("data-highlight-js-parsed", "true");

        // Special "codes"
        var tc = box.textContent;
        if(
            /^custombutton:\/\/\S+%3C\/custombutton%3E\s*$/.test(tc)
            || /^data:[\w-]+\/[\w-]+;base64,\S+\s*$/.test(tc)
        ) {
            tc = tc.replace(/\s+$/, "");
            var a = doc.createElement("a");
            a.href = tc;

            var icon;
            if(/^data:image\//.test(tc))
                icon = tc;
            else if(
                /^custombutton:\/\//.test(tc)
                && /%3Cimage%3E%3C%21%5BCDATA%5B(data%3A\S+)%5D%5D%3E%3C\/image%3E/.test(tc)
            )
                try { icon = decodeURIComponent(RegExp.$1); } catch(e) {}
            if(icon) {
                var img = doc.createElement("img");
                img.src = icon;
                img.alt = "";
                var s = img.style;
                s.marginRight = "4px";
                s.verticalAlign = "middle";
                a.appendChild(img);
            }

            a.appendChild(doc.createTextNode(tc));
            var s = a.style;
            s.background = "none";
            s.margin = s.padding = 0;

            box.innerHTML = "";
            box.appendChild(a);
            continue;
        }
    }

  }
},
    true,
    document.getElementById("appcontent")
);

Uxapb
Спасибо.

Ultima2m пишет

bunda1
у кнопки Переключить JavaScript для сайтов отвалилась перезагрузка страницы.

А e10 включен?

bunda1 пишет

А e10 включен?

Нет, отключен.
В кнопке Загружать изображения на страницах перезагрузка работает.
Может, позаимствовать можно?

Ultima2m пишет

В кнопке Загружать изображения на страницах перезагрузка работает.
Может, позаимствовать можно?

В кнопке Загружать изображения на страницах и Переключить JavaScript для сайтов одинаковые коды перезагрузки страницы -  BrowserReload() и у меня на FF52 + Переключить JavaScript для сайтов перегрузка страницы работает. Может так попробуй:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ..............
this._handleClick =()=> {
   var scriptEnabled = gBrowser.docShell.allowJavascript; // текущее состояние JavaScript на странице

   var currHost = content.document.domain;
   if ( !currHost ) return;

   saveTextToHelp(currHost, scriptEnabled);
   tabsReload(false, currHost, !scriptEnabled);
};


// Получаем из вкладки 'Справка' массив с доменами ..............
var hosts = self.getAttribute('Help').split('\n').filter((host)=> /\S/.test(host)).map((host)=> host.trim());


// Перегрузить и переключить JavaScript для текущей вкладки или вкладок сайта или всех сайтов из массива .............. 
function tabsReload( reason, currHost, scriptEnabled ) {
   if ( reason == 'destructor' ) return;
   if ( reason ) scriptEnabled = reason != 'update';

   // переключить текущую вкладку если левый клик на кнопке
   if ( !reason ) {
        gBrowser.docShell.allowJavascript = scriptEnabled; 
        setTimeout(()=> BrowserReload(), 500);
        };

   // Сплывающая подсказка ....
   var notification  = reason 
                       ? 'Перегрузить все вкладки сайтов из списка'
                       : 'Перегрузить все вкладки сайта'; 
   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   alertsService.showAlertNotification(self.image, self.label, notification, true, "", listener, "");
   
   // стиль сплывающей подсказки
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #alertImage { height: 35px !important; width: 35px !important; }\
      #alertNotification:hover { cursor: pointer !important; }\
      #alertTextLabel { color: #0000FF !important; text-decoration: underline; }\
   '));
   sss.loadAndRegisterSheet(uri, 0);
   
   // удалить стиль и подсказку через указанное время
   setTimeout(()=> { sss.unregisterSheet(uri, 0); alertsService.closeAlert(); }, 4000); 
    
   // переключить вкладки сайта или всех сайтов из массива если кликнуть на подсказке
   function listener(subject, topic, data) {
      if ( topic !== 'alertclickcallback' ) return;
      
      var currTab = gBrowser.mCurrentTab;
      for( var tab of gBrowser.tabs ) {
           var uri = tab.linkedBrowser.currentURI;
           if ( !uri.scheme.startsWith("http") ) continue;   
           
           var tabHost = tab.linkedBrowser.contentDocument.location.host;
           if ( tabHost == '' ) return;

           var tabReload = reason 
                           ? hosts.indexOf(tabHost) !== -1 
                           : tab !== currTab && tabHost == currHost;             
           if ( tabReload ) {
                tab.linkedBrowser.docShell.allowJavascript = scriptEnabled;
                gBrowser.reloadTab(tab);
                }
           }
   }
};
addDestructor(tabsReload);


// Записать текст в вкладку 'Справка' ..............
function saveTextToHelp(currHost, addHost) {
   // удалить или добавить текущий сайт в массив с доменами
   addHost
   ? hosts.push(currHost)     
   : hosts = hosts.filter((host)=> { return (host !== currHost) })   
   var value = hosts.join("\n");

   // записать массив
   var dir = Services.dirsvc.get("ProfD", Ci.nsIFile);
   dir.initWithPath(dir.path + "\\extensions\\custombuttons@xsms.org\\components\\CustomButtonsService.js");
   var url = Services.io.newFileURI(dir).spec, cbs = {};
   Services.scriptloader.loadSubScript(url, cbs);
   var AO = new cbs.AppObject(), btn = AO.getButton(_id);

   self.setAttribute("Help", value);
   btn.setAttribute("Help", value);
   AO.overlay.saveOverlayToProfile();   
};


// Обработчик следит за изменениями табов и запускают нужные коды и функции ..............
addEventListener("TabAttrModified", e=> {
   var browser = e.target.linkedBrowser;   

   // отключить JavaScript для сайта если домен сайта совпадает с массивом 'hosts'
   var specifiedSite = hosts.indexOf( browser.contentDocument.location.host ) !== -1; 
   browser.docShell.allowJavascript = !specifiedSite;

   // если на странице отключен JavaScript меняем иконку
   if ( browser == gBrowser.selectedBrowser ) { 
        self.style.filter = specifiedSite || !cbu.getPrefs("javascript.enabled") ? grayscale : '';        
        }
}, true, gBrowser.tabContainer);
var grayscale = parseInt(Services.appinfo.version) < 36 ? 'url("chrome://mozapps/skin/extensions/extensions.svg#greyscale")' : 'grayscale(1)';

bunda1
Извиняюсь за панику, похоже, это косяк Cyberfox.
Версия 52.0.1 работает стабильно.
Но сегодня обновил Cyberfox до 52.0.2 и они там чего-то наулучшали.
Откатился и все заработало.

Добрый день!
Давно пользуюсь незаменимым и замечательным Save snapshot to html. Но на некоторых сайтах он не сохраняет картинки, либо обрезает их. При этом в pdf или mht  все норм. Подозреваю что это из-за кривизны рук сайтописателя, но тем не менее. Как пример, если сохранить вот эту страницу, то часть верхнего рисунка отрезается на 70%. Можно что-то сделать с этим?

А из за чего такое может быть? FF Exp Imp CB перестала перезаписывать путь каталога сохранения в настройках. Пришлось в ручную исправлять. Проверил и на 3 и 4 фиксе CB. На чистом профиле то же самое, но она хотя бы предлагает сохранять на C:, а вот на старом, где был прописан уже не существующий путь, постоянно выводит сообщение, что нужно установить путь, ну а при установке пути он не перезаписывается.

Можно это дело пофиксить?

13-04-2017 00:42:26
ARG
Вот смотрите, я сделал фотку и в архив ее запаковал, так как слишком большая получилась, сравните со своей.
FREESCALE 2 X BLF188XR HF AMPLIFIER 1 8-54MHZ 1 5K  13.04.2017. 00-36-23.rar
Если у вас работает не так, то ищите фиксы которые недавно делались для этой кнопки, буквально в прошлом месяце вроде. Их было штук пять разных, но где они лежат я не помню.

Хотя, вот вариант который у меня:

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

Выделить код

Код:

// Save, от 08.03.2017. .............

self.label = "Save";
self._handleClick =()=> menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
self.image = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAADAgBEDRIXnwxQjKQNWp6pDFWXqAxXm6gMV5moDFeaqAxXmqgMV5qoDFebqAxVlqgNW5+pCkyIogwSFqgDAgBHDQoFhyszOv8hheP+IJH7/x+L8v8fjfb/H433/x+N9v8fjfb/H432/x+N9/8fi/L/IJH7/yGF5P0kLTTvDAcDgwgICIQ8Ojf/0czA+Oji1fzh18r85NzO/OTbz/zj287849vO/OPbzvzk3M/84dfK++ji1f3Sy8D5NDIvywYGB3kKCgqFQ0A8/+XXw/v979f/9uTO//rp0f/66NH/+ujR//rn0f/66NH/+ujR//bkzv/979f/5tfD/UZBPv8KCwqEDQwMhUVDQP/f08X7+OrZ/+zf0P/v5NP/8OPT/+/j0//v4tP/8OPT/+/j0//s39D/+OrZ/+DTxfxEQj//DAwMhA8PD4VKR0T/4dXG+/rr2v/v4tH/9OXU//Ll1P/z5dT/8+XU//Pl1P/05NT/7+DR//rr2v/i1cX7SkhE/w8PD4USEhKFT0xI/+XXxfv97tr/9ePR//no1P/459T/+OfU//jn1P/459T/+OfU//Xk0f/97tr/5dfF+09MSf8SEhGFFRQUhVNQTv/j2cv7+u/g//Hm2P/169v/9Orb//Tq2//06tv/9erb//br3P/x5tf/+e/g/+PZzPtTUU7/FBQUhRgXF4VXU1D/2828+/Lk0f/q2sf/7d3K/+3dyv/t3cr/7N3K/+rayP/r28n/69vI//Ll0v/azbv7VlNP/xgXF4UfHh6FTktJ/1JOTPtZVFL/Uk5L/1FNSv9RTUr/UU1K/1JPTP9YVVD/VVJP/09NSv9WUk//UU1L+05LSf8fHh2FIR8fhVVTUP9FQkD7UlBM/6Wlj/+4uJ7/sLCX/7S0mv+xsJn/oKCQ/6+vmv+hoYv/TEtH/0NCQPtVUk//IR8fhSMhIIVcWVb/SEVF+19dVv/f3sP////e//X10v///93/2di8/1lYWP+eno//5+fG/19dV/9JRkb7W1hV/yMhIYUkJCOFXltZ/0tJSPtdW1f/0NC4/+/u1P/h4cj/8PDV/7++q/8vLC7/e3lw/9fWv/9eXVf/TElJ+15bWf8lJCKEJSQjhF9cWf9LSUf5XVtX/tbVwf/5+OL/6enV//j54v/GxrX/QD0+/42Kgv/d3cr/YF5a/k5LSvlhXlv/JSUjhCkoKIZpZWT/VVJR/WNhXP/V1cT//f3s/+3t3v/8/Or/zc2//01LSf+VlIz/4eDS/2hmYv9YVVT8aWVj/ycmJoIaGRlYSEVE1DYzM8NKSUfP0dHG9/X16P/n59v+7e3g/+jo3f/X2M3+6uve/9bWzPdOTUvNOjg3y0RBQLwPDw8lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==";


var pref = "CB.Shortcuts.pathToSaveShortcuts";
var faviconFolder = "C:\\Documents and Settings\\Favicon\\";   // папка для сохранения иконок для ярлыков и ярлыков сайтов
var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);


// Создать меню для кнопки .............
var array = [
   { label: "Сохранить страницу в html одним файлом", func: "runSaveSnapshotToHtml()", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACaUlEQVR4AX3BTWvcVRTA4d+592am/5lp0qSxtEtRxI0oVmipuBFEEDfd1IUvCz+RO3du/QAqCgUjxULdWKFV8AUkapg0pplM5uX/cu85x7RQlDb4PPL62++8ubq68cLZjXPnY2hnKYk4JxMgZ/fpvHe6bo72tr745OO0trb+4pVLb1x7/92rFzfXIQr/a1kbX34T2Lrx2d350Uefpq4znc6y/b0Ho8oZVII5J4oC81qZTAL1YhmAXnK12LUqB1O40Br9fkQLT3DAIjQNLBsw1wBIKmahbkucTKFtjdxFioI7T4gRcnG0tJgVASSVUmKXS6hrJXeQC+QC5iD8h0NaAS2Cu6FFAxCCqkZVDWYKIjwiPEZ4SBzMCmo5AJJULWIau7ZlZ6zMZhV1q5g5j0sxcP+gpl4qZhqAmLTkBBbNnZvfjTk8zBxMWprWcAd3HhJxhoNEVSWGowsE0QBI6nIOajnEFEkp8Orl8wxHQ4QCKCJOjByL/PLbnB/u7DIYRFRLAELKucSmzuHPnTmT/TFX33qK61vbLGp479qzbG70eGR9NXHj258Yjc7h5gEIIecS6yaHxaJlWS9ZLjPf3x5z89Yuh9PMA/cnsLsPh9NMFMetYFYCEII7vRh7vapaReQUm2d6fPjBZV678hxrp3s80O9DFJBwin5/QFWtEWMvATGpFp8e3bOd8W0O9u/w1deZiy8/zysvLfj19xk//mzMF4W2c7b/2NPtv+52Kk11eHSPYyKD1bOXzMozpbRPSwjkpgiChJWAZ8UViBwTQSSnldjgVsXUm5Wm+Vz41xDoAwIETuaAAy3QAf4PtuhVEPpvXZEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAAElFTkSuQmCC"},  
   { separator: ''},
   { label: "Сохранить значок веб-сайта", func: "saveFavicon()", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACPVBMVEX09ff////C3L+Uq8+Vq8+Uqs+Zr9CZrtCZr9Gfu+ear8+mt9JRf8ORxl3t8vfF06+Twojs8/d9otl8o9s+aquZrs/X9KLp8Pft8fZhisf//+DBzN2hveihv+pii8hti9pgicl6oNlojs1zncNsi836/P2duebx8/eYyWqBp+Gn0IKBvlKHsm9qmaVuk8zt7/FEbauEv1Tp7/JdhL9oi9Pl8e2LwlmdsdD7/P76+/3H7ofo8+peh8eHwFaSteZ0pkp2gl7q8/Ohy5OApt2by2eZuOqbuOWaezWuvtd7nN2HvWxul9Ty9feQxV5ljcqBp+JEcLCVtOOo0nR7odx5n9suX6Z1mtBzmtSXyGPv9PewzfOzx+O6zu/s8fd9o95Xfrthi8lYhMN5oNnw9ffw9Pjw9Pf8/f6ewO/m8O9zmdE6aapsjdyUwouPxWPDzd6XteOSs9B5nNVpnpqHt7h/s6F6n9d7ntSTttGHwVh4qp+Ev1HH7ox6qk5wj+Hm8e3t9fOm0IKAtqOBpNrx+P9ljcyhs9FpkM2hv+/u8/fF0eOLu4N+vFKgzX3p9OSFqN13qExekIl4n9j7/P3x9PhxmNDm8e9Vg8Zfkozr8veq0YTX9qL//92AtamOwnHFz96Fot1diMh+pd13ntmatu+YyW/3+/+Tqs5UgcShzJNbhsdTf8GHs7bo8PaXtuqMr+Ty8/SZt+SUqs7r7Ox3ndb9/f7t8feZyXGYyWWCpNbz9PRuiteNtNDn7/V4ntjx8fGo3JqNAAAAv3RSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AEVuhDkAAAD+SURBVBhXY5jHzcUMAqxAICq9bx8D96adDFAgaGQOFOBaH7h7zoqZDTlFyptncAAFWBjyi52CXCI0unRLxcECPhsatbbzmlXMnS60hg0kkOxW0uNrq93tNaFpD1ggUm21QK532ZQdSm1hmXKdDCwdnOWVOi1RjNGMQCCrwMDMJ8NZ4LAynVGPkXFp8zpJBubYmn579wXtqhZb0iwn9a1iWLaViYmJ3891obOwYtLEvcYMGyWAAkwJdv6accEhi8LjGVr11SenpC5f61g3NcO0vjCAIc+DjZ2dnWexddWSbYa9nlkM+8BgWsxsK7FZ1VLzRaACNokmtdnyu1QMQgF7Rlh4zWWTAwAAAABJRU5ErkJggg=="},
   { label: "Запомнить значок веб-сайта как base64", func: "copyFaviconData()", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAI2bv/9RVpf/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAACIkvD/Jia6/ywpq/8AAAAAAAAAAAAAAAAAAAD/AAAA/wbwAf90qpv/Ymic/1RWqP9OUKr/W2Ch/2dumf9YYKT/Ly/B/xQP3/8MB9P/JCGb/wAAAAAAAAAAAAAAAAAAAP8G8AH/U5ea/ycr8f8VIP3/HiP4/ywo8v8sIvb/LCL2/ywi9v8KBOj/BQDe/wQAtv8tK4P/AAAAAAAAAAAAAAD/BvAB/3Sqm/9iaJz/Tim3/0UuuP9GPrT/R0ex/zk8uf8gIMz/FRDe/xEMzv8jIJz/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAP8AAAD/SqOR/yImvP8sLKj/AAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAD/AAAA/wAAAP8AAAD/BvAB/3Sqm/9KW5r/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAAAAAAAAAAAAAAAAAAABvAB/wbwAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BvAB/wbwAf8G8AH/AAAAAAAAAAAAAAAAAAAAAAAAAAAG8AH/AAAAAAAAAP8G8AH/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BvAB/wbwAf8AAAAAAAAA/wAAAP8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAAAG8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOesQQBjrEGAAaxBwACsQcABrEHDg6xBwAesQcAPrEHAD6xBw8+sQcPprEHD8axBwAGsQQABrEGAAaxB//+sQQ=="},  
   { separator: ''},
   { label: "Сохранить ярлык страницы как…", func: "saveShortcuts('true')", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP8E/yT/BP8k/5XLDv/zqgD/86oA//I1///yNf//86oA//OqAP/zqgD/86oA//OqAP+Vyw7/lcsO/wT/JP8E/yT/BP8k/5XLDv+Vyw7/86oA//OqAP/yNf//8jX///OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//02AP/9NgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/9NgD//TYA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA/wA31v8AN9b/86oA//9If///SH//86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP8AN9b/ADfW//OqAP//SH///0h///OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/5XLDv+Vyw7/86oA//OqAP/zqgD/86oA/0CA//9AgP//86oA/07+9f9O/vX/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP9AgP//QID///OqAP9O/vX/Tv71//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ=="},
   { label: "Сохранить ярлык страницы без запроса на сохранение", func: "saveShortcuts()", image: false},
   { separator: ''},
   { label: "Сохранить всю страницу как PNG", func: "WebScreenShot.captureAll()", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAiAcFBa4KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwsJCaECAQE/BQMDAAAAAJUgICD4V1ZW/2FhYf5hYWH/YmFh/2BgYP9fX1//X19f/19fX/9gYGD/YmFh/2FhYf9gYGD+ZmVl/1RSUuIVFBQtCgkJy1paWv+Li4v9h4eH/oiIiP6FhYX+i4uL/pKSkv6Sk5P+kpKS/ouLi/6FhYX+iIiI/oiIiP6Hh4f7lZaW/25tbYQNDQ3OcHBw/5KSkv6Li4v/i4uL/5mZmf+EhIT/ZGRk/1tbWv9kZGT/hISE/5mZmf+Li4v/jY2N/4yMjPyWl5f/iomJjQ4NDc13d3f/m5ub/pWVlf+goKD/XFxc/ygoKP8fHyD/GBsb/yAhIv8pKSn/W1tb/6CgoP+Wlpb/lpaW/J6env+Jh4eMDg4OzX1+fv+ioqL+qqqq/1hYWP8ZGRn/Ghwb/x4dHP8mIh//FhQR/xUWF/8aGhr/WFhY/6urq/+cnJz8pKSk/4qJiYwPDg7Ng4OD/7W1tf6MjIz/Ghoa/xYYGP8uKCb/ZEAo/5xyOP++saL/RD45/xISE/8bGxv/jY2N/6+vr/ypqan/ioiIjA8PD82IiIj/xMTE/l1cXP8LDAz/JiId/1o3LP9ADgD/mGog//Dt6P/VysX/Ih4Z/wsMDf9eXl7/v7+//K6urv+KiYmMEA8PzY+Pj//Kysr+SEhH/wEDBv9MPi7/hlES/3dCAP+VZAn/tJVO/7eVXf9OQTL/AAIE/0pJSf/FxcX8tLS0/4qJiYwQEBDNm5ub/9/e3/5SUlL/AAAA/0M7Mf/aya7/ybiO/5RmEf9aIAD/cjkX/z80KP8AAAD/U1JS/9nZ2fzAwMD/i4qKjBEREc2oqKn/8O/w/oeGhv8AAAD/DAsK/6qkof/17uj/nW8l/14eCf9hPTr/ExUU/wAAAP+Hh4f/6urq/MzMzf+Mi4uMERERzbCwsv/r6uz+3Nzd/yoqKv8AAAD/ExEP/2heU/9yWjv/UD0u/xcXFv8AAAD/Kioq/93d3v/l5eb81NTV/4yLi4wSERHNuLm5/+/v8P7z8/P/xsbG/yAgIP8AAAD/AQEB/wAAAP8BAQH/AAAA/yAgIP/Gxsb/9PT0/+np6vzb29v/jIuLjBIREc2+vb7/+Pj5/uvr7P/7+/v/4ODg/3Nyc/8uLi7/Hh4d/y0sLP9zc3P/4ODg//v7+//s7O3/8/P0/OHg4f+Mi4uLFBMTyMPDw//////7+Pj4/ff29v38/Pz9/////fr6+v3u7u79+vr6/f////38/Pz99/b2/fn5+f37+/v53t7e/5KSko4GBgZ7m5yc//j4+P/w8fH/8fLy//Dw8P/u7u7/8vLy//X19f/y8vL/7u7u//Dw8P/x8vL/8vLy/uXl5f/BwcH+k5GRUAAAAAQeHR1yb25uxn59fcZ9fHzGfXx8xn18fMZ9e3vGfHt7xn17e8Z9fHzGfXx8xn18fMZ9fHzGgH9/xYmIiGVaV1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
   { label: "Сохранить видимую часть страницы как PNG", func: "WebScreenShot.capturePage()", image: false},
   { label: "Сохранить выбранный элемент страницы как PNG", func: "WebScreenShotByClick.init()", image: "data:image/x-icon;base64,AAABAAEAIBkAAAEAIAAMDQAAFgAAACgAAAAgAAAAMgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29fT/2tra/8jIyP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8jIyP/a2tr/9vX0/+zs7P/ak0b/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/9qTRv/s7Oz/7Ozs/+J9Dv/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+/6SdmP/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r/+vn4//z7+v/6+fj/4n0O/+zs7P/s7Oz/4n0O//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r/aFtT//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//j39v/ifQ7/7Ozs/+zs7P/ifQ7/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P9oW1P/7+zq/+/s6v/v7Or/8O3r//Dt6//w7ev/8O3r//Dt6//w7ev/8O3r/+/s6v/w7ev/9fTy/+J9Dv/s7Oz/7Ozs/+J9Dv/49/b/+Pf2//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4/2hbU//q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/y8O//4n0O/+zs7P/s7Oz/4n0O//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/aFtT/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe//Dt6//ifQ7/7Ozs/+zs7P/ifQ7/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P9oW1P/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/7uro/+J9Dv/s7Oz/7Ozs/+J9Dv/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx/2hbU//x7+3/8vDv//Hv7f/x7+3/8e/t//Lw7//x7+3/8e/t//Lw7//x7+3/8vDv//Hv7f/29fT/4n0O/+zs7P/s7Oz/4n0O//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//aFtT/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/8vGwf/ifQ7/7Ozs/+zs7P/ifQ7/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f9nWlL/aFtT/2hbU/9nWlL/Z1pS/2hbU/9oW1P/Z1pS/2daUv9oW1P/aFtT/2hbU/9nWlL/pJyX/+J9Dv/s7Oz/7Ozs/+J9Dv/w7ev/8O3r//Dt6//w7ev/8O3r//Dt6//x7+3/8O3r//Dt6//w7ev/8e/t//Dt6//w7ev/8O3r//Hv7f/w7ev/8O3r//Dt6//x7+3/8O3r//Dt6//w7ev/8e/t//Dt6//w7ev/8O3r//Dt6//w7ev/4n0O/+zs7P/s7Oz/4n0O/+/s6v/v7Or/7uro/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/u6uj/7+zq/+/s6v/ifQ7/7Ozs/+zs7P/ifQ7/7uro/+7q6P/u6uj/7uro/+zo5v/u6uj/7uro/+7q6P/s6Ob/7uro/+7q6P/u6uj/7Ojm/+7q6P/u6uj/7uro/+zo5v/u6uj/7uro/+7q6P/s6Ob/7uro/+7q6P/u6uj/7Ojm/+7q6P/u6uj/7Ojm/+J9Dv/s7Oz/7Ozs/+J9Dv/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/4n0O/+zs7P/s7Oz/4n0O/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/ifQ7/7Ozs/+zs7P/ifQ7/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+J9Dv/s7Oz/7Ozs/+J9Dv/m4d7/5uHe/+bh3v/p5eL/5uHe/+bh3v/m4d7/6eXi/+bh3v/m4d7/5uHe/+nl4v/m4d7/5uHe/+bh3v/p5eL/5uHe/+bh3v/m4d7/6eXi/+bh3v/m4d7/5uHe/+nl4v/m4d7/5uHe/+bh3v/p5eL/4n0O/+zs7P/s7Oz/4n0O/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/ifQ7/7Ozs/+zs7P/ifQ7/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+J9Dv/s7Oz/7Ozs/+J9Dv/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/k39z/4n0O/+zs7P/s7Oz/4n0O/+Lc2f/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/ifQ7/7Ozs/+zs7P/ifQ7/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+J9Dv/s7Oz/9fTy/+J9Dv/8+/r/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/4n0O//X08v/8+/r/6KFU/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ooVT//Pv6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
   { label: "Сохранить выбранную область страницы как PNG", func: "WebScreenShotByClipping.init()", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAADDn2Hfz5pE/8eVQP7IlkH/yJZB/8iWQf/IlUH/yJVA/8iVQP/IlED/yJQ//8iUP//IlD//yJM+/8iTPv/Hkj3/nI1w//bDbP//8OH//+zW///s1///69b//+rV///p1P//59L//+XQ///izf//38n//9vG///ZxP//1b///dG////Prf/KlkX/88N4/v37///99Pj//fT6//vy9v/68fT/+u/y//rt8P/66u3/+ufq//rl6P/64eT/+93h//3a3//71d7//9LK/86XR//0xHb//vv////18///9fT///f5///4////9f7///P8///v+f//7Pb//+nz///m8f//4eb//9vZ//3Y2v//1Mb/zphH//TGd//+/////Pj1///7///Q58r/m9aV/6TZnv+i15r/otWY/6LTlv+j0pb/mc6M/9DXuf//3+P//Nnc///Wyf/OmUf/9MZ3//7////8+/j//////53WnP+Y5pn/rvGv/6PvpP+e7p//me6b/5nvm/95533/mM+L///j7f/629z//9jL/86ZR//0xnf//v////z9+v//////qtup/8Xzxf/a/tn/z/vO/8n7yf/D+sL/xPvD/6Hzo/+j05b//+Tu//re3///2cz/zplI//XGeP/+/////P36//////+n26f/uvC6/9T71P/K+Mr/xvjG/8D3wP+/+L//nfCf/6LTlf//5u//+t/g///cz//OmUj/9MZ3//7////8/fr//////6rcqv/G9MX/3//f/9n92f/V/NX/0PzQ/9H+0P+s9a7/pdSY///o8f/64OL//9zP/86aSP/0xnf//v////z9+f//////ndid/5TjlP+v7q//qeyp/6jsqf+k7KX/p+6n/4Tlh/+Z0Y7//+r0//rh4v//3tH/zppI//TGd//+/////v77///////Y8Nj/p9+n/6/jr/+t4a3/rd2p/67bpv+u2ab/p9Wc/9jgx///6Oz//OPl///e0f/Omkj/9MV1//7//////fr///78///+/f///////////////////P////j////0+///8fn//+vu///m4v/94+P//97P/86ZSP/zx3v//v/////+/f///////f////v////7////+/////v+///7+///+/f///vz/P/98Pr//+33//3p9///5OL/zppL//a1Sv/0xoL/9cR7//XEfP/1xHz/9cR8//XEfP/1xH3/9cR8//XCev/1wXr/9b94//W9d//1u3X/87l0//y6bP/Llj7/+pMA/vWBAP/1gwD/9YMA//WDAP/1gwD/9YMA//WDAP/1gwD/9YQA//WEAP/1hAD/9YQA//WEAP/zhAH//okA/8qLIv3xpzP/4ptV/+OdU//jnVP/451T/+OdU//jnVP/451T/+OdU//jnVL/451S/+OdUv/jnVL/451S/+GdVf/qnUf/2aRJ/9q0c9/8yn7/98V5/vjGev/4xnr/+MZ6//jGev/4xnr/+MZ6//jGev/4xnr/+MZ6//jGev/4xnr/+MZ6/vrIe/+jj2y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
   { separator: ''},
   { label: "Сохранить всю страницу как PDF", func: "savePageToPDF()", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYUw4pJt3V/+Rb1D8lnFP/55zTf+VcVH/lXJS/5VyUv+VclL/lXJS/5VyUv+VclL/k3BR/J56Wv9cRzSkAAAAAJNvUKTto2L/4ppe/uehZf/Pmmr/noZv/9Scav/Wl17/1plh/9eZYf/XmWH/15lh/9eZYf/WmGD/2Jlg/suRXP9mRiuk8rWA/397dP1akKn/rqqi/3LF3f8Mntj/4dLJ///+9f/48u3/9e7n//bt5v/47+f/+O/n//jv5//rvZP/1ZJX/a9/VP9+lrD8AIvz/xOt+f8Douv/ALb6/wC28/9tmar/z8jJ//Lq5/////7//v////n9///6/P3//////+Ta0P/PjVP/pnpT/IWds/+aiXj/5efl/8Px//951/3/LMz//wCx8/8GltL/NIu3/4ycqf/l29L////+//n6+//8/v//3tXM/8+OVP+oe1P/6K57/86QWP/r6Ob////////++v/r9/z/oOb9/zDL//8Arf//AI/r/ydysv+hpqr//PTr///////d1Mz/0I5U/6h7U//osH//wo5g/+fm5P/7/f//9vf5//z7+////vv/9/r8/5Dc/P8Oqv7/AJf//wF02v9ffZ7/8Ojh/+Ha1P/NjFL/qHtT/+ewf//Ej1//7O3r///////+/v7//v7+//f5+v/6+vv////8/8Tq/f8hp/7/AJH//wB18/8/bqj/1MGu/9mXXv+leVH/569+/8iSYv+/tKn/wLew/8O5sf/P0M////////7+/v/3+fv////7/9Hv/v8hoP3/AIn//wB4/v84ZqL/w4NH/619VP/nsYD/x45c/9W5of/bv6j/0Jxt/6J/YP+spqD/2N3i//7////6+/3///76/8vr/v8Slv7/AIb+/wBz//83VH7/nW1B/+ewfv/Fjl7/7Ozr///////9+/r/9d7K/9Ghdv+jd1D/pJ6Y/+jt8f/9///////7/6fb/v8Ahv7/AYD//wRp6f95YlT/57B//8SOXv/n5uT//v7///r7/P/8/v////////XRsv/DhEv/loBu/9DX3P/9/v/////7/2O6/f8Afv//FnTU/5JtTf/nsH//xY9e/+jn5f/+/f//+fj5//n4+P/5+Pn/+/////Xbxf/Wj1D/nX1h/+Ll6P////7/3+/3/w+V//8tcbP/qHJB/+WuffzCjV7/5efn///////+/v7//////////////v7///////XRsP/TnW3/8fT3//////////z/ddD//0Nxl/+zdkH88LmH/9CRWP2+qJT/0M7N/8/Jxv/Pysf/z8rH/8/Kxv/Py8n/zsO6/7+pmP/PzMv/zsnG/9bNyP+nsK7/h4R3/b2BT/+Sb1Ck7qxw/9GSW/69hlb/wYhX/8CIV//AiFf/wIhX/8CIVv/BiVj/xI1d/8CIVv/BiFf/vYZW/9STW/7ppmv/bE80pAAAAACUd16k+sui/+7AmPzwwpr/8MKa//DCmv/wwpr/8MKa//DCmf/vwZj/8MKa//DCmv/uwJj8+cui/5N3XaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
   { label: "Добавить url и сохранить страницу", func: "savePage()", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAyMjIzwyMjFeLi0tVS8vLlcuLy9XLS4uVywsLFUuLi5aKSkpUggICBMAAAAAAgICAQAAAAAAAAAAAAAAABQTEyOgoJ/yysvL/s3Pz/7Z293/4OPk/+bp6f/t7u7/5eXl/LOysv97e3vLFRUWJQAAAAACAgIDAAAAAAAAAAA8PDxSz9HT/83Qz/fLx8T8z7+5/M/AsPzez8n89e3r/PDx8fyusLL43dzc/52dndMWFhY2AAAAAAICAgIAAAAAODg5T8bEv/+9o476vIR1/7WDcv+uj3v/spCA/8Wqk//Gtab/rqyq/+Pk5fn19fX+np6e4BQUFCgAAAAAAAAAAC4uJU29oYj/wLao+tLDqf/Mv7P/yLik/7zEvP/F0cr/v62Y/6+Kef/Z2NP/6Ors+d3c3P97e3vNBAQEDgIDAAZhRCuYxaSb/8Gvqfu2inL/vIF0/7FmUv+ygG//waaX/8m8tP/CoIn/vqOF/9zg3//l5ef7ycnJ/zY2Nm0hFw08rGJD/6BlYf2mWUD/rW9g/7aNff+ZRyL/pmxR/7RyWv+qaEz/uYR0/69kSf/k1tD//////Ozs6/1iYmK4WTMck61mVv+Yemj8hjsg/51bQ/+wem//n084/6+pq/+3p6H/l0Ux/4lFOf+gWDr/zq2X//b7/fzo6Oj/YWBgsXpXSbnMsp//wNC8/I9jWv+WX1X/tn5w/7iKfv/Tzc7/ztXc/513bf+MSjH/rWJG/7iRd//o7Oz85OPl/2BgYLN1aFqu2tO+/7ejnvyohYD/ybGb/7q1ov/HwrX/7/Lr//T19v/Hzs3/p4V0/6hvW/+6gHf/4uDh/N3e3v9hYWC0dWNPuaVXRP6cfWv8w7Gz/8vHsv/U2dP/4OHf//b08//9/Pv/3drZ/7rBw/+0ppv/wZ2F/9zc3PzW1tj/ZWRktE1HPW2oa1f/lX1t/cTP0v/Ew8T/3Nvd/9LR0//W1tf/5OXl/+/t6v/i6vD/wK+i/8y2o//b3t/81NTU/2FhYbMMDAsPsZ2a1tDX2P++vL390c/P/+Dh4P/b29r/09PS/9rY1//6+Pf/8PP3/8Kqlf/c0sv/3N7g/NTU1P9iYmKyAAAAAEY6MmXozcP/5ezt+OHk6Pzt7Oz9+Pj4/urq6/zs7/T8+f///NXGsPzey8P87vDy/OXm5vnf39//ZWVlrgAAAAAGBQQQdFdHy8Wfhv/d18797e7w/+3t7P/y8u7/7N/G/7unff+/uqT/4+Tl/97d3v/c3Nz/sLCw+h8fH0IBAQABAAEBABEVFx8vJB1cWy8ciZNrU8itknHrkWdIxUsqFnEnJSBRMjQ3WS8uL1csLCtVMjIyXiIiIj4BAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="},
   { label: "Сохранить выделенный текст как txt файл", func: "saveSelectionToTxt()", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAQE6AAAAZAAAAGgAAAJmAAACZgAAAGYAAABmAAAAZgAAAGYAAABmAAAAZgAAAGYAAABlAAAAaQABAmYAAQEjAAAAADlVkOdVcKHxVXKi8kdklPJLZpfyU3Cg8lJvn/JRbZ7yUW+g8lFun/JRbp/yUG6e8lVyofFVdKjzLkV45wAAAFABAQEAaIzF/3y34v9wsuL/cJe0/0lpgv9bjLP/dLLh/2+v3v9sq9v/cK3d/3Gv3v9sqtv/b7Df/4G77P9VcqT2AAAAVAMDAQBnir/+ZqfU/pDB4/7a3uD+j46N/kxYXv6To6/+1er4/tXp+P7J3/D+1ej4/svg8v6Gut/9aqzd/lhxnvAAAABSAwIBAGaIvv9pptX/ocfj//f4/P/P0tX/g4CA/1xZWf+Woqr/2uz8/9Hl+f/W5fT/2Of3/5fC4v5tq93/Vm+e8QAAAFIDAgEAaYm+/3mw2/+iyeX/9Pn8/+z0+//IzNL/d3h5/0tMTv+Mkpn/xdvs/9Hp/f/O4PL/msXk/nmz4/9XcJ/xAAAAUgMDAQBti7//k7/h/6fL5v/v9fn/4u73/9Dk9P+8wMT/YGpx/zJJWv94iJf/ztzo/9Pp/P+ZwuD+gLfk/1dwnvEAAABSAwMBAHOPwf+myub/sNHp//j7/P/6/P3/8fr///r39P+sxdP/IXWq/xJJcv+NjZD/0+Lu/6TN7f6Ft+L/WXGf8QAAAFIDAwEAd5LD/7PR6/+ZxOP/0ePx/97r9f/Y5/L/3e32/8Tc7f9gseT/CHK3/zBYdv+HiY7/lL/f/pLE7/9bcJ3xAAAAUgMDAQB4k8P/xNvx/5/F5f+kyOX/qMrn/6TH5f+kyOX/sM/q/5e51P9Mm83/GHm3/xxIav9fdYf+pMvs/1x1pfIAAABTAwMBAHmSxf/O4/T/y9/y/8Hb9P/C3PX/wNv0/7vW7/+93ff/utDm/42fsf9Gjbn/EXS2/ytSbv6Fj5r/WnGc8gAAAFICAwEBepPE/tHk9f/S5PX/vMjV/7fCzP+3w8//uMPP/7XBzP+6ytf/qa+4/3h/hv9Ghaz/JoO+/jNXdP82PVnyAAAAVgACAgCBmcb/2+r3/dHh8fyPkpX/kI6N/5yam/+dnJ3/paWk/6enpf+sr6//mpSR/3Bubf9SjbD8H4C+/QsrSvcCAAB/AAAAA3yVx//j8///3u/7/52gpf6pqKf+uLm5/rq7u/7Ly8v+ycnI/paWlf6LjY/+np2f/Xh+g/5gnL7/MX+y/xcgJ80BAgNNN1OUs6W84fDA1O73mJyj/ainpv+2trb/t7e4/8fHyP/Fxsb/kZGQ/4eGhP+vucT/j6G+/W53k/NlkbnwNoOv/AgiNb8CCBsQDRo/YwsaO3B0d33arKyp9q2trfWvr6/2u7u79ru7vPawr7H1sbCt9nJ2gOQIGD6bFCFEYB0qPE1Bf6SpEz9cggAAAAMCAQEBAQAAADIyMmlDQ0ONQUFBhUFBQYVCQkGFQkJBhUhISIRNTU2OKysrZAEAAAUBAQAAAgEAAAkEAAEDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
   { separator: ''},
   { label: "Запомнить изображение как base64, в контекстном меню", value: "CB.Save.WebScreenShotOnImage"},
   { label: "Сохранить выделенный текст в файл, в контекстном меню", value: "CB.Save.SelectionToFile" },
   { label: "Открыть выделенный текст в внешнем редакторе, в контекстном меню", value: "CB.Save.TextToEditor"},
];

var menuPopup = self.appendChild(document.createElement("menupopup"));
array.forEach((m,i)=> {
   if ("separator" in m) { menuPopup.appendChild(document.createElement("menuseparator")); return };
   var mItem = menuPopup.appendChild(document.createElement("menuitem"));
   mItem.setAttribute("label", m.label);
   mItem.setAttribute("class", "menuitem-iconic");
   if ("image" in m) mItem.setAttribute("image", m.image || array[i-1].image); 
   if ("value" in m) { 
       mItem.setAttribute('type', 'checkbox');
       mItem.setAttribute('checked', cbu.getPrefs(m.value) );
       mItem.onclick =()=> cbu.setPrefs(m.value, !cbu.getPrefs(m.value));
       }
   if ("func" in m) mItem.addEventListener("command", ()=> eval(m.func.toString()));
});
menuPopup.setAttribute("onclick", "event.stopPropagation()");



// Сохранить как PNG страницу или части страницы .............
WebScreenShot = {
   capture: function(win, x, y, width, height) {
      var canvas = document.createElementNS(xhtmlns, 'canvas');
      canvas.width = width;
      canvas.height = height;
      var ctx = canvas.getContext("2d");
      ((i = 17)=> { 
         try { ctx.drawWindow(win, x, y, canvas.width, canvas.height, "white") }
         catch(e) { canvas.height = canvas.width*i; arguments.callee(--i) };
      })();
      var url = makeURI(canvas.toDataURL("image/png"));
      
      var fp = window.makeFilePicker();
      fp.init(window, "Сохранить как…", fp.modeSave);
      fp.appendFilter("", "*.png");
      fp.defaultString = getTabLabel() + "  " + (new Date().toLocaleFormat("%d.%m.%Y. %H:%M:%S")) + ".png";
      if (fp.show() == fp.returnCancel || !fp.file) return;
      
      var wbp = window.makeWebBrowserPersist();
      parseInt(Services.appinfo.version) < 36
      ? wbp.saveURI(url, null, null, null, null, fp.file, null)
      : wbp.saveURI(url, null, null, null, null, null, fp.file, null); // если FF36+
   },
   captureAll: function() {
      var win = content;
      WebScreenShot.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY);
   },
   capturePage: function() {
      var win = content, doc = win.document, body = doc.body, html = doc.documentElement;
      var scrX = (body.scrollLeft || html.scrollLeft) - html.clientLeft;
      var scrY = (body.scrollTop || html.scrollTop) - html.clientTop;
      WebScreenShot.capture(win, scrX, scrY, win.innerWidth, win.innerHeight);
   },
   onImage: function(image) {
      var canvas = document.createElementNS(xhtmlns, 'canvas');
      canvas.width = image.naturalWidth;
      canvas.height = image.naturalHeight;
      var ctx = canvas.getContext('2d');
      ctx.drawImage(image, 0, 0);
      var base64 = canvas.toDataURL();
      gClipboard.write(base64);
   
      // стиль для изображение в сплывающей подсказке ....
      var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
      var uri = makeURI('data:text/css,'+ encodeURIComponent('#alertImage { height: 25px !important; width: 25px !important; }'));
      sss.loadAndRegisterSheet(uri, 0);
      
      alertsService.showAlertNotification(base64, self.label, "Запомнил изображение как base64", false, "", (s, t)=> { 
         if (t == 'alertfinished')
             sss.unregisterSheet(uri, 0); // удалить стиль когда подсказка закрывается
      }, "");
   }
};

// Сохранить выбранную область страницы как PNG ....
WebScreenShotByClipping = {
   capture: WebScreenShot.capture,
   handleEvent: function(e) {
      if (e.button) return false;
          e.preventDefault();
          e.stopPropagation();
          switch(e.type){
                 case 'mousedown':
                    this.downX = e.pageX;
                    this.downY = e.pageY;
                    this.bs.left = this.downX + 'px';
                    this.bs.top = this.downY + 'px';
                    this.body.appendChild(this.box);
                    this.flag = true;
                    break;
                 case 'mousemove':
                    if (!this.flag) return;
                    this.moveX = e.pageX;
                    this.moveY = e.pageY;
                    if (this.downX > this.moveX) this.bs.left = this.moveX + 'px';
                    if (this.downY > this.moveY) this.bs.top  = this.moveY + 'px';
                    this.bs.width = Math.abs(this.moveX - this.downX) + 'px';
                    this.bs.height = Math.abs(this.moveY - this.downY) + 'px';
                    break;
                 case 'mouseup':
                    this.uninit();
                    break;
          }
   },
   init: function() {
      this.win = document.commandDispatcher.focusedWindow;
      if (this.win == window) this.win = content;
      this.doc = this.win.document;
      this.body = this.doc.body;
      if (!this.body instanceof HTMLBodyElement){
          alertsService.showAlertNotification(self.image, self.label, "Не удается захватить!");
          return false;
          }
      this.flag = null;
      this.box = this.doc.createElement('div');
      this.bs = this.box.style;
      this.bs.border = '#0f0 dashed 2px';
      this.bs.position = 'absolute';
      this.bs.zIndex = '2147483647';
      this.defaultCursor = getComputedStyle(this.body, '').cursor;
      this.body.style.cursor = 'crosshair';
      ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.addEventListener(type, this, true));
   },
   uninit: function() {
      var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)];
      this.body.style.cursor = this.defaultCursor;
      this.body.removeChild(this.box);
      this.capture.apply(this, pos);
      ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.removeEventListener(type, this, true));
   },
};

// Сохранить выбранный элемент на странице как PNG ....
WebScreenShotByClick = {
   capture: WebScreenShot.capture,
   getPosition: function() {
      var html = this.doc.documentElement;
      var body = this.doc.body;
      var rect = this.target.getBoundingClientRect();
      return [
              this.win
             ,Math.round(rect.left) + (body.scrollLeft || html.scrollLeft) - html.clientLeft
             ,Math.round(rect.top) + (body.scrollTop || html.scrollTop) - html.clientTop
             ,parseInt(rect.width)
             ,parseInt(rect.height)
          ];
   },
   highlight: function() {
      this.orgStyle = this.target.hasAttribute('style') ? this.target.style.cssText : false;
      this.target.style.cssText += 'outline: red 2px solid; outline-offset: 2px; -moz-outline-radius: 2px;';
   },
   lowlight: function(e) {
      if (this.orgStyle) this.target.style.cssText = this.orgStyle;
      else this.target.removeAttribute('style'); 
   },
   handleEvent: function(e) {
      switch(e.type){
             case 'click':
                if (e.button) return;
                e.preventDefault();
                e.stopPropagation();
                this.lowlight();
                this.capture.apply(this, this.getPosition());
                this.uninit();
                break;
             case 'mouseover':
                if (this.target) this.lowlight();
                this.target = e.target;
                this.highlight();
                break;
      }
   },
   init: function() {
      this.win = content;
      this.doc = content.document;
      ["click", "mouseover"].forEach(type=> this.doc.addEventListener(type, this, true));
   },
   uninit: function() {
      this.target = false;
      ["click", "mouseover"].forEach(type=> this.doc.removeEventListener(type, this, true));
   },
};


// Сохранить страницу как PDF файл через сервис 'pdfmyurl.com' .............
function savePageToPDF(loc = content.location) {
   loc.href.startsWith("http") && loadURI("http://pdfmyurl.com?url=" + loc);
}; 

 
// Сохранить ярлык страницы в указанную папку или в последнюю папку сохранения ..............
function saveShortcuts(saveAs, shortcutName) {
   var url = content.document.location;
   cbu.isPref(pref, "C:\\");
  
   // блокируем создание ярлыков для внутренних страниц FF
   if ( ["about:", "chrome:", "jar:", "data:"].indexOf(url.protocol) !== -1 ) {   
         alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", self.label, "Не поддерживается");
         return;
         }          
   
   // получить название ярлыка 
   if ( saveAs ) shortcutName = setPathToShortcut(shortcutName)
   else 
        shortcutName = shortcutName ? shortcutName : getSiteName() + getTabLabel() + " " + Date.now();
   if ( saveAs && shortcutName == false ) return;
   
   // сохранить иконку таба в установленную папку
   var faviconName = "favicon" + Date.now();
   var favicon = saveFaviconToFolder(faviconName);
 
   // получить путь для сохранения ярлыка из 'about:config' 
   var pathToFolder = gPrefService.getComplexValue(pref, Ci.nsISupportsString).data;
   var pathToShortcut = pathToFolder + shortcutName + ".url";
       
   // адрес страницы в UTF-8 если это протокол 'file' или в 'Punycode' если это .рф домен
   if ( url.protocol == 'file:' ) url = convertFromUnicode("UTF-8", url);   
   if ( url.host.slice(-3) == '.рф') url = Services.io.newURI(url, null, null).asciiSpec;
     
   // текст ярлыка из адреса страницы и пути к иконке таба    
   var text = "[InternetShortcut]" + "\r\n" + "URL=" + url;
   var pathToFavicon = "IconFile=" + faviconFolder + faviconName + ".ico" + "\r\n";
   if ( favicon == false ) var pathToFavicon = "";
   var data = text + "\r\n" + pathToFavicon + "IconIndex=0";      

   // записать текст в ярлык
   var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
   var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
   file.initWithPath(pathToShortcut);
   foStream.init(file, 0x02|0x08|0x20, 0666, 0);
   foStream.write(data, data.length);
   foStream.close();

   // подсказка
   var notification = 'Сохранил в: ' + pathToFolder;
   var image = (favicon == false) ? self.image : gBrowser.selectedBrowser.mIconURL;
   alertsService.showAlertNotification(image, shortcutName, notification);
};


// Установка пути и названия для сохранения ярлыка через диалог сохранения, отмена отдаст 'false' ..............
function setPathToShortcut(shortcutName) {     
   var pathToFile = gPrefService.getComplexValue(pref, Ci.nsISupportsString).data;
   var shortcutName = shortcutName ? shortcutName : getSiteName() + getTabLabel() + " " + Date.now();

   // диалог создания и установки пути    
   var fp = window.makeFilePicker();
   fp.init(window, "Укажите где сохранить ярлык страницы!", fp.modeSave);
   fp.appendFilters(fp.filterAll);
   fp.defaultString = shortcutName;
     
   if ( fp.show() == fp.returnCancel ) return false;          
     
   // убрать название файла из пути к файлу и записать путь в 'about:config'
   var filePath = fp.file.path.toString();
   var fileName = fp.file.leafName.toString();
   cbu.setPrefs(pref, convertFromUnicode("UTF-8", filePath.replace(fileName, "")) );      
   return fileName;
};


// Сохранить в указанную папку иконку таба как .ico и без диалога сохранения ..............
function saveFaviconToFolder(faviconName) {
   var url = gBrowser.mCurrentTab.image.replace("#-moz-resolution=16,16","");
   if ( !url || content.document.mozSyntheticDocument ) return false;
   if ( url.startsWith("http") ) url = "moz-anno:favicon:" + url;

   var img = new Image();
   img.onload = function() {
       var tools = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools);
       var stream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
       var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);

       var request = img.QueryInterface(Ci.nsIImageLoadingContent).getRequest(img.CURRENT_REQUEST);
       var istrm = tools.encodeImage(request.image, "image/vnd.microsoft.icon", "format=bmp;bpp=32");
       stream.init(istrm);
       var data = stream.readBytes(stream.available());
       istrm.close(); stream.close();

       var path = faviconFolder + faviconName + ".ico";
       file.initWithPath(path);
       file.exists() && file.remove(false);
       try { file.create(file.NORMAL_FILE_TYPE, 448) } 
       catch(e) {
          setTimeout(()=> {  
             alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", self.label,
             "Не могу сохранить иконку вкладки в " + faviconFolder + "\n" + "Укажите в начале кода кнопки другой диск!");
          }, 2500);
       };
       cbu.writeFile(path, data);
   }
   img.setAttribute("src", url);
};


// Добавить адрес наверху страницы и открыть диалог сохранения страницы .............
function savePage() {
   var sURL = gURLBar.value;
   content.document.body.innerHTML = "<table width=100%><tr><td align=left><small><a target=_blank href=" + 
                                        sURL + ">"+ sURL + "</a></small>\n</td></tr></table>" + content.document.body.innerHTML;
   saveDocument(window.content.document);
};


// Сохранить иконку текущего сайта с диалогом сохранения .............
function saveFavicon() { saveImageURL(gBrowser.mCurrentTab.image, "save", null, false, false, null, content.document) };


// Скопировать иконку текущего сайта как base64 код .............
function copyFaviconData() {
   var img = new Image();
   img.src = gBrowser.mCurrentTab.image;
   WebScreenShot.onImage(img);
};


// Сохранить выделенный текст или весь текст на странице как txt файл .............
function saveSelectionToTxt() {
   var sel = getSelect();
   !sel && document.getElementById("cmd_selectAll").doCommand(); 
     
   // создать название файла из заголовка страницы и текущего времени и сохранить текст ....
   var fileTitle = getTabLabel() + '  ' + (new Date()).toLocaleFormat("%H·%M·%S");
   saveURL("data:text/plain," + encodeURIComponent(content.location + ("\r\n\r\n" + sel)), 
                                fileTitle + ".txt", null, false, false, null, content.document);
   !sel && goDoCommand("cmd_selectNone"); 
};

 
// Добавляем в контекстного меню страницы новые пункты .............
((contextMenu, el)=> {
   // в контекстного меню изображений ....
   var baseItem = contextMenu.appendChild(document.createElement("menuitem"));
   baseItem.id = "content-baseItem";
   baseItem.setAttribute("label", "Запомнить изображение как base64");
   baseItem.onclick =()=> WebScreenShot.onImage(gContextMenu.target);

   // в контекстного меню выделенного текста ....
   var saveItem = contextMenu.insertBefore(document.createElement("menuitem"), el);
   saveItem.id = "content-saveItem";
   saveItem.setAttribute("label", "Сохранить выделенный текст в файл");
   saveItem.onclick =()=> saveSelectionToFile();

   var editorItem = contextMenu.insertBefore(document.createElement("menuitem"), el);
   editorItem.id = "content-editorItem";
   editorItem.setAttribute("label", "Открыть выделенный текст в внешнем редакторе");
   editorItem.onclick =()=> textToEditor();

   // устанавливаем где и при каких настройках показывать новые пункты ....
   addEventListener('popupshowing', e=> {
      if (e.target != e.currentTarget) return;
      var sel = gContextMenu.isTextSelected;
      saveItem.hidden = !sel || !cbu.getPrefs("CB.Save.SelectionToFile");
      editorItem.hidden = !sel || !cbu.getPrefs("CB.Save.TextToEditor"); 
      baseItem.hidden =  !gContextMenu.onImage || !cbu.getPrefs("CB.Save.WebScreenShotOnImage"); 
   }, false, contextMenu);

   // удалять новые пункти при изминениях ....
   addDestructor(()=> {
      baseItem.remove(); saveItem.remove(); editorItem.remove();
   });   
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-open"));


// Сохранить выделенный текст в файл на рабочем столе .............
function saveSelectionToFile() {
   // создать текст для записи
   var url = content.document.location;
   if (/\.рф/.test(url.host)) url = convertFromUnicode("UTF-8", url);
   
   var time = new Date().toLocaleFormat("%H:%M:%S");
   var text = convertFromUnicode("UTF-8", getSelect()); 
   var title = convertFromUnicode("UTF-8", getTabLabel());
   
   var text = "..............................................................\n"
            + title + " - " + time + "\n" + url + "\n\n" + text + "\n\n\n";
   var text = text.replace(/\u000A/g, "\u000D\u000A").replace(/\u000D\u000D\u000A/g, "\u000D\u000A");

   // путь к файлу и название файла
   var file = Services.dirsvc.get("Desk", Ci.nsIFile); 
   file.append("Save - " + (new Date()).toLocaleFormat("%d.%m.%Y") + ".txt");
          
   // создать файл с текстом или добавлять текст в файл
   var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
   file.exists() ? foStream.init(file, 0x02 | 0x10, 0664, 0) : foStream.init(file, 0x02|0x08|0x20, 0666, 0);
   foStream.write(text, text.length);
   foStream.close();

   // всплывающая подсказка дает возможность открыть файл если кликнуть на подсказке
   var notification = 'Сохранил выделенный текст в файл на рабочий стол'; 
   var image = gBrowser.mCurrentTab.image || self.image;
   alertsService.showAlertNotification(image, notification, "Кликни чтобы открыть файл", true, "", (s, t)=> { 
      if (t == 'alertclickcallback') file.launch();
   }, "");
};


// Создать текстовой файл с выделенным текстом в папке профиля и открыть в редакторе .............
function textToEditor() {
   var text = convertFromUnicode("UTF-16", getSelect()); 
   var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
   file.append("TextToEditor.txt");
   custombuttonsUtils.writeFile(file.path, text);
   file.launch(); 
};


// Конвертировать текст в юникод .............
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();
};


// Получить название домена с заглавным первым символом и без приставок( типа .ru и .com ) ..............
function getSiteName() {
   try { var domain = content.document.domain.split('.') } catch(e) { return "" };
   domain = (domain.length == 2) ? domain[0] : domain[1]
   return domain[0].toUpperCase() + domain.slice(1).split('.')[0] + " ";  
};


// Получить название вкладки без не сохраняемых символов и лишних пробелов ..............
function getTabLabel() { 
   var label = gBrowser.mCurrentTab.label;      
   var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
   return label.substring(0, 50);
};

    
// Получить выделенный текст из страницы или 'false' ..............
function getSelect() {
   var el = document.commandDispatcher.focusedElement;
   try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {};
   var sel = document.commandDispatcher.focusedWindow.getSelection();
   return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,"").replace(/\u000A/g, "\u000D\u000A").replace(/\u000D\u000D\u000A/g, "\u000D\u000A");
};



function runSaveSnapshotToHtml() {
var saveToFile = function (fileContent, fileName) {
    var uc = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    uc.charset = 'utf-8';
    fileContent = uc.ConvertFromUnicode(fileContent);

    var nsIFilePicker = Components.interfaces.nsIFilePicker;
    var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
    fp.init(window, '', fp.modeSave);
    fp.defaultString = fileName;
    fp.appendFilters(fp.filterHTML);
    fp.appendFilters(fp.filterAll);
    if(fp.show() == fp.returnCancel) return;
    var stream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
    stream.init(fp.file, 0x02|0x20|0x08, 0666, 0);
    stream.write(fileContent, fileContent.length);
    stream.close();
};
var resolveURL = function (url, base) {
    try {
        var ioService = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService);
        var baseURI = ioService.newURI(base, null, null);
        var absURI = ioService.newURI(url, null, baseURI);
        return absURI.spec;
    } catch (e) {}
};

var getSelWin = function (w) {
    if (w.getSelection().toString()) return w;
    for (var i = 0, f, r; f = w.frames[i]; i++) {
        try {
            if (r = getSelWin(f)) return r;
        } catch(e) {}
    }
};
var encodeImg = function (src, obj) {
    var canvas, img, ret = src;
    if (/^https?:\/\//.test(src)) {
        canvas = doc.createElement('canvas');
        if (!obj || obj.nodeName.toLowerCase() != 'img') {
            img = doc.createElement('img');
            img.src = src;
        } else {
            img = obj;
        };
        if (img.complete) try{
            canvas.width = img.width;
            canvas.height = img.height;
            canvas.getContext('2d').drawImage(img, 0, 0);
            ret = canvas.toDataURL((/\.jpe?g/i.test(src) ? 'image/jpeg' : 'image/png'));
        } catch (e) {};
        if (img != obj) img.src = 'about:blank';
    };
    return ret;
};
var toSrc = function (obj) {
    var strToSrc = function (str) {
        var chr, ret = '', i = 0, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\x22' : '\\\x22', '\\': '\\\\'};
        while (chr = str.charAt(i++)) {
            ret += meta[chr] || chr;
        };
        return '\x22' + ret + '\x22';
    },
    arrToSrc = function (arr) {
        var ret = [];
        for (var i = 0; i < arr.length; i++) {
            ret[i] = toSrc(arr[i]) || 'null';
        };
        return '[' + ret.join(',') + ']';
    },
    objToSrc = function (obj) {
        var val, ret = [];
        for (var prop in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, prop) && (val = toSrc(obj[prop]))) ret.push(strToSrc(prop) + ': ' + val);
        };
        return '{' + ret.join(',') + '}';
    };

    switch (Object.prototype.toString.call(obj).slice(8, -1)) {
        case 'Array': return arrToSrc(obj);
        case 'Boolean':
        case 'Function':
        case 'RegExp': return obj.toString();
        case 'Date': return 'new Date(' + obj.getTime() + ')';
        case 'Math': return 'Math';
        case 'Number': return isFinite(obj) ? String(obj) : 'null';
        case 'Object': return objToSrc(obj);
        case 'String': return strToSrc(obj);
        default: return obj ? (obj.nodeType == 1 && obj.id ? 'document.getElementById(' + strToSrc(obj.id) + ')' : '{}') : 'null';
    }
};

var mainWin = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content;
var selWin = getSelWin(mainWin), win = selWin || mainWin, doc = win.document, loc = win.location;
var ele, pEle, clone, reUrl = /(url\(\x22)(.+?)(\x22\))/g;

if (selWin) {
    var rng = win.getSelection().getRangeAt(0);
    pEle = rng.commonAncestorContainer;
    ele = rng.cloneContents();
} else {
    pEle = doc.documentElement;
    ele = (doc.body || doc.getElementsByTagName('body')[0]).cloneNode(true);
};
while (pEle) {
    if (pEle.nodeType == 1) {
        clone = pEle.cloneNode(false);
        clone.appendChild(ele);
        ele = clone;
    };
    pEle = pEle.parentNode
};
var sel = doc.createElement('div');
sel.appendChild(ele);

for (var el, all = sel.getElementsByTagName('*'), i = all.length; i--;) {
    el = all[i];
    if (el.style && el.style.backgroundImage) el.style.backgroundImage = el.style.backgroundImage.replace(reUrl, function (a, prev, url, next) {
        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, loc.href);
        return prev + encodeImg(url) + next;
    });
    switch (el.nodeName.toLowerCase()) {
        case 'link':
        case 'style':
        case 'script': el.parentNode.removeChild(el); break;
        case 'a': 
        case 'area': if (el.hasAttribute('href') && el.getAttribute('href').charAt(0) != '#') el.href = el.href; break;
        case 'img':
        case 'input': if (el.hasAttribute('src')) el.src = encodeImg(el.src, el); break;
        case 'audio':
        case 'video':
        case 'embed':
        case 'frame':
        case 'iframe': if (el.hasAttribute('src')) el.src = el.src; break;
        case 'object': if (el.hasAttribute('data')) el.data = el.data; break;
        case 'form': if (el.hasAttribute('action')) el.action = el.action; break;
    }
};

var head = ele.insertBefore(doc.createElement('head'), ele.firstChild);
var meta = doc.createElement('meta');
meta.httpEquiv = 'content-type';
meta.content = 'text/html; charset=utf-8';
head.appendChild(meta);
var title = doc.getElementsByTagName('title')[0];
if (title) head.appendChild(title.cloneNode(true));

head.copyScript = function (unsafeWin) {
    if ('$' in unsafeWin) return;
    var f = doc.createElement('iframe');
    f.src = 'about:blank';
    f.setAttribute('style', 'position:fixed;left:0;top:0;visibility:hidden;width:0;height:0;');
    doc.documentElement.appendChild(f);
    var str, script = doc.createElement('script');
    script.type = 'text/javascript';
    for (var name in unsafeWin) {
        if (name in f.contentWindow || !/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name)) continue;
        try {
            str = toSrc(unsafeWin[name]);
            if (!/\{\s*\[native code\]\s*\}/.test(str)) {
                script.appendChild(doc.createTextNode('var ' + name + ' = ' + str.replace(/<\/(script>)/ig, '<\\/$1') + ';\n'));
            }
        } catch (e) {};
    };
    f.parentNode.removeChild(f);
    if (script.childNodes.length) this.nextSibling.appendChild(script);
};
head.copyScript(win.wrappedJSObject || win);

head.copyStyle = function (s) {
    if (!s) return;
    var style = doc.createElement('style');
    style.type = 'text/css';
    if (s.media && s.media.mediaText) style.media = s.media.mediaText;
    try {
        for (var i = 0, rule; rule = s.cssRules[i]; i++) {
            if (rule.type != 3) {
                if((!rule.selectorText || rule.selectorText.indexOf(':') != -1) || (!sel.querySelector || sel.querySelector(rule.selectorText))) {
                    var css = !rule.cssText ? '' : rule.cssText.replace(reUrl, function (a, prev, url, next) {
                        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, s.href || loc.href);
                        if(rule.type == 1 && rule.style && rule.style.backgroundImage) url = encodeImg(url);
                        return prev + url + next;
                    });
                    style.appendChild(doc.createTextNode(css + '\n'));
                }
            } else {
                this.copyStyle(rule.styleSheet);
            }
        }
    } catch(e) {
        if (s.ownerNode) style = s.ownerNode.cloneNode(false);
    };
    this.appendChild(style);
};
var sheets = doc.styleSheets;
for (var j = 0; j < sheets.length; j++) head.copyStyle(sheets[j]);
head.appendChild(doc.createTextNode('\n'));

var doctype = '', dt = doc.doctype;
if (dt && dt.name) {
    doctype += '<!DOCTYPE ' + dt.name;
    if (dt.publicId) doctype += ' PUBLIC \x22' + dt.publicId + '\x22';
    if (dt.systemId) doctype += ' \x22' + dt.systemId + '\x22';
    doctype += '>\n';
};
var fileName = selWin ? win.getSelection().toString() : (title && title.text ? title.text : loc.pathname.split('/').pop());
fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '_').replace(/\s+/g, ' ').slice(0, 100).replace(/^\s+|\s+$/g, '');
fileName += (function () {
    var d = new Date(), z = function(n){return '_' + (n < 10 ? '0' : '') + n};
    return z(d.getHours()) + z(d.getMinutes()) + z(d.getSeconds());
})();
if(!/\.html?$/.test(fileName))fileName += '.html';

saveToFile(doctype + sel.innerHTML + '\n<!-- This document saved from ' + (loc.protocol != 'data:' ? loc.href : 'data:uri') + ' -->', fileName);
};


Или вы не о PNG говорили? scratch_one-s_head.gif В любом случае, все косяки вроде были поправлены.

Есть кнопка "Открыть страницу или выделенную ссылку в другом браузере":

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

Выделить код

Код:

// Настройка функций кликов мыши .................
this.onclick = function(e) {      
     if ( e.button == 0 ) menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft"); 
};




// Объявляем настройки и переменные для этой вкладки .................
var autoClose = true;  // true => автоматически закрывать меню
var dropmarker = false; // true => добавлять дропмаркер у кнопки

const pref = Application.prefs;
if ( dropmarker ) this.type = "menu";
const alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);



// Проверить наличие строки в about:config и если не существует записать пути к браузерам по умолчанию .................
const allPath = "C:\\Program Files\\Internet Explorer\\iexplore.exe,C:\\Documents and Settings\\Администратор\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe,C:\\Program Files\\Opera\\Opera.exe,C:\\Program Files\\Maxthon\\Bin\\Maxthon.exe,C:\\Program Files\\SeaMonkey\\seamonkey.exe";
if ( !pref.getValue("CB.OpenWith.pathToBrowser", 0) ) {
     pref.setValue("CB.OpenWith.pathToBrowser", allPath );
     pref.setValue("CB.OpenWith.removeMenuitem", "");
     };



// Создать меню для кнопки .................
var array = [
       { label: "Internet Explorer", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAABf2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjarZExS0JhFIaf71q0mA1dovFCFg0WogRJLeoggcNNHFRa9Ko3w/TjerOCfkKD0FItWf2BhqgpaI9agiCIfkMQtITchq9wKSLohQPPeZdz3nNAOy9KWdeA9YbrZFIJI5cvGEOPDDAKAEWrJeOmmeZHvT0gAO5nilLW+Zv8Ti5fAKEDuq14GtBLihcBfdOVLggT0K3VYhlEGQg52UwSRAcI2Iq7QKCk+AwItC3bBXENhBvlWgPECzBfrrQs0KYB25KOC1oHCObyBUOt1uxCbAJ8u32vtA+XVzB+0/eCRzCyABd3fe91GQGIsftWNRoBQPiTMPjsea+TMLQHvY7nvR97Xu8EfE9wvWZtOO3PuwgtCr/1Kpvq1Q9Azf2eVX4AwnD6ANkdSN/CwSFMVWFkBUw/ZGNo0bmvUrcCYLiVSSUM02lWa/UK/yy3suUCJJty26nZq64Rl7JeCRlLDWs2ZETC4Rgf5HRpEzoTj48AAAAgY0hSTQAAbZYAAHOMAAD2MgAAgUIAAHBtAADjXwAAMXgAABN0+ysqDQAAAv5JREFUeNqk0n1MTWEcB/Dvee655957dDv3VjepuUJohRHd0YSsoVHG2IwhsxUbxlrYbOafsmHzOsbGGNPQojEvxai8TBSSNKu8leqme+q+nvfjr27hT9+/nu3ZPvs9z+9L6bqO/wnBf4YeOlAU9e+tKZKl2QgHBVCyIHkQ+uVNcpBxWxabNq+ZacwzEZipoSeMBMwOZ0bs9KxCLjFlvslqiw3JDEVEj2fdmLKW3VM/pcmdqv3mM+1Zj1cf/BugYtJyShLmrdprjIwmKgzwiiymj+1FafZ1JHubUP7chWMP1doXVZWLaKiWPwD7jCVH47PWF+m0BbqZg0BsyJvWhsN5N+D97Efx/TWo64xFgvAdntd3rwgd1SfDf8DEOLNts5YVCZoRMEdhgFdRkN2M0hX1eHytoamwPDfIjx47h6ME8BJBYlrmhj7leyAMEGfajhBhYTTb4Fds2Jh0Sy/NC1GPGv3dW845D7p73vTTbvUQFuVnqAYruvvb4bXPnBMGBEtsujugQLNw2JrdgeO5nVRl20Tsbt7jMBaMKo+XZKKIAVkUBfh4QAoy0E1xKfTwylirRuyYn9qDM8su4cmXWdhavx+qRtGsCaCtAFFtRj0gQTdYoPkHIfX/ZIYBWQ86ooSIslVX0VrrUdYf6qkWuBKFYzTC2UyIYAiEoCDwfsUgCSKlen1E+drCDwN9XQ1HM7tz4ro6sMl9g/T1HrinVJ0/PTCyV8mzl9pX7ipWewNEDXyFroiNYWAu+/TOxhhDzsG6bXgfnULG7ys7ZXh31uVvqKnQNMicK32Jde3OwpDEMgNN3ZDe1kFueVAT7sHdYlPF1PiElVk/SmGwTgI7ORUxC8xgWEAngKgD3i+Ar9UDX9sH8A/O10ovr+WEJ1g8wby86ELXid7QRbgyl2+PdkoG8WMSApwdEk1D9KmQ3YPAj08Qay7fk19dzwcQHC4SoYySoLSPbq+ulNVmRuEXrrZMckXDMYXIVCRE3oOB1vq+/pe3y0Lfmo8A8ADA7wEATrdVy5ywgXEAAAAASUVORK5CYII=" },
       { label: "Google Chrome", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAABf2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjarZExS0JhFIaf71q0mA1dovFCFg0WogRJLeoggcNNHFRa9Ko3w/TjerOCfkKD0FItWf2BhqgpaI9agiCIfkMQtITchq9wKSLohQPPeZdz3nNAOy9KWdeA9YbrZFIJI5cvGEOPDDAKAEWrJeOmmeZHvT0gAO5nilLW+Zv8Ti5fAKEDuq14GtBLihcBfdOVLggT0K3VYhlEGQg52UwSRAcI2Iq7QKCk+AwItC3bBXENhBvlWgPECzBfrrQs0KYB25KOC1oHCObyBUOt1uxCbAJ8u32vtA+XVzB+0/eCRzCyABd3fe91GQGIsftWNRoBQPiTMPjsea+TMLQHvY7nvR97Xu8EfE9wvWZtOO3PuwgtCr/1Kpvq1Q9Azf2eVX4AwnD6ANkdSN/CwSFMVWFkBUw/ZGNo0bmvUrcCYLiVSSUM02lWa/UK/yy3suUCJJty26nZq64Rl7JeCRlLDWs2ZETC4Rgf5HRpEzoTj48AAAAgY0hSTQAAbZYAAHOMAAD2MgAAgUIAAHBtAADjXwAAMXgAABN0+ysqDQAAAzZJREFUeNpsk01oHAUYhp+Z2dnd7Mxmt7vJmqTJttk03QRCq6BSa4xYzMEg9mBEeymIRvSg3oqCBIUKgoI3vVjxoqAoBSvF4kG0jdg/WluLqZqkSdls9n9ndmdmZ3Z+PLQqVD94b9/7nN5H4D8nk5SS2cmwsW9YFHYhIBRcf33Z6f+57tf+BBMI/vkW/i2KqPSkn+1LvHUwFjmUQU4RQNf36NCl5Fr6d2b3+KdG903dt2+AewcgGt393OT4h++66gFD70BYRZRCmI5DrdmgYzcQ0LmGv37Ukp/e9NtnwUcCkGQ5Pf3CvScnd07te7iuElcGSI3k8dUUoqrSm8iAHcJum2xzmsmc7M4uIX/VDXxdAsjv3/nG7PMPzlcFuMvIMjqwi48CmffS2/lCjFF0NSLZLEVfoFYtM+LZSWG7HPul5X0jiZKUuv/JiQ/kISuxe2+Slf5BTlYVygcfZWThcS7kZji+uYNu6hLzr6excgHXSy1iYS93qRN8JsZT6lRPOpI1TYO4otKfdzgliiSmp5jcBsNjEMrfw5ViHxPZEPMv5Xjl2A4ee7E3NZIU9oQSaTUTT8WoN6pUmx3iEYF20+HzC5Acg9IaBCZEe8cIpApoBWKixwN7FZJxvV+URNHOjg7R0i3WbpTRcMiN1tn48irXTkDlIrB6kbmJP1B6LXBMfMelZYFhB1Zo62ZlRSuapt/1YtVyDTFa4O7ZUaQfv+Xc6Stk+xye2LPBkadCoK2CrYHvstUM7LWic11yHbfhicz0ZOSxtmESBAGu4KLXdGbjBY69ajO3XyDc2QR9HVcrIylhPvm6debET/r7EuDXC1p5MJ95puMZotG20C8bzCkui4dlFFmHxk2C1gauXkKO9rBeDLsLb6+83LL8ZQnAdbwVvWT4g/n+A/WWxXTI4uiCh2iWCbQtvHYFr2MR7h2g0lI4dOTy4q9r1sfArSUCdDT7dG1V76SH4vc11FA05VhMZEQEKYwYSYDUx6mldvPwa2cXzy0b7/yPTISAceARZUSZCfeFJ2fGldRDw7FAa3ar35+v/HbmansJ+AH4HejeCfgbIgIyEAeU2+4aQJtbCnq3EwD8NQCjhmvoeRBJAQAAAABJRU5ErkJggg==" },
       { label: "Opera", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAADNklEQVQ4jV2RS2hcVRzGf+fcO5OZTBJokiYZW0gEMQljUWuxlRH7IBmkVrEBd6JCqLoJ1kWqXYgL0Y2gRRfaheDCnTZxoZE2EAQfFEkrYRRTNU0ymslkHkm1mcmde865fxfRjd/+9z34lIgwPz9PeWNDtcTjurq97RKJBMP796f7e/v2ARQ2SsXFYnG9vrMj3a2tnnEu6ujokGw2ixIRcrkcs7OzHkq5k5l7Hp08fmLyYHf3g6ZYbBNjie3tbuSr1fl3vv/u3enFXz5HRGcymSifz6MBtFIacB+cHnv7y6ef+epYe/uJ0rX57dLQ3S9v3Hdg4s8fr29mlXpkajQ3/cnI6EUgUrsCEfEeOnqUF4eGz8q5V8WceaG5cuy4LF26lBMRRITlK1eO/Hr/Qbtz8rFQnhyT1wcG3hgYHEREPA244T17+s73D7zmbt5E1tbi9Zi/mM7l5hCJY21y38jI1aC35wcpFGKNwop7yY+dO9zWNliPIqebwONdXaf6tjY7m7Vq0/xRgM7O3xNtbRYRRKkophRef//PQWEVu7VlUrVqfCwWeyoQQXvAITjiSiWoVDDFNXQqVVMAIgoRALyurvLtep2dMFRVYxjS+nBSa3wf6Kw30s1aFYUQ3P4b0bq5y+/CACrREmw5R9w5AmNoEelLAj5AwxrXsBZxjsBFCCj+L0HVAN9aAmtJGusE8B3wm7HLSWtxxkjgHB1BkNyNVfw3wW5vJ6uAMobQOUJrCocArYBvwvDrsnNUjNEVoFEu7/3XQFC7Zerr633rQDEMZQO4bu1cBPga+NbZGQeLd4bh0CbAjRuDUq8naW21EkVaAcWFhQNloNWYxC0oXRP5rAXQgPeXSPMjmLwVhlQ9z/60ujqwNjV1SilltO8HtZmZkRv5/ANKKdseCbNwvgJVHzwfcCmtvSX44lOln39C8WGohcsTExcfXloa9uJxc/XChbNKKXp937+MemUhch/f63lawCEijI6OAnh4Hj1w+llYfBPMeyDvg7wFdhxW7oDn0BrAy2QyRFG0e+P4+DjZbNalEgm/LjItMNej1F09fqwTUBVrt4xEy2egmlLKD8LQptNplFL8A026qgDDLrhmAAAAAElFTkSuQmCC" },
       { label: "Maxthon", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfWBw8BAS1q932nAAAAB3RJTUUH1gcPAQIYwmgJNwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFHUSfHk+qG1OvH1OtHWC7I0SeIUehJ0+nI0+oKUynI1KqIVGsIlauJlKpJ1WsK1CqKlKoKlSqKVetKletLVSrLVWrL1yvIVixI121I163JFmyJluyJF61Ll2xLF60M1esNlarNVqwOFqyO1q0ImG6IWO9JWG5JmC4LGC2KWW5L2W5LWm9N2++PmO2P2O2O2m5Hm7JI23GJmjAJW/HKmzDL23AI3TNLnDFKHTKK3XKLnnOI3jRI3nTJnrSKX7VLH/SMHXJOn3MQmK6Q2a5R2u6SWq9T3u/U3a3T2/AV3fHL4HVMYbXOYjXeJ2sfJypbaW8eai8QYbRVYrMXo3PXpTSXZrVa4vGbI7IaJfPYpXSZZzWbprTb5vVcpzVd5/UaKvHba/Kbqrbd63EeKzCcavbc6nYea3becPjeMTkg6OwgqWzhJ3OgqDQhKTUgqrahK/di6fVgbLGgbLHjLfKgLHfhLDeirTekbPBmLvJkbffpLjBq77Fg8nmiczom8jnmcnpvsjNr8fmqsnnv+T0yNXa1trb29zcxuPvyeDjyuPmzODizODjyODpyeTuzebwz+fwyu7yzer3ze7yz+/yx/b9xvj+yPj+yfj+y/j+2OHj2ebr3ubq0Ofx0ujx0unx0+ny1+vz2ezz2O302uz03u713+/11Pr+3PDy2vv+2/v+/8D/4Obn4vDz4PD24fD25fD25PL34/L65/P44/v+6fT46vT57vf68Pj68P3/9/n69fr89fv99/z9+Pv9+v7/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNJ5gQAAAKt0Uk5T//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8Atyo9bAAAAQNJREFUeNpjWAUCHROWrVw+E8xkAOLuaVPrS0qbduxpgwhMmpZob2NtZmhasHs2SKBrSqitl4+3nYWRevjGBqDA9FQrx6CIkEAHbQ3ZnJ5VDJ0zLA127d21bdPahXMZRSdWM0yuMzbcu3/v9i3rFs/jYK+sYFiRb26ya6+7m470wrkC8nHFDJvzVFm2bdfcuoFpwRwG/ugihjWNapKbtqhsWMozv49VKS2ZYfU+fbm167SWLBbr71XwqM1iWLUzm5tZXEJGiouNUzkyAeiO1vVhvHxCwoIiik7B6b4gp89alOuiq+fs6hmV4Q/xXEt7c1lsTEpNvB/Ut6tWVZUXJgVkgpkAR0RyCIGXtksAAAAASUVORK5CYII=" },
       { label: "SeaMonkey", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAABAXYNFBQcVxERCUQCAgEf////Avz8/urz8/nG6+vypP//fOMAAAAAAAAAAAAAAAAB////AAAAAAAAAAAAERGRXB0dDJAPDwgT/f3/AP39/gD9/f8A/f3+APz8/wD9/f775ub1jvHxCX3//2b7AAAAAAH///8AAAAAABMTkHwjIxKDAwMBAP39/wD8/P4A/f3+AP39/wAgIRAAV28/ABcgEwC0pM0AoY/Dt/Ly2E///5n7AgAAAAANDZBSHh4Pgv7+/wD4+PwA+Pj8APn5/AD5+f0A/v7/AF54RAAXIBQA1OoAAOXZ6QAGBgNJBwckjAAAAAACAQGACBUVCZL//wAB+fn8APn5/QD4+PwA+Pj9APj4/AA4PiAA/g4OANLp/gD//fsAVFssAPv7/gABAQJsAQGILwILCw5QCQkDG/j4/AD4+P0A+Pj8APn5/QD5+fwA+Pj9AB80IgDn9AEA6PQAAP///wAWJxkAMDAWAP///wIFBQJpAgoKBkICAgMADg4LAA0NCAAKCgcA/Pz/APj4/QACAgAAECYbANzuAADq9QAA/f8BAAEAAAAXHREABgYDABAQDEIESUk4IT0+MQAAAAEA9vb1AO/u7gD5+foA8fH7AB4nCQDW8QYA+v0AAAoE/wAKBQAA+P0AADw5KgA0LzsA5+bsIATm5wgA1NQBAAEB/wDz8wUABAQVACYmBwAcHQIA+ikAAP/yAQAIBP8AEwf9AA8H/wAOBwIAwb4SAAEBBgD5+QMBBMPC6uXOzRMA+/v/APn5/wD9/QAAAQEAAG19EAD5HgoAFQv/APX4+wARCP8AHA4BANHF+gDOzvUABAT1APn57uQC+fnnwPLy/QD19f8A+/sAAP7+AAA2OgYACDgJABgL/wAHAPsAKxX/ACgUAADm3P0Ano/0AAgIAAAICAEA/v71wAQAAOWt/PzqjAEBFxMCAgAAJSYDADlvEQASCf0AHw79AAoGAQAA9wEAwaj4ALeu9wAAAAAACAgBAAAA+gDs7NubAf///wABAalkBQU2my0uCgA/dxMAJRL+AAz2/QDU0fwA49j7ANHP+wABAQAABQUAAAQEAQAFBQAA5+fWpd/fQFwB////AAAAAABodNrDHEMjPNy08wC9svcABAQBAAUFAAAFBQEABAQAAAUFAQAFBQAABAQAAOrq3sba2sRG//909QHh8P9GxeH+ffr9APy2isvAwsANdgwMEgoEBAAABQUBAAUFAAAEBAEABQUBAP7+9v/p6dyf3t7Dbf//gPYAAAAAAdbq/3AkFQDHBQAAyQAAAAABAYoaExMsZwwMFEcGBgUgAwMAAQIC/uv5+fLD4uLYmvr6ac8AAAAAAAAAAAAAAAB08Ygz9inangAAAABJRU5ErkJggg==" },
            ];       

// получить массив с ненужными пунктами меню и восстановливать меню при обнавлении кнопки
var hideItems = pref.getValue("CB.OpenWith.removeMenuitem", 0).split(","); 
addDestructor(function(reason) { if (reason == 'update') pref.setValue("CB.OpenWith.removeMenuitem", "") }); 

var menuPopup = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m, i ) {
      if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
      var mItem = document.createElement("menuitem");
      mItem.setAttribute("label", m.label);
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.setAttribute("image", m.image );
      mItem.setAttribute("value", i++ );
      mItem.hidden = hideItems.indexOf(m.label) !== -1; // прятать ненужные пункты меню      

      menuPopup.appendChild( mItem );
});
menuPopup.addEventListener("click", setMenuClick, false);



// Настройка функций кликов мыши для пунктов меню .................
function setMenuClick(e) {
   var mItem = e.target;
   var value = mItem.getAttribute("value");
   var label = mItem.getAttribute("label");
   var image = mItem.getAttribute("image");

   // ЛКМ запускает другой браузер ....
   if ( e.button == 0) openWith( value );

   // СКМ удаляет пункты меню и записывает выбор в 'about:config' ....
   if ( e.button == 1 ) {
        e.preventDefault();
                
        mItem.hidden = true;
        pref.setValue("CB.OpenWith.removeMenuitem", pref.getValue("CB.OpenWith.removeMenuitem", 0) + label +',' );
        }
     
   // ПКМ устанавливает новый путь к нужному браузеру ....
   if ( e.button == 2 ) {
        e.preventDefault();
        
        menuPopup.hidePopup();        
        setPathToBrowser( value, image, label );
        }
};



// Получить выделенную ссылку, иначе отдаст 'false' .................
function getSelectLink() {
   var links = window.content.document.links;
   if ( !(document.commandDispatcher.focusedWindow.getSelection() == '') ) {
        for ( i=0; i<links.length; ++i ) {
              if ( window.content.getSelection().containsNode(links[i], true) ) {
                   var link = links[i]; 
                   }
              }
        
        return ( link == undefined ) ? false : link; 
        }
   else { return false };
};



// Открыть страницу или ссылку в другом браузере, аргумент 'value' определяет нужный элемент массива с путями .................
function openWith( value ) {
   
   // получить адрес ссылки или страницы, в 'Punycode' если это .рф домен ....
   var loc = content.document.location;
   var link = getSelectLink();
   var loc = link ? link : loc;
   var url = ( loc.host.slice(-3) == '.рф') ? Services.io.newURI( loc.href, null, null).asciiSpec : loc;  

   var path = pref.getValue("CB.OpenWith.pathToBrowser", 0);
   var pathToBrowser = path.split(",")[value]; // получить путь из 'about:config'

   var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
   file.initWithPath( pathToBrowser );
   if ( !file.exists() ) {
        alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", pathToBrowser, 'Файл не существует', false, "", null, ""); 
        return;
        }
   var process  = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   try {
       var args = [url];
       process.init( file );
       process.run( false, args, args.length );
       }
   catch(e) { alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", pathToBrowser, 'Не удалось выполнить', false, "", null, "") };
};



// Установить новый путь к  браузеру, и записать выбор в 'about:config' .................
function setPathToBrowser( value, image, label ) {

   var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
   fp.init( window, "Укажите путь к нужному браузеру!", fp.modeOpen );
   fp.appendFilters( fp.filterApps );

   if ( fp.show() == fp.returnCancel ) return;
   else
       {
       // получить из 'about:config' массив с путями к браузерам          
       var arr = pref.getValue("CB.OpenWith.pathToBrowser", 0).split(",");
              
       // заменить нужный элемент массива на новый путь и записать
       var newPath = fp.file.path;
       arr[value] = newPath;       
       pref.setValue("CB.OpenWith.pathToBrowser", arr.toString() );       

       alertsService.showAlertNotification( image, "Путь к браузеру: " + label, newPath, false, "", null, "");
       }
};



// Автоматически закрывать меню при ухода курсора с меню .................
if ( autoClose ) {
     menuPopup.setAttribute("onmouseleave", "this.mo = false; setTimeout(function(mp) { if ( !mp.mo ) mp.hidePopup() }, 800, this)");
     menuPopup.setAttribute("onmouseover", "this.mo = true");
};



// Подсказка кнопки .................
this.tooltipText = "Открыть страницу или выделенную ссылку в другом браузере" +"\n"+"\n"+
                   "Функции кликов мыши для пунктов меню" +"\n"+
                   "Л: Открыть страницу или ссылку" +"\n"+
                   "С: Удалить пункт меню" +"\n"+
                   "П: Изменить путь к нужному браузеру";


Как добавить туда Microsoft Edge? Я не могу найти путь к этому браузеру

difabor пишет

Есть кнопка "Открыть страницу или выделенную ссылку в другом браузере":

Я уже обновил эту кнопку и теперь в меню кнопки новые программы можно добавить по СКМ на кнопке: Открыть страницу в другом браузере

17-04-2017 16:02:33

difabor пишет

Как добавить туда Microsoft Edge? Я не могу найти путь к этому браузеру

Где в windows 10 находится edge

Спасибо!
Я нашёл путь к Microsoft Edge, но всё равно он не запускается. Причём не запускается даже с Файл Эксплорера дабл кликом...
Так что дело не в кнопке... Пункт меню создаётся...

difabor пишет

Спасибо!
Я нашёл путь к Microsoft Edge, но всё равно он не запускается.

Ну тогда не знаю.

bunda1 пишет

Ну тогда не знаю.

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

Выделить код

Код:

var link = "https://forum.mozilla-russia.org";

var explorer = Services.dirsvc.get("WinD", Ci.nsIFile);
explorer.append("explorer.exe");

var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(explorer);

process.runw(false, ["microsoft-edge:" + link], 1);

Спасибо большое, Dumby!

Привет, bunda1
А можно прикрутить редактирование имени браузера?
А то бывают не очень читабельные, особенно в портативных версиях.
Можно, конечно, сам экзешник переименовать, но лучше бы в кнопке была такая возможность.

С этим ни кто не пожет?

FF Exp Imp CB перестала перезаписывать путь каталога сохранения в настройках. Пришлось в ручную исправлять. Проверил и на 3 и 4 фиксе CB. На чистом профиле то же самое, но она хотя бы предлагает сохранять на C:, а вот на старом, где был прописан уже не существующий путь, постоянно выводит сообщение, что нужно установить путь, ну а при установке пути он не перезаписывается.

Можно это дело пофиксить?

Спасибо Dumby. Попробую интегрировать твой код в свою кнопку.

18-04-2017 12:19:30

Ultima2m пишет

А можно прикрутить редактирование имени браузера?
А то бывают не очень читабельные, особенно в портативных версиях.
Можно, конечно, сам экзешник переименовать, но лучше бы в кнопке была такая возможность.

Сделаю, это не трудно.

_zt пишет

FF Exp Imp CB перестала перезаписывать путь каталога сохранения в настройках. Пришлось в ручную исправлять. Проверил и на 3 и 4 фиксе CB. На чистом профиле то же самое, но она хотя бы предлагает сохранять на C:, а вот на старом, где был прописан уже не существующий путь, постоянно выводит сообщение, что нужно установить путь, ну а при установке пути он не перезаписывается.
Можно это дело пофиксить?

Вроде всё работает: FF Exp Imp CB

bunda1 пишет

Спасибо Dumby. Попробую интегрировать твой код в свою кнопку.

У меня иногда вместо некоторых сайтов открывается файл эксплорер

Выделить код

Код:

/*CODE*/

var link = content.document.location;

var explorer = Services.dirsvc.get("WinD", Ci.nsIFile);
explorer.append("explorer.exe");

var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(explorer);

process.runw(false, ["microsoft-edge:" + link], 1);

bunda1
Конечно работает, автор же обновил ее вчера. Как же неудобно сделано, нет возможности узнавать об обновлениях. Может кнопку напишите, что бы проверяла обновления постов в той теме? smile.gif

_zt пишет

bunda1
Конечно работает, автор же обновил ее вчера.

Автор кнопку не обновлял, это я исправил и обновил эту кнопку потому что автор не показывается на форуме.

difabor пишет

У меня иногда вместо некоторых сайтов открывается файл эксплорер

Нужен пример такого сайта. Что значит открывается файл эксплорер?

bunda1 пишет
difabor пишет

У меня иногда вместо некоторых сайтов открывается файл эксплорер

Нужен пример такого сайта. Что значит открывается файл эксплорер?

1. Например: http://moemnenie.club/forumdisplay.php?f=79 или https://forum.mozilla-russia.org/viewto … 57166&p=69
2. Вместо браузера открывается File Explorer - то, где все мои файлы, фолдеры и пр.

bunda1
Спасибо вам, как всегда выручаете. А правда, есть способ автоматической проверки обновлений постов в той теме?

В новых версиях FF перестала работать кнопка:

"открыть как ссылку в новом табе"

Выделить код

Код:

(function() {
   if ( document.getElementById("go2link") ) return;
   var menuItem = document.createElement("menuitem");

   menuItem.id = "go2link";
   menuItem.setAttribute("label", "Перейти по ссылке");
   menuItem.setAttribute("class", "menuitem-iconic");
   menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAU0lEQVQ4je2RwQ3AMAgDswcjMARMYbZgDdZgU/fVZ6WGfHOSvyfLXuvySXfzSFBVrKq5JDP5ZiQAQACMCALYl7g73Z1mNmugqlTV+QYicvbC5T8PBOogdLzwKzcAAAAASUVORK5CYII=");
   menuItem.setAttribute("oncommand", "getBrowser().selectedTab = getBrowser().addTab(document.commandDispatcher.focusedWindow.getSelection().toString())");
   document.getElementById("context-copy").parentNode.insertBefore( menuItem, document.getElementById("context-copy") );

   
   document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function() {
     menuItem.hidden = !gContextMenu.isTextSelected;
     }, false);
})();


Помогите поправить.

какая-то  хрень  приключилася,с после обновления   до   версии 52
перестал работать  этот код: (при двой ном клике по картинкам,закидывал в  буфер обмена  адрес картинки)

Выделить код

Код:

/*Initialization Code*/
addEventListener('dblclick', (e)=> {
  var img = e.originalTarget.tagName.toLowerCase() == "img";
  var win = e.originalTarget.ownerDocument.defaultView;
  if (img && e.button == 2 && win.top == content) {
    e.preventDefault();
    e.stopPropagation();
    document.getElementById("contentAreaContextMenu").hidePopup();
    var imgLink = e.originalTarget.src;
    if (imgLink && e.originalTarget.parentNode.tagName.toLowerCase() == "a"
        && e.originalTarget.parentNode.href.endsWith('.png'||'.jpg'||'.jpeg'||'.gif'||'.apng'||'.webp')) {
      imgLink = e.originalTarget.parentNode.href;
    }
    gClipboard.write(imgLink);
    custombuttons.alertSlide('Ссылка на изображение скопирована', imgLink);
  }
}, false, gBrowser);

Может кто поправит?
В чём дело вообще,почему перестало работать ?
Чё там   разработчики наговнячили в  этом  FF
Cплошная головная боль.
Руки бы им оторвать.
не надо было обновляться....

_zt
Нет, я не про png, я про html страницу имел ввиду. Она не сохранятеся полностью. PNG вообще нет проблем, да и любой другой графический формат, но это меня не интересует вообще...

А существует ли кнопка, добавляющая в контекстное меню изображений "Поиск в Google картинках"?

Echotony, только для гкартинок не знаю. вот в этой есть Context Search 2 и гкартинки и якартинки и ещекакиетокартинки и вообще много поисков :)

Echotony пишет

А существует ли кнопка, добавляющая в контекстное меню изображений "Поиск в Google картинках"?

Выделить код

Код:

// Добавить подменю "Поиск изображения в ..." в контекстном меню изображений, от 06.09.2015. .............
((contextMenu, copyimage)=> {
 
  var array = [
     ['Google', 'https://www.google.lv/favicon.ico', 'https://www.google.com/searchbyimage?&image_url='],
     ['Яндекс', 'http://yastatic.net/morda-logo/i/favicon_islands.ico', 'http://yandex.ru/images/search?rpt=imageview&img_url='],
     ['Bing', 'https://www.bing.com/s/a/bing_p.ico', 'http://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl='],
     ['Tineye', 'http://tineye.com/favicon.ico', 'http://tineye.com/search?pluginver=bookmark_1.0&url='],
  ];
  
  var menu = contextMenu.insertBefore(document.createElement("menu"), copyimage); 
  menu.setAttribute("label", "Поиск изображения в ...");
  menu.setAttribute("class", "menu-iconic");
  menu.setAttribute("image", array[0][1]);
  menu.onclick =e=> { e.target.nodeName == 'menu' && search(array[0][2]); setTimeout(()=> contextMenu.hidePopup(), 20) };
  addEventListener("popupshowing", ()=> menu.hidden = copyimage.hidden, true, contextMenu);
  addDestructor(()=> contextMenu.removeChild(menu));

  var menuPopup = menu.appendChild(document.createElement("menupopup"));              
  array.forEach((m)=> {
     var mItem = menuPopup.appendChild(document.createElement("menuitem"));
     mItem.setAttribute("label", m[0]);       
     mItem.setAttribute("image", m[1]);
     mItem.setAttribute("class", "menuitem-iconic");
     mItem.onclick =()=> search(m[2]);
  });  
  function search(finder) gBrowser.selectedTab = gBrowser.addTab(finder + encodeURIComponent(gContextMenu.imageURL));
  
  var mItem = menuPopup.appendChild(document.createElement("menuitem"));
  mItem.setAttribute("label", 'Искать во всех поисковиках');       
  mItem.onclick =()=> array.forEach((m)=> gBrowser.addTab(m[2] + encodeURIComponent(gContextMenu.imageURL)) );
    
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-copyimage-contents"));

sonyas75
Не, это слишком много.

bunda1
Спасибо, а могли бы сделать версию только с Google и без вложенного контекстного меню, т.е. ПКМ по картинке и сразу "Поиск изображения в Google"?

Перестала работать кнопка "Поиск по сайту в Гугл", может кто-нибудь поправить?
Спасибо.

Лия пишет

Перестала работать кнопка "Поиск по сайту в Гугл", может кто-нибудь поправить?

Работает Поиск по сайту в Google. У тебя наверно старая версия.

bunda1
Спасибо, эта работает. У меня на старой была иконка "Увеличительное стекло", но я ее удалила, нет случайно кода, чтобы такую же для этой кнопки поставить?

Лия

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

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAAOGSURBVHjaxVZdKGRhGJ4zy7JEo50IERFR2o2U1k/RTrkhSomUWZNZIqJEpvUfN3S23IwdJWVLxNq9IDJRotFwZs78+y3tXuwFeyHZHz/fPu/E/ZFp99TbOafOPM/3Pe/zvN/IZP/jKigoUMbHx6sjIyPfh4eHGyIiIvrw/rq2ttbvUcBqtfppcnJyn0KhuMAr8/f3Z6GhoSwsLIzJ5XIWEhLiiYuLU7nd7oeDFxcXP8MqVwg4KCjoT0lJybfOzk7n6OioODEx4dTr9SdFRUWXgYGB1yDRPgh8dXVVFhMToydwyHLe3NxsHR4e3h0fHxfm5+ct6+vr4vb2tt1sNjt4nj+Njo6+ysjIyJVMkJqa+gK3a9Svmpoay9DQkBd8dnbWYjQaRZPJZLdYLFDGvY866O7uPk9MTDQvLi5ykgjQSJ5Wn5eXd9TT03O/cuvKyoq4sbFhw8qdDodjz+PxHKGORVE8TktLu83Pz38piQCNNOF2o9PphKmpKWFpaclKshD41taWfWdnx3VHcEgkTqdzr7Ky8iIzM7NeEgGaehgbG/tzbm5OAKCIFduhuYOKVg95iMAD4H0Cxw5cdXV1p9nZ2e8kEcB+u2jabwBaAeBCeWw2m1sQBBfKSwBQNxU9U8M1Gs2ZSqVqkkQA34+lpKTcEsC9ztRQaiztgAoyeYvA4TpraWnpJWR6JYkAvs7lOO4WEn2/JyA5SPvNzU0HemGnXqBsa2tr1sHBQQ/A95GPJ5IIDAYD7eIT7HoDsAPSmPRfXl62TU9Pi2i8ODMzI+LZMjIyYq2urr5E6vsfFLb09PTncJOYlJR0NTAwcIBACeSqlpYWb7W1tQnQ3QFpLpBqVlhYuIeffUYNVlRUyCWR5OTkhCHRU9jNDSUaif2K9+OEhIQT7O4HcnJWVlY2gqFHw4hFRUUxfMPwPIqxIi10cI0MjkpDX/ph3S+YT0aAf4Ql3yLlirvPPkEi1tXVxTCfaLx4SSTvRMLVhxywhYUFBhlJLqZUKr0k5eXljyfBSjmEk8dQZBgprL29neEMYZDWS9LR0cE9mqS3t5eDKfimpiYGd7HW1laGHtKo991OqqqqOEwBvr6+nk1OTrLGxkaWlZXF/Pz8iETnk2YQSXBwMK/VatnY2BijOyxP7vrgszOc5MJJx4OMIYgMNmbIk8anfxSgORcQENDR0NCgxxh5A/vKZf/i+gvTfwvd9D//IgAAAABJRU5ErkJggg==

или

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsSAAALEgHS3X78AAAFVElEQVRIia2VS2ycVxXHz7n3e3jGM5nMDPZ47IwNwWM7wQXHiVRUErkSpVLiJEYCVWxQSSqWoO4rVyJigdh0zUMCBYUtUFikSEChNBLUqp1OO3FCm5CH5/3Nw/PN97qPw6J2VFycBsR/cTdX+v3/95x77kV4PCEiMiJSqVQqOzMze252bvapeDyeUUoNKpXK+jvXr/9ma2vrDiIyAAAi0gAA+DhwAEDOuV48fvw7C8eOvURS5ETgkRACGTdoZDSHyVTaK5ff+/FrV6+u9l3X3QmkH8vANAx85ivPXhkfH/vGjXfWqTlQkfGpyV46m1U2Rbbz4E7MEJ791MlTDDlf/+WVK6cdx6kjIj7SYDfFl06efGXy0PiL10tlP/b58/enl77ayEwUgsLYAfPIWDwZeNus9MbvD1z9ySujRw9PJuzhxOu/uHz5y1EUaf5J8Pz4+Bc/Nzf7083b96LE0oulz5z6Wi0eN8HkmgNJlrK1PRyP4dEnnxgsPnOu//qrv44djFuzpm3XHty/v8Y+ofYwWZj8ttNqAB157r3kpxc7ot8cIq2Qcw4auYqISUTCnhOYo4dGxfPf/+HdaqsDU4XCC5ZlwX4GSETKtCweM+HprnnIY+OLLeV1bGCGJgIgItCawI20BALg3KDtdsQLs8Xg6NPPNkLf+8LI6Ojco04AhmFmpRRjfnKmojWCUhqUUqCUBik1KKWh7ysZCUVSKlCayHOBf/bEqTZwbpqGOWk8ojxEWpthJLkyD/pMSpSSg4gUCKFARBIsi2Pfj9QgMNQwgAEApHWEsQPZyLCGQEShsZ8B7SwqDH1iQSdGmiAMBUSRhDCQYJgCuMFAE1DHNaTFwNCawLA59VuO6fa6IKSkR5aIMdbVSjuqfj0X44yLUIDvRxAGEQReBL4XgedF0OwGMgwE+H6ASjN9e+NvB9utBgw839nPgACAKykCMGNvRdX1ZLi1nslls8wfeNh3A/C9CAZuCP4gxEbHk9vbHhHYqnL7fevdP/wq33MHd72Bu7nvHDDGDCmljseHOxzpm/2tUioxdsQ9NHlYbrseCSmBiJA0YRApnUomUQ269puXfzDVvPePoa1K/eee5736MYOd4UbLsgxEVCsrK8eev3DxufW/v2GGtdLBQIC2EyORRFtEikmhQIe+z0S1nK39+fLh5t2byVqzXWs2Gy9orXvGHjgCAAcAuby8/HI2m72wtLQUsywLFo4/2b72179kUv/83TTvbORjyQmXzOEIKeSm30yE6CYajSar1Btup+1cEELcAwCOe+FEJJeXly8Vi8XVGzduyEqlYpw4ceJPjUbjW0EQvFSr1S+CFkYiPgSmaYLWCgZ+RIFQqKR6u9/f/m69Xn8TABgAfPiafhR+5syZS8VicbVcLstqtSp7vd5QLpf72dra2sWJiQk+P//Eoib99X7fPSaESCulQgT4IAyD12q12m/b7XZ/F77Lfgg/ffr0penp6dXNzU1Zq9XAcRxjYWHhTrfbPX/t2rV3EZETkUqn05DJZNC2bdvzPNntdmWv1wMiQkTE3c8G4MOJZYwxffbs2UuFQmH11q1bslqtQqfTMebn5+86jnNmbW2tDAAMETUAMCJCAFAfbd/uPhHRv/WVcw4rKysv5/P57928eVPW63XodDrG3NzcvVartbyxsfEw+d4LgYiww9vLfSieTqfPj4yM/MhxHFGtVrHb7RrFYvFBvV4/VyqVSoyxj8F3tR90b5CpTCbzx+Hh4cOICFNTU9VWq3W2XC6//Z+S/09KJBKL+Xz+9sLCQm1mZub4jvO+U/7figEApFKp6Vwut/j/hv8LkScFgdXP7AUAAAAASUVORK5CYII=

ARG
Я тоже в основном HTML пользуюсь и проблем обычно нет, но на данном вами примере верхнее изображение действительно обрезается (т.е. от него остается огрызок в виде левого верхнего угла исходного изображения) при сохранении страницы в HTML.

bunda1
Посмотрите пожалуйста пример страницы на которой это происходит. Можно как ни будь поправить?

Речь о кнопке Save

villa7
Спасибо, именно то, что нужно.

_zt пишет

bunda1
Посмотрите пожалуйста пример страницы на которой это происходит. Можно как ни будь поправить?
Речь о кнопке Save

Не знаю в чём тут дело.

Помогите, пожалуйста с кнопкой Toggle Find+ Minimal, с 53+ перестали работать стрелки след и пред

скрытый текст
const forceFind = false, forceFindCS = true;

// Приклеить элемент findbar к странице( #appcontent ) ................................
const fbID = "FindToolbar-m";
delete window.gFindBar;
window.gFindBar = document.getElementById(fbID);
if (!gFindBar) {
    gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
    gFindBar.id = fbID;
    gFindBar.setAttribute("browserid", "content");
    gFindBar.clientTop;
    delete window.gFindBarInitialized;
    window.gFindBarInitialized = true;
    gFindBar._selectionMaxLen = 1000;    // лимит символов для поиска
   
    setTimeout(function() {
       eval("gFindBar.startFind = " + gFindBar.startFind.toString()
       .replace('this.browser.finder.getInitialSelection();',
       'this.onCurrentSelection(gBrowser.finder.getActiveSelectionText(), false)'));
             
       var {Finder} = Cu.import("resource://gre/modules/Finder.jsm");
       eval("Finder.prototype.getActiveSelectionText = " + Finder.prototype
       .getActiveSelectionText.toString().replace('.replace', '; //'));         
    }, 3000 );
   
}


// Ctrl+F, показать - скрыть панель поиска .................................... 
function toggleFindbar() {
   if (gFindBar.hidden) { gFindBar.onFindCommand(); setTimeout(function() { gFindBar._find() }, 50) }
   else
       gFindBar.close();
};
addEventListener("keydown", function(e)
    e.keyCode == e.DOM_VK_F && e.ctrlKey && !e.altKey && !e.shiftKey
    && !e.preventDefault() && toggleFindbar()
, false);
this.onclick = function(e) { if (!e.button) toggleFindbar() };



// Показать количество совпадений на панели поиска ................................
const textbox = gFindBar.getElement("findbar-textbox"),
nrm = Ci.nsISelectionController.SELECTION_NORMAL, labID = "hits-m";
var lab = document.getElementById(labID);
if (!lab) {
    lab = textbox.parentNode.insertBefore(document.createElement("label"), textbox);
    lab.id = labID;
}
var curHit, allHits;

function updateHits(arg) {
    if (gFindBar.hidden) return;
    var word = textbox.value;
    if (!word) {
        lab.value = "0/0";
        textbox.removeAttribute("status");
        return;
    }
    var win = arg instanceof Window && arg || content;
    if (win == content) curHit = allHits = 0;
    var findbarFinder = gFindBar._browser.finder;
    var controller = findbarFinder._getSelectionController(win);
    var doc = win.document;

    if (word && controller && doc && doc.documentElement) {
        var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement;

        var searchRange = doc.createRange();
        searchRange.selectNodeContents(body);
        var startPt = searchRange.cloneRange();
        startPt.collapse(true);
        var endPt = searchRange.cloneRange();
        endPt.collapse(false);

        var retRange = null;
        var finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind);
        finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word);

        while ((retRange = finder.Find(word, searchRange, startPt, endPt))) {
            allHits++;
            if (!curHit) {
                var sel = controller.getSelection(nrm), range;
                if (sel.toString()) range = sel.getRangeAt(0);
                else {
                    var editableNode = findbarFinder._getEditableNode(retRange.startContainer);
                    if (editableNode) sel = editableNode.editor.selectionController.getSelection(nrm);
                    if (sel.toString()) range = sel.getRangeAt(0);
                }
                var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"]
                    .every(function(prop) range[prop] == retRange[prop]);
                if (comp) curHit = allHits;
            }
            startPt = retRange.cloneRange();
            startPt.collapse(false);
        }
        Array.forEach(win.frames, function(frame) updateHits(frame));
    }
    if (win != content) return;
    allHits ? textbox.removeAttribute("status") : textbox.setAttribute("status", "notfound");
    forceFind && !curHit && allHits && gFindBar._find();
    lab.value = curHit + "/" + allHits;
}
updateHits();


gFindBar.updateHits = updateHits;
function insUpd(methodName, code) {
    const method = gFindBar[methodName];
    gFindBar[methodName] = Function("arguments.callee.method.apply(this, arguments);" + (code || "") + " this.updateHits();");
    gFindBar[methodName].method = method;
    addDestructor(function() gFindBar[methodName] = method);
}
insUpd("_find"); insUpd("_findAgain");
insUpd("_setCaseSensitivity", forceFindCS && " this._find();");


const progressListener = {
    onStateChange: function(wpr, req, state)
        state & Ci.nsIWebProgressListener.STATE_STOP && setTimeout(updateHits, 320),
    onLocationChange: function(wpr, req) !req && updateHits()
};
addDestructor(function() gBrowser.removeProgressListener(progressListener));


function onFindbar() {
    gBrowser[(gFindBar.hidden ? "remove" : "add") + "ProgressListener"](progressListener);
    !gFindBar.hidden && updateHits();
}
onFindbar();
const observer = new MutationObserver(onFindbar);
observer.observe(gFindBar, { attributes: true, attributesFilter: ["hidden"] });
addDestructor(function() observer.disconnect());


и еще есть кнопка Autocopy Minimal, в ней есть функция мигания тестка при выделении autocopy.selectingTextBlink, которая нафиг не нужна, можно очистить код от этой функции.
скрытый текст
({
        PREF_ROOT: "autocopy",
        PREF_BLINK: "autocopy.selectingTextBlink",
        get blinkMenuitem() {
                delete this.blinkMenuitem;
                return this.blinkMenuitem = menuPopup.querySelector('[onclick*="' + this.PREF_BLINK + '"]');
        },
        init: function() {
                gPrefService.addObserver(this.PREF_ROOT, this, false);
                addDestructor(() => gPrefService.removeObserver(this.PREF_ROOT, this));

                if (!gPrefService.getBoolPref(this.PREF_ROOT)) return;
                this.blink = gPrefService.getBoolPref(this.PREF_BLINK);
                this.setAutocopy(true);
        },
        observe: function(subj, topic, data) {
                if (data == this.PREF_ROOT)
                        this.setAutocopy(gPrefService.getBoolPref(data));
                else if (data == this.PREF_BLINK) setTimeout(() =>
                        this.blinkMenuitem.setAttribute("checked", this.blink = gPrefService.getBoolPref(data))
                , 100);
        },
        setAutocopy: function(set) {
                var method = set ? addEventListener : removeEventListener;
                for(var type of ["mousedown", "mouseup"]) method(type, this, false, gBrowser);
        },
        handleEvent: function(e) {
                if (e.button || e.target instanceof Ci.nsIDOMNSEditableElement) return;
                var win = e.target.ownerDocument.defaultView;
                if (win.top != content) return;

                var sel = win.getSelection().toString();
                if (e.type == "mousedown") {this.sel = sel; return;}
                if (!sel || sel == this.sel) return;

                goDoCommand("cmd_copy");

                if (!this.blink) return;
                gBrowser.selectedBrowser.blur();
                setTimeout(() => gBrowser.selectedBrowser.focus(), 300);
        }
}).init();

momo2000 пишет

и еще есть кнопка Autocopy Minimal, в ней есть функция мигания тестка при выделении autocopy.selectingTextBlink, которая нафиг не нужна, можно очистить код от этой функции.

Выделить код

Код:

({
        PREF_ROOT: "autocopy",
        init: function() {
                cbu.isPref(this.PREF_ROOT, true);
                gPrefService.addObserver(this.PREF_ROOT, this, false);
                addDestructor(()=> gPrefService.removeObserver(this.PREF_ROOT, this));

                if (!gPrefService.getBoolPref(this.PREF_ROOT)) return;
                this.setAutocopy(true);
        },
        observe: function(subj, topic, data) {
                if (data == this.PREF_ROOT)
                        this.setAutocopy(gPrefService.getBoolPref(data));
        },
        setAutocopy: function(set) {
                var method = set ? addEventListener : removeEventListener;
                for(var type of ["mousedown", "mouseup"]) method(type, this, false, gBrowser);
        },
        handleEvent: function(e) {
                if (e.button || e.target instanceof Ci.nsIDOMNSEditableElement) return;
                var win = e.target.ownerDocument.defaultView;
                if (win.top != content) return;

                var sel = win.getSelection().toString();
                if (e.type == "mousedown") {this.sel = sel; return;}
                if (!sel || sel == this.sel) return;

                goDoCommand("cmd_copy");
        }
}).init();

bunda1
:beer:

Может есть у кого кнопка для дополнения  Cookies Export/import :: Дополнения Firefox

Кто поможет, надо в этот код

Выделить код

Код:

var itemsArr = [
["Поиск по текущему сайту",function(){var getSel=function(w){var s,d=w.document;if(d.selection){var r=d.selection.createRange();s=r?r.text:''}else{s=d.getSelection().toString();if(!s){var e,t=d.getElementsByTagName('textarea'),u=d.getElementsByTagName('input'),i=t.length;while(e=(i>0)?t[--i]:u[-i--])try{if(e.offsetHeight>0&&(s=e.value.substring(e.selectionStart,e.selectionEnd)))break}catch(x){}}};if(!s)for(var j=0,f;f=w.frames[j];j++){try{if(s=getSel(f))break}catch(x){}};return s};var w=window,s=w.prompt('Поиск на этом сайте с помощью Google',getSel(w));if(s){w.open('http://www.google.com/search?as_q='+encodeURIComponent(s)+'&as_sitesearch='+w.location.hostname)}}],
,
["Night - ночной стиль",function(){var night=function(w){(function(d){var css='html{background:#333 !important}html *{background:none !important;color:#bbb !important;border-color:#333 !important;border-width:0 !important}html a,html a *{color:#5c8599 !important;text-decoration:underline !important}html a:visited,html a:visited *,html a:active,html a:active *{color:#525f66 !important}html a:hover,html a:hover *{color:#cef !important;background:#023 !important}html input,html select,html button,html textarea{background:#4d4c40 !important;border:1px solid #5c5a46 !important;border-top-color:#474531 !important;border-bottom-color:#7a7967 !important}html input[type=button],html input[type=submit],html input[type=reset],html input[type=image],html button{border-top-color:#7a7967 !important;border-bottom-color:#474531 !important}html input:focus,html select:focus,html option:focus,html button:focus,html textarea:focus{background:#5c5b3e !important;color:#fff !important;border-color:#474100 #665d00 #7a7849 !important;outline:2px solid #041d29 !important}html input[type=button]:focus,html input[type=submit]:focus,html input[type=reset]:focus,html input[type=image]:focus,html button:focus{border-color:#7a7849 #665d00 #474100 !important}html input[type=radio]{background:none !important;border-color:#333 !important;border-width:0 !important}html img[src],html input[type=image]{opacity:.5}html img[src]:hover,html input[type=image]:hover{opacity:1}html,html body{scrollbar-base-color:#4d4c40 !important;scrollbar-face-color:#5c5b3e !important;scrollbar-shadow-color:#5c5b3e !important;scrollbar-darkshadow-color:#474531 !important;scrollbar-track-color:#4d4c40 !important;scrollbar-arrow-color:#000 !important;scrollbar-3dlight-color:#7a7967 !important}';var s=d.getElementsByTagName('style');for(var i=0,si;si=s[i];i++){if(si.innerHTML==css){si.parentNode.removeChild(si);return}};var heads=d.getElementsByTagName('head');if(heads.length){var node=d.createElement('style');node.type='text/css';node.appendChild(d.createTextNode(css));heads[0].appendChild(node)}})(w.document);for(var i=0,f;f=w.frames[i];i++){try{arguments.callee(f)}catch(e){}}};night(window)}],
["Сохранить как PDF",function(){window.open('http://www.web2pdfconvert.com/engine?cURL='+escape(location.href)+'&title='+escape(document.title)+'&ref=bookmarklet')}],];
var contextMenu = document.getElementById("contentAreaContextMenu");
var nextEleMenu = contextMenu.children['context-inspect'];
var menuId = "context-ext-addon";
var menuItem, menuPopup, menu = document.getElementById(menuId);
if (menu) {contextMenu.removeChild(menu);};
menuPopup = document.createElement("menupopup");
menu = document.createElement("menu");
menu.setAttribute("id", menuId);menu.setAttribute("label", "Дополнительно");
for (var i = 0; i < itemsArr.length; i++) {if (itemsArr[i]) {menuItem = document.createElement("menuitem");menuItem.setAttribute("label", itemsArr[i][0]);
menuItem.addEventListener("command", (function(f){return function(){content.location.href = "javascript:(" + encodeURI(f) + ")()"}})(itemsArr[i][1].toString()), false);
} else {menuItem = document.createElement("menuseparator");};menuPopup.appendChild(menuItem);};menu.appendChild(menuPopup);contextMenu.insertBefore(menu, nextEleMenu);
addDestructor(function(){contextMenu.removeChild(menu)});


подстройть этот

Выделить код

Код:

var menuAddPopup = menuM.appendChild(document.createElement("menupopup"));
document.getElementById("context-viewsource");
var contextViewsource2 = menuAddPopup.appendChild(contextViewsource.cloneNode(true));
contextViewsource2.id = "context-viewsource2.";
contextViewsource2.hidden = false;


Еще хотел эту прикрутить...если не сложно спс, потом постараюсь разобраться на примере.
[Переключить стиль на странице]

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0441%u0442%u0438%u043B%u044C%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAyhJREFUOMtdk11oW3UYh59zzj8nyUnz2TSmaWfT2lY3nWvRi7KBX3gxxBsHguKY84OyG9ErL7yQgdfFKYKI4gQvnKDI5kVRkNWqGyg6R9utpraNXWzztTRZ0pPk5Jz/8aJbaf3Be/e+Dw8v76twO2ff63uj0ejMBHziRZ9P/VEX6uvArCYCj0i5VbXcePr5yT/G+V80gOnpqx9n5+tv9QYap2rWSxNJY/G5n+ZPpwe6jUfrzvF0NNR/n99uJOPpl080LJlNpcfq3eGDzVLpmhQA5ZvtsSdPvIOz/Db37nsFf3sUbd8ghycmKOVWGThwjFuVAlkuhX6+EjsiPCKTCOmVhQVsASClVHtSAazUGVzHReNp9g+DL+xhqHsYAFuEmZuf8wmhJhXXjhCwjMmHJrcBruuqEoiHPQhgy7RxJSgKWLnz5ItVPp0u4JjrXe+/sHz0yoqSPXfZX92M5231zjIcYL3WIVux2GxJGpZEupD/5Qzh1iz3jw4imxuEjXwiHmoe99B5rGLKxA7gjkFvTCcV00lFFNT5N4mnoijqdlvHktRKdYYTq0NTp5iqNZ0hsdvg6pqJZUl8msLdMZ3fP/mMo8cO47SzjChfwoEStgVW1WXpekV37OCzewyWNlrMrZk0O5KFf5scfGYKUDC32vQaOcZHW3SnwnhDI3z9vafasTB2DGxgsNeHZUk0VSER0tjsPMyv776GHhzniadUfrvUplG0IWHLa6aRi6jOithtkIh6QIK0JfmyRfKuISInZ3ngwf18dbKfizdj9loleqtLc6qGRgbUi3sALQk4Ll26ynCfn6ihcU/yEB7g1QtF2h+ctRc//Gheuu5MROssK5Dds0QJuIBhCHyasgN2AAXQhGYHE31FT6d52WM3Mk67XtwDiNw+JHYN7S7TbJtC91Z0n1EM+nvKhzbXTAGQ+eufC4+3RsYMj8NW3WTp71U7v1G084WyvZhZaeVubDT+nLteFkKsj46kl1Upqj09mnX6m5ntZ/r2uy8+P//DuVq+UDjiujLk9epqOBS0DMNver16VVWV9fRA/416w1xstzp51+etpFIpC+A/x3JsuL3cxBcAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BgetMarkupDocumentViewer%28%29.authorStyleDisabled%20%3F%20gPageStyleMenu.switchStyleSheet%28%27%27%29%20%3A%20gPageStyleMenu.disableStyle%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Gladius333 пишет

Еще хотел эту прикрутить Переключить стиль на странице

Выделить код

Код:

((contextMenu, el)=> {
   var menu = document.createElement("menu");      
   menu.setAttribute("label", "Дополнительно");
   menu.setAttribute("id", "context-ext-addon");  
   contextMenu.insertBefore(menu, contextMenu.children[el]); 
   addDestructor(()=> menu.remove() );

   var array = [
      ["Поиск по текущему сайту", ()=>{ var getSel=function(w){var s,d=w.document;if(d.selection){var r=d.selection.createRange();s=r?r.text:''}else{s=d.getSelection().toString();if(!s){var e,t=d.getElementsByTagName('textarea'),u=d.getElementsByTagName('input'),i=t.length;while(e=(i>0)?t[--i]:u[-i--])try{if(e.offsetHeight>0&&(s=e.value.substring(e.selectionStart,e.selectionEnd)))break}catch(x){}}};if(!s)for(var j=0,f;f=w.frames[j];j++){try{if(s=getSel(f))break}catch(x){}};return s};var w=window,s=w.prompt('Поиск на этом сайте с помощью Google',getSel(w));if(s){w.open('http://www.google.com/search?as_q='+encodeURIComponent(s)+'&as_sitesearch='+w.location.hostname)} }],
      ["Night - ночной стиль", ()=>{ var night=function(w){(function(d){var css='html{background:#333 !important}html *{background:none !important;color:#bbb !important;border-color:#333 !important;border-width:0 !important}html a,html a *{color:#5c8599 !important;text-decoration:underline !important}html a:visited,html a:visited *,html a:active,html a:active *{color:#525f66 !important}html a:hover,html a:hover *{color:#cef !important;background:#023 !important}html input,html select,html button,html textarea{background:#4d4c40 !important;border:1px solid #5c5a46 !important;border-top-color:#474531 !important;border-bottom-color:#7a7967 !important}html input[type=button],html input[type=submit],html input[type=reset],html input[type=image],html button{border-top-color:#7a7967 !important;border-bottom-color:#474531 !important}html input:focus,html select:focus,html option:focus,html button:focus,html textarea:focus{background:#5c5b3e !important;color:#fff !important;border-color:#474100 #665d00 #7a7849 !important;outline:2px solid #041d29 !important}html input[type=button]:focus,html input[type=submit]:focus,html input[type=reset]:focus,html input[type=image]:focus,html button:focus{border-color:#7a7849 #665d00 #474100 !important}html input[type=radio]{background:none !important;border-color:#333 !important;border-width:0 !important}html img[src],html input[type=image]{opacity:.5}html img[src]:hover,html input[type=image]:hover{opacity:1}html,html body{scrollbar-base-color:#4d4c40 !important;scrollbar-face-color:#5c5b3e !important;scrollbar-shadow-color:#5c5b3e !important;scrollbar-darkshadow-color:#474531 !important;scrollbar-track-color:#4d4c40 !important;scrollbar-arrow-color:#000 !important;scrollbar-3dlight-color:#7a7967 !important}';var s=d.getElementsByTagName('style');for(var i=0,si;si=s[i];i++){if(si.innerHTML==css){si.parentNode.removeChild(si);return}};var heads=d.getElementsByTagName('head');if(heads.length){var node=d.createElement('style');node.type='text/css';node.appendChild(d.createTextNode(css));heads[0].appendChild(node)}})(w.document);for(var i=0,f;f=w.frames[i];i++){try{arguments.callee(f)}catch(e){}}};night(window) }],
      ["Сохранить как PDF", ()=>{ window.open('http://www.web2pdfconvert.com/engine?cURL='+escape(location.href)+'&title='+escape(document.title)+'&ref=bookmarklet') }],
      ["separator"],
      ["Переключить стиль на странице", "getMarkupDocumentViewer().authorStyleDisabled ? gPageStyleMenu.switchStyleSheet('') : gPageStyleMenu.disableStyle()" ],
   ];
   var menuPopup = menu.appendChild( document.createElement("menupopup") );              
   array.forEach(m=> {
      if ( m[0] == "separator" ) { menuPopup.appendChild(document.createElement("menuseparator")); return };  
      var mItem = menuPopup.appendChild(document.createElement("menuitem"));
      mItem.setAttribute("label", m[0]);
      
      typeof(m[1]) == "string"
      ? mItem.addEventListener("command", ()=> eval(m[1]))
      : mItem.addEventListener("command", ()=> content.location.href = "javascript:(" + encodeURI(m[1]) + ")()");
   });
})(document.getElementById("contentAreaContextMenu"), "context-inspect");

25-07-2017 13:34:11
Не понял что за подстроить этот:

Выделить код

Код:

var menuAddPopup = menuM.appendChild(document.createElement("menupopup"));
document.getElementById("context-viewsource");
var contextViewsource2 = menuAddPopup.appendChild(contextViewsource.cloneNode(true));
contextViewsource2.id = "context-viewsource2.";
contextViewsource2.hidden = false;

Что должен делать этот код?

bunda1 пишет
Gladius333 пишет

Еще хотел эту прикрутить Переключить стиль на странице

Что должен делать этот код?...

Спасибо за код, ты его обновил)
Это "просмотр исходного кода страницы", хотя он итак выпадает в стандартном меню, увидел в другом коде и захотел добавить.

я его выдернул отсюда "исходный код страницы"

Выделить код

Код:

// Adds.Menu
(()=> {var contMenu = document.getElementById("contentAreaContextMenu");
var addMenufragm = document.createDocumentFragment('menupopup');
(contextMenu => {

var menuM = contextMenu.appendChild(document.createElement("menu"));
menuM.id = "content-addmenu.";
menuM.setAttribute("label", "Дополнительно ...");

var menuAddPopup = menuM.appendChild(document.createElement("menupopup"));
var contextViewsource = document.getElementById("context-viewsource");
var contextViewsource2 = menuAddPopup.appendChild(contextViewsource.cloneNode(true));
contextViewsource2.id = "context-viewsource2.";
contextViewsource2.hidden = false;

var menu8 = menuAddPopup.appendChild(document.createElement("menuitem"));
menu8.id = "content-bugmen.";
menu8.setAttribute("label", "Поискать логины к сайту на BugMeNot.com");
menu8.onclick = () => gBrowser.selectedTab = gBrowser.addTab("http://bugmenot.com/view/" + normDom());
//=======================
 // Удалить куки текущего сайта в контекстном меню на странице, от 04.02.2017. ................bunda1
var menu = contextMenu.appendChild(document.createElement("menu"));menu.id = "content-removeCookies.";menu.setAttribute("label", "Удалить куки текущего сайта");
var menuPopup = menu.appendChild(document.createElement("menupopup"));var menuitem = menuPopup.appendChild(document.createElement("menuitem"));
menuitem.setAttribute("label", "Удалить (так же будут удалены все Flash-куки)");menuitem.onclick =()=> {var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);
for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {var cookie = en.getNext().QueryInterface(Ci.nsICookie);
~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false);}
var reversedDomain = host.split("").reverse().join("") + ".";Cu.import("resource://gre/modules/FileUtils.jsm");var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
var dbConn = Services.storage.openDatabase(file);dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");dbConn.close();
 //удалить и все Flash куки. закомпанию.
var dir = Services.dirsvc.get('Home', Ci.nsIFile);dir.append("Application Data");dir.append("Macromedia");dir.remove(true);dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);};

contMenu.addEventListener("popupshowing", () => {contextViewsource.hidden = gBrowser.currentURI.scheme.startsWith("http") || gContextMenu.onLink;
menu.hidden = menuW.hidden = menuM.hidden = pophiddP();menuA.hidden = menu.hidden || onWArch(gBrowser.currentURI.spec);menuG.hidden = menu.hidden || onGCahe(gBrowser.currentURI.spec);
menuGl.hidden = !gContextMenu.linkURI || !gContextMenu.linkURI.scheme.startsWith("http");menuAl.hidden = menuGl.hidden || onWArch(gContextMenu.linkURI.spec);}, false);
addDestructor(() => {menuW.remove();menuG.remove();menuA.remove();menuGl.remove();menuAl.remove();menuM.remove();menu.remove()});})(addMenufragm);
contMenu.insertBefore(addMenufragm, contMenu.lastChild);var onGCahe = function(link) {
if((link.startsWith('https://webcache.googleusercontent.com/search?q=cache:') || link.startsWith('http://webcache.googleusercontent.com/search?q=cache:') || link.startsWith('http://www.google.com/search?q=cache:') || link.startsWith('https://www.google.com/search?q=cache:')) && link.indexOf(':http') > 0)return true;return false;};
var Glink = function(link) {return decodeURIComponent(link.substring(link.indexOf(':http')+1).split('+&')[0].split('&')[0]);};var onWArch = function(link) {
if((link.startsWith('http://web.archive.org/web/') || link.startsWith('https://web.archive.org/web/')) && link.indexOf('/http') > 0)return true;return false;};
var Wlink = function(link) {return link.substring(link.indexOf('://web.archive.org/web/')+23).match(/\/(https?:\/\/\S+)/)[1];};
var normlink = function(link) {if(onGCahe(link))return Glink(link);if(onWArch(link))return Wlink(link);return link;};
var normDom =  function() {let urispec = gBrowser.currentURI.spec;let dom = '';if(onGCahe(urispec)) dom =  Glink(urispec);if(onWArch(urispec)) dom =  Wlink(urispec);
if(dom)return dom.replace(/^https?:\/\//,'').split('/')[0].split('?')[0].split('#')[0];return content.location.hostname;};var pophiddP = function() {
if(!gBrowser.currentURI.scheme.startsWith("http") || gContextMenu.onVideo || gContextMenu.isContentSelected || gContextMenu.onLink || gContextMenu.onTextInput)return true;return false;};})();


Кстати хотел "Удалить куки+флеш" тудаже в прошлую кнопку.
Вообще я нашел 3 таких кода, все похожи, только код отличается хочу все в одну собрать на того кода которую ты сделал компактную.
Это полный код, хочю сюда дополнить, с других кодов

Выделить код

Код:

((contextMenu, el)=> {
var menu = document.createElement("menu");
menu.setAttribute("label", "Дополнительно");
menu.setAttribute("id", "context-ext-addon");
contextMenu.insertBefore(menu, contextMenu.children[el]);
addDestructor(()=> menu.remove() );
var array = [["Поиск по текущему сайту",function(){var getSel=function(w){var s,d=w.document;if(d.selection){var r=d.selection.createRange();s=r?r.text:''}else{s=d.getSelection().toString();if(!s){var e,t=d.getElementsByTagName('textarea'),u=d.getElementsByTagName('input'),i=t.length;while(e=(i>0)?t[--i]:u[-i--])try{if(e.offsetHeight>0&&(s=e.value.substring(e.selectionStart,e.selectionEnd)))break}catch(x){}}};if(!s)for(var j=0,f;f=w.frames[j];j++){try{if(s=getSel(f))break}catch(x){}};return s};var w=window,s=w.prompt('Поиск на этом сайте с помощью Google',getSel(w));if(s){w.open('http://www.google.com/search?as_q='+encodeURIComponent(s)+'&as_sitesearch='+w.location.hostname)}}],
["Сгенерировать/показать пароль", function(){var getRandomPass=function(d){var chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';var rez='';var len=d>=3?d:3;while(rez.length<len){rez+=chars.charAt(Math.floor(Math.random()*chars.length))}return/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).+$/.test(rez)?rez:arguments.callee(len)};var findPassEle=function(p){var c,s='',r=false,f=document.getElementsByTagName('form');for(var i=0;i<f.length;i++){c=f[i].elements;for(var j=0,e;e=c[j];j++){if(e.type=='password'){r=true;if(p){e.value=p;e.focus()}else if(e.value)s+='\n\n'+e.value}}};return r?s:null};var s=findPassEle();if(s){alert('На этой странице уже имеется пароль:'+s)}else{findPassEle(prompt('Пароль сгенерирован'+(s==null?':':'. Вставить?'),getRandomPass(12)))}}],
["Информация о странице +", function(){var meta='',scripts='',embed='',iframes='',cookies='';var corrUrl=function(url){if(!url)return'';var q=url.indexOf('?')+1;return((q&&url.length>50)?url.slice(0,q>50?q:50)+'\u2026':url)+'\n'};var fullUrl=function(url){var a=document.createElement('a');a.href=url;return url?corrUrl(a.href):''};var m=document.getElementsByTagName('meta');for(var i=0,mi;mi=m[i];i++){meta+=(mi.name?mi.name+': ':(mi.httpEquiv?mi.httpEquiv+': ':''))+mi.content+'\n'};var s=document.getElementsByTagName('script');for(var i=0,si;si=s[i];i++){if(si.src)scripts+=corrUrl(si.src)};var e=document.getElementsByTagName('embed');var o=document.getElementsByTagName('object');for(var i=0,ei;ei=e[i];i++){embed+=fullUrl(ei.getAttribute('src'))};for(var i=0,oi;oi=o[i];i++){var src=oi.getAttribute('data')||oi.getAttribute('src')||oi.getAttribute('source');if(!src){var params=oi.getElementsByTagName('param');for(var j=0,p;p=params[j];j++){if(p.hasAttribute('name')&&p.getAttribute('name').match(/^(movie|data|src|code|filename|url|source)$/i)){src=p.getAttribute('value');break}}};var lnk=fullUrl(src);if(embed.indexOf(lnk)==-1)embed+=lnk};var f=document.getElementsByTagName('iframe');for(var i=0,fi;fi=f[i];i++){if(fi.src)iframes+=corrUrl(fi.src)};var c=document.cookie.split(';');for(var i=0,ci;ci=c[i];i++){while(ci.charAt(0)==' ')ci=ci.slice(1);if(ci.length>40)ci=ci.slice(0,40)+'\u2026';cookies+=ci+'\n'};var lastmod=(Date.parse(document.lastModified)==0)?'':document.lastModified;var mode=document.getElementsByTagName('HTmL').length==0?'Really strict':(document.compatMode=='CSS1Compat'?'Normal strict':'Quirks');var title=document.title||(document.getElementsByTagName('title')[0]&&document.getElementsByTagName('title')[0].text)||'';if(meta)meta='\nMeta-данные:\n'+meta;if(scripts)scripts='\nСкрипты:\n'+scripts;if(embed)embed='\nВстроенные объекты:\n'+embed;if(iframes)iframes='\nIframes:\n'+iframes;if(cookies)cookies='\nCookies:\n'+cookies;alert('Идентификация браузера: '+navigator.userAgent+'\n\nЗаголовок: '+title+'\n\nАдрес: '+location.href+'\n\nРеферрер: '+document.referrer+'\n\nДата последнего изменения: '+lastmod+'\n\nРежим отображения: '+mode+' mode\n'+meta+scripts+embed+iframes+cookies)}],
["Исходный код (snapshot)", function(){var q='  ',C={img:1,br:1,link:1,input:1,hr:1,meta:1},u=false,v=0,D=1,g=window.document,m=window.location,w='resizable=yes,scrollbars=yes,location=no',h='</span></li>';var x=function(a){return'<span class=\'tag\'>&lt;'+a+''};var y=function(a){return(a?'/':'')+'&gt;</span>'};var z=function(a,b){if(b||C[a.toLowerCase()])return'';return'<span class=\'tag\'>&lt;/'+a+'&gt;</span>'};var j=function(){var a=v.toString();while(a.length<3)a='0'+a;return'<li class=\'line'+(D&&((v++)&1)?' dark\'':'\'')+'><span>'};var n=function(a){return a.replace(/</g,'&lt;').replace(/>/g,'&gt;')};var E=function(a){var b=a.doctype,c='';if(b){c=j()+x('!DOCTYPE')+' <span class=\'attrDoc\'>'+b.nodeName+(b.publicId?' PUBLIC \''+b.publicId+'\'':'')+(b.systemId?'</span></span>'+h+j()+'<span class=\'tag\'><span class=\'attrDoc\'>'+q+'\''+b.systemId+'\'':'')+'</span>'+y()+h}return c};var F=function(a){var b=a.attributes,c=null,d='';for(var f=0;c=b[f];f++){if(c.specified&&c.value){d+=' <span class=\'attrTitle\'>'+c.name+'</span>=<span class=\'attrValue\'>\x22'+n(c.value.replace(/\t/g,q))+'\x22</span> '}}return d};var r=function(a){return n(a.nodeValue.replace(/[\n\t\r\u00A0]+ */g,'').replace(/ +/g,' '))};var G=function(a){var b=0,c='';while(b<a){c+=q;b++}return c};var A=function(a,b,c){var d='',f=G(b++);switch(a.nodeType){case 1:{var i=a.childNodes,k=null;var s=(i.length==0)||(i.length==1&&i[0].nodeType==3);var t=u&&i.length==0;var l=j()+f+x(a.nodeName)+F(a)+y(t);if(!s)l+=h;for(var B=0;k=i[B];B++){l+=A(k,b,!s&&k.nodeType==3)}if(s){l+=(a.nodeName.toLowerCase()=='textarea'?n(a.value):'')+z(a.nodeName,t)+h}else{l+=j()+f+z(a.nodeName,t)+h}return l}case 3:{if((d=r(a))&&c){return j()+f+d+h}else{return d}}case 4:{d=r(a);return j()+f+'<span class=\'cdata\'>&lt;![CDATA[</span>'+d+'<span class=\'cdata\'>]]&gt;</span>'+h}case 8:{d=r(a);return j()+f+'<span class=\'comment\'>&lt;!--'+d+'--&gt;</span>'+h}}return a.nodeType};var H=function(a){var b,c='';if(a){var d=a.getSelection().getRangeAt(0),f=d.commonAncestorContainer;if(f.nodeType==3||f.nodeType==4)f=f.parentNode;b=f.cloneNode(false);b.appendChild(d.cloneContents());var i=d.startContainer,k=d.endContainer;if(i!=f.firstChild||(i.nodeType==3&&d.startOffset!=0))b.insertBefore(g.createTextNode('\u2026'),b.firstChild);if(k!=f.lastChild||(k.nodeType==3&&d.endOffset!=k.nodeValue.length))b.appendChild(g.createTextNode('\u2026'))}else{c=E(g);b=g.documentElement};c+=A(b,0);return c};var I=function(a){if(a&&a.getSelection){if(a.getSelection().toString())return a;for(var b=0,c,d;c=a.frames[b];b++){try{if(d=arguments.callee(c))return d}catch(e){}}}};var o=I(window);if(o){g=o.document;m=o.location;w+=',width=800,height=500,left=100,top=100'};u=/[a-z]/.test(g.documentElement.nodeName);var J='<!DOCTYPE html PUBLIC><html><head><title>Snapshot: '+((g.getElementsByTagName('title').length&&n(g.getElementsByTagName('title')[0].text))||(m.protocol+'//'+m.host+m.pathname))+'</title><style type=\'text/css\'>body{padding:0 5px;margin:0;font-family:sans-serif;font-size:.7em;background-color:#FFF;color:#000;}#content{white-space:pre-wrap}ol{color:#999;}span{color:#000}.tag{color:#05F}.attrTitle{color:#E00}.attrValue{color:#C0C}.attrDoc{color:#800080}.comment{color:#008000}.cdata{color:#63D}.line{margin:0;padding:0}.dark{background-color:#FAFAFA}</style></head><body><ol id=\'content\'>'+H(o)+'</ol></body></html>';var p=window.open('about:blank','_blank',w);p.document.write(J);p.document.onkeydown=function(a){if(a.keyCode==27)p.close()};p.document.close()}],
["Шахматы", function(){window.open('data:text/html;base64,PGh0bWw+PGhlYWQ+PHRpdGxlPkNoZXNzPC90aXRsZT48bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Ik9zY2FyIFRvbGVkbyBHLiI+PG1ldGEgbmFtZT0ic2l0ZSIgY29udGVudD0iaHR0cDovL25hbm9jaGVzcy4xMTBtYi5jb20vY2hlc3M0Lmh0bWwiPjwvaGVhZD48Ym9keT48c2NyaXB0PnZhciBCLGkseSx1LGIsST1bXSxHPTEyMCx4PTEwLHo9MTUsTT0xZTQsbD1bNSwzLDQsNiwyLDQsMyw1LDEsMSwxLDEsMSwxLDEsMSw5LDksOSw5LDksOSw5LDksMTMsMTEsMTIsMTQsMTAsMTIsMTEsMTMsMCw5OSwwLDMwNiwyOTcsNDk1LDg0NiwtMSwwLDEsMiwyLDEsMCwtMSwtMSwxLC0xMCwxMCwtMTEsLTksOSwxMSwxMCwyMCwtOSwtMTEsLTEwLC0yMCwtMjEsLTE5LC0xMiwtOCw4LDEyLDE5LDIxXTtmdW5jdGlvbiBYKHcsYyxoLGUsUyxzKXt2YXIgdCxvLEwsRSxkLE89ZSxOPS1NKk0sSz03OC1oPDx4LHAsZyxuLG0sQSxxLHIsQyxKLGE9eT8teDp4O3lePTg7RysrO2Q9d3x8cyYmcz49aCYmWCgwLDAsMCwyMSwwLDApPk07ZG97aWYobz1JW3A9T10pe3E9byZ6Xnk7aWYocTw3KXtBPXEtLSYyPzg6NDtDPW8tOSZ6P1s1Myw0Nyw2MSw1MSw0Nyw0N11bcV06NTc7ZG97cj1JW3ArPWxbQ11dO2lmKCF3fHA9PXcpe2c9cXxwK2EtUz8wOlM7aWYoIXImKCEhcXxBPDN8fCEhZyl8fChyKzEmel55KT45JiZxfEE+Mil7aWYobT0hKHItMiY3KSlyZXR1cm4geV49OCxJW0ctLV09TyxLO0o9bj1vJno7RT1JW3AtYV0mejt0PXF8RS03P246KG4rPTIsNl55KTt3aGlsZShuPD10KXtMPXI/bFtyJjd8MzJdLWgtcTowO2lmKHMpTCs9KDEtcT9sWyhwLXAleCkveCszN10tbFsoTy1PJXgpL3grMzddK2xbcCV4KzM4XSoocT8xOjIpLWxbTyV4KzM4XSsobyYxNikvMjohIW0qOSkrKCFxPyEoSVtwLTFdXm4pKyEoSVtwKzFdXm4pK2xbbiY3fDMyXS05OSshIWcqOTkrKEE8Mik6MCkrIShFXnleOSk7aWYocz5ofHwxPHMmcz09aCYmTD56fGQpe0lbcF09bixJW09dPW0/KElbZ109SVttXSxJW21dPTApOmc/SVtnXT0wOjA7TC09WChzPmh8ZD8wOnAsTC1OLGgrMSxJW0crMV0sSj1xfEE+MT8wOnAscyk7aWYoIShofHxzLTF8Qi1PfGktbnxwLWJ8TDwtTSkpcmV0dXJuIFcoKSxHLS0sdT1KO0o9cS0xfEE8N3x8bXx8IXN8ZHxyfG88enx8WCgwLDAsMCwyMSwwLDApPk07SVtPXT1vO0lbcF09cjttPyhJW21dPUlbZ10sSVtnXT0wKTpnP0lbZ109OV55OjB9aWYoTD5OfHxzPjEmJkw9PU4mJiFoJiZNYXRoLnJhbmRvbSgpPC41KXtJW0ddPU87aWYocz4xKXtpZihoJiZjLUw8MClyZXR1cm4geV49OCxHLS0sTDtpZighaClpPW4sQj1PLGI9cH1OPUx9bis9Snx8KGc9cCxtPXA8Tz9nLTM6ZysyLElbbV08enxJW20rTy1wXXx8SVtwKz1wLU9dKT8xOjB9fX19d2hpbGUoIXImcT4yfHwocD1PLHF8QT4yfG8+eiYhciYmKytDKi0tQSkpfX19d2hpbGUoKytPPjk4P089MjA6ZS1PKTtyZXR1cm4geV49OCxHLS0sTitNKk0mJk4+LUsrMTkyNHxkP046MH1CPWk9eT11PTA7d2hpbGUoQisrPDEyMClJW0ItMV09QiV4P0IveCV4PDJ8QiV4PDI/NzpCL3gmND8wOmxbaSsrXXwxNjo3O2ZvcihhPSI8dGFibGUgY2VsbHNwYWNpbmc9MCBhbGlnbj1jZW50ZXIgYm9yZGVyPTA+IixCPTA7Qjw4O0IrKylmb3IoYSs9Ijx0cj4iLGk9MjE7aTwyOTtpKyspYSs9Ijx0ZCB3aWR0aD02MCBoZWlnaHQ9NjAgb25jbGljaz1ZKCIrKEIqeCtpKSsiKSBpZD1vIisoQip4K2kpKyIgc3R5bGU9J2xpbmUtaGVpZ2h0OjUwcHg7Zm9udC1zaXplOjUwcHg7Ym9yZGVyOjJweCBzb2xpZCAiKyIjZTBlMGYwJyBiZ2NvbG9yPSMiKyhpK0ImMT8iZjBmIjoiYzBjIikrIjBmMCBhbGlnbj1jZW50ZXI+IjthKz0iPHRyPjx0ZCBjb2xzcGFuPTggYWxpZ249Y2VudGVyPjxzZWxlY3QgaWQ9dCBzdHlsZT0nZm9udC1zaXplOjIwcHgnPjxvcHRpb24+JiM5ODE5OzxvcHRpb24+Ijtkb2N1bWVudC53cml0ZShhKyImIzk4MjA7PG9wdGlvbj4mIzk4MjE7PG9wdGlvbj4mIzk4MjI7PC9zZWxlY3Q+PC90YWJsZT4iKTtmdW5jdGlvbiBXKCl7Qj1iO2ZvcihwPTIxO3A8OTk7cCs9cCV4LTg/MTozKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibyIrcCkuaW5uZXJIVE1MPSJceGEwXHUyNjVmXHUyNjVhXHUyNjVlXHUyNjVkXHUyNjVjXHUyNjViICBcdTI2NTlcdTI2NTRcdTI2NThcdTI2NTdcdTI2NTZcdTI2NTUiLmNoYXJBdChJW3BdJnopO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitwKS5zdHlsZS5ib3JkZXJDb2xvcj1wPT1CPyJyZWQiOiIjZTBlMGYwIn19VygpO2Z1bmN0aW9uIFkocyl7aT0oSVtzXV55KSZ6O2lmKGk+OCl7Yj1zO1coKX1lbHNlIGlmKEImJmk8OSl7Yj1zO2k9SVtCXSZ6O2lmKChpJjcpPT0xJihiPDI5fGI+OTApKWk9MTQtZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQiKS5zZWxlY3RlZEluZGV4Xnk7WCgwLDAsMCwyMSx1LDEpO2lmKHkpd2luZG93LnNldFRpbWVvdXQoIlgoMCwwLDAsMjEsdSwyLypwbHkqLyksWCgwLDAsMCwyMSx1LDEpIiwyNTApfX08L3NjcmlwdD48L2JvZHk+PC9odG1sPgo=','_blank','width=600,height=550,left=200,top=100')}],
["separator"],
//["Искать логин на Login2",function(){window.open('http://login2.me/#'+location.hostname,'login2.me_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на Loginz",function(){window.open('http://loginz.org/view/'+location.hostname,'loginz_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на ByPass",function(){window.open('https://bypass.org.ru/login/'+location.hostname,'bypass_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на BugMeNot",function(){window.open('http://bugmenot.com/view/'+location.hostname,'bugmenot_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["separator"],
//["Показать ссылки на Flash/Video", function(){var getVideo=function(flashvars,src){var getLink=function(s){var a=s.match(/[^\s\x22=&?]+\.[^\s\x22=&?\/]*(flv|mp4)/i);return a?a[0]:''};var getQuery=function(s,q){var a=s.match(new RegExp('(^|[&?])'+q+'=([^&]+)'));return a?a[2]:''};var getJson=function(s,q){var a=s.match(new RegExp('\x22'+q+'\x22:\\s*(\x22.+?\x22)'));return a?eval(a[1]):''};var getURL=function(f,s){return f.match(/^(\w+:\/\/|\/|$)/)?f:s.replace(/[#?].*$/,'').replace(/[^\/]*$/,f)};var decodeURL=function(s){try{return decodeURIComponent(s)}catch(e){return unescape(s)}};var q='',url=location.href,flv=decodeURL(flashvars);if(url.indexOf('youtube.com/watch?')!=-1&&(q=getQuery(flv,'url')))return decodeURL(q)+'&signature='+getQuery(flv,'sig')+'&title='+encodeURIComponent(document.title);if(url.indexOf('video.google.com/videoplay?')!=-1&&(q=getQuery(src,'videoUrl')))return decodeURL(q);if(url.indexOf('metacafe.com/watch/')!=-1&&(q=getJson(flv,'mediaURL')))return q+'?__gda__='+getJson(flv,'value');if(url.indexOf('dailymotion.com/')!=-1&&(q=getJson(flv,'hqURL')||getJson(flv,'sdURL')))return q;if(url.indexOf('www.break.com/')!=-1&&(q=getQuery(flv,'videoPath')))return q+'?'+getQuery(flv,'icon');if(url.indexOf('my-hit.ru/film/')!=-1&&(q=getLink(flv)))return q+'?start=0&id='+getQuery(flv,'id');return getURL(getLink(flv)||decodeURL(getLink(src)),src)};var createLink=function(url,txt){var oLnk=document.createElement('a');oLnk.setAttribute('href',url);oLnk.setAttribute('style','display:inline;margin:0;padding:0;font:14px Times New Roman;text-decoration:underline;text-transform:none;');oLnk.appendChild(document.createTextNode(txt));return oLnk};var showLink=function(oEle,src,flv){var cName='ujs_downlink';var p=oEle.previousSibling;if(p&&p.className==cName){oEle.parentNode.removeChild(p);return};if(src){var oDiv=document.createElement('div');oDiv.setAttribute('style','display:block;position:static;float:none;margin:0;padding:0;width:auto;height:auto;font:14px Times New Roman;color:#555;z-index:999;');oDiv.className=cName;oDiv.appendChild(createLink(src,'Download'));var v=getVideo(flv,src);if(v){oDiv.appendChild(document.createTextNode(' ('));oDiv.appendChild(createLink(v,'Video'));oDiv.appendChild(document.createTextNode(')'))};oEle.parentNode.insertBefore(oDiv,oEle)}};var getParam=function(e,n){var v='',r=new RegExp('^('+n+')$','i');var param=e.getElementsByTagName('param');for(var i=0,p;p=param[i];i++){if(r.test(p.getAttribute('name'))){v=p.getAttribute('value');break}};return v};var searchEmbed=function(w){if(!w)return;var obj=w.document.getElementsByTagName('object');for(var i=0,oi;oi=obj[i];i++){if(oi.parentNode)showLink(oi,oi.getAttribute('data')||oi.getAttribute('src')||getParam(oi,'movie|data|src|code|filename|url')||(oi.getElementsByTagName('embed').length&&oi.getElementsByTagName('embed')[0].getAttribute('src')),getParam(oi,'flashvars'))};var em=w.document.getElementsByTagName('embed');for(var i=0,ei;ei=em[i];i++){if(ei.parentNode&&ei.parentNode.nodeName.toLowerCase()!='object')showLink(ei,ei.getAttribute('src'),ei.getAttribute('flashvars'))};for(var j=0,f;f=w.frames[j];j++){try{arguments.callee(f)}catch(e){}}};searchEmbed(window)}],
//["Набрать сообщение в форме", function(){window.open('http://southron4965.ucoz.ru/files/Opera_LE/html/forma.html')}],
//["separator"],
["Искать страницу в кэше Google",function(){window.open('http://www.google.com/search?q=cache:'+location.href)}],
["Искать страницу на Archive.org",function(){window.open('http://web.archive.org/web/*/'+location.href)}],
["separator"],
["Посмотреть отзывы о сайте в WOT",function(){window.open('https://www.mywot.com/ru/scorecard/'+location.hostname)}],
["Информация о сервере (netcraft)",function(){window.open('http://toolbar.netcraft.com/site_report?url='+location.hostname)}],
["Проверить доступность сайта через isitdownrightnow.com",function(){window.open('http://www.isitdownrightnow.com/downorjustme.php?url='+location.hostname,'DownForMe_'+location.hostname,'width=600,height=400,left=100,top=100,scrollbars=yes,location=no')}],
["Узнать, кому принадлежит домен через Domaintools",function(){window.open('http://whois.domaintools.com/'+location.hostname)}],
["Узнать, кому принадлежит домен через Reg.ru",function(){window.open('https://www.reg.ru/whois/?dname='+location.hostname)}],
["separator"],
["Проверить с помощью Dr.Web Online",function(){window.open('http://online.drweb.com/result?url='+escape(location.href),'DrWeb_'+location.href,'width=640,height=400,left=200,top=100,scrollbars=yes,location=no')}],
["Проверить с помощью AntiMalware Online",function(){window.open('http://antivirus-alarm.ru/proverka/?url='+escape(location.href),'AntiMalware_'+location.href,'width=640,height=400,left=200,top=100,scrollbars=yes,location=no')}],
["separator"],
["Переключить стиль на странице", "getMarkupDocumentViewer().authorStyleDisabled ? gPageStyleMenu.switchStyleSheet('') : gPageStyleMenu.disableStyle()" ],
["Night - ночной стиль", ()=>{ var night=function(w){(function(d){var css='html{background:#333 !important}html *{background:none !important;color:#bbb !important;border-color:#333 !important;border-width:0 !important}html a,html a *{color:#5c8599 !important;text-decoration:underline !important}html a:visited,html a:visited *,html a:active,html a:active *{color:#525f66 !important}html a:hover,html a:hover *{color:#cef !important;background:#023 !important}html input,html select,html button,html textarea{background:#4d4c40 !important;border:1px solid #5c5a46 !important;border-top-color:#474531 !important;border-bottom-color:#7a7967 !important}html input[type=button],html input[type=submit],html input[type=reset],html input[type=image],html button{border-top-color:#7a7967 !important;border-bottom-color:#474531 !important}html input:focus,html select:focus,html option:focus,html button:focus,html textarea:focus{background:#5c5b3e !important;color:#fff !important;border-color:#474100 #665d00 #7a7849 !important;outline:2px solid #041d29 !important}html input[type=button]:focus,html input[type=submit]:focus,html input[type=reset]:focus,html input[type=image]:focus,html button:focus{border-color:#7a7849 #665d00 #474100 !important}html input[type=radio]{background:none !important;border-color:#333 !important;border-width:0 !important}html img[src],html input[type=image]{opacity:.5}html img[src]:hover,html input[type=image]:hover{opacity:1}html,html body{scrollbar-base-color:#4d4c40 !important;scrollbar-face-color:#5c5b3e !important;scrollbar-shadow-color:#5c5b3e !important;scrollbar-darkshadow-color:#474531 !important;scrollbar-track-color:#4d4c40 !important;scrollbar-arrow-color:#000 !important;scrollbar-3dlight-color:#7a7967 !important}';var s=d.getElementsByTagName('style');for(var i=0,si;si=s[i];i++){if(si.innerHTML==css){si.parentNode.removeChild(si);return}};var heads=d.getElementsByTagName('head');if(heads.length){var node=d.createElement('style');node.type='text/css';node.appendChild(d.createTextNode(css));heads[0].appendChild(node)}})(w.document);for(var i=0,f;f=w.frames[i];i++){try{arguments.callee(f)}catch(e){}}};night(window) }],
["Сохранить как PDF",function(){window.open('http://www.web2pdfconvert.com/engine?cURL='+escape(location.href)+'&title='+escape(document.title)+'&ref=bookmarklet')}],];
var menuPopup = menu.appendChild( document.createElement("menupopup") );
array.forEach(m=> {if ( m[0] == "separator" ) { menuPopup.appendChild(document.createElement("menuseparator")); return };
var mItem = menuPopup.appendChild(document.createElement("menuitem"));
mItem.setAttribute("label", m[0]);

typeof(m[1]) == "string"
? mItem.addEventListener("command", ()=> eval(m[1]))
: mItem.addEventListener("command", ()=> content.location.href = "javascript:(" + encodeURI(m[1]) + ")()");});
})(document.getElementById("contentAreaContextMenu"), "context-inspect");


Тут оказываеться есть "исходный код страницы" только как снапшот.
-А шахматы не пашут, я их недавно перенес с другого кода. "Исправишь?"

-----------------------------------------------------------------------------------------------------------------------------
Вопрос, а если надо поменять столбик в меню, к примеру чтобы он стоял отдельно "сепаратор". Где надо менять в коде?

Gladius333 пишет

Кстати хотел "Удалить куки+флеш" тудаже в прошлую кнопку.

Выделить код

Код:

((contextMenu, el)=> {
var menu = document.createElement("menu");
menu.setAttribute("label", "Дополнительно");
menu.setAttribute("id", "context-ext-addon");
contextMenu.insertBefore(menu, contextMenu.children[el]);
addDestructor(()=> menu.remove() );
var array = [["Поиск по текущему сайту",function(){var getSel=function(w){var s,d=w.document;if(d.selection){var r=d.selection.createRange();s=r?r.text:''}else{s=d.getSelection().toString();if(!s){var e,t=d.getElementsByTagName('textarea'),u=d.getElementsByTagName('input'),i=t.length;while(e=(i>0)?t[--i]:u[-i--])try{if(e.offsetHeight>0&&(s=e.value.substring(e.selectionStart,e.selectionEnd)))break}catch(x){}}};if(!s)for(var j=0,f;f=w.frames[j];j++){try{if(s=getSel(f))break}catch(x){}};return s};var w=window,s=w.prompt('Поиск на этом сайте с помощью Google',getSel(w));if(s){w.open('http://www.google.com/search?as_q='+encodeURIComponent(s)+'&as_sitesearch='+w.location.hostname)}}],
["Сгенерировать/показать пароль", function(){var getRandomPass=function(d){var chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';var rez='';var len=d>=3?d:3;while(rez.length<len){rez+=chars.charAt(Math.floor(Math.random()*chars.length))}return/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).+$/.test(rez)?rez:arguments.callee(len)};var findPassEle=function(p){var c,s='',r=false,f=document.getElementsByTagName('form');for(var i=0;i<f.length;i++){c=f[i].elements;for(var j=0,e;e=c[j];j++){if(e.type=='password'){r=true;if(p){e.value=p;e.focus()}else if(e.value)s+='\n\n'+e.value}}};return r?s:null};var s=findPassEle();if(s){alert('На этой странице уже имеется пароль:'+s)}else{findPassEle(prompt('Пароль сгенерирован'+(s==null?':':'. Вставить?'),getRandomPass(12)))}}],
["Информация о странице +", function(){var meta='',scripts='',embed='',iframes='',cookies='';var corrUrl=function(url){if(!url)return'';var q=url.indexOf('?')+1;return((q&&url.length>50)?url.slice(0,q>50?q:50)+'\u2026':url)+'\n'};var fullUrl=function(url){var a=document.createElement('a');a.href=url;return url?corrUrl(a.href):''};var m=document.getElementsByTagName('meta');for(var i=0,mi;mi=m[i];i++){meta+=(mi.name?mi.name+': ':(mi.httpEquiv?mi.httpEquiv+': ':''))+mi.content+'\n'};var s=document.getElementsByTagName('script');for(var i=0,si;si=s[i];i++){if(si.src)scripts+=corrUrl(si.src)};var e=document.getElementsByTagName('embed');var o=document.getElementsByTagName('object');for(var i=0,ei;ei=e[i];i++){embed+=fullUrl(ei.getAttribute('src'))};for(var i=0,oi;oi=o[i];i++){var src=oi.getAttribute('data')||oi.getAttribute('src')||oi.getAttribute('source');if(!src){var params=oi.getElementsByTagName('param');for(var j=0,p;p=params[j];j++){if(p.hasAttribute('name')&&p.getAttribute('name').match(/^(movie|data|src|code|filename|url|source)$/i)){src=p.getAttribute('value');break}}};var lnk=fullUrl(src);if(embed.indexOf(lnk)==-1)embed+=lnk};var f=document.getElementsByTagName('iframe');for(var i=0,fi;fi=f[i];i++){if(fi.src)iframes+=corrUrl(fi.src)};var c=document.cookie.split(';');for(var i=0,ci;ci=c[i];i++){while(ci.charAt(0)==' ')ci=ci.slice(1);if(ci.length>40)ci=ci.slice(0,40)+'\u2026';cookies+=ci+'\n'};var lastmod=(Date.parse(document.lastModified)==0)?'':document.lastModified;var mode=document.getElementsByTagName('HTmL').length==0?'Really strict':(document.compatMode=='CSS1Compat'?'Normal strict':'Quirks');var title=document.title||(document.getElementsByTagName('title')[0]&&document.getElementsByTagName('title')[0].text)||'';if(meta)meta='\nMeta-данные:\n'+meta;if(scripts)scripts='\nСкрипты:\n'+scripts;if(embed)embed='\nВстроенные объекты:\n'+embed;if(iframes)iframes='\nIframes:\n'+iframes;if(cookies)cookies='\nCookies:\n'+cookies;alert('Идентификация браузера: '+navigator.userAgent+'\n\nЗаголовок: '+title+'\n\nАдрес: '+location.href+'\n\nРеферрер: '+document.referrer+'\n\nДата последнего изменения: '+lastmod+'\n\nРежим отображения: '+mode+' mode\n'+meta+scripts+embed+iframes+cookies)}],
["Исходный код (snapshot)", function(){var q='  ',C={img:1,br:1,link:1,input:1,hr:1,meta:1},u=false,v=0,D=1,g=window.document,m=window.location,w='resizable=yes,scrollbars=yes,location=no',h='</span></li>';var x=function(a){return'<span class=\'tag\'>&lt;'+a+''};var y=function(a){return(a?'/':'')+'&gt;</span>'};var z=function(a,b){if(b||C[a.toLowerCase()])return'';return'<span class=\'tag\'>&lt;/'+a+'&gt;</span>'};var j=function(){var a=v.toString();while(a.length<3)a='0'+a;return'<li class=\'line'+(D&&((v++)&1)?' dark\'':'\'')+'><span>'};var n=function(a){return a.replace(/</g,'&lt;').replace(/>/g,'&gt;')};var E=function(a){var b=a.doctype,c='';if(b){c=j()+x('!DOCTYPE')+' <span class=\'attrDoc\'>'+b.nodeName+(b.publicId?' PUBLIC \''+b.publicId+'\'':'')+(b.systemId?'</span></span>'+h+j()+'<span class=\'tag\'><span class=\'attrDoc\'>'+q+'\''+b.systemId+'\'':'')+'</span>'+y()+h}return c};var F=function(a){var b=a.attributes,c=null,d='';for(var f=0;c=b[f];f++){if(c.specified&&c.value){d+=' <span class=\'attrTitle\'>'+c.name+'</span>=<span class=\'attrValue\'>\x22'+n(c.value.replace(/\t/g,q))+'\x22</span> '}}return d};var r=function(a){return n(a.nodeValue.replace(/[\n\t\r\u00A0]+ */g,'').replace(/ +/g,' '))};var G=function(a){var b=0,c='';while(b<a){c+=q;b++}return c};var A=function(a,b,c){var d='',f=G(b++);switch(a.nodeType){case 1:{var i=a.childNodes,k=null;var s=(i.length==0)||(i.length==1&&i[0].nodeType==3);var t=u&&i.length==0;var l=j()+f+x(a.nodeName)+F(a)+y(t);if(!s)l+=h;for(var B=0;k=i[B];B++){l+=A(k,b,!s&&k.nodeType==3)}if(s){l+=(a.nodeName.toLowerCase()=='textarea'?n(a.value):'')+z(a.nodeName,t)+h}else{l+=j()+f+z(a.nodeName,t)+h}return l}case 3:{if((d=r(a))&&c){return j()+f+d+h}else{return d}}case 4:{d=r(a);return j()+f+'<span class=\'cdata\'>&lt;![CDATA[</span>'+d+'<span class=\'cdata\'>]]&gt;</span>'+h}case 8:{d=r(a);return j()+f+'<span class=\'comment\'>&lt;!--'+d+'--&gt;</span>'+h}}return a.nodeType};var H=function(a){var b,c='';if(a){var d=a.getSelection().getRangeAt(0),f=d.commonAncestorContainer;if(f.nodeType==3||f.nodeType==4)f=f.parentNode;b=f.cloneNode(false);b.appendChild(d.cloneContents());var i=d.startContainer,k=d.endContainer;if(i!=f.firstChild||(i.nodeType==3&&d.startOffset!=0))b.insertBefore(g.createTextNode('\u2026'),b.firstChild);if(k!=f.lastChild||(k.nodeType==3&&d.endOffset!=k.nodeValue.length))b.appendChild(g.createTextNode('\u2026'))}else{c=E(g);b=g.documentElement};c+=A(b,0);return c};var I=function(a){if(a&&a.getSelection){if(a.getSelection().toString())return a;for(var b=0,c,d;c=a.frames[b];b++){try{if(d=arguments.callee(c))return d}catch(e){}}}};var o=I(window);if(o){g=o.document;m=o.location;w+=',width=800,height=500,left=100,top=100'};u=/[a-z]/.test(g.documentElement.nodeName);var J='<!DOCTYPE html PUBLIC><html><head><title>Snapshot: '+((g.getElementsByTagName('title').length&&n(g.getElementsByTagName('title')[0].text))||(m.protocol+'//'+m.host+m.pathname))+'</title><style type=\'text/css\'>body{padding:0 5px;margin:0;font-family:sans-serif;font-size:.7em;background-color:#FFF;color:#000;}#content{white-space:pre-wrap}ol{color:#999;}span{color:#000}.tag{color:#05F}.attrTitle{color:#E00}.attrValue{color:#C0C}.attrDoc{color:#800080}.comment{color:#008000}.cdata{color:#63D}.line{margin:0;padding:0}.dark{background-color:#FAFAFA}</style></head><body><ol id=\'content\'>'+H(o)+'</ol></body></html>';var p=window.open('about:blank','_blank',w);p.document.write(J);p.document.onkeydown=function(a){if(a.keyCode==27)p.close()};p.document.close()}],
["Шахматы", function(){window.open('data:text/html;base64,PGh0bWw+PGhlYWQ+PHRpdGxlPkNoZXNzPC90aXRsZT48bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Ik9zY2FyIFRvbGVkbyBHLiI+PG1ldGEgbmFtZT0ic2l0ZSIgY29udGVudD0iaHR0cDovL25hbm9jaGVzcy4xMTBtYi5jb20vY2hlc3M0Lmh0bWwiPjwvaGVhZD48Ym9keT48c2NyaXB0PnZhciBCLGkseSx1LGIsST1bXSxHPTEyMCx4PTEwLHo9MTUsTT0xZTQsbD1bNSwzLDQsNiwyLDQsMyw1LDEsMSwxLDEsMSwxLDEsMSw5LDksOSw5LDksOSw5LDksMTMsMTEsMTIsMTQsMTAsMTIsMTEsMTMsMCw5OSwwLDMwNiwyOTcsNDk1LDg0NiwtMSwwLDEsMiwyLDEsMCwtMSwtMSwxLC0xMCwxMCwtMTEsLTksOSwxMSwxMCwyMCwtOSwtMTEsLTEwLC0yMCwtMjEsLTE5LC0xMiwtOCw4LDEyLDE5LDIxXTtmdW5jdGlvbiBYKHcsYyxoLGUsUyxzKXt2YXIgdCxvLEwsRSxkLE89ZSxOPS1NKk0sSz03OC1oPDx4LHAsZyxuLG0sQSxxLHIsQyxKLGE9eT8teDp4O3lePTg7RysrO2Q9d3x8cyYmcz49aCYmWCgwLDAsMCwyMSwwLDApPk07ZG97aWYobz1JW3A9T10pe3E9byZ6Xnk7aWYocTw3KXtBPXEtLSYyPzg6NDtDPW8tOSZ6P1s1Myw0Nyw2MSw1MSw0Nyw0N11bcV06NTc7ZG97cj1JW3ArPWxbQ11dO2lmKCF3fHA9PXcpe2c9cXxwK2EtUz8wOlM7aWYoIXImKCEhcXxBPDN8fCEhZyl8fChyKzEmel55KT45JiZxfEE+Mil7aWYobT0hKHItMiY3KSlyZXR1cm4geV49OCxJW0ctLV09TyxLO0o9bj1vJno7RT1JW3AtYV0mejt0PXF8RS03P246KG4rPTIsNl55KTt3aGlsZShuPD10KXtMPXI/bFtyJjd8MzJdLWgtcTowO2lmKHMpTCs9KDEtcT9sWyhwLXAleCkveCszN10tbFsoTy1PJXgpL3grMzddK2xbcCV4KzM4XSoocT8xOjIpLWxbTyV4KzM4XSsobyYxNikvMjohIW0qOSkrKCFxPyEoSVtwLTFdXm4pKyEoSVtwKzFdXm4pK2xbbiY3fDMyXS05OSshIWcqOTkrKEE8Mik6MCkrIShFXnleOSk7aWYocz5ofHwxPHMmcz09aCYmTD56fGQpe0lbcF09bixJW09dPW0/KElbZ109SVttXSxJW21dPTApOmc/SVtnXT0wOjA7TC09WChzPmh8ZD8wOnAsTC1OLGgrMSxJW0crMV0sSj1xfEE+MT8wOnAscyk7aWYoIShofHxzLTF8Qi1PfGktbnxwLWJ8TDwtTSkpcmV0dXJuIFcoKSxHLS0sdT1KO0o9cS0xfEE8N3x8bXx8IXN8ZHxyfG88enx8WCgwLDAsMCwyMSwwLDApPk07SVtPXT1vO0lbcF09cjttPyhJW21dPUlbZ10sSVtnXT0wKTpnP0lbZ109OV55OjB9aWYoTD5OfHxzPjEmJkw9PU4mJiFoJiZNYXRoLnJhbmRvbSgpPC41KXtJW0ddPU87aWYocz4xKXtpZihoJiZjLUw8MClyZXR1cm4geV49OCxHLS0sTDtpZighaClpPW4sQj1PLGI9cH1OPUx9bis9Snx8KGc9cCxtPXA8Tz9nLTM6ZysyLElbbV08enxJW20rTy1wXXx8SVtwKz1wLU9dKT8xOjB9fX19d2hpbGUoIXImcT4yfHwocD1PLHF8QT4yfG8+eiYhciYmKytDKi0tQSkpfX19d2hpbGUoKytPPjk4P089MjA6ZS1PKTtyZXR1cm4geV49OCxHLS0sTitNKk0mJk4+LUsrMTkyNHxkP046MH1CPWk9eT11PTA7d2hpbGUoQisrPDEyMClJW0ItMV09QiV4P0IveCV4PDJ8QiV4PDI/NzpCL3gmND8wOmxbaSsrXXwxNjo3O2ZvcihhPSI8dGFibGUgY2VsbHNwYWNpbmc9MCBhbGlnbj1jZW50ZXIgYm9yZGVyPTA+IixCPTA7Qjw4O0IrKylmb3IoYSs9Ijx0cj4iLGk9MjE7aTwyOTtpKyspYSs9Ijx0ZCB3aWR0aD02MCBoZWlnaHQ9NjAgb25jbGljaz1ZKCIrKEIqeCtpKSsiKSBpZD1vIisoQip4K2kpKyIgc3R5bGU9J2xpbmUtaGVpZ2h0OjUwcHg7Zm9udC1zaXplOjUwcHg7Ym9yZGVyOjJweCBzb2xpZCAiKyIjZTBlMGYwJyBiZ2NvbG9yPSMiKyhpK0ImMT8iZjBmIjoiYzBjIikrIjBmMCBhbGlnbj1jZW50ZXI+IjthKz0iPHRyPjx0ZCBjb2xzcGFuPTggYWxpZ249Y2VudGVyPjxzZWxlY3QgaWQ9dCBzdHlsZT0nZm9udC1zaXplOjIwcHgnPjxvcHRpb24+JiM5ODE5OzxvcHRpb24+Ijtkb2N1bWVudC53cml0ZShhKyImIzk4MjA7PG9wdGlvbj4mIzk4MjE7PG9wdGlvbj4mIzk4MjI7PC9zZWxlY3Q+PC90YWJsZT4iKTtmdW5jdGlvbiBXKCl7Qj1iO2ZvcihwPTIxO3A8OTk7cCs9cCV4LTg/MTozKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibyIrcCkuaW5uZXJIVE1MPSJceGEwXHUyNjVmXHUyNjVhXHUyNjVlXHUyNjVkXHUyNjVjXHUyNjViICBcdTI2NTlcdTI2NTRcdTI2NThcdTI2NTdcdTI2NTZcdTI2NTUiLmNoYXJBdChJW3BdJnopO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitwKS5zdHlsZS5ib3JkZXJDb2xvcj1wPT1CPyJyZWQiOiIjZTBlMGYwIn19VygpO2Z1bmN0aW9uIFkocyl7aT0oSVtzXV55KSZ6O2lmKGk+OCl7Yj1zO1coKX1lbHNlIGlmKEImJmk8OSl7Yj1zO2k9SVtCXSZ6O2lmKChpJjcpPT0xJihiPDI5fGI+OTApKWk9MTQtZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQiKS5zZWxlY3RlZEluZGV4Xnk7WCgwLDAsMCwyMSx1LDEpO2lmKHkpd2luZG93LnNldFRpbWVvdXQoIlgoMCwwLDAsMjEsdSwyLypwbHkqLyksWCgwLDAsMCwyMSx1LDEpIiwyNTApfX08L3NjcmlwdD48L2JvZHk+PC9odG1sPgo=','_blank','width=600,height=550,left=200,top=100')}],
["separator"],
//["Искать логин на Login2",function(){window.open('http://login2.me/#'+location.hostname,'login2.me_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на Loginz",function(){window.open('http://loginz.org/view/'+location.hostname,'loginz_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на ByPass",function(){window.open('https://bypass.org.ru/login/'+location.hostname,'bypass_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на BugMeNot",function(){window.open('http://bugmenot.com/view/'+location.hostname,'bugmenot_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["separator"],
//["Показать ссылки на Flash/Video", function(){var getVideo=function(flashvars,src){var getLink=function(s){var a=s.match(/[^\s\x22=&?]+\.[^\s\x22=&?\/]*(flv|mp4)/i);return a?a[0]:''};var getQuery=function(s,q){var a=s.match(new RegExp('(^|[&?])'+q+'=([^&]+)'));return a?a[2]:''};var getJson=function(s,q){var a=s.match(new RegExp('\x22'+q+'\x22:\\s*(\x22.+?\x22)'));return a?eval(a[1]):''};var getURL=function(f,s){return f.match(/^(\w+:\/\/|\/|$)/)?f:s.replace(/[#?].*$/,'').replace(/[^\/]*$/,f)};var decodeURL=function(s){try{return decodeURIComponent(s)}catch(e){return unescape(s)}};var q='',url=location.href,flv=decodeURL(flashvars);if(url.indexOf('youtube.com/watch?')!=-1&&(q=getQuery(flv,'url')))return decodeURL(q)+'&signature='+getQuery(flv,'sig')+'&title='+encodeURIComponent(document.title);if(url.indexOf('video.google.com/videoplay?')!=-1&&(q=getQuery(src,'videoUrl')))return decodeURL(q);if(url.indexOf('metacafe.com/watch/')!=-1&&(q=getJson(flv,'mediaURL')))return q+'?__gda__='+getJson(flv,'value');if(url.indexOf('dailymotion.com/')!=-1&&(q=getJson(flv,'hqURL')||getJson(flv,'sdURL')))return q;if(url.indexOf('www.break.com/')!=-1&&(q=getQuery(flv,'videoPath')))return q+'?'+getQuery(flv,'icon');if(url.indexOf('my-hit.ru/film/')!=-1&&(q=getLink(flv)))return q+'?start=0&id='+getQuery(flv,'id');return getURL(getLink(flv)||decodeURL(getLink(src)),src)};var createLink=function(url,txt){var oLnk=document.createElement('a');oLnk.setAttribute('href',url);oLnk.setAttribute('style','display:inline;margin:0;padding:0;font:14px Times New Roman;text-decoration:underline;text-transform:none;');oLnk.appendChild(document.createTextNode(txt));return oLnk};var showLink=function(oEle,src,flv){var cName='ujs_downlink';var p=oEle.previousSibling;if(p&&p.className==cName){oEle.parentNode.removeChild(p);return};if(src){var oDiv=document.createElement('div');oDiv.setAttribute('style','display:block;position:static;float:none;margin:0;padding:0;width:auto;height:auto;font:14px Times New Roman;color:#555;z-index:999;');oDiv.className=cName;oDiv.appendChild(createLink(src,'Download'));var v=getVideo(flv,src);if(v){oDiv.appendChild(document.createTextNode(' ('));oDiv.appendChild(createLink(v,'Video'));oDiv.appendChild(document.createTextNode(')'))};oEle.parentNode.insertBefore(oDiv,oEle)}};var getParam=function(e,n){var v='',r=new RegExp('^('+n+')$','i');var param=e.getElementsByTagName('param');for(var i=0,p;p=param[i];i++){if(r.test(p.getAttribute('name'))){v=p.getAttribute('value');break}};return v};var searchEmbed=function(w){if(!w)return;var obj=w.document.getElementsByTagName('object');for(var i=0,oi;oi=obj[i];i++){if(oi.parentNode)showLink(oi,oi.getAttribute('data')||oi.getAttribute('src')||getParam(oi,'movie|data|src|code|filename|url')||(oi.getElementsByTagName('embed').length&&oi.getElementsByTagName('embed')[0].getAttribute('src')),getParam(oi,'flashvars'))};var em=w.document.getElementsByTagName('embed');for(var i=0,ei;ei=em[i];i++){if(ei.parentNode&&ei.parentNode.nodeName.toLowerCase()!='object')showLink(ei,ei.getAttribute('src'),ei.getAttribute('flashvars'))};for(var j=0,f;f=w.frames[j];j++){try{arguments.callee(f)}catch(e){}}};searchEmbed(window)}],
//["Набрать сообщение в форме", function(){window.open('http://southron4965.ucoz.ru/files/Opera_LE/html/forma.html')}],
//["separator"],
["Искать страницу в кэше Google",function(){window.open('http://www.google.com/search?q=cache:'+location.href)}],
["Искать страницу на Archive.org",function(){window.open('http://web.archive.org/web/*/'+location.href)}],
["separator"],
["Посмотреть отзывы о сайте в WOT",function(){window.open('https://www.mywot.com/ru/scorecard/'+location.hostname)}],
["Информация о сервере (netcraft)",function(){window.open('http://toolbar.netcraft.com/site_report?url='+location.hostname)}],
["Проверить доступность сайта через isitdownrightnow.com",function(){window.open('http://www.isitdownrightnow.com/downorjustme.php?url='+location.hostname,'DownForMe_'+location.hostname,'width=600,height=400,left=100,top=100,scrollbars=yes,location=no')}],
["Узнать, кому принадлежит домен через Domaintools",function(){window.open('http://whois.domaintools.com/'+location.hostname)}],
["Узнать, кому принадлежит домен через Reg.ru",function(){window.open('https://www.reg.ru/whois/?dname='+location.hostname)}],
["separator"],
["Проверить с помощью Dr.Web Online",function(){window.open('http://online.drweb.com/result?url='+escape(location.href),'DrWeb_'+location.href,'width=640,height=400,left=200,top=100,scrollbars=yes,location=no')}],
["Проверить с помощью AntiMalware Online",function(){window.open('http://antivirus-alarm.ru/proverka/?url='+escape(location.href),'AntiMalware_'+location.href,'width=640,height=400,left=200,top=100,scrollbars=yes,location=no')}],
["separator"],
["Переключить стиль на странице", "getMarkupDocumentViewer().authorStyleDisabled ? gPageStyleMenu.switchStyleSheet('') : gPageStyleMenu.disableStyle()" ],
["Night - ночной стиль", ()=>{ var night=function(w){(function(d){var css='html{background:#333 !important}html *{background:none !important;color:#bbb !important;border-color:#333 !important;border-width:0 !important}html a,html a *{color:#5c8599 !important;text-decoration:underline !important}html a:visited,html a:visited *,html a:active,html a:active *{color:#525f66 !important}html a:hover,html a:hover *{color:#cef !important;background:#023 !important}html input,html select,html button,html textarea{background:#4d4c40 !important;border:1px solid #5c5a46 !important;border-top-color:#474531 !important;border-bottom-color:#7a7967 !important}html input[type=button],html input[type=submit],html input[type=reset],html input[type=image],html button{border-top-color:#7a7967 !important;border-bottom-color:#474531 !important}html input:focus,html select:focus,html option:focus,html button:focus,html textarea:focus{background:#5c5b3e !important;color:#fff !important;border-color:#474100 #665d00 #7a7849 !important;outline:2px solid #041d29 !important}html input[type=button]:focus,html input[type=submit]:focus,html input[type=reset]:focus,html input[type=image]:focus,html button:focus{border-color:#7a7849 #665d00 #474100 !important}html input[type=radio]{background:none !important;border-color:#333 !important;border-width:0 !important}html img[src],html input[type=image]{opacity:.5}html img[src]:hover,html input[type=image]:hover{opacity:1}html,html body{scrollbar-base-color:#4d4c40 !important;scrollbar-face-color:#5c5b3e !important;scrollbar-shadow-color:#5c5b3e !important;scrollbar-darkshadow-color:#474531 !important;scrollbar-track-color:#4d4c40 !important;scrollbar-arrow-color:#000 !important;scrollbar-3dlight-color:#7a7967 !important}';var s=d.getElementsByTagName('style');for(var i=0,si;si=s[i];i++){if(si.innerHTML==css){si.parentNode.removeChild(si);return}};var heads=d.getElementsByTagName('head');if(heads.length){var node=d.createElement('style');node.type='text/css';node.appendChild(d.createTextNode(css));heads[0].appendChild(node)}})(w.document);for(var i=0,f;f=w.frames[i];i++){try{arguments.callee(f)}catch(e){}}};night(window) }],
["Сохранить как PDF",function(){window.open('http://www.web2pdfconvert.com/engine?cURL='+escape(location.href)+'&title='+escape(document.title)+'&ref=bookmarklet')}],
["Удалить куки текущего сайта", "deleteCookiesFromHost()"],
];
var menuPopup = menu.appendChild( document.createElement("menupopup") );
array.forEach(m=> {if ( m[0] == "separator" ) { menuPopup.appendChild(document.createElement("menuseparator")); return };
var mItem = menuPopup.appendChild(document.createElement("menuitem"));
mItem.setAttribute("label", m[0]);

typeof(m[1]) == "string"
? mItem.addEventListener("command", ()=> eval(m[1]))
: mItem.addEventListener("command", ()=> content.location.href = "javascript:(" + encodeURI(m[1]) + ")()");});

   
function deleteCookiesFromHost() {
      var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);

      for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {
            var cookie = en.getNext().QueryInterface(Ci.nsICookie);
            ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false); 
            }
   
      var reversedDomain = host.split("").reverse().join("") + ".";
      Cu.import("resource://gre/modules/FileUtils.jsm");
      var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
      var dbConn = Services.storage.openDatabase(file);
      dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");
      dbConn.close();
   
      var dir = Services.dirsvc.get('Home', Ci.nsIFile);
      dir.append("Application Data");
      dir.append("Macromedia");
      dir.remove(true);
      dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
   };
})(document.getElementById("contentAreaContextMenu"), "context-inspect");
bunda1 пишет
Gladius333 пишет

Кстати хотел "Удалить куки+флеш" тудаже в прошлую кнопку.

Спасибо, я понял откуда ты этот код взял, я оттуда добавил "перезагрузить все вкладки текущего сайта", но он не работает, как правильно сделать чтобы оба кода выполнялись вместе? просто там выполняеться только "перезагрузить все вкладки текущего сайта".

Удалить куки текущего сайта

Выделить код

Код:

["Удалить куки текущего сайта", "deleteCookiesFromHost(), reloadAllTabsFromHost()"],];


----------------------------------------------------------------------------------------------------------------
И где меню "Шахматы" он октрывает и сразу закрываеться, в чем проблема?
Шахматы

Выделить код

Код:

["Шахматы", function(){window.open('data:text/html;base64,PGh0bWw+PGhlYWQ+PHRpdGxlPkNoZXNzPC90aXRsZT48bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Ik9zY2FyIFRvbGVkbyBHLiI+PG1ldGEgbmFtZT0ic2l0ZSIgY29udGVudD0iaHR0cDovL25hbm9jaGVzcy4xMTBtYi5jb20vY2hlc3M0Lmh0bWwiPjwvaGVhZD48Ym9keT48c2NyaXB0PnZhciBCLGkseSx1LGIsST1bXSxHPTEyMCx4PTEwLHo9MTUsTT0xZTQsbD1bNSwzLDQsNiwyLDQsMyw1LDEsMSwxLDEsMSwxLDEsMSw5LDksOSw5LDksOSw5LDksMTMsMTEsMTIsMTQsMTAsMTIsMTEsMTMsMCw5OSwwLDMwNiwyOTcsNDk1LDg0NiwtMSwwLDEsMiwyLDEsMCwtMSwtMSwxLC0xMCwxMCwtMTEsLTksOSwxMSwxMCwyMCwtOSwtMTEsLTEwLC0yMCwtMjEsLTE5LC0xMiwtOCw4LDEyLDE5LDIxXTtmdW5jdGlvbiBYKHcsYyxoLGUsUyxzKXt2YXIgdCxvLEwsRSxkLE89ZSxOPS1NKk0sSz03OC1oPDx4LHAsZyxuLG0sQSxxLHIsQyxKLGE9eT8teDp4O3lePTg7RysrO2Q9d3x8cyYmcz49aCYmWCgwLDAsMCwyMSwwLDApPk07ZG97aWYobz1JW3A9T10pe3E9byZ6Xnk7aWYocTw3KXtBPXEtLSYyPzg6NDtDPW8tOSZ6P1s1Myw0Nyw2MSw1MSw0Nyw0N11bcV06NTc7ZG97cj1JW3ArPWxbQ11dO2lmKCF3fHA9PXcpe2c9cXxwK2EtUz8wOlM7aWYoIXImKCEhcXxBPDN8fCEhZyl8fChyKzEmel55KT45JiZxfEE+Mil7aWYobT0hKHItMiY3KSlyZXR1cm4geV49OCxJW0ctLV09TyxLO0o9bj1vJno7RT1JW3AtYV0mejt0PXF8RS03P246KG4rPTIsNl55KTt3aGlsZShuPD10KXtMPXI/bFtyJjd8MzJdLWgtcTowO2lmKHMpTCs9KDEtcT9sWyhwLXAleCkveCszN10tbFsoTy1PJXgpL3grMzddK2xbcCV4KzM4XSoocT8xOjIpLWxbTyV4KzM4XSsobyYxNikvMjohIW0qOSkrKCFxPyEoSVtwLTFdXm4pKyEoSVtwKzFdXm4pK2xbbiY3fDMyXS05OSshIWcqOTkrKEE8Mik6MCkrIShFXnleOSk7aWYocz5ofHwxPHMmcz09aCYmTD56fGQpe0lbcF09bixJW09dPW0/KElbZ109SVttXSxJW21dPTApOmc/SVtnXT0wOjA7TC09WChzPmh8ZD8wOnAsTC1OLGgrMSxJW0crMV0sSj1xfEE+MT8wOnAscyk7aWYoIShofHxzLTF8Qi1PfGktbnxwLWJ8TDwtTSkpcmV0dXJuIFcoKSxHLS0sdT1KO0o9cS0xfEE8N3x8bXx8IXN8ZHxyfG88enx8WCgwLDAsMCwyMSwwLDApPk07SVtPXT1vO0lbcF09cjttPyhJW21dPUlbZ10sSVtnXT0wKTpnP0lbZ109OV55OjB9aWYoTD5OfHxzPjEmJkw9PU4mJiFoJiZNYXRoLnJhbmRvbSgpPC41KXtJW0ddPU87aWYocz4xKXtpZihoJiZjLUw8MClyZXR1cm4geV49OCxHLS0sTDtpZighaClpPW4sQj1PLGI9cH1OPUx9bis9Snx8KGc9cCxtPXA8Tz9nLTM6ZysyLElbbV08enxJW20rTy1wXXx8SVtwKz1wLU9dKT8xOjB9fX19d2hpbGUoIXImcT4yfHwocD1PLHF8QT4yfG8+eiYhciYmKytDKi0tQSkpfX19d2hpbGUoKytPPjk4P089MjA6ZS1PKTtyZXR1cm4geV49OCxHLS0sTitNKk0mJk4+LUsrMTkyNHxkP046MH1CPWk9eT11PTA7d2hpbGUoQisrPDEyMClJW0ItMV09QiV4P0IveCV4PDJ8QiV4PDI/NzpCL3gmND8wOmxbaSsrXXwxNjo3O2ZvcihhPSI8dGFibGUgY2VsbHNwYWNpbmc9MCBhbGlnbj1jZW50ZXIgYm9yZGVyPTA+IixCPTA7Qjw4O0IrKylmb3IoYSs9Ijx0cj4iLGk9MjE7aTwyOTtpKyspYSs9Ijx0ZCB3aWR0aD02MCBoZWlnaHQ9NjAgb25jbGljaz1ZKCIrKEIqeCtpKSsiKSBpZD1vIisoQip4K2kpKyIgc3R5bGU9J2xpbmUtaGVpZ2h0OjUwcHg7Zm9udC1zaXplOjUwcHg7Ym9yZGVyOjJweCBzb2xpZCAiKyIjZTBlMGYwJyBiZ2NvbG9yPSMiKyhpK0ImMT8iZjBmIjoiYzBjIikrIjBmMCBhbGlnbj1jZW50ZXI+IjthKz0iPHRyPjx0ZCBjb2xzcGFuPTggYWxpZ249Y2VudGVyPjxzZWxlY3QgaWQ9dCBzdHlsZT0nZm9udC1zaXplOjIwcHgnPjxvcHRpb24+JiM5ODE5OzxvcHRpb24+Ijtkb2N1bWVudC53cml0ZShhKyImIzk4MjA7PG9wdGlvbj4mIzk4MjE7PG9wdGlvbj4mIzk4MjI7PC9zZWxlY3Q+PC90YWJsZT4iKTtmdW5jdGlvbiBXKCl7Qj1iO2ZvcihwPTIxO3A8OTk7cCs9cCV4LTg/MTozKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibyIrcCkuaW5uZXJIVE1MPSJceGEwXHUyNjVmXHUyNjVhXHUyNjVlXHUyNjVkXHUyNjVjXHUyNjViICBcdTI2NTlcdTI2NTRcdTI2NThcdTI2NTdcdTI2NTZcdTI2NTUiLmNoYXJBdChJW3BdJnopO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitwKS5zdHlsZS5ib3JkZXJDb2xvcj1wPT1CPyJyZWQiOiIjZTBlMGYwIn19VygpO2Z1bmN0aW9uIFkocyl7aT0oSVtzXV55KSZ6O2lmKGk+OCl7Yj1zO1coKX1lbHNlIGlmKEImJmk8OSl7Yj1zO2k9SVtCXSZ6O2lmKChpJjcpPT0xJihiPDI5fGI+OTApKWk9MTQtZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQiKS5zZWxlY3RlZEluZGV4Xnk7WCgwLDAsMCwyMSx1LDEpO2lmKHkpd2luZG93LnNldFRpbWVvdXQoIlgoMCwwLDAsMjEsdSwyLypwbHkqLyksWCgwLDAsMCwyMSx1LDEpIiwyNTApfX08L3NjcmlwdD48L2JvZHk+PC9odG1sPgo=','_blank','width=600,height=550,left=200,top=100')}],

:/

Выделить код

Код:

"deleteCookiesFromHost(); reloadAllTabsFromHost()"
bunda1 пишет

:/

Выделить код

Код:

"deleteCookiesFromHost(); reloadAllTabsFromHost()"

А я так делал, потом тестил куки не удалялись но страницы перезагружались, подумал он пропускает. Походу дела тот код бесполезен "reloadAllTabsFromHost()" так как пока с одной удаляет, на другой грузятся другие куки, то есть тупо перезагружает страницу...

Спасиб еще раз, я тот код удалю, ты поэтому не добавил?
------------------------------------
А почему шахматы закрываються? при открытий.

Gladius333 пишет

Спасиб еще раз, я тот код удалю, ты поэтому не добавил?
------------------------------------
А почему шахматы закрываються? при открытий.

Gladius333 пишет

Спасиб еще раз, я тот код удалю, ты поэтому не добавил?
------------------------------------
А почему шахматы закрываються? при открытий.

Да потому, я сам им не пользуюсь reloadAllTabsFromHost() но кто то просил добавить в кнопку. Шахматы посмотрю вечером.

Gladius333 пишет

А почему шахматы закрываються? при открытий.

У меня вроде не закрывается. Мистика.

Вопрос можно кроме меню "допольнительно", добавить еще одно меню?
==================================
Или можно добавить в меню-еще меню, к примеру
------------------------------------------------
дополнительно[выпадающее меню]
---линкс[выпадающее меню-сами ссылки]
---разное[выпадающее меню-сами ссылки]
------------------------------------------------
==================================

Примерно так, этот код нерабочий просто как набросок...

Выделить код

Код:

((contextMenu, el)=> {
var menu = document.createElement("menu");
menu.setAttribute("label", "- Additionally -");
menu.setAttribute("id", "context-ext-addon");
contextMenu.insertBefore(menu, contextMenu.children[el]);
addDestructor(()=> menu.remove() );
var array = [["Поиск по текущему сайту",function(){var getSel=function(w){var s,d=w.document;if(d.selection){var r=d.selection.createRange();s=r?r.text:''}else{s=d.getSelection().toString();if(!s){var e,t=d.getElementsByTagName('textarea'),u=d.getElementsByTagName('input'),i=t.length;while(e=(i>0)?t[--i]:u[-i--])try{if(e.offsetHeight>0&&(s=e.value.substring(e.selectionStart,e.selectionEnd)))break}catch(x){}}};if(!s)for(var j=0,f;f=w.frames[j];j++){try{if(s=getSel(f))break}catch(x){}};return s};var w=window,s=w.prompt('Поиск на этом сайте с помощью Google',getSel(w));if(s){w.open('http://www.google.com/search?as_q='+encodeURIComponent(s)+'&as_sitesearch='+w.location.hostname)}}],
["Сгенерировать/показать пароль", function(){var getRandomPass=function(d){var chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';var rez='';var len=d>=3?d:3;while(rez.length<len){rez+=chars.charAt(Math.floor(Math.random()*chars.length))}return/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).+$/.test(rez)?rez:arguments.callee(len)};var findPassEle=function(p){var c,s='',r=false,f=document.getElementsByTagName('form');for(var i=0;i<f.length;i++){c=f[i].elements;for(var j=0,e;e=c[j];j++){if(e.type=='password'){r=true;if(p){e.value=p;e.focus()}else if(e.value)s+='\n\n'+e.value}}};return r?s:null};var s=findPassEle();if(s){alert('На этой странице уже имеется пароль:'+s)}else{findPassEle(prompt('Пароль сгенерирован'+(s==null?':':'. Вставить?'),getRandomPass(12)))}}],
["Информация о странице +", function(){var meta='',scripts='',embed='',iframes='',cookies='',links='';var corrUrl=function(url){if(!url)return'';var q=url.indexOf('?')+1;return((q&&url.length>50)?url.slice(0,q>50?q:50)+'\u2026':url)+'\n'};var fullUrl=function(url){var a=document.createElement('a');a.href=url;return url?corrUrl(a.href):''};var m=document.getElementsByTagName('meta');for(var i=0,mi;mi=m[i];i++){meta+=(mi.name?mi.name+': ':(mi.httpEquiv?mi.httpEquiv+': ':''))+mi.content+'\n'};var s=document.getElementsByTagName('script');for(var i=0,si;si=s[i];i++){if(si.src)scripts+=corrUrl(si.src)};var e=document.getElementsByTagName('embed');var o=document.getElementsByTagName('object');for(var i=0,ei;ei=e[i];i++){embed+=fullUrl(ei.getAttribute('src'))};for(var i=0,oi;oi=o[i];i++){var src=oi.getAttribute('data')||oi.getAttribute('src')||oi.getAttribute('source');if(!src){var params=oi.getElementsByTagName('param');for(var j=0,p;p=params[j];j++){if(p.hasAttribute('name')&&p.getAttribute('name').match(/^(movie|data|src|code|filename|url|source)$/i)){src=p.getAttribute('value');break}}};var lnk=fullUrl(src);if(embed.indexOf(lnk)==-1)embed+=lnk};var f=document.getElementsByTagName('iframe');for(var i=0,fi;fi=f[i];i++){if(fi.src)iframes+=corrUrl(fi.src)};var c=document.cookie.split(';');for(var i=0,ci;ci=c[i];i++){while(ci.charAt(0)==' ')ci=ci.slice(1);if(ci.length>40)ci=ci.slice(0,40)+'\u2026';cookies+=ci+'\n'};var lastmod=(Date.parse(document.lastModified)==0)?'':document.lastModified;var mode=document.getElementsByTagName('HTmL').length==0?'Really strict':(document.compatMode=='CSS1Compat'?'Normal strict':'Quirks');var title=document.title||(document.getElementsByTagName('title')[0]&&document.getElementsByTagName('title')[0].text)||'';if(meta)meta='\nMeta-данные:\n'+meta;if(scripts)scripts='\nСкрипты:\n'+scripts;if(embed)embed='\nВстроенные объекты:\n'+embed;if(iframes)iframes='\nIframes:\n'+iframes;if(cookies)cookies='\nCookies:\n'+cookies;alert('Идентификация браузера: '+navigator.userAgent+'\n\nЗаголовок: '+title+'\n\nАдрес: '+location.href+'\n\nРеферрер: '+document.referrer+'\n\nДата последнего изменения: '+lastmod+'\n\nРежим отображения: '+mode+' mode\n'+meta+scripts+embed+iframes+cookies)}],
["Исходный код (snapshot)", function(){var q='  ',C={img:1,br:1,link:1,input:1,hr:1,meta:1},u=false,v=0,D=1,g=window.document,m=window.location,w='resizable=yes,scrollbars=yes,location=no',h='</span></li>';var x=function(a){return'<span class=\'tag\'>&lt;'+a+''};var y=function(a){return(a?'/':'')+'&gt;</span>'};var z=function(a,b){if(b||C[a.toLowerCase()])return'';return'<span class=\'tag\'>&lt;/'+a+'&gt;</span>'};var j=function(){var a=v.toString();while(a.length<3)a='0'+a;return'<li class=\'line'+(D&&((v++)&1)?' dark\'':'\'')+'><span>'};var n=function(a){return a.replace(/</g,'&lt;').replace(/>/g,'&gt;')};var E=function(a){var b=a.doctype,c='';if(b){c=j()+x('!DOCTYPE')+' <span class=\'attrDoc\'>'+b.nodeName+(b.publicId?' PUBLIC \''+b.publicId+'\'':'')+(b.systemId?'</span></span>'+h+j()+'<span class=\'tag\'><span class=\'attrDoc\'>'+q+'\''+b.systemId+'\'':'')+'</span>'+y()+h}return c};var F=function(a){var b=a.attributes,c=null,d='';for(var f=0;c=b[f];f++){if(c.specified&&c.value){d+=' <span class=\'attrTitle\'>'+c.name+'</span>=<span class=\'attrValue\'>\x22'+n(c.value.replace(/\t/g,q))+'\x22</span> '}}return d};var r=function(a){return n(a.nodeValue.replace(/[\n\t\r\u00A0]+ */g,'').replace(/ +/g,' '))};var G=function(a){var b=0,c='';while(b<a){c+=q;b++}return c};var A=function(a,b,c){var d='',f=G(b++);switch(a.nodeType){case 1:{var i=a.childNodes,k=null;var s=(i.length==0)||(i.length==1&&i[0].nodeType==3);var t=u&&i.length==0;var l=j()+f+x(a.nodeName)+F(a)+y(t);if(!s)l+=h;for(var B=0;k=i[B];B++){l+=A(k,b,!s&&k.nodeType==3)}if(s){l+=(a.nodeName.toLowerCase()=='textarea'?n(a.value):'')+z(a.nodeName,t)+h}else{l+=j()+f+z(a.nodeName,t)+h}return l}case 3:{if((d=r(a))&&c){return j()+f+d+h}else{return d}}case 4:{d=r(a);return j()+f+'<span class=\'cdata\'>&lt;![CDATA[</span>'+d+'<span class=\'cdata\'>]]&gt;</span>'+h}case 8:{d=r(a);return j()+f+'<span class=\'comment\'>&lt;!--'+d+'--&gt;</span>'+h}}return a.nodeType};var H=function(a){var b,c='';if(a){var d=a.getSelection().getRangeAt(0),f=d.commonAncestorContainer;if(f.nodeType==3||f.nodeType==4)f=f.parentNode;b=f.cloneNode(false);b.appendChild(d.cloneContents());var i=d.startContainer,k=d.endContainer;if(i!=f.firstChild||(i.nodeType==3&&d.startOffset!=0))b.insertBefore(g.createTextNode('\u2026'),b.firstChild);if(k!=f.lastChild||(k.nodeType==3&&d.endOffset!=k.nodeValue.length))b.appendChild(g.createTextNode('\u2026'))}else{c=E(g);b=g.documentElement};c+=A(b,0);return c};var I=function(a){if(a&&a.getSelection){if(a.getSelection().toString())return a;for(var b=0,c,d;c=a.frames[b];b++){try{if(d=arguments.callee(c))return d}catch(e){}}}};var o=I(window);if(o){g=o.document;m=o.location;w+=',width=800,height=500,left=100,top=100'};u=/[a-z]/.test(g.documentElement.nodeName);var J='<!DOCTYPE html PUBLIC><html><head><title>Snapshot: '+((g.getElementsByTagName('title').length&&n(g.getElementsByTagName('title')[0].text))||(m.protocol+'//'+m.host+m.pathname))+'</title><style type=\'text/css\'>body{padding:0 5px;margin:0;font-family:sans-serif;font-size:.7em;background-color:#FFF;color:#000;}#content{white-space:pre-wrap}ol{color:#999;}span{color:#000}.tag{color:#05F}.attrTitle{color:#E00}.attrValue{color:#C0C}.attrDoc{color:#800080}.comment{color:#008000}.cdata{color:#63D}.line{margin:0;padding:0}.dark{background-color:#FAFAFA}</style></head><body><ol id=\'content\'>'+H(o)+'</ol></body></html>';var p=window.open('about:blank','_blank',w);p.document.write(J);p.document.onkeydown=function(a){if(a.keyCode==27)p.close()};p.document.close()}],
//["Шахматы", function(){window.open('data:text/html;base64,PGh0bWw+PGhlYWQ+PHRpdGxlPkNoZXNzPC90aXRsZT48bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Ik9zY2FyIFRvbGVkbyBHLiI+PG1ldGEgbmFtZT0ic2l0ZSIgY29udGVudD0iaHR0cDovL25hbm9jaGVzcy4xMTBtYi5jb20vY2hlc3M0Lmh0bWwiPjwvaGVhZD48Ym9keT48c2NyaXB0PnZhciBCLGkseSx1LGIsST1bXSxHPTEyMCx4PTEwLHo9MTUsTT0xZTQsbD1bNSwzLDQsNiwyLDQsMyw1LDEsMSwxLDEsMSwxLDEsMSw5LDksOSw5LDksOSw5LDksMTMsMTEsMTIsMTQsMTAsMTIsMTEsMTMsMCw5OSwwLDMwNiwyOTcsNDk1LDg0NiwtMSwwLDEsMiwyLDEsMCwtMSwtMSwxLC0xMCwxMCwtMTEsLTksOSwxMSwxMCwyMCwtOSwtMTEsLTEwLC0yMCwtMjEsLTE5LC0xMiwtOCw4LDEyLDE5LDIxXTtmdW5jdGlvbiBYKHcsYyxoLGUsUyxzKXt2YXIgdCxvLEwsRSxkLE89ZSxOPS1NKk0sSz03OC1oPDx4LHAsZyxuLG0sQSxxLHIsQyxKLGE9eT8teDp4O3lePTg7RysrO2Q9d3x8cyYmcz49aCYmWCgwLDAsMCwyMSwwLDApPk07ZG97aWYobz1JW3A9T10pe3E9byZ6Xnk7aWYocTw3KXtBPXEtLSYyPzg6NDtDPW8tOSZ6P1s1Myw0Nyw2MSw1MSw0Nyw0N11bcV06NTc7ZG97cj1JW3ArPWxbQ11dO2lmKCF3fHA9PXcpe2c9cXxwK2EtUz8wOlM7aWYoIXImKCEhcXxBPDN8fCEhZyl8fChyKzEmel55KT45JiZxfEE+Mil7aWYobT0hKHItMiY3KSlyZXR1cm4geV49OCxJW0ctLV09TyxLO0o9bj1vJno7RT1JW3AtYV0mejt0PXF8RS03P246KG4rPTIsNl55KTt3aGlsZShuPD10KXtMPXI/bFtyJjd8MzJdLWgtcTowO2lmKHMpTCs9KDEtcT9sWyhwLXAleCkveCszN10tbFsoTy1PJXgpL3grMzddK2xbcCV4KzM4XSoocT8xOjIpLWxbTyV4KzM4XSsobyYxNikvMjohIW0qOSkrKCFxPyEoSVtwLTFdXm4pKyEoSVtwKzFdXm4pK2xbbiY3fDMyXS05OSshIWcqOTkrKEE8Mik6MCkrIShFXnleOSk7aWYocz5ofHwxPHMmcz09aCYmTD56fGQpe0lbcF09bixJW09dPW0/KElbZ109SVttXSxJW21dPTApOmc/SVtnXT0wOjA7TC09WChzPmh8ZD8wOnAsTC1OLGgrMSxJW0crMV0sSj1xfEE+MT8wOnAscyk7aWYoIShofHxzLTF8Qi1PfGktbnxwLWJ8TDwtTSkpcmV0dXJuIFcoKSxHLS0sdT1KO0o9cS0xfEE8N3x8bXx8IXN8ZHxyfG88enx8WCgwLDAsMCwyMSwwLDApPk07SVtPXT1vO0lbcF09cjttPyhJW21dPUlbZ10sSVtnXT0wKTpnP0lbZ109OV55OjB9aWYoTD5OfHxzPjEmJkw9PU4mJiFoJiZNYXRoLnJhbmRvbSgpPC41KXtJW0ddPU87aWYocz4xKXtpZihoJiZjLUw8MClyZXR1cm4geV49OCxHLS0sTDtpZighaClpPW4sQj1PLGI9cH1OPUx9bis9Snx8KGc9cCxtPXA8Tz9nLTM6ZysyLElbbV08enxJW20rTy1wXXx8SVtwKz1wLU9dKT8xOjB9fX19d2hpbGUoIXImcT4yfHwocD1PLHF8QT4yfG8+eiYhciYmKytDKi0tQSkpfX19d2hpbGUoKytPPjk4P089MjA6ZS1PKTtyZXR1cm4geV49OCxHLS0sTitNKk0mJk4+LUsrMTkyNHxkP046MH1CPWk9eT11PTA7d2hpbGUoQisrPDEyMClJW0ItMV09QiV4P0IveCV4PDJ8QiV4PDI/NzpCL3gmND8wOmxbaSsrXXwxNjo3O2ZvcihhPSI8dGFibGUgY2VsbHNwYWNpbmc9MCBhbGlnbj1jZW50ZXIgYm9yZGVyPTA+IixCPTA7Qjw4O0IrKylmb3IoYSs9Ijx0cj4iLGk9MjE7aTwyOTtpKyspYSs9Ijx0ZCB3aWR0aD02MCBoZWlnaHQ9NjAgb25jbGljaz1ZKCIrKEIqeCtpKSsiKSBpZD1vIisoQip4K2kpKyIgc3R5bGU9J2xpbmUtaGVpZ2h0OjUwcHg7Zm9udC1zaXplOjUwcHg7Ym9yZGVyOjJweCBzb2xpZCAiKyIjZTBlMGYwJyBiZ2NvbG9yPSMiKyhpK0ImMT8iZjBmIjoiYzBjIikrIjBmMCBhbGlnbj1jZW50ZXI+IjthKz0iPHRyPjx0ZCBjb2xzcGFuPTggYWxpZ249Y2VudGVyPjxzZWxlY3QgaWQ9dCBzdHlsZT0nZm9udC1zaXplOjIwcHgnPjxvcHRpb24+JiM5ODE5OzxvcHRpb24+Ijtkb2N1bWVudC53cml0ZShhKyImIzk4MjA7PG9wdGlvbj4mIzk4MjE7PG9wdGlvbj4mIzk4MjI7PC9zZWxlY3Q+PC90YWJsZT4iKTtmdW5jdGlvbiBXKCl7Qj1iO2ZvcihwPTIxO3A8OTk7cCs9cCV4LTg/MTozKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibyIrcCkuaW5uZXJIVE1MPSJceGEwXHUyNjVmXHUyNjVhXHUyNjVlXHUyNjVkXHUyNjVjXHUyNjViICBcdTI2NTlcdTI2NTRcdTI2NThcdTI2NTdcdTI2NTZcdTI2NTUiLmNoYXJBdChJW3BdJnopO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitwKS5zdHlsZS5ib3JkZXJDb2xvcj1wPT1CPyJyZWQiOiIjZTBlMGYwIn19VygpO2Z1bmN0aW9uIFkocyl7aT0oSVtzXV55KSZ6O2lmKGk+OCl7Yj1zO1coKX1lbHNlIGlmKEImJmk8OSl7Yj1zO2k9SVtCXSZ6O2lmKChpJjcpPT0xJihiPDI5fGI+OTApKWk9MTQtZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQiKS5zZWxlY3RlZEluZGV4Xnk7WCgwLDAsMCwyMSx1LDEpO2lmKHkpd2luZG93LnNldFRpbWVvdXQoIlgoMCwwLDAsMjEsdSwyLypwbHkqLyksWCgwLDAsMCwyMSx1LDEpIiwyNTApfX08L3NjcmlwdD48L2JvZHk+PC9odG1sPgo=','_blank','width=600,height=550,left=200,top=100')}],
//["Tetris", function(){window.open('data:text/html;base64,PGh0bWw+DQoJPGhlYWQ+DQoJCTx0aXRsZT5UZXRyaXM8L3RpdGxlPg0KCQk8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Imh0dHA6Ly9lbGJlcnRmLmNvbS90ZXRyaXMvIj4NCgkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGV0cmlzICp7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OmluaGVyaXQ7Zm9udC1mYW1pbHk6J1RyZWJ1Y2hldCBNUycsVmVyZGFuYSxBcmlhbDtsaW5lLWhlaWdodDoxLjRlbTtsaXN0LXN0eWxlOm5vbmUgaW5zaWRlO21hcmdpbjowO3BhZGRpbmc6MDt0ZXh0LWFsaWduOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fSN0ZXRyaXN7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZy10b3A6LjVlbTt9I3RldHJpcyBhOmxpbmssI3RldHJpcyBhOmhvdmVyLCN0ZXRyaXMgYTphY3RpdmUsI3RldHJpcyBhOnZpc2l0ZWR7Y29sb3I6IzIwMjt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30jdGV0cmlzIHN0cm9uZ3tmb250LXdlaWdodDpib2xkO30jdGV0cmlzIC5jbGVhcntjbGVhcjpib3RoO30jdGV0cmlzLXdyYXB7bWFyZ2luOi4yZW0gYXV0byAwIGF1dG87cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpyaWdodDt3aWR0aDo0NTZweDt9I3RldHJpcy13cmFwLWlubmVye2JvcmRlcjoycHggc29saWQgIzMxMzttYXJnaW4tYm90dG9tOi4yZW07fSN0ZXRyaXMtbWFpbiwjdGV0cmlzLW92ZXJsYXksI3RldHJpcy1zaWRle2hlaWdodDo2MDBweDt9I3RldHJpcy1tYWluLCN0ZXRyaXMtb3ZlcmxheXt3aWR0aDozMDBweDt9I3RldHJpcy1tYWlue2JhY2tncm91bmQ6IzIwMjtmbG9hdDpsZWZ0O292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTt9I3RldHJpcy1vdmVybGF5e3Bvc2l0aW9uOmFic29sdXRlO30jdGV0cmlzLW1lc3NhZ2V7Zm9udC1zaXplOjJlbTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fSN0ZXRyaXMtbWVzc2FnZSBwe2NvbG9yOiNGRkY7cGFkZGluZzouNWVtO30jdGV0cmlzLW1lc3NhZ2UgcCBzcGFue2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOi41ZW07Zm9udC1zdHlsZTppdGFsaWM7dGV4dC10cmFuc2Zvcm06bm9uZTt9I3RldHJpcy1zaWRle2JhY2tncm91bmQ6IzMxMztjb2xvcjojRkZGO2Zsb2F0OnJpZ2h0O3RleHQtYWxpZ246bGVmdDt3aWR0aDoxNTJweDt9I3RldHJpcy1zaWRlLWlubmVye3BhZGRpbmc6MTZweDt9I3RldHJpcy1zaWRlIGRse2NsZWFyOmJvdGg7fSN0ZXRyaXMtc2lkZSBkdHtmbG9hdDpsZWZ0O30jdGV0cmlzLXNpZGUgZGR7ZmxvYXQ6cmlnaHQ7Zm9udC1mYW1pbHk6R2VvcmdpYSxzZXJpZjt9ZGQjdGV0cmlzLWxldmVsLGRkI3RldHJpcy1zY29yZXttYXJnaW4tYm90dG9tOjFlbTt9I3RldHJpcy1uZXh0e2JhY2tncm91bmQ6IzIwMjtwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MTIwcHg7bWFyZ2luLWJvdHRvbToxZW07d2lkdGg6MTIwcHg7fSN0ZXRyaXMtbmV4dC1pbm5lcntwYWRkaW5nOjFlbTt9I3RldHJpcy1rZXlze2NvbG9yOiM5Nzk7Zm9udC1zaXplOi44ZW07bWFyZ2luLXRvcDoxZW07fTwvc3R5bGU+DQoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij52YXIgdGV0cmlzPXticmlja1NpemU6MzAsYnJpY2tCb3JkZXJTaXplOjIsbWFpbldpbldpZHRoOjEwLG1haW5XaW5IZWlnaHQ6MjAsbGV2ZWxVcFNjb3JlOjE1MCxsZXZlbDoxLHNjb3JlOjAsc2luZ2xlczowLGRvdWJsZXM6MCx0cmlwbGVzOjAscXVhZHM6MCxicmlja3M6W10scGlsZTpbXSxwaWxlQW5pbUxpbmU6W10scGlsZUFuaW1Ecm9wOltdLGdhbWVTdGFydDp0cnVlLGdhbWVPdmVyOmZhbHNlLHBhdXNlZDpmYWxzZSxrZXlQcmVzc2VkOmZhbHNlLHNoYXBlQ291bnQ6MCxrZXlEcm9wOjMyLGtleUxlZnQ6Mzcsa2V5Um90YXRlOjM4LGtleVJpZ2h0OjM5LGtleURvd246NDAsa2V5UGF1c2U6MTksa2V5U3RvcDoyNyxpbml0OmZ1bmN0aW9uKCl7dGV0cmlzLm1haW5XaW49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRldHJpcy1tYWluIik7dGV0cmlzLm5leHRXaW49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRldHJpcy1uZXh0LWlubmVyIik7dGV0cmlzLm1lc3NhZ2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRldHJpcy1tZXNzYWdlIik7dGV0cmlzLm1lc3NhZ2UuaW5uZXJIVE1MPSI8cD5OZXcgZ2FtZSA8c3Bhbj5QcmVzcyBhbnkga2V5IHRvIHN0YXJ0PC9zcGFuPjwvcD4iO2RvY3VtZW50Lm9ua2V5ZG93bj10ZXRyaXMua2V5TGlzdGVuZXJ9LG5ld0dhbWU6ZnVuY3Rpb24oKXtmb3IodmFyIEI9MDtCPHRldHJpcy5tYWluV2luV2lkdGg7QisrKXtpZighdGV0cmlzLnBpbGVbQl0pe3RldHJpcy5waWxlW0JdPVtdfXRldHJpcy5waWxlQW5pbUxpbmVbQl09W107dGV0cmlzLnBpbGVBbmltRHJvcFtCXT1bXTtmb3IodmFyIEE9MDtBPHRldHJpcy5tYWluV2luSGVpZ2h0O0ErKyl7aWYodGV0cmlzLnBpbGVbQl1bQV0pe3RldHJpcy5tYWluV2luLnJlbW92ZUNoaWxkKHRldHJpcy5waWxlW0JdW0FdKX10ZXRyaXMucGlsZVtCXVtBXT1mYWxzZTt0ZXRyaXMucGlsZUFuaW1MaW5lW0JdW0FdPWZhbHNlO3RldHJpcy5waWxlQW5pbURyb3BbQl1bQV09ZmFsc2V9fXRldHJpcy5sZXZlbD0xO3RldHJpcy5zY29yZT0wO3RldHJpcy5zaW5nbGVzPTA7dGV0cmlzLmRvdWJsZXM9MDt0ZXRyaXMudHJpcGxlcz0wO3RldHJpcy5xdWFkcz0wO3RldHJpcy51cGRhdGVTY29yZSgpO3RldHJpcy5uZXdTaGFwZSgpfSxuZXdTaGFwZTpmdW5jdGlvbigpe3RldHJpcy5zaGFwZUNvdW50Kys7dGV0cmlzLnNoYXBlTnVtPXR5cGVvZiAodGV0cmlzLnNoYXBlTnVtTmV4dCkhPSJ1bmRlZmluZWQiP3RldHJpcy5zaGFwZU51bU5leHQ6TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjYpO3RldHJpcy5zaGFwZU51bU5leHQ9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjcpO3RldHJpcy5zaGFwZVJvdD10eXBlb2YgKHRldHJpcy5zaGFwZVJvdE5leHQpIT0idW5kZWZpbmVkIj90ZXRyaXMuc2hhcGVSb3ROZXh0Ok1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo0KTt0ZXRyaXMuc2hhcGVSb3ROZXh0PU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo0KTt0ZXRyaXMuc2hhcGVQb3NIb3I9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKih0ZXRyaXMubWFpbldpbldpZHRoLTYpKSszO3RldHJpcy5zaGFwZVBvc1Zlcj0tMTt0ZXRyaXMuZHJhd1NoYXBlKCk7dGV0cmlzLmRyYXdOZXh0KCk7dGV0cmlzLnNoYXBlTGFuZGVkPWZhbHNlO2NsZWFySW50ZXJ2YWwodGV0cmlzLmludHZhbCk7dGV0cmlzLmludHZhbD1zZXRJbnRlcnZhbCgidGV0cmlzLnRpbWVTdGVwKCkiLDIwMDAvdGV0cmlzLmxldmVsKX0sbmV3QnJpY2s6ZnVuY3Rpb24oQixELEEpe3ZhciBDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJhY2tncm91bmQ6ICIrQisiOyBib3JkZXItY29sb3I6ICIrRCsiICIrQSsiICIrQSsiICIrRCsiOyBib3JkZXItd2lkdGg6ICIrdGV0cmlzLmJyaWNrQm9yZGVyU2l6ZSsicHg7IGJvcmRlci1zdHlsZTogc29saWQ7IGhlaWdodDogIisodGV0cmlzLmJyaWNrU2l6ZS10ZXRyaXMuYnJpY2tCb3JkZXJTaXplKjIpKyJweDsgbGVmdDogMDsgdG9wOiAwOyB3aWR0aDogIisodGV0cmlzLmJyaWNrU2l6ZS10ZXRyaXMuYnJpY2tCb3JkZXJTaXplKjIpKyI7IHBvc2l0aW9uOiBhYnNvbHV0ZTsiKTtyZXR1cm4gQ30sZHJhd1NoYXBlOmZ1bmN0aW9uKCl7dmFyIEQ9MCxCPXRydWU7dGV0cmlzLmJyaWNrUG9zPVtdO2Zvcih2YXIgQT0wO0E8NDtBKyspe2Zvcih2YXIgRj0wO0Y8NDtGKyspe2lmKHRldHJpcy5icmlja0xpYlt0ZXRyaXMuc2hhcGVOdW1dW0EqNCtGK3RldHJpcy5zaGFwZVJvdCoxNl0pe3RldHJpcy5icmlja1Bvc1tEXT17aG9yOkYrdGV0cmlzLnNoYXBlUG9zSG9yLHZlcjpBK3RldHJpcy5zaGFwZVBvc1Zlcn07aWYodGV0cmlzLmNvbGxpc2lvbih0ZXRyaXMuYnJpY2tQb3NbRF0uaG9yLHRldHJpcy5icmlja1Bvc1tEXS52ZXIpKXtCPWZhbHNlfUQrK319fWlmKEImJiF0ZXRyaXMucGF1c2VkJiYhdGV0cmlzLmdhbWVPdmVyKXt2YXIgRT10ZXRyaXMuYnJpY2tzP3RldHJpcy5icmlja3Muc2xpY2UoMCk6ZmFsc2U7Zm9yKHZhciBDPTA7QzxEO0MrKyl7dGV0cmlzLmJyaWNrc1tDXT10ZXRyaXMubmV3QnJpY2sodGV0cmlzLmJyaWNrTGliW3RldHJpcy5zaGFwZU51bV1bNjRdLHRldHJpcy5icmlja0xpYlt0ZXRyaXMuc2hhcGVOdW1dWzY1XSx0ZXRyaXMuYnJpY2tMaWJbdGV0cmlzLnNoYXBlTnVtXVs2Nl0pO3RldHJpcy5icmlja3NbQ10ubnVtPXRldHJpcy5zaGFwZUNvdW50O3RldHJpcy5icmlja3NbQ10uc3R5bGUubGVmdD10ZXRyaXMuYnJpY2tQb3NbQ10uaG9yKnRldHJpcy5icmlja1NpemUrInB4Ijt0ZXRyaXMuYnJpY2tzW0NdLnN0eWxlLnRvcD10ZXRyaXMuYnJpY2tQb3NbQ10udmVyKnRldHJpcy5icmlja1NpemUrInB4In1mb3IodmFyIEM9MDtDPEQ7QysrKXt0ZXRyaXMubWFpbldpbi5hcHBlbmRDaGlsZCh0ZXRyaXMuYnJpY2tzW0NdKX1mb3IodmFyIEM9MDtDPEQ7QysrKXtpZihFW0NdJiZFW0NdLm51bT09dGV0cmlzLnNoYXBlQ291bnQpe3RldHJpcy5tYWluV2luLnJlbW92ZUNoaWxkKEVbQ10pfX10ZXRyaXMucHJldlNoYXBlUm90PXRldHJpcy5zaGFwZVJvdDt0ZXRyaXMucHJldlNoYXBlUG9zSG9yPXRldHJpcy5zaGFwZVBvc0hvcjt0ZXRyaXMucHJldlNoYXBlUG9zVmVyPXRldHJpcy5zaGFwZVBvc1Zlcjt0ZXRyaXMucHJldkJyaWNrUG9zPXRldHJpcy5icmlja1Bvcy5zbGljZSgwKX1lbHNle3RldHJpcy5zaGFwZVJvdD10ZXRyaXMucHJldlNoYXBlUm90O3RldHJpcy5zaGFwZVBvc0hvcj10ZXRyaXMucHJldlNoYXBlUG9zSG9yO3RldHJpcy5zaGFwZVBvc1Zlcj10ZXRyaXMucHJldlNoYXBlUG9zVmVyO3RldHJpcy5icmlja1Bvcz10ZXRyaXMucHJldkJyaWNrUG9zLnNsaWNlKDApfX0sZHJhd05leHQ6ZnVuY3Rpb24oKXt0ZXRyaXMubmV4dFdpbi5pbm5lckhUTUw9IiI7Zm9yKHZhciBBPTA7QTw0O0ErKyl7Zm9yKHZhciBCPTA7Qjw0O0IrKyl7aWYodGV0cmlzLmJyaWNrTGliW3RldHJpcy5zaGFwZU51bU5leHRdW0EqNCtCK3RldHJpcy5zaGFwZVJvdE5leHQqMTZdKXticmljaz10ZXRyaXMubmV3QnJpY2sodGV0cmlzLmJyaWNrTGliW3RldHJpcy5zaGFwZU51bU5leHRdWzY0XSx0ZXRyaXMuYnJpY2tMaWJbdGV0cmlzLnNoYXBlTnVtTmV4dF1bNjVdLHRldHJpcy5icmlja0xpYlt0ZXRyaXMuc2hhcGVOdW1OZXh0XVs2Nl0pO2JyaWNrLnN0eWxlLmxlZnQ9Qip0ZXRyaXMuYnJpY2tTaXplKyJweCI7YnJpY2suc3R5bGUudG9wPUEqdGV0cmlzLmJyaWNrU2l6ZSsicHgiO3RldHJpcy5uZXh0V2luLmFwcGVuZENoaWxkKGJyaWNrKX19fX0sY29sbGlzaW9uOmZ1bmN0aW9uKEIsQSl7aWYoQjwwKXtpZih0ZXRyaXMua2V5UHJlc3NlZD09dGV0cmlzLmtleVJvdGF0ZSl7aWYoIXRldHJpcy5jb2xsaXNpb24oQisxLEEpKXt0ZXRyaXMuc2hhcGVQb3NIb3IrKzt0ZXRyaXMuZHJhd1NoYXBlKCk7cmV0dXJuIHRydWV9ZWxzZXt0ZXRyaXMuc2hhcGVSb3QtLTtyZXR1cm4gdHJ1ZX19cmV0dXJuIHRydWV9aWYoQj49dGV0cmlzLm1haW5XaW5XaWR0aCl7aWYodGV0cmlzLmtleVByZXNzZWQ9PXRldHJpcy5rZXlSb3RhdGUpe2lmKCF0ZXRyaXMuY29sbGlzaW9uKEItMSxBKSl7dGV0cmlzLnNoYXBlUG9zSG9yLS07dGV0cmlzLmRyYXdTaGFwZSgpO3JldHVybiB0cnVlfWVsc2V7dGV0cmlzLnNoYXBlUm90LS07cmV0dXJuIHRydWV9fXJldHVybiB0cnVlfWlmKEE+PXRldHJpcy5tYWluV2luSGVpZ2h0KXtpZih0ZXRyaXMua2V5UHJlc3NlZCE9dGV0cmlzLmtleVJvdGF0ZSl7dGV0cmlzLnNoYXBlUG9zVmVyLS19dGV0cmlzLnNoYXBlTGFuZGVkPXRydWU7cmV0dXJuIHRydWV9aWYodGV0cmlzLnBpbGVbQl1bQV0pe2lmKHRldHJpcy5zaGFwZVBvc1Zlcj50ZXRyaXMucHJldlNoYXBlUG9zVmVyKXt0ZXRyaXMuc2hhcGVMYW5kZWQ9dHJ1ZX1yZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9LHRpbWVTdGVwOmZ1bmN0aW9uKCl7dGV0cmlzLnNoYXBlUG9zVmVyKys7dGV0cmlzLmRyYXdTaGFwZSgpO2lmKHRldHJpcy5zaGFwZUxhbmRlZCl7Zm9yKHZhciBFIGluIHRldHJpcy5icmlja3Mpe3RldHJpcy5waWxlW3RldHJpcy5icmlja1Bvc1tFXS5ob3JdW3RldHJpcy5icmlja1Bvc1tFXS52ZXJdPXRldHJpcy5icmlja3NbRV19dmFyIEM9MDtmb3IodmFyIEE9MDtBPHRldHJpcy5tYWluV2luSGVpZ2h0O0ErKyl7dmFyIEI9dHJ1ZTtmb3IodmFyIEY9MDtGPHRldHJpcy5tYWluV2luV2lkdGg7RisrKXtpZighdGV0cmlzLnBpbGVbRl1bQV0pe0I9ZmFsc2V9fWlmKEIpe0MrKztmb3IodmFyIEY9MDtGPHRldHJpcy5tYWluV2luV2lkdGg7RisrKXtpZih0ZXRyaXMucGlsZVtGXVtBXSl7dGV0cmlzLnBpbGVBbmltTGluZVtGXVtBXT10ZXRyaXMucGlsZVtGXVtBXTtzZXRUaW1lb3V0KCJ0ZXRyaXMubWFpbldpbi5yZW1vdmVDaGlsZCh0ZXRyaXMucGlsZUFuaW1MaW5lWyIrRisiXVsiK0ErIl0pOyIsRio1MCk7dGV0cmlzLnBpbGVbRl1bQV09ZmFsc2V9fWZvcih2YXIgRj0wO0Y8dGV0cmlzLm1haW5XaW5XaWR0aDtGKyspe2Zvcih2YXIgRD1BO0Q+MDtELS0pe2lmKHRldHJpcy5waWxlW0ZdW0RdKXt0ZXRyaXMucGlsZUFuaW1Ecm9wW0ZdW0RdPXRldHJpcy5waWxlW0ZdW0RdO3NldFRpbWVvdXQoInRldHJpcy5waWxlQW5pbURyb3BbIitGKyJdWyIrRCsiXS5zdHlsZS50b3AgPSAoICIrRCsiICsgMSApICogdGV0cmlzLmJyaWNrU2l6ZSArICdweCc7Iix0ZXRyaXMubWFpbldpbldpZHRoKjUwKTt0ZXRyaXMucGlsZVtGXVtEKzFdPXRldHJpcy5waWxlW0ZdW0RdO3RldHJpcy5waWxlW0ZdW0RdPWZhbHNlfX19fX10ZXRyaXMudXBkYXRlU2NvcmUoQyk7Zm9yKHZhciBGPTA7Rjx0ZXRyaXMubWFpbldpbldpZHRoO0YrKyl7aWYodGV0cmlzLnBpbGVbRl1bMF0pe3RldHJpcy5kb0dhbWVPdmVyKCk7cmV0dXJuIH19dGV0cmlzLm5ld1NoYXBlKCl9fSx1cGRhdGVTY29yZTpmdW5jdGlvbihBKXt2YXIgQj10ZXRyaXMuc2NvcmU7aWYoQSl7dGV0cmlzLnNjb3JlKz1BKkErQSoxMH1mb3IoaT1CO2k8dGV0cmlzLnNjb3JlO2krKyl7c2V0VGltZW91dCgiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RldHJpcy1zY29yZScpLmlubmVySFRNTCA9ICciK2krIic7IiwoaS1CKSoyMCl9dGV0cmlzLmxldmVsPU1hdGguZmxvb3IodGV0cmlzLnNjb3JlL3RldHJpcy5sZXZlbFVwU2NvcmUpKzE7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRldHJpcy1sZXZlbCIpLmlubmVySFRNTD10ZXRyaXMubGV2ZWw7aWYoQT09MSl7dGV0cmlzLnNpbmdsZXMrKztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV0cmlzLXNpbmdsZXMiKS5pbm5lckhUTUw9dGV0cmlzLnNpbmdsZXN9aWYoQT09Mil7dGV0cmlzLmZsYXNoTWVzc2FnZSgnPHAgY2xhc3M9InRldHJpcy1kb3VibGUiPkRvdWJsZSE8L3A+Jyk7dGV0cmlzLmRvdWJsZXMrKztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV0cmlzLWRvdWJsZXMiKS5pbm5lckhUTUw9dGV0cmlzLmRvdWJsZXN9aWYoQT09Myl7dGV0cmlzLmZsYXNoTWVzc2FnZSgnPHAgY2xhc3M9InRldHJpcy1kb3VibGUiPlRyaXBsZSE8L3A+Jyk7dGV0cmlzLnRyaXBsZXMrKztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV0cmlzLXRyaXBsZXMiKS5pbm5lckhUTUw9dGV0cmlzLnRyaXBsZXN9aWYoQT09NCl7dGV0cmlzLmZsYXNoTWVzc2FnZSgnPHAgY2xhc3M9InRldHJpcy1kb3VibGUiPlRldHJpcyE8L3A+Jyk7dGV0cmlzLnF1YWRzKys7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRldHJpcy1xdWFkcyIpLmlubmVySFRNTD10ZXRyaXMucXVhZHN9fSxmbGFzaE1lc3NhZ2U6ZnVuY3Rpb24oQSl7dGV0cmlzLm1lc3NhZ2UuaW5uZXJIVE1MPUE7c2V0VGltZW91dCgidGV0cmlzLm1lc3NhZ2UuaW5uZXJIVE1MID0gJyc7IiwxMDAwKX0sZG9HYW1lT3ZlcjpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGV0cmlzLmludHZhbCk7dGV0cmlzLm1lc3NhZ2UuaW5uZXJIVE1MPSI8cD5HYW1lIG92ZXIgPHNwYW4+UHJlc3MgU3BhY2ViYXIgdG8gY29udGludWU8L3NwYW48L3A+Ijt0ZXRyaXMuZ2FtZU92ZXI9dHJ1ZX0sa2V5TGlzdGVuZXI6ZnVuY3Rpb24oQSl7aWYoIUEpe0E9d2luZG93LmV2ZW50fXRldHJpcy5rZXlQcmVzc2VkPUEua2V5Q29kZTtpZih0ZXRyaXMuZ2FtZVN0YXJ0KXt0ZXRyaXMuZ2FtZVN0YXJ0PWZhbHNlO3RldHJpcy5tZXNzYWdlLmlubmVySFRNTD0iIjt0ZXRyaXMubmV3R2FtZSgpfWVsc2V7aWYodGV0cmlzLmdhbWVPdmVyJiZBLmtleUNvZGU9PXRldHJpcy5rZXlEcm9wKXt0ZXRyaXMuZ2FtZU92ZXI9ZmFsc2U7dGV0cmlzLm1lc3NhZ2UuaW5uZXJIVE1MPSIiO3RldHJpcy5uZXdHYW1lKCl9ZWxzZXtpZighdGV0cmlzLmdhbWVPdmVyKXtpZihBLmtleUNvZGU9PXRldHJpcy5rZXlTdG9wfHxBLmtleUNvZGU9PXRldHJpcy5rZXlQYXVzZSl7dGV0cmlzLnBhdXNlZD0hdGV0cmlzLnBhdXNlZDtpZih0ZXRyaXMucGF1c2VkKXt0ZXRyaXMubWVzc2FnZS5pbm5lckhUTUw9IjxwPlBhdXNlZCA8c3Bhbj5QcmVzcyBFc2MgdG8gcmVzdW1lPC9zcGFuPC9wPiJ9ZWxzZXt0ZXRyaXMubWVzc2FnZS5pbm5lckhUTUw9IiJ9fWlmKCF0ZXRyaXMucGF1c2VkKXtpZihBLmtleUNvZGU9PXRldHJpcy5rZXlEcm9wKXtjbGVhckludGVydmFsKHRldHJpcy5pbnR2YWwpO3RldHJpcy5pbnR2YWw9c2V0SW50ZXJ2YWwoInRldHJpcy50aW1lU3RlcCgpIiwyMCl9aWYoQS5rZXlDb2RlPT10ZXRyaXMua2V5TGVmdCl7dGV0cmlzLnNoYXBlUG9zSG9yLS07dGV0cmlzLmRyYXdTaGFwZSgpfWlmKEEua2V5Q29kZT09dGV0cmlzLmtleVJvdGF0ZSl7dGV0cmlzLnNoYXBlUm90PSh0ZXRyaXMuc2hhcGVSb3QrMSklNDt0ZXRyaXMuZHJhd1NoYXBlKCl9aWYoQS5rZXlDb2RlPT10ZXRyaXMua2V5UmlnaHQpe3RldHJpcy5zaGFwZVBvc0hvcisrO3RldHJpcy5kcmF3U2hhcGUoKX1pZihBLmtleUNvZGU9PXRldHJpcy5rZXlEb3duKXt0ZXRyaXMuc2hhcGVQb3NWZXIrKzt0ZXRyaXMuZHJhd1NoYXBlKCl9fX19fXJldHVybiB0cnVlfSxicmlja0xpYjp7MDpbMSwwLDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwxLDAsMCwwLDAsMCwiI0Y5MCIsIiNGQzAiLCIjRjYwIl0sMTpbMCwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwiI0MwMCIsIiNFMDAiLCIjQjAwIl0sMjpbMSwxLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwiIzBDMCIsIiMwRTAiLCIjMEEwIl0sMzpbMSwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMSwxLDAsMCwwLDAsMCwiIzAwQyIsIiMwMEUiLCIjMDBBIl0sNDpbMSwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwiIzYwQyIsIiM4MEUiLCIjNDBBIl0sNTpbMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwiI0NDQyIsIiNFRUUiLCIjQUFBIl0sNjpbMSwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwiI0NDMCIsIiNFRTAiLCIjQUEwIl19LH07d2luZG93Lm9ubG9hZD10ZXRyaXMuaW5pdDs8L3NjcmlwdD4NCgk8aGVhZD4NCgk8Ym9keT4NCgkJPGRpdiBpZD0idGV0cmlzIj4NCgkJCTxkaXYgaWQ9InRldHJpcy13cmFwIj4NCgkJCQk8ZGl2IGlkPSJ0ZXRyaXMtd3JhcC1pbm5lciI+DQoJCQkJCTxkaXYgaWQ9InRldHJpcy1tYWluIj4JCQ0KCQkJCQk8L2Rpdj4NCgkJCQkJPGRpdiBpZD0idGV0cmlzLW92ZXJsYXkiPg0KCQkJCQkJPGRpdiBpZD0idGV0cmlzLW1lc3NhZ2UiPjwvZGl2Pg0KCQkJCQk8L2Rpdj4NCgkJCQkJPGRpdiBpZD0idGV0cmlzLXNpZGUiPg0KCQkJCQkJPGRpdiBpZD0idGV0cmlzLXNpZGUtaW5uZXIiPg0KCQkJCQkJCTxkaXYgaWQ9InRldHJpcy1uZXh0Ij4NCgkJCQkJCQkJPGRpdiBpZD0idGV0cmlzLW5leHQtaW5uZXIiPjwvZGl2Pg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTxkaXYgaWQ9InRldHJpcy1zY29yZXMiPg0KCQkJCQkJCQk8ZGw+DQoJCQkJCQkJCQk8ZHQ+TGV2ZWw6PC9kdD4NCgkJCQkJCQkJCTxkZCBpZD0idGV0cmlzLWxldmVsIj4xPC9kZD4NCgkJCQkJCQkJPC9kbD4NCgkJCQkJCQkJPGRsPg0KCQkJCQkJCQkJPGR0PlNjb3JlOjwvZHQ+DQoJCQkJCQkJCQk8ZGQgaWQ9InRldHJpcy1zY29yZSI+MDwvZGQ+DQoJCQkJCQkJCTwvZGw+DQoJCQkJCQkJCTxkbD4NCgkJCQkJCQkJCTxkdD5TaW5nbGVzOjwvZHQ+DQoJCQkJCQkJCQk8ZGQgaWQ9InRldHJpcy1zaW5nbGVzIj4wPC9kZD4NCgkJCQkJCQkJPC9kbD4NCgkJCQkJCQkJPGRsPg0KCQkJCQkJCQkJPGR0PkRvdWJsZXM6PC9kdD4NCgkJCQkJCQkJCTxkZCBpZD0idGV0cmlzLWRvdWJsZXMiPjA8L2RkPg0KCQkJCQkJCQk8L2RsPg0KCQkJCQkJCQk8ZGw+DQoJCQkJCQkJCQk8ZHQ+VHJpcGxlczo8L2R0Pg0KCQkJCQkJCQkJPGRkIGlkPSJ0ZXRyaXMtdHJpcGxlcyI+MDwvZGQ+DQoJCQkJCQkJCTwvZGw+DQoJCQkJCQkJCTxkbD4NCgkJCQkJCQkJCTxkdD5UZXRyaXM6PC9kdD4NCgkJCQkJCQkJCTxkZCBpZD0idGV0cmlzLXF1YWRzIj4wPC9kZD4NCgkJCQkJCQkJPC9kbD4NCgkJCQkJCQkJPGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2Pg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTxkaXYgaWQ9InRldHJpcy1rZXlzIj4NCgkJCQkJCQkJPGRsPg0KCQkJCQkJCQkJPGR0Pk1vdmU6PC9kdD4NCgkJCQkJCQkJCTxkZD4mbGFycjsgJmRhcnI7ICZyYXJyOzxkZD4NCgkJCQkJCQkJPC9kbD4NCgkJCQkJCQkJPGRsPg0KCQkJCQkJCQkJPGR0PlJvdGF0ZTo8L2R0Pg0KCQkJCQkJCQkJPGRkPiZ1YXJyOzxkZD4NCgkJCQkJCQkJPC9kbD4NCgkJCQkJCQkJPGRsPg0KCQkJCQkJCQkJPGR0PkRyb3A6PC9kdD4NCgkJCQkJCQkJCTxkZD5TcGFjZWJhcjxkZD4NCgkJCQkJCQkJPC9kbD4NCgkJCQkJCQkJPGRsPg0KCQkJCQkJCQkJPGR0PlBhdXplOjwvZHQ+DQoJCQkJCQkJCQk8ZGQ+UGF1emUvRXNjPGRkPg0KCQkJCQkJCQk8L2RsPg0KCQkJCQkJCQk8ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+DQoJCQkJCQkJPC9kaXY+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCTwvZGl2Pg0KCQkJPC9kaXY+DQoJPC9ib2R5Pg0KPC9odG1sPg==','_blank','width=500,height=650,left=300,top=100')}],
//["separator"],
//["Искать логин на Login2",function(){window.open('http://login2.me/#'+location.hostname,'login2.me_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на Loginz",function(){window.open('http://loginz.org/view/'+location.hostname,'loginz_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на ByPass",function(){window.open('https://bypass.org.ru/login/'+location.hostname,'bypass_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["Искать логин на BugMeNot",function(){window.open('http://bugmenot.com/view/'+location.hostname,'bugmenot_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
//["separator"],
//["Показать ссылки на Flash/Video", function(){var getVideo=function(flashvars,src){var getLink=function(s){var a=s.match(/[^\s\x22=&?]+\.[^\s\x22=&?\/]*(flv|mp4)/i);return a?a[0]:''};var getQuery=function(s,q){var a=s.match(new RegExp('(^|[&?])'+q+'=([^&]+)'));return a?a[2]:''};var getJson=function(s,q){var a=s.match(new RegExp('\x22'+q+'\x22:\\s*(\x22.+?\x22)'));return a?eval(a[1]):''};var getURL=function(f,s){return f.match(/^(\w+:\/\/|\/|$)/)?f:s.replace(/[#?].*$/,'').replace(/[^\/]*$/,f)};var decodeURL=function(s){try{return decodeURIComponent(s)}catch(e){return unescape(s)}};var q='',url=location.href,flv=decodeURL(flashvars);if(url.indexOf('youtube.com/watch?')!=-1&&(q=getQuery(flv,'url')))return decodeURL(q)+'&signature='+getQuery(flv,'sig')+'&title='+encodeURIComponent(document.title);if(url.indexOf('video.google.com/videoplay?')!=-1&&(q=getQuery(src,'videoUrl')))return decodeURL(q);if(url.indexOf('metacafe.com/watch/')!=-1&&(q=getJson(flv,'mediaURL')))return q+'?__gda__='+getJson(flv,'value');if(url.indexOf('dailymotion.com/')!=-1&&(q=getJson(flv,'hqURL')||getJson(flv,'sdURL')))return q;if(url.indexOf('www.break.com/')!=-1&&(q=getQuery(flv,'videoPath')))return q+'?'+getQuery(flv,'icon');if(url.indexOf('my-hit.ru/film/')!=-1&&(q=getLink(flv)))return q+'?start=0&id='+getQuery(flv,'id');return getURL(getLink(flv)||decodeURL(getLink(src)),src)};var createLink=function(url,txt){var oLnk=document.createElement('a');oLnk.setAttribute('href',url);oLnk.setAttribute('style','display:inline;margin:0;padding:0;font:14px Times New Roman;text-decoration:underline;text-transform:none;');oLnk.appendChild(document.createTextNode(txt));return oLnk};var showLink=function(oEle,src,flv){var cName='ujs_downlink';var p=oEle.previousSibling;if(p&&p.className==cName){oEle.parentNode.removeChild(p);return};if(src){var oDiv=document.createElement('div');oDiv.setAttribute('style','display:block;position:static;float:none;margin:0;padding:0;width:auto;height:auto;font:14px Times New Roman;color:#555;z-index:999;');oDiv.className=cName;oDiv.appendChild(createLink(src,'Download'));var v=getVideo(flv,src);if(v){oDiv.appendChild(document.createTextNode(' ('));oDiv.appendChild(createLink(v,'Video'));oDiv.appendChild(document.createTextNode(')'))};oEle.parentNode.insertBefore(oDiv,oEle)}};var getParam=function(e,n){var v='',r=new RegExp('^('+n+')$','i');var param=e.getElementsByTagName('param');for(var i=0,p;p=param[i];i++){if(r.test(p.getAttribute('name'))){v=p.getAttribute('value');break}};return v};var searchEmbed=function(w){if(!w)return;var obj=w.document.getElementsByTagName('object');for(var i=0,oi;oi=obj[i];i++){if(oi.parentNode)showLink(oi,oi.getAttribute('data')||oi.getAttribute('src')||getParam(oi,'movie|data|src|code|filename|url')||(oi.getElementsByTagName('embed').length&&oi.getElementsByTagName('embed')[0].getAttribute('src')),getParam(oi,'flashvars'))};var em=w.document.getElementsByTagName('embed');for(var i=0,ei;ei=em[i];i++){if(ei.parentNode&&ei.parentNode.nodeName.toLowerCase()!='object')showLink(ei,ei.getAttribute('src'),ei.getAttribute('flashvars'))};for(var j=0,f;f=w.frames[j];j++){try{arguments.callee(f)}catch(e){}}};searchEmbed(window)}],
//["Набрать сообщение в форме", function(){window.open('http://southron4965.ucoz.ru/files/Opera_LE/html/forma.html')}],
//["separator"],
["Искать страницу в кэше Google",function(){window.open('http://www.google.com/search?q=cache:'+location.href)}],
["Искать страницу на Archive.org",function(){window.open('http://web.archive.org/web/*/'+location.href)}],
["separator"],
["Посмотреть отзывы о сайте в WOT",function(){window.open('https://www.mywot.com/ru/scorecard/'+location.hostname)}],
["Информация о сервере (netcraft)",function(){window.open('http://toolbar.netcraft.com/site_report?url='+location.hostname)}],
["Проверить доступность сайта через isitdownrightnow.com",function(){window.open('http://www.isitdownrightnow.com/downorjustme.php?url='+location.hostname,'DownForMe_'+location.hostname,'width=600,height=400,left=100,top=100,scrollbars=yes,location=no')}],
["Узнать, кому принадлежит домен через Domaintools",function(){window.open('http://whois.domaintools.com/'+location.hostname)}],
["Узнать, кому принадлежит домен через Reg.ru",function(){window.open('https://www.reg.ru/whois/?dname='+location.hostname)}],
["separator"],
["Проверить с помощью Dr.Web Online",function(){window.open('http://online.drweb.com/result?url='+escape(location.href),'DrWeb_'+location.href,'width=640,height=400,left=200,top=100,scrollbars=yes,location=no')}],
["Проверить с помощью AntiMalware Online",function(){window.open('http://antivirus-alarm.ru/proverka/?url='+escape(location.href),'AntiMalware_'+location.href,'width=640,height=400,left=200,top=100,scrollbars=yes,location=no')}],
["separator"],
["Settings","document.getElementById('menu_preferences').click();"],
["Переключить стиль на странице", "getMarkupDocumentViewer().authorStyleDisabled ? gPageStyleMenu.switchStyleSheet('') : gPageStyleMenu.disableStyle()"],
["Night - ночной стиль", ()=>{ var night=function(w){(function(d){var css='html{background:#333 !important}html *{background:none !important;color:#bbb !important;border-color:#333 !important;border-width:0 !important}html a,html a *{color:#5c8599 !important;text-decoration:underline !important}html a:visited,html a:visited *,html a:active,html a:active *{color:#525f66 !important}html a:hover,html a:hover *{color:#cef !important;background:#023 !important}html input,html select,html button,html textarea{background:#4d4c40 !important;border:1px solid #5c5a46 !important;border-top-color:#474531 !important;border-bottom-color:#7a7967 !important}html input[type=button],html input[type=submit],html input[type=reset],html input[type=image],html button{border-top-color:#7a7967 !important;border-bottom-color:#474531 !important}html input:focus,html select:focus,html option:focus,html button:focus,html textarea:focus{background:#5c5b3e !important;color:#fff !important;border-color:#474100 #665d00 #7a7849 !important;outline:2px solid #041d29 !important}html input[type=button]:focus,html input[type=submit]:focus,html input[type=reset]:focus,html input[type=image]:focus,html button:focus{border-color:#7a7849 #665d00 #474100 !important}html input[type=radio]{background:none !important;border-color:#333 !important;border-width:0 !important}html img[src],html input[type=image]{opacity:.5}html img[src]:hover,html input[type=image]:hover{opacity:1}html,html body{scrollbar-base-color:#4d4c40 !important;scrollbar-face-color:#5c5b3e !important;scrollbar-shadow-color:#5c5b3e !important;scrollbar-darkshadow-color:#474531 !important;scrollbar-track-color:#4d4c40 !important;scrollbar-arrow-color:#000 !important;scrollbar-3dlight-color:#7a7967 !important}';var s=d.getElementsByTagName('style');for(var i=0,si;si=s[i];i++){if(si.innerHTML==css){si.parentNode.removeChild(si);return}};var heads=d.getElementsByTagName('head');if(heads.length){var node=d.createElement('style');node.type='text/css';node.appendChild(d.createTextNode(css));heads[0].appendChild(node)}})(w.document);for(var i=0,f;f=w.frames[i];i++){try{arguments.callee(f)}catch(e){}}};night(window) }],
["Сохранить как PDF",function(){window.open('http://www.web2pdfconvert.com/engine?cURL='+escape(location.href)+'&title='+escape(document.title)+'&ref=bookmarklet')}],
["Удалить куки текущего сайта", "deleteCookiesFromHost()"],];

                 //-----------------------------------------------------------------------
((contextMenu, el)=> {
var menu = document.createElement("menu");
menu.setAttribute("label", "- Links -");
menu.setAttribute("id", "context-ext-addon");
contextMenu.insertBefore(menu, contextMenu.children[el]);
addDestructor(()=> menu.remove() );
var array = [
["Поиск по текущему сайту",function(){var getSel=function(w){var s,d=w.document;if(d.selection){var r=d.selection.createRange();s=r?r.text:''}else{s=d.getSelection().toString();if(!s){var e,t=d.getElementsByTagName('textarea'),u=d.getElementsByTagName('input'),i=t.length;while(e=(i>0)?t[--i]:u[-i--])try{if(e.offsetHeight>0&&(s=e.value.substring(e.selectionStart,e.selectionEnd)))break}catch(x){}}};if(!s)for(var j=0,f;f=w.frames[j];j++){try{if(s=getSel(f))break}catch(x){}};return s};var w=window,s=w.prompt('Поиск на этом сайте с помощью Google',getSel(w));if(s){w.open('http://www.google.com/search?as_q='+encodeURIComponent(s)+'&as_sitesearch='+w.location.hostname)}}]
];
                 //-----------------------------------------------------------------------

var menuPopup = menu.appendChild( document.createElement("menupopup") );
array.forEach(m=> {if ( m[0] == "separator" ) { menuPopup.appendChild(document.createElement("menuseparator")); return };
var mItem = menuPopup.appendChild(document.createElement("menuitem"));
mItem.setAttribute("label", m[0]);

typeof(m[1]) == "string"
? mItem.addEventListener("command", ()=> eval(m[1]))
: mItem.addEventListener("command", ()=> content.location.href = "javascript:(" + encodeURI(m[1]) + ")()");});
   //---//   //---//   //---//
// Удалить куки базового домена .............
function deleteCookiesFromHost() {var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);
   //удалить обычные куки домена
for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {var cookie = en.getNext().QueryInterface(Ci.nsICookie);~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false);}
   //удалить куки домена из истории
var reversedDomain = host.split("").reverse().join("") + ".";Cu.import("resource://gre/modules/FileUtils.jsm");var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
var dbConn = Services.storage.openDatabase(file);dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");dbConn.close();
   //удалить все Flash куки
var dir = Services.dirsvc.get('Home', Ci.nsIFile);dir.append("Application Data");dir.append("Macromedia");dir.remove(true);dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);};
})(document.getElementById("contentAreaContextMenu"), "context-inspect");
   //---//   //---//   //---//


28-07-2017 11:38:30
Мм еще эта кнопка интересная
Забрал с NewTabFromUrlBar (вот реально зачем столько кнопок когда можно все уместить в одну...).
Не всегда удобно, можно через "Ctrl" тоже самое делать, когда вам это надо.
NewTabFromUrlBar

Выделить код

Код:

//=======================================================================================
//[+++] Открывать адрес из адресной строки в новой вкладке, от 07.03.2017. .................
(()=> {var src = "gURLBar.handleCommand = " + gURLBar.handleCommand.toString(),
res = src.replace('altEnter)','true)').replace('if (isMouseEvent)','if (false)').replace('altEnter ? "tab" : "current"','"tab"');eval(res);addDestructor(()=>eval(src));})();
//=======================================================================================


09-08-2017 13:17:40
difabor Спасибо тебе.
У меня uBlockOrigin пробовал в белый список, что-то не добавляет... может он блокирует всплывающие окна? не пойму разбираюсь...

difabor uBlockOrigin это тоже что и Adblock Plus, режет рекламу.
----У кого "uBlockOrigin" снимаем галочку || Сторонные фильты=Реклама-"EasyList without element hiding rules" || и шахматы заработают, думаю в других резалках аналогично.

bunda1 пишет
Gladius333 пишет

А почему шахматы закрываються? при открытий.

У меня вроде не закрывается. Мистика.

У меня тоже закрывается :( Консоль жалуется:

Empty string passed to getElementById().  tabbrowser.xml:6401:17
Error: This embedded extension has already been started  LegacyExtensionsUtils.jsm:134:29

Я пытался "поиграться" с data:text/html :
Если вместо  text поставить image, а вместо html -  jpeg или  jpg или png - окно открывается и не исчезает, но в нём вместо картинки - сообщение, что там ошибка в приведённом коде...
По-видимому браузер как-то не так реагирует на слово "text" :(

difabor
На основном профиле у меня тоже закрываются, а вот на чистом (CB + кнопка "Ext menu" с шахматами) работают.:( [firefox] 54.0.1

скрытый текст
ZCXl7vg.png

xrun1 пишет

difabor
На основном профиле у меня тоже закрываются, а вот на чистом (CB + кнопка "Ext menu" с шахматами) работают.:( [firefox] 54.0.1

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

И у меня точно также.
Наверное какое-то расширение мешает....
Будут силы и время - исследую...

28-07-2017 21:33:20
Нашёл кто мешает!!! Это Adblock Plus 2.9.1
Ничего себе!

Блин, а у мну вообще крякозябры
8658031m.png

Gladius333 пишет

difabor Спасибо тебе.
У меня uBlockOrigin пробовал в белый список, что-то не добавляет... может он блокирует всплывающие окна? не пойму разбираюсь...

Однако никак не пойму - причём здесь я? Я не знаю что такое uBlockOrigin

29-07-2017 04:30:37

bunda1 пишет
Gladius333 пишет

А почему шахматы закрываються? при открытий.

У меня вроде не закрывается. Мистика.

Уважаемый bunda1,
Шахматы закрываются из-за Adblock Plus 2.9.1

difabor
У меня на основном профиле сейчас 2 сайта не работают - lenta.ru и www.championat.com. Приходится отключать кнопкой Переключить JavaScript для сайтов. Подозреваю, что виноват AdBlock, но простое отключение AdBlock не приводит сайты в чувство, поэтому пока просто отключил там javascript.

difabor пишет

Будут силы и время - исследую...

Вот и я о том же мечтаю.:)

xrun1 пишет

difabor
У меня на основном профиле сейчас 2 сайта не работают - lenta.ru и www.championat.com. Приходится отключать кнопкой Переключить JavaScript для сайтов. Подозреваю, что виноват AdBlock, но простое отключение AdBlock не приводит сайты в чувство, поэтому пока просто отключил там javascript.

difabor пишет

Будут силы и время - исследую...

Вот и я о том же мечтаю.:)

У меня отключение Adblock Plus 2.9.1 позволило открыть шахматы.
Поэтому я решил заменить Adblock Plus 2.9.1 чем-то другим :)
В процессе поиска "кандидатов на вакантное место" :) убедился некоторые из них тоже мешают шахматам.
Из не мешающих нашёл AdBlocker Ultimate и AdBlocker Lite
Первый - огромный (более 10 МB), но чистит всё (имхо), второй - меньше (~1 MB), но особо не чистит или я не знаю как им правильно пользоваться...
Кроме того, заметил, что на сайте мозиллы https://addons.mozilla.org/ru/firefox/ шахматы всё равно не открываются, даже не появляются.
У меня нет расширения, отключающего javascript.
Зачем надо отключать javascript я не знаю - если у Вас будет время, просветите дилетанта.

29-07-2017 13:26:15

Gladius333 пишет

difabor uBlockOrigin это тоже что и Adblock Plus, режет рекламу.

Спасибо,
я в процессе выяснения причин, почему шахматы блокируются, нашёл "виновника" (Adblock Plus), и когда искал ему замену испытал и uBlockOrigin.
Так он тоже блокирует шахматы :)

difabor
Так можно просто отключить то правило которое блокирует и всё.

villa7 пишет

difabor
Так можно просто отключить то правило которое блокирует и всё.

Возможно... Если бы я знал какое правило и как его отключают :)
Я пару часов угрохал лишь на то, чтобы найти виновника :)

difabor пишет: Если бы я знал какое правило и как его отключают

а ПКМ по значку адблока никак не сделать?

Прошу обратить внимание, на сообщение под номером №1733.... 2 день а никакого ответа...

Вообще один модер мало для такого большого форума, где везде надо править код, и стили, и кнопки... когда я первый раз написал сюда, думал не он один будет помогать. По идее там не так сложно просто меню сделать а коды я достану из кнопок, которые не пойму напишу сюда, хотя думаю ответ будет 2-3 недели.
Охота было сделать место 100500 кнопок одну в виде кодов, с подменю. По идее это обновление "Link  Master (Context menu)". ех мечты....

difabor

Зачем надо отключать javascript я не знаю - если у Вас будет время, просветите дилетанта.

Дело в том, что свой основной профиль не меняю очень давно, 3 года точно - стили, скрипты, дополнения, кнопки. Изменения бывают косметические и на функционал никак не влияют. Но последние пару версий [firefox] стал доставлять. Вот как неожиданно стал выглядеть сайт https://www.championat.com/ на последней версии. И как должен выглядеть (раньше так и выглядел без всяких отключений) при отключении javascript.

скрытый текст
PMUCd2U.png3cTT3F3.png

Ещё непонятный глюк: чтобы просмотреть видео, надо включить dom.workers.enabled на sportbox.ru (спасибо turbot за кнопку Быстрое переключение параметров about:config).
Вот, например, ссылка. Не всегда воспроизводится видео на mail.ru, youtube стал глючить. media.autoplay.enabled туды-сюды на разных сайтах приходится переключать... Приходится держать открытым запасной браузер...
А тут ещё и шахматы отвалились!:)

okkamas_knife пишет

difabor пишет: Если бы я знал какое правило и как его отключают

а ПКМ по значку адблока никак не сделать?

Спасибо, okkamas_knife,
Вы как всегда и правы, и вовремя.
Вопрос "А почему мне, тупице, это в голову не пришло?" остаётся и открытым, и острым, и актуальным...

Есть кнопка, в справке которой вот такой стиль

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

Выделить код

Код:

@-moz-document url-prefix(http), url-prefix(file)
{
html:before {
    position: fixed !important;
    z-index: 999999999 !important;
    display: block !important;
    width: 100% !important;
    height: 100% !important;
    background: rgba(0, 0, 0, 0.5) !important;
    content: "" !important;
    pointer-events: none !important;
}}


Можно ли добавить в инициализацию код, чтобы колесиком мыши на кнопке менять параметр 0.5
в строке background: rgba?

Ultima2m
А кнопка не подойдет
https://forum.mozilla-russia.org/viewto … 63#p716863

villa7 пишет

А кнопка не подойдет

У меня эта кнопка есть. Включает свет, выключает.
Но не регулирует яркость почему-то.
Кнопка "менять масштаб" с похожим функционалом колесика работает, а эта никак.

Ultima2m
И свет и цвет. Причем, прозрачность светофильтра не меняется.
Screen Color Temperature :: Дополнения Firefox

Gladius333 пишет

Вопрос можно кроме меню "допольнительно", добавить еще одно меню?
==================================
Или можно добавить в меню-еще меню, к примеру
------------------------------------------------
дополнительно[выпадающее меню]
---линкс[выпадающее меню-сами ссылки]
---разное[выпадающее меню-сами ссылки]
-

Конечно можно, только я не понял что именно требуется.

bunda1 пишет
Gladius333 пишет

Вопрос можно кроме меню "допольнительно", добавить еще одно меню?
==================================
Или можно добавить в меню-еще меню, к примеру
------------------------------------------------
дополнительно[выпадающее меню]
---линкс[выпадающее меню-сами ссылки]
---разное[выпадающее меню-сами ссылки]
-

Конечно можно, только я не понял что именно требуется.

Второй вариант с подменю, а первый можно как пример? я его сохраню чтобы потом не задавать вопрос.
1)"допольнительно", добавить еще одно меню?
--Дополнительно=[сами ссылки]
--Что то...=[сами ссылки]
------------------------------------------------
2)
---дополнительно=[выпадающее меню]
===линкс=[выпадающее меню-сами ссылки]
===разное=[выпадающее меню-сами ссылки]

Все равно не понял что именно требуется, но вот пример:

Выделить код

Код:

((contextMenu, el)=> {
   var menu = document.createElement("menu");
   menu.setAttribute("label", "дополнительно");
   menu.setAttribute("id", "context-ext-addon");
   contextMenu.insertBefore(menu, contextMenu.children[el]);
   addDestructor(()=> menu.remove() );

var array = [
   ["дополнительно1"],
   ["Искать логин на Login2",function(){window.open('http://login2.me/#'+location.hostname,'login2.me_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
   ["Искать логин на Loginz",function(){window.open('http://loginz.org/view/'+location.hostname,'loginz_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
   ["Искать логин на ByPass",function(){window.open('https://bypass.org.ru/login/'+location.hostname,'bypass_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
   ["Искать логин на BugMeNot",function(){window.open('http://bugmenot.com/view/'+location.hostname,'bugmenot_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
   ["separator"],
   ["Набрать сообщение в форме", function(){window.open('http://southron4965.ucoz.ru/files/Opera_LE/html/forma.html')}],
   ["Искать страницу на Archive.org",function(){window.open('http://web.archive.org/web/*/'+location.href)}],
   ["дополнительно2"],
   ["Посмотреть отзывы о сайте в WOT",function(){window.open('https://www.mywot.com/ru/scorecard/'+location.hostname)}],
   ["Информация о сервере (netcraft)",function(){window.open('http://toolbar.netcraft.com/site_report?url='+location.hostname)}],
   ["Проверить доступность сайта через isitdownrightnow.com",function(){window.open('http://www.isitdownrightnow.com/downorjustme.php?url='+location.hostname,'DownForMe_'+location.hostname,'width=600,height=400,left=100,top=100,scrollbars=yes,location=no')}],
   ["separator"],
   ["Узнать, кому принадлежит домен через Domaintools",function(){window.open('http://whois.domaintools.com/'+location.hostname)}],
   ["Узнать, кому принадлежит домен через Reg.ru",function(){window.open('https://www.reg.ru/whois/?dname='+location.hostname)}],
   ["дополнительно3"],
   ["Удалить куки текущего сайта", "deleteCookiesFromHost()"],
   ["Искать страницу в кэше Google",function(){window.open('http://www.google.com/search?q=cache:'+location.href)}],
];
var menuPopup = menu.appendChild( document.createElement("menupopup") );
var subMenu, subMenupopup; 
array.forEach(m=> {
   if ( m.length == 1 && m[0] != "separator" ) {
        subMenu = menuPopup.appendChild(document.createElement("menu"));
        subMenu.setAttribute("label", m[0]);
        subMenupopup = subMenu.appendChild(document.createElement("menupopup"));  
        return;
        }
   if ( m[0] == "separator"  ) { subMenupopup.appendChild(document.createElement("menuseparator")); return };
   
   var mItem = subMenupopup.appendChild(document.createElement("menuitem"));
   mItem.setAttribute("label", m[0]);
   typeof(m[1]) == "string"
   ? mItem.addEventListener("command", ()=> eval(m[1]))
   : mItem.addEventListener("command", ()=> content.location.href = "javascript:(" + encodeURI(m[1]) + ")()");
});

   
   function deleteCookiesFromHost() {
      var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);

      for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {
            var cookie = en.getNext().QueryInterface(Ci.nsICookie);
            ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false); 
            }
   
      var reversedDomain = host.split("").reverse().join("") + ".";
      Cu.import("resource://gre/modules/FileUtils.jsm");
      var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
      var dbConn = Services.storage.openDatabase(file);
      dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");
      dbConn.close();
   
      var dir = Services.dirsvc.get('Home', Ci.nsIFile);
      dir.append("Application Data");
      dir.append("Macromedia");
      dir.remove(true);
      dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
   };
})(document.getElementById("contentAreaContextMenu"), "context-inspect");
bunda1 пишет

Все равно не понял что именно требуется, но вот пример:

Выделить код

Код:

((contextMenu, el)=> {....

Да то что надо, мне скинули кое-что пока разбераюсь) спс!
Еще хотел как пример без подменю, к примеру у нас было одно "дополнительно", подним без подменю другое "дополнительно".

Gladius333 пишет

к примеру у нас было одно "дополнительно", подним без подменю другое "дополнительно".

Куда поднимим :cry:

bunda1 пишет
Gladius333 пишет

к примеру у нас было одно "дополнительно", подним без подменю другое "дополнительно".

Куда поднимим :cry:

Тоже самое только (где красные) и только одно подменю.

скрытый текст
oJ3zLOc.png

:angry:

Может ли кнопка узнать, посещалась ли ссылка или нет? Я в курсе, что псевдокласс :visited недоступен для проверки в целях безопасности, но локальное расширение по логике таких ограничений иметь не должно...

bugmenot пишет

Может ли кнопка узнать, посещалась ли ссылка или нет?

Может-может. Причём не только - посещалась ли, но и когда именно.
У меня стоит расширение Link Status Redux, которое для ссылки, на которую мышка наведена, показывает это в строке статуса.

yup пишет

Может-может.

Уже отлично. А не подкинет ли многоуважаемый all кусочек кода на сию тему, чтобы не раскапывать это в расширениях?..

bugmenot
Как отправная точка: https://developer.mozilla.org/en-US/doc … query_URIs и https://developer.mozilla.org/en-US/doc … ry_service

Расковырял-таки расширение и собрал вот такой код.

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

Выделить код

Код:

var iosvc = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
      var query = PlacesUtils.history.getNewQuery();
      var queryOptions = PlacesUtils.history.getNewQueryOptions();
      queryOptions.includeHidden = true;
      queryOptions.maxResults = 1;
      queryOptions.resultType = queryOptions.RESULTS_AS_VISIT;
      queryOptions.sortingMode = queryOptions.SORT_BY_DATE_DESCENDING;

      var isVisited = function(link)
      {
        try
        {
          uri1 = iosvc.newURI(link, null, null);
        }
        catch (e if e.result == Components.results.NS_ERROR_MALFORMED_URI)
        {
          uri1 = null;
        }

        query.uri = uri1;
        var results = PlacesUtils.history.executeQuery(query, queryOptions).root;
        results.containerOpen = true;
        return results.hasChildren;
      }


С одной стороны, работает, с другой, нет ли тут косяков и подводных камней, пропущенных по незнанию?

bugmenot пишет

нет ли тут косяков и подводных камней, пропущенных по незнанию?

1. Mozilla не рекомендует использовать конструкцию "catch (e if ...)".
Тем более, что в данном случае её можно совершенно безболезненно переписать как:

Выделить код

Код:

catch (e) {
  if e.result == Components.results.NS_ERROR_MALFORMED_URI) uri1 = null;
}

2. Mozilla же рекомендует пользоваться асинхронными методами, а там это выглядит примерно так:

Выделить код

Код:

var iosvc = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
var asyncHistory = Components.classes["@mozilla.org/browser/history;1"].getService(Components.interfaces.mozIAsyncHistory);

var uri = iosvc.newURI(link, null, null);

asyncHistory.isURIVisited(uri, function(uri, isVisited) {
  if (isVisited) alert('visited')
  else alert('not visited');
});

В синхронном nsIGlobalHistory2 описана функция isVisited(), но, похоже, что это дело из [firefox] уже выкосили.

2yup
Спасибо, catch поправлю. Асинхронность пока что не нужна, но информация полезная, пригодится.

yup пишет

В синхронном nsIGlobalHistory2 описана функция isVisited(), но, похоже, что это дело из  уже выкосили.

Да, сначала с нее и попытался начать.

bugmenot пишет

Асинхронность пока что не нужна

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

yup пишет

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

Да, придется. Спасибо еще раз.

bugmenot пишет
yup пишет

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

Да, придется. Спасибо еще раз.

А что делает твоя кнопка? просто я вбил ничего не заметил, как она работает?
Понял из комментов что она показывает посещалось ли ссылка, но в работе я так и не понял...

Gladius333 пишет

А что делает твоя кнопка? просто я вбил ничего не заметил, как она работает?Понял из комментов что она показывает посещалось ли ссылка, но в работе я так и не понял...

Это не кнопка. Это функция, которой можно передать ссылку и узнать, есть она в истории или нет. А дальше как хочешь, так ее и применяй.

Привет.
Подскажите как; в конт. меню страницы(обычном станд. ПКМ) есть пункты добавляемые расширениями. Этих пунктов может быть не один, но всех их зовут одинаково. Я написал действия для этих пунктов, ф-цию-листенер на действия мыши(case 0,1,2). Все работает правильно и как надо, но сейчас держу две ф-ции для двух разных ID. Вопрос такой:
- как повесить одно-и-тоже действие на два(три, пять) разных id в меню ?

Сейчас это так(две абсолютно одинаковых ф-ции , различия только в id):

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

Выделить код

Код:

// -----------------  Для расширения MediaSnifer\Video-Sniffer действия для кликов  --------------------------------------------------------
(function() {
   addEventListener("click", function(e) {
   
      if(e.target.id != "mediasniffer") return;
    
          var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
          var ref = ('"' + content.document.location + '"');
          var domain = content.document.domain.replace(/^www./g,'');
          var url = ('"' + e.target.getAttribute("tooltiptext") + '"');
          var title = convertFromUnicode("Windows-1251", gBrowser.mCurrentTab.label);

       switch (e.button) {
// скачать через wget или aria
           case 0:
              e.preventDefault();
              e.stopPropagation();
  
             if ( domain == "xvideos.com" ) { var url=url.replace(/p\d+\.ts/ig, 'p\.m3u8'); }

       file.initWithPath(file.path + "\\Soft\\wget\\wgetfile.cmd");
          var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
       process.init(file);
       process.run(false, [url, title.replace(/(?:@|#|&|\\|\/|\.|,|\||\:)+/g,'').slice(0,65), ref], 3);
          break;
          
// скопировать ссылку-подсказку
           case 1:
              var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
              var tt = e.target.getAttribute("tooltiptext");
            gClipboard.write( decodeURIComponent(tt) );
            alertsService.showAlertNotification(e.target.image, null, "Скопировал ссылку Mediasniffer-a", false, "", null, ""); 
                 break;          

// Открыть в Smplayer
           case 2:
//            var param = "-add-to-playlist";
            var url = e.target.getAttribute("tooltiptext");
            var file = Services.dirsvc.get('ProfD', Ci.nsIFile);

      file.initWithPath(file.path + "\\Soft\\PotPlayer\\PotPlayerMini.exe");
           var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(file);
        process.run(false, [url, "/add"], 2 );
        break;
  }
 }, false, document.getElementById("contentAreaContextMenu"));
})();

// и ниже , точно тоже самое, только с разницей в 
//    if(e.target.id != "video-sniffer") return;


пробовал так сделать

Выделить код

Код:

if(e.target.id != ("mediasniffer" || "video-sniffer")) return;

срабатывает только на первом id , для второго нет. :rolleyes:

mokujin пишет

срабатывает только на первом id , для второго нет.

Да и на первом-то срабатывать не должно.

Выделить код

Код:

if((e.target.id != "mediasniffer") && (e.target.id != "video-sniffer")) return;

или

Выделить код

Код:

if(["mediasniffer", "video-sniffer"].indexOf(e.target.id) < 0) return;

блиииин... делал точно такуюж конструкцию, а заместо и(&&) писал или( || )  и не работало.  fool.gif 
:)
Пасиб, второй пример тоже в копилку, пригодицца.   
Благодарю.

Можно добавить сюда, чтобы пойск закрывался и открывался с помощью "Ctrl+F".
К примеру заходишь на страницу, начинаешь печатать в адресной строке а он начинает автоматом пойск+когда начинаешь искать то саму панель приходиться закрывать через крестик или "Escape" жать...

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

Выделить код

Код:

/*[+++] Задаем положение панели поиска наверху */
@-moz-document url("chrome://browser/content/browser.xul"),url("chrome://global/content/viewSource.xul") {
:-moz-any(.browserContainer, #viewSource) .findbar-container > *,
:-moz-any(.browserContainer, #viewSource) .findbar-container > *:not(spacer),
:-moz-any(.browserContainer, #viewSource) :-moz-any(.findbar-find-previous, .findbar-find-next) {display: -moz-box;}
:-moz-any(.browserContainer, #viewSource) .findbar-container :-moz-any(spacer, .findbar-find-fast[anonid="match-case-status"], .findbar-find-fast[anonid="entire-word-status"]) {visibility: collapse}
:-moz-any(.browserContainer, #viewSource) .findbar-find-fast.findbar-find-status, .found-matches {-moz-box-ordinal-group: 0;margin:0 5px 0 -6px!important;}
:-moz-any(.browserContainer, #viewSource) .findbar-button {margin:0 -1px!important;padding:0!important;max-width: 125px!important;}
:-moz-any(.browserContainer, #viewSource) .findbar-closebutton {position: relative !important;right: 0 !important;margin: 0px -3px -5px 0px!important;}
:-moz-any(.browserContainer, #viewSource) .findbar-textbox {height: 20px !important;font-size: medium !important;max-width: 170px!important;}.browserContainer findbar,
#viewSource #FindToolbar {-moz-box-ordinal-group: 0;position: fixed !important;left: 5px;margin-top: -1px !important;box-shadow: 1px 2px 3px rgba(0, 0, 0, .25) !important;border: 1px solid threedshadow !important;border-top: none !important;border-radius: 0 0 9px 9px;transition-property: margin-top, opacity, visibility !important;}
#viewSource #FindToolbar {background-color: -moz-dialog;color: -moz-dialogtext;}
:-moz-any(.browserContainer, #viewSource) .findbar-find-status { color: inherit !important }}


П.С. вот тут есть такая функция, но я чета не разобрался.
скрытый текст

Выделить код

Код:

var tipOrig1 = "ЛКМ: Вкл-Выкл панели поиска по странице";
var tips2 = ['ПКМ: Вкл-Выкл режима подсветки выделенного слова во всех вкладках','ПКМ: Выкл.подсветки "','Ожидание выделения текста для его подсветки во вкладках...'];

// Подсказка для кнопки ...........
function setTip() {
var normLen = function(str) {return str.slice(0,40) + (str.length > 40 ? '..."' : '"')};
self.tooltipText = tipOrig1 + '\n' + tips2[state > 2 ? 1 : state] + ((state > 2 || state == 1) ? normLen(Services.prefs.getComplexValue("CB.autoHighlight.value", Ci.nsISupportsString).data) : '');
};

self.onclick = e => {
if(e.button == 0)toggleFindbar();
if(e.button == 1)gShowPopup(self);
if(e.button == 2 && e.target == self && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) {
e.preventDefault();
e.stopPropagation();
if(!cbu.getPrefs("CB.autoHighlight.state")){
let selWord = getSelect();
if(!selWord){
// Нет выделенного
cbu.setPrefs("CB.autoHighlight.state", 2);
} else {
handleSelect(selWord);
setTimeout(()=> autoHighlight(true), 200);
cbu.setPrefs("CB.autoHighlight.state", 1);
}
}else{
cbu.setPrefs("CB.autoHighlight.state", 0);
}}};

function toggleFindbar() {
if (gFindBar.hidden) { gFindBar.onFindCommand(); setTimeout(function() { gFindBar._find() }, 50) }
else {gFindBar.close();setTimeout(()=> autoHighlight(true), 10)}
};

self.ondblclick = e => {e.preventDefault()};

function keyDown(e) {
if(e.keyCode == e.DOM_VK_F && e.ctrlKey && !e.altKey && !e.shiftKey){
e.preventDefault();
toggleFindbar();
}
};

addEventListener("keydown", keyDown, false, getBrowser());

var imgOrig = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAACZElEQVR42mNgAIK/f/+GMvz69ct3yZIlyxjOnTt3BCTK8P///0Yw49ixY0eBnEAGbICdnf0/SCnvrl27nsBFz5492wuio6Oj/4NopoSExAygqmm/f/9G1R8bG/s9LCzsF9iMlNSU/5cuXcp7/fq1Q3Fx8c8XL17MgKsEuu7Rs2fP3IAKOaCYycrK6j+KcXfv3p0gLib+n5OT87+Xp+d/SSmp/0lJSb8Y8IHIyMjv6urqEJO+fPlStG3btpc3btzYjKHyzJkzF9rb2x++f//e/PDhwxNLS0pQ7Q8MDAS6638FjL9o0aLNr169aoIrcHR0/A8NXbAvdu/e3XT58uX5cAURERH/gcHXBZScCcRVKioq/3//+Z0MVwAUZE1ISPjDwcHxX1tb+7+goOB/Hh6e/z9//gzD6j1gmPuD9IHwp0+f8Cu6efNmG8waZaA7ztXV1f3Pycn5X1ZW9r8E6N3s7Oz/vb29/x8/frwU5AGspn3+8iW/sLDwf319/Y2vX7/WARX2Iss/eHA/ISUl5feUyZNBwWWMYQAwsp+DwvLNmzdOQAXC2Cw5fvx4qZub2/+LFy8uwZA8derURi0trf8rVqyYAzTAFIi9gdgdiD2A2AuILUuKS854AhPJ58+fU7B64/r16/P09fX/S0lJ/a2oqDiybt26tcuWLdsQHx9/SUxM7L+ysvJ/GRmZ/5mZmd+BGSgMZwoD2mbw6NHjqiNHjsw5efLk9A8fPqQANcQmJ6d8B0kLCAj8Z2Rk/B8dE/0LZzziAqCoi4qKAhsEMgREd3V1vWMgFQBd5Ddp0qTbwEzUCuIDAFDBb1F5m6ZWAAAAAElFTkSuQmCC";
var imgLockedSearch = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAACrUlEQVR42o2T30tTYRjHn/PuDM/mmh7RxjYzGiioiRR10UC8CUzzolmIOtAxpsQKc660i4LsqigIpUKxYqCgBu4PKOlmidpNxGA4QujC/IHr7MyUzXPYnt4dp8xZ0POBw8tzvu/3vM953odBBBrtUUilrgnuz26EcNgn0ewaDOEQKotgcFyyoQ2Bkk4wSjYTHJdnpAn9RiAwVlJX176pZD2rHkVut9uVLeRDy0d4TZFlWREcerhcHcZ4XAJIe7i6XdgR6UCrZMW+wT6MxV7spoWK2O8fTtbv1SOXgVCsViseCtKPSGRo13DSgBqNBpsaG9FoMmFPj+P4ubPD4Wg1Li5+2z+ULPfrAoGL+RUVO3JpabeQpTORUGi65OEb9YmB+ufkmRTMG7h315glWAObzYb3KZDB88mDOzsPfh8ckoiiCE8oXAbhtADRaL7qwIIYDAbo/dkLw5R+ynzDPJjNP6TDjyCq153OTuQ4Dqurq5HnedTpdJhMtkX/WiZiC0eIn0+vZblVJLn1M4w/kUq1RNNrUTyjzjhUsMvLj/mpqRArCAJotVp6SVIQj8fBYrHQn6ZNFBV5RIAEHjOUpDuxwUGilywS6G/qoZgtBi/lIG7sXge9twDOnz0Ht25PRgCW5CMGs7OvkpOTcyTyPgIhNgS/KLlhX7fDlmMLxscvJ8rKBqLZ70hNjSSHw2Go/FoJFspVSgPlCqWJconCzDCgUqnAZPq+l2tOyss9wtxcV3ypewlWT60CP8ZD7ZdaqApUAfuQhRXDCiy8XKDTEQSvFwoQ2zVHSjjahgvq7e26vM1NLcuygGbzhqxWJ8HthoLRUR8UFhZCLBaDzq42ePcWRUKm4/+8rrmR7q/TqeZ9vhnaSkYZ0pGRR8jsD/f/mewb2biJiRp9c/Mebe1T3R+cNmFDpJ/KUgAAAABJRU5ErkJggg==";
var imgReady = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAC5klEQVR42mNk+F/MkMhgepch/N+iO0uWLFnGsOTG7i9A0TNM0eouvQwgMP/S1i////8PBHOAMowgggEK2DmmGDMK/K8+P/OQhXa43YFLYNGzZ8+C9UZHR/8HGxaXkVIANGPa79+/wQrgZkSlvDb69f0nA9iMkLSXBnm5efmSkpKXWns69qlWeb/N5tv6EKxl8tr5v549e+YGNIYDipmsrKzA5oPtyA26cmkR67nFEuIS37m4uL57e3n9vf/gAUNC+gcjFDvRQVjCc6OLJ84yghVU/XYQ1zv0T+KHGu/XBNmtd5DUmTCuubLv2+3NJ19nZGSEXblyJWrTxo153d3/z8JUMC2tncxZUVExXVBQ8KStrW2+rp7elpavzlJwBR8+fGBgZGTsgPkC6NXznO/+ssEViIuLg4KvC8ieCMRFmZmZtQ9lfn+BK1i3XO7cxKlTSjk5OdN0dHRa3759yzCPL04+/p+xEFZvRv43EFjOFKsMYsf+XnyfCd3/yxkvfIj8t/guiK3wnosTbIIWgzh743UT5csrDnC+e/eOARiiDP/+/WP4/v07g5KSEoNAvPG7HOHtD78z/PmHbiBj2a+Nj3+XH5Dh4+O7WVZWtgyomR/o62KYggcP7ic0tbfNN9LRY1iRw3DjCMODrygGTFsz//fupZtYZs+e7SwsLHwRqPktui3Hjx8vra+v7/KalfuuQP7AfWQ5pn86Il9v3rzJsGfPniggXwkY1t5A7A7EHkDsBcSWa9esDWdmZma4LfXjM7rhTDnqB+6k7u5+297eniwlK3OqEgjWr1+ftnz58oyEhIQOYDwdW79hvfHly5cZfpXsl0v4Dwl+uBeQo8GSQZ7L7qMMP9fLX+z/WRj/v5Jh/PoXSP/I3iW/cMZsRgEBAYaPHz8yRMRH/2eb6/VgIdPZdziTKzoAxe+/pB1KKxcsBQYTUNv//wyNEzv+ggwAyRNlCAhE/NcX0Fj4Ruafr+L7JuEjkgA5RWMpXs0CsgAAAABJRU5ErkJggg==";
var imgReadySearch = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAC1UlEQVR42o2SbUhTURjHn3MdOqftJaVZzLRJmZukOZP0g/olNKVgJqmJOSVL1AQzDSyJ+SXBT5JEWmFmZYJGKVIo4bCJGZq1FSm5nGSJZtetnHO77Z7uvanoJOj/+3DPee5z/ufleRDgcsiDQybIoO9NFumLMNwf71tioiOgxVrMDZoNPUtqrGYmwAUQF12VF79BhcT48ljjwGFlRrzOwEXLZsq45OzsbG4J0ZvWBzcYKIriEtY9Tp35HuW0O4DzSD87F7l8bRnMQjPEVMfA3qrjC8XCnmluyfXOZmeCIwHzVyEY4uLi/p6R3eN82nvD0Z8V8yKpCJAAQXJKEkyZzaA5Z4natKe7Tmpmo969GkVcQhWVKD0wQAes7Ntm0wT2TG7IiyY6PqQqXLf1srrEGt4b6omoogKpNiSMILVajUMfh0ItA/cQ/WXgF3Nk9orPi2/snLBYLNxP/ipkEAnepMtzzYKQSqVQ+rUU6hkuMAwmDcK0jFpa38QTV46ezs/DfD4fK5VKLJFIsK+vL851Pfy8pTyssnCkuI3ICWHHOVTrFOF+/zb01pJFt5rYcfCiwJtzUIDUS/sxOsT4SOdNkiQIBAKgaRrsdjvI5XIQ56rIEr9n03b4Tbsbokrn0y/UJZ3MKXeCsFAI/jx/KGdYU7rtBAjLRRAVfhAelcC4Hsy2jQZEcBcZYGZqZyg0QBOvadNiVh0+neC46oCu7m5Inw7e4X4Cgg73t01MTEDYWBjIGVIZkhiSGVIYYhlQOwIPDw/4tGvl1xaDklDdZEFf3Y/hgmGYCZwBSaMEIl5HgOKlAnjVPDBJTTDUMARGoxGcF/t3a7Bq+6Y32FiGWAgSxFtlIsGc0wvzEJ6XIZuL+a4U9wa13LyFxGIxWK1WyMzNxp53UswtxCj5z3Z1F1tfOv+5vP3uA4TYJsYYtPW1LtaA60r4T2XiCPH+lgUZfWzPYo2ffucfIF9BRWk+aooAAAAASUVORK5CYII=";

// Обработчик следит за загрузкой и переключением вкладки и запускают автовыделение ..........
var listener = {onStateChange: function(wpr, req, flag) {if ( gBrowser.currentURI.spec.startsWith("http") && flag & Ci.nsIWebProgressListener.STATE_STOP )
setTimeout(()=> autoHighlight(true), 10);},onLocationChange: function(wpr, req) {if ( gBrowser.currentURI.spec.startsWith("http") && !req && wpr.document.readyState == "complete" )
setTimeout(()=> autoHighlight(true), 10);}};

function handleSelect(str) {var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
.createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
converter.charset="UTF-8";cbu.setPrefs("CB.autoHighlight.value", converter.ConvertFromUnicode(str));};

// Получить выделенный текст из страницы или false ..........
function getSelect() {let selA = gBrowser.contentDocument.defaultView.getSelection(), selB ='', sel = '', el = document.commandDispatcher.focusedElement;
selA = selA ? selA.toString() : '';
try { selB = el && el.value ? el.value.substring(el.selectionStart, el.selectionEnd) : '' } catch(e) {};
selB = selB ? selB.toString() : '';
sel = selA.length > selB.length ? selA : selB;
return(sel == '') ? false : sel.replace(/^\s+|\s+$/g,"");};


//выделить текст ..........
function autoHighlight(power) {
var finder = gBrowser.finder || gFindBar;
var lighted = (finder._highlightDoc || finder.highlight).bind(finder);
lighted(false,"");
if(power){
var lightstr = Services.prefs.getComplexValue("CB.autoHighlight.value", Ci.nsISupportsString);
if(lightstr)lighted(true, lightstr.data);};};

var addFlag = false, state = 0, wnd = document.getElementById('main-window');

function onMouseup() {let selection = getSelect();
if(!selection || state<2)return;
setTimeout(()=> autoHighlight(true), 200);
handleSelect(selection);
cbu.setPrefs("CB.autoHighlight.state", state+1);};

function onMouseent() {autoHighlight(true)};

function onStateChange() {
state = cbu.getPrefs("CB.autoHighlight.state");
if(!state && state != 0){
state=0;
cbu.setPrefs("CB.autoHighlight.state", 0);
};
if(state<3){
addFlag = false;
//gBrowser.removeProgressListener(listener);
removeEventListener("mouseup", onMouseup, false, getBrowser());
};
setTip();
switch (state) {
case 0:
gBrowser.removeProgressListener(listener);
wnd.removeEventListener("mouseenter", onMouseent, false);
if(cbu.getPrefs("CB.autoHighlight.value")){
setTimeout(()=> cbu.setPrefs("CB.autoHighlight.value", ""), 50);
autoHighlight(false);
};
self.image = imgOrig;
break;
case 1:
//setTimeout(()=> autoHighlight(true), 100);
wnd.addEventListener("mouseenter", onMouseent, false);gBrowser.addProgressListener(listener);
self.image = imgLockedSearch;break;case 2:addEventListener("mouseup", onMouseup, false, getBrowser());self.image = imgReady;break;default:
//setTimeout(()=> autoHighlight(true), 100);
if(!addFlag){if(self.image != imgReady)addEventListener("mouseup", onMouseup, false, getBrowser());self.image = imgReadySearch;addFlag = true;
wnd.addEventListener("mouseenter", onMouseent, false);gBrowser.addProgressListener(listener);};break;}};

onStateChange();gPrefService.addObserver("CB.autoHighlight.state", onStateChange, false);

addDestructor(() => {gPrefService.removeObserver("CB.autoHighlight.state", onStateChange, false);
gBrowser.removeProgressListener(listener);removeEventListener("mouseup", onMouseup, false, getBrowser());
wnd.removeEventListener("mouseenter", onMouseent, false);cbu.setPrefs("CB.autoHighlight.value", "");
cbu.setPrefs("CB.autoHighlight.state", 0);autoHighlight(false);try{removeEventlistener("keydown", keyDown, false, getBrowser())}catch(e){};});

долго браузер не обновлял, обновился до Waterfox _55.0.22,
часть кнопок работать перестали.

была кнопка рестарта Firefox, брал там

Инициализация

Выделить код

Код:

// ***** VARS ***** //

var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
                        .getService(Components.interfaces.nsIPromptService);




// ***** FUNCTIONS ***** //

function createBrandingBundle() {
    var myBrandingPath = null;
    var myStringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]
                        .getService(Components.interfaces.nsIStringBundleService);
    
    myBrandingPath = "chrome://branding/locale/brand.properties"
    return myStringBundleService.createBundle(myBrandingPath);
}


function getWindowType() {
    // Relies on Branding Code so can not be run on startup
    var myBrandStrings = createBrandingBundle();
    var thisBrandShortName = myBrandStrings.GetStringFromName("brandShortName")
    switch (thisBrandShortName) {
      case "Mozilla Thunderbird":
      case "Shredder":
      case "Thunderbird":
        return "mail:3pane";
      case "Nvu":
        return "composer:html";
      case "Calendar":
      case "Sunbird":
        return "calendarMainWindow";
      case "eMusic Download Manager":
      case "eMusic Remote":
        return "emusic:window";
      case "Songbird":
        return "Songbird:Main";
      default:
        return "navigator:browser";
    }
}


function Restart()
{
    // Notify all windows that an application quit has been requested.
    var os = Components.classes["@mozilla.org/observer-service;1"]
                     .getService(Components.interfaces.nsIObserverService);
    var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"]
                              .createInstance(Components.interfaces.nsISupportsPRBool);
    os.notifyObservers(cancelQuit, "quit-application-requested", "restart");

    // Something aborted the quit process.
    if (cancelQuit.data)
     return false;

    var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
    var windows = wm.getEnumerator("");

    var windowType = getWindowType();

    while (windows.hasMoreElements()) {
      var myConfigWindow = windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindowInternal);
      if (myConfigWindow.document.documentElement.getAttribute("windowtype") != windowType) {
         myConfigWindow.close();
      }
    }

    if ("@zeniko/crashrecoveryservice;1" in Components.classes) {
      nsPreferences.setBoolPref("extensions.crashrecovery.resume_session_once", true);
    }

    var appStartup = Components.interfaces.nsIAppStartup;
    Components.classes["@mozilla.org/toolkit/app-startup;1"]
      .getService(appStartup).quit(appStartup.eRestart | appStartup.eAttemptQuit);

    return true;
}




// ***** MOUSE HANDLING ***** //

this.leftclick = function(evt) {
  var RestartProceed = prompts.confirm(null, "Restart Firefox", "Перезапустить приложение?");
  if (RestartProceed) {
    Restart();
  }
}

this.aleftclick = function(evt) {
  Restart();
}




// ***** INITIALISATION ***** //

this.tooltipText = "Restart";
this.style.opacity = '.85';

this.setAttribute("onclick","custombuttons.gQuot.mHandler(event, this)");
this.setAttribute('ondblclick', 'gQuot(event, this)');




// ***** ATTRIBUTES ***** //

this.setAttribute('author','Rawny, zooot');
this.setAttribute('version','4');
this.setAttribute('homepage', 'http://custombuttons2.com/forum/buttons/buttons-database/restart-session-restore.html');
this.setAttribute('dependency','FF2.0*, FL1.0*, TB2.0*, CB2 2.0.5*');
this.setAttribute('status','Complete');
this.setAttribute('public',true)


посмотрите пожалуйста, можно поправить?

Gladius333
Автоскрытие панели поиска

polk90 пишет

долго браузер не обновлял, обновился до Waterfox _55.0.22,
часть кнопок работать перестали.
была кнопка рестарта Firefox, брал там
посмотрите пожалуйста, можно поправить?

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ERestart%20%28with%20confirmation%29%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAA6hJREFUOE9VkwtMU1cYx/+9tYAKWAYixWXjIQpYBGEF3AZoNKEyLeCiDQ+dBidjQHj4qHEoyLYw0KCTQUarqLQisGRmG+CCo0zEGljXAI0dr0InJpDNER/Lqin026GajJ3kl3Puyf1+93+/nMPD4pGpFYLHSbxErnJ3Hr3HA3lbbXa71U6WpzbSzv9tU8NORvB5TzFPfmyu/688XStakae7LFWO/pXcYqF930/RwbYpkn8zSYnqMYqq+438ywzTyOr5Ghndb7nk3/uO/2Gv7aUgXesrKuzvKPrpj7lDHQ9pd+sEpTSbKXURu1rMlNJkpo01921LP+p9kHx9cm79CT0BaV2eHvn3mg53/Wk/1P6QZOylheL3WyZIdt3sYGG9sOfYZ/JtjWN0Vj9LkScNTHDgduKOhvEn+bdmSKoepyTNOIs8Tn4Vg+Sr6HewpmqIpEycxARJTLaT/VZ53yxFnPyV4F3Y25bWNk2bNWaKaRijmEujtLyw5wmSGlQIzZQiJEPKkzXdWHpYZxOrRknSOEFvt/xOBXdnab2ij+D/cdczWdsM+dWN0Ju1I+R2VEdI+KqGdcaLwWHLpQDsbG1Dds8cFCxy2RCtrB0n2a1HFJj/M0F05A6FaaZI8IWJBBX3iZP/YEVQntjR3PgrTth6rRMZP9pQzL52jDXtExb71AAFXZ4k770dBHn7MqqyeFDeIOhgH2iTGtaQGvg6BJLzexBZ1YzwzzXYwAj9VIOQ8pesO61BRGUL4tUuzz+zuFG2ASS/DYprBvlXI+fVAVnGZk/Gax6pEItzESnJhTh8H4LWJsN/hQRvIKx6SX+JyYmy9Bzt6gbtYYTW4YFPBT7wLIe3sBRebB0XW++cd84YvP+CMSJZadoUd6QzKNzvBEvqnoucvTfdX5QYRQ5BRi8oS4f5ba14HK3CgETFv7P7hmsnK26sN8VUKI1xRXWGd9KTVT5bndNYOucdCAwo57ouDL9rLzAIKVMHytFjvsiAZ0cNmC4bdB86P7xGqxyOblaZ4quVxoTjxe1r93vlI5ZLgDMgAMelYsu6SlfjGVO4/ZRxFRUYOLvCiOenTdyjs8O+IxfNUXevmjd/ywS1xzqDS18vdpIjAsLF91DAbUdiYKlz94H2gBcKvZAqx1bO1Vh8HistoWaVOeaXMl3IzZQrqy+uLuZnIwyrWDHvfzeZPQgEsdiwPA3Hgytd9NEqNyvjH0m928zGL90HAkqWnHPaDik/CiLHAXs1/gU8lc1wSyvYVQAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%20%28%20%21custombuttons.confirmBox%28null%2C%20%22%u041F%u0435%u0440%u0435%u0437%u0430%u043F%u0443%u0441%u0442%u0438%u0442%u044C%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%3F%22%2C%20%22%u0414%u0430%22%2C%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%29%20%29%20return%3B%20%0Avar%20startup%20%3D%20Services.startup%3B%0Astartup.quit%28startup.eForceQuit%20%7C%20startup.eRestart%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5BLeft%20%20%20%20%20%20%20%20%3D%20Restart%20application%20with%20confirmation%20dialogue%0AAlt+Left%20%3D%20Restart%20application%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

bunda1
Спасибо, но к сожалению, у меня не заработало,
пробовал и на чистом профиле, только с этой кнопкой,
может что-то в 55 перепилили, что не дает ей сработать?

polk90
Очевидно тебе надо обновить Сustom Buttons на Custom Buttons • View topic - [Signed fixed extension attached] CB broken on Firefox 48+

bunda1 пишет

надо обновить Сustom Buttons на Custom Buttons fixed extension

ааа... Супер, оно!
Спасибо!

Спасибо пойдет, только жаль что один код надо в кнопке держать, а один в стиле.
Но все равно спасибо! Кстати в кнопке "Toggle Find+" есть все что надо, но хотелось обойтись без кнопки а функций в код, -1 кнопка которая маячит.

Кнопка VT ( Firefox10+ )
В консоле ошибок
"Метка времени: 02.09.2017 6:46:45
Ошибка: TypeError: bgc.match(...) is null
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button0@init line 1 > Function
Строка: 226"
Pale Moon 27.4.2 Win7 32

Помогите найти кнопку. Кнопка регулировала количество загрузки вкладок. Похожа на это дополнение.

Также хочу задать вопрос о кнопке VT. Можно ли в ней ограничить размер иконок? Скажем, чтобы иконки были 16 пикс.

rgdru пишет

Кнопка VT ( Firefox10+ )
В консоле ошибок
"Метка времени: 02.09.2017 6:46:45
Ошибка: TypeError: bgc.match(...) is null
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button0@init line 1 > Function
Строка: 226"
Pale Moon 27.4.2 Win7 32

А ты менял тему или обои? Попробуй это:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0432%u0435%u0440%u0442%u0438%u043A%u0430%u043B%u044C%u043D%u0443%u044E%20%u043F%u0430%u043D%u0435%u043B%u044C%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAKP+AAIX/gAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAFf+AABUAAAAAAAAAAAAAAAAAAAAA/4AAJP+AAP//gAD//4AA//+AACQAAAAAAAAAAAAAAAAAAAAA/4AAEv+AAP//gAD//4AAEgAAAAAAAAAA/4AAIP+AAP//gAD//4AA//+AAP//gAD//4AAJgAAAAAAAAAAAAAAAP+AABH/gAD//4AA//+AABEAAAAAAAAAAP+AAP//gAD//4AA//+AADb/gAD//4AA//+AAP//gAAQAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AACAAAAAA/4AAIP+AAP//gAD//4AAEQAAAAAAAAAA/4AAD/+AAP//gAD//4AADwAAAAAAAAAA/4AA//+AAP//gAAMAAAAAP+AAAz/gAD//4AA//+AAA8AAAAAAAAAAP+AAA//gAD//4AA//+AAA8AAAAAAAAAAP+AAP//gAD//4AADwAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AAA8AAAAA/4AAD/+AAP//gAD//4AADAAAAAAAAAAA/4AACv+AAP//gAD//4AACgAAAAAAAAAA/4AA//+AAP//gAAPAAAAAP+AAA//gAD//4AA//+AAAv/gAAL/4AADP+AACH/gAD//4AA//+AACH/gAAK/4AAD/+AAP//gAD//4AAEQAAAAD/gAAR/4AA//+AAP//gAAm/4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AABIAAAAA/4AAEv+AAP//gAD//4AAJ/+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AAEf+AABIAAAAAAAAAAAAAAAD/gAAV/4AAEgAAAAD/gAAQ/4AAEf+AAA//gAAP/4AAD/+AAA//gAAP/4AADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQe//rEHH56xBg8OsQQHDrEEAw6xBEMOsQRDDrEEQw6xBEMOsQRAArEEQAKxBEACsQTkArEH//6xB//+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20button%20%3D%20this%3B%0A%0Aconst%20sideBarAutoClose%20%3D%20false%3B%20%20//%20true%20%3D%3E%20%u0432%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0430%u0432%u0442%u043E%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0435%20%u0431%u043E%u043A%u043E%u0432%u043E%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%20%0Aconst%20autoCloseDelay%20%3D%20500%3B%20%20%20%20%20//%20ms%0A%0Aconst%20showDelay%20%3D%20250%3B%09%09//%20ms%0Aconst%20distanceShow%20%3D%202%3B%09%09//%20px%0Aconst%20distanceHide%20%3D%2064%3B%09//%20px%0Aconst%20vtWidthCorrection%20%3D%20-1%3B%09//%20px%20%28%20number%20%5B%20+%20or%20-%20%5D%20%29%0A%0Aconst%20toolbarId%20%3D%20%22vertical_toolbar%22%3B%0Aconst%20toolboxId%20%3D%20toolbarId%20+%20%22_toolbox%22%3B%0Aconst%20sep%20%3D%20%22%5Cu00A0%22%3B%0Aconst%20firstAttributes%20%3D%20%22%5C%0Aid%20%25id%25%20class%20chromeclass-toolbar%20fullscreentoolbar%20true%20context%20toolbar-context-menu%20_width%2020%20%5C%0Acustomizable%20true%20flex%201%20iconize%20large%20mode%20icons%20orient%20vertical%20widthcorr%200%22%0A.replace%28/%20/g%2C%20sep%29.replace%28/%25id%25/%2C%20toolbarId%29%3B%0A%0A//%20....................................................................................................%0A%0Aconst%20pn%20%3D%20%22custombutton.verticaltoolbar.attributes%22%3B%0Avar%20prefs%20%3D%20Application.prefs%3B%0Aif%20%28%21prefs.has%28pn%29%29%20prefs.setValue%28pn%2C%20firstAttributes%29%3B%0Avar%20pref%20%3D%20prefs.get%28pn%29%3B%0Afunction%20getAttr_pref%28%29%20%7B%0A%09return%20pref.value%0A%7D%0Afunction%20setAttr_pref%28%29%20%7B%0A%09pref.value%20%3D%20%22%22%3B%0A%09Array.slice%28document.getElementById%28toolbarId%29.attributes%29.forEach%28function%28attr%29%20%7B%0A%09%09pref.value%20+%3D%20%28attr.name%20+%20sep%20+%20attr.value%20+%20sep%29%3B%0A%09%7D%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Avar%20browser%20%3D%20document.getElementById%28%22browser%22%29%3B%0Avar%20toolbar%20%3D%20document.getElementById%28toolbarId%29%3B%0Avar%20toolbox%20%3D%20document.getElementById%28toolboxId%29%3B%0A%0Aif%20%28%21toolbar%29%20%7B%0A%0A%09toolbox%20%3D%20document.createElement%28%22toolbox%22%29%3B%0A%09toolbox.id%20%3D%20toolboxId%3B%0A%09toolbox.palette%20%3D%20gNavToolbox.palette%3B%0A%09%0A%09toolbar%20%3D%20document.createElement%28%22toolbar%22%29%3B%0A%09toolbar.style.minWidth%20%3D%20%2220px%22%3B%0A%09%0A%09browser.insertBefore%28toolbox%2C%20browser.firstChild%29%3B%0A%09toolbox.appendChild%28toolbar%29%3B%0A%0A//%20....................................................................................................%0A//%20Thanks%20-%20http%3A//nanto.asablo.jp/blog/2007/04/22/1459018%0A%0A%09const%20style%20%3D%27%5C%0A%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%7B%5Cn%5C%0A%09%09-moz-appearance%3A%20none%3B%5Cn%5C%0A%09%09border-bottom%3A%200px%20none%3B%5Cn%5C%0A%09%09border-top%3A%200px%20none%3B%5Cn%5C%0A%09%09border-right%3A%201px%20solid%20rgb%28170%2C%20188%2C%20207%29%3B%5Cn%5C%0A%09%09background%3A%20none%20repeat%20scroll%200%25%200%25%20rgb%28207%2C%20219%2C%20236%29%3B%5Cn%5C%0A%09%09-image%3A%20-moz-linear-gradient%28rgba%28255%2C%20255%2C%20255%2C%20.5%29%2C%20rgba%28255%2C%20255%2C%20255%2C%200%29%2027px%29%20%21important%3B%5Cn%5C%0A%7D%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20toolbarseparator%2C%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20%5Bid%5E%3D%22wrapper-separator%22%5D%20%7B%5Cn%5C%0A%09%09-moz-appearance%3A%20none%20%21important%3B%5Cn%5C%0A%09%09margin%3A%200.2em%202px%3B%5Cn%5C%0A%09%09border-bottom%3A%201px%20solid%20ThreeDHighlight%3B%5Cn%5C%0A%09%09border-top%3A%201px%20solid%20ThreeDShadow%3B%5Cn%5C%0A%09%09height%3A%202px%3B%5Cn%5C%0A%09%09border-left%3A%20none%3B%5Cn%5C%0A%09%09border-right%3A%20none%3B%5Cn%5C%0A%7D%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20toolbarspacer%2C%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20%5Bid%5E%3D%22wrapper-spacer%22%5D%20%7B%20height%3A%2015px%3B%20%7D%27%0A%0A%09var%20sspi%20%3D%20document.createProcessingInstruction%28%27xml-stylesheet%27%2C%0A%09%09%20%20%27type%3D%22text/css%22%20href%3D%22data%3Atext/css%2C%27%20+%20encodeURI%28style%29%20+%20%27%22%27%29%3B%0A%09document.insertBefore%28sspi%2C%20document.documentElement%29%3B%0A%0A//%20....................................................................................................%0A%0A%09var%20attr%20%3D%20getAttr_pref%28%29.split%28sep%29%3B%0A%09for%20%28var%20i%3D0%3B%20i%3C%28attr.length-1%29%3B%20i+%3D2%29%20%7B%20toolbar.setAttribute%28attr%5Bi%5D%2C%20attr%5Bi+1%5D%29%3B%20%7D%0A%0A%09var%20currentSet%20%3D%20toolbar.getAttribute%28%22currentset%22%29.split%28%22%2C%22%29%3B%0A%09currentSet.forEach%28function%28id%29%7B%20toolbar.insertItem%28id%29%3B%20%7D%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Avar%20et%20%3D%20gNavToolbox.externalToolbars%3B%0Avar%20already%20%3D%20false%3B%0Afor%20%28var%20i%3D0%3B%20i%3Cet.length%3B%20i++%29%20%7B%20if%20%28et%5Bi%5D%20%3D%3D%20toolbar%29%20%7B%20already%20%3D%20true%3B%20break%20%7D%20%7D%0Aif%20%28%21already%29%20et%5Bet.length%5D%20%3D%20toolbar%3B%0A%0Avar%20delta%20%3D%20toolbar.getAttribute%28%22widthcorr%22%29%20-%20vtWidthCorrection%3B%0Atoolbar.setAttribute%28%22widthcorr%22%2C%20vtWidthCorrection%29%3B%0Aif%20%28delta%29%20toolbar.setAttribute%28%22_width%22%2C%20toolbar.getAttribute%28%22_width%22%29%20-%20delta%29%3B%0A%0Afunction%20lock%28%29%20%7B%0A%0A%09var%20width%20%3D%20toolbar.getAttribute%28%22_width%22%29%3B%0A%09%0A%09toolbox.style.position%20%3D%20toolbar.hasAttribute%28%22autohide%22%29%20%3F%20%22%22%20%3A%20%22fixed%22%3B%0A%09toolbox.style.height%20%3D%0A%09toolbar.style.height%20%3D%20browser.boxObject.height%20+%20%22px%22%3B%0A%0A%09toolbar.style.maxWidth%20%3D%0A%09toolbar.style.minWidth%20%3D%0A%09toolbox.style.maxWidth%20%3D%0A%09toolbox.style.minWidth%20%3D%20width%20*%20%21toolbar.collapsed%20+%20%22px%22%3B%09%0A%7D%0Afunction%20beforeCustomize%28%29%20%7B%0A%0A%09toolbox.removeAttribute%28%22style%22%29%3B%0A%09toolbox.removeAttribute%28%22width%22%29%3B%0A%09toolbar.removeAttribute%28%22style%22%29%3B%0A%09toolbar.style.minWidth%20%3D%20%2220px%22%3B%0A%7D%0Afunction%20customizationChange%28%29%20%7B%0A%09window.setTimeout%28function%28%29%20%7B%0A%09%09toolbar.setAttribute%28%22_width%22%2C%20toolbar.boxObject.width%20+%20vtWidthCorrection%29%3B%0A%09%7D%2C%20640%29%3B%0A%7D%0Afunction%20afterCustomize%28%29%20%7B%0A%0A%09setAttr_pref%28%29%3B%0A%09removeListeners%28%29%3B%0A%09lock%28%29%3B%0A%7D%0Afunction%20collapser%28e%29%20%7B%0A%0A%09var%20distance%20%3D%20e.screenX%20-%20browser.boxObject.screenX%3B%0A%09if%20%28toolbar.waiting%29%20return%3B%0A%0A%09if%20%28%28distance%20%3C%3D%20distanceShow%29%20%26%26%20%28toolbar.collapsed%29%29%20%7B%0A%0A%09%09if%20%28showDelay%20%3C%201%29%20%7B%20toolbar.collapsed%20%3D%20false%3B%20lock%28%29%3B%20return%3B%20%7D%0A%0A%09%09toolbar.waiting%20%3D%20true%3B%0A%09%09window.setTimeout%28function%28%29%20%7B%0A%0A%09%09%09if%20%28distance%20%3E%3D%20distanceShow%29%20%7B%20toolbar.waiting%20%3D%20false%3B%20return%3B%20%7D%0A%09%09%09toolbar.collapsed%20%3D%20false%3B%0A%09%09%09lock%28%29%3B%0A%09%09%09toolbar.waiting%20%3D%20false%3B%0A%0A%09%09%7D%2C%20showDelay%29%3B%0A%09%7D%0A%09if%20%28%28distance%20%3E%3D%20distanceHide%29%20%26%26%20%28%21toolbar.collapsed%29%29%20%7B%0A%09%09toolbar.collapsed%20%3D%20true%3B%0A%09%09lock%28%29%3B%0A%09%7D%0A%7D%0Afunction%20removeListeners%28%29%20%7B%0A%0A%09gNavToolbox.removeEventListener%28%22beforecustomization%22%2C%20beforeCustomize%2C%20false%29%3B%0A%09gNavToolbox.removeEventListener%28%22customizationchange%22%2C%20customizationChange%2C%20false%29%3B%0A%09gNavToolbox.removeEventListener%28%22aftercustomization%22%2C%20afterCustomize%2C%20false%29%3B%0A%7D%0A%0Athis.onclick%20%3D%20function%28e%29%20%7B%20%0A%0A%09if%20%28e.button%29%20return%3B%0A%0A%09var%20autohide%20%3D%20toolbar.hasAttribute%28%22autohide%22%29%3B%0A%09toolbar.collapsed%20%3D%20autohide%3B%0A%0A%09if%20%28%21autohide%29%20%7B%0A%09%09browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09%09toolbar.setAttribute%28%22autohide%22%2C%20%22true%22%29%3B%0A%09%7D%0A%09else%20%7B%0A%09%09browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09%09toolbar.removeAttribute%28%22autohide%22%29%3B%0A%09%7D%0A%09lock%28%29%3B%0A%7D%0A%0Atoolbar.ondblclick%20%3D%20function%28e%29%20%7B%0A%0A%09if%20%28%20e.button%20%7C%7C%20e.target.nodeName%20%3D%3D%20%22toolbarbutton%22%0A%09%20%20%09%20%20%20%20%20%20%7C%7C%20e.target.nodeName%20%3D%3D%20%22toolbaritem%22%20%29%20return%3B%0A%09button.click%28%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Aif%20%28%21toolbar.hasAttribute%28%22autohide%22%29%29%20%7B%0A%09browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%7D%0Aelse%20toolbar.setAttribute%28%22autohide%22%2C%20%22true%22%29%3B%0A%0Alock%28%29%3B%0A%0AgNavToolbox.addEventListener%28%22beforecustomization%22%2C%20beforeCustomize%2C%20false%29%3B%0AgNavToolbox.addEventListener%28%22customizationchange%22%2C%20customizationChange%2C%20false%29%3B%0AgNavToolbox.addEventListener%28%22aftercustomization%22%2C%20afterCustomize%2C%20false%29%3B%0A%0A%0A%0A%0Afunction%20addBackground%28e%29%20%7B%0A%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20var%20toolbar%20%3D%20document.getElementById%28%27vertical_toolbar%27%29%3B%0A%20%20%20%20%20%20var%20win%20%3D%20document.getElementById%28%22main-window%22%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20image%20%3D%20win.style.backgroundImage%3B%0A%20%20%20%20%20%20if%20%28%20image%20%3D%3D%20%27%27%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20toolbar.style.background%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20toolbar.style.background%20%3D%20image%3B%0A%20%20%20%20%20%20toolbar.style.backgroundSize%20%3D%20%27auto%20100%25%27%3B%0A%20%20%20%7D%2C%20500%29%3B%0A%7D%3B%0AaddBackground%28%29%3B%20%0AServices.obs.addObserver%28addBackground%2C%20%22lightweight-theme-styling-update%22%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20Services.obs.removeObserver%28addBackground%2C%20%22lightweight-theme-styling-update%22%29%20%29%3B%20%0A%0A%0A%0A%0Aconst%20MPT%20%3D%20window.MousePosTracker%20%7C%7C%20%7B%20_x%3A%200%2C%20handleEvent%3A%20function%28e%29%20this._x%20%3D%20e.screenX%20%7D%3B%0Afunction%20handlePopup%28e%29%20%7B%0A%0A%20%20%20%20if%20%28toolbar.hasAttribute%28%22autohide%22%29%20%7C%7C%20toolbar.collapsed%20%7C%7C%20e.target.nodeName%20%21%3D%20%22menupopup%22%29%20return%3B%0A%0A%20%20%20%20var%20count%20%3D%20Array.filter%28document.getElementsByTagName%28%22menupopup%22%29%2C%20function%28popup%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28popup.state%20%21%3D%20%22open%22%29%20return%20false%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20node%20%3D%20popup.triggerNode%20%7C%7C%20popup%3B%20node%3B%20node%20%3D%20node.parentNode%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28node%20%3D%3D%20toolbar%29%20return%20true%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%29.length%3B%0A%0A%20%20%20%20if%20%28e.type%20%3D%3D%20%22popupshown%22%20%26%26%20count%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%21MPT._y%20%26%26%20window.addEventListener%28%22mousemove%22%2C%20MPT%2C%20false%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28e.type%20%3D%3D%20%22popuphidden%22%20%26%26%20count%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%21MPT._y%20%26%26%20window.removeEventListener%28%22mousemove%22%2C%20MPT%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20MPT._x%20%3E%20distanceHide%20%26%26%20lock%28toolbar.collapsed%20%3D%20true%29%3B%0A%20%20%20%20%7D%0A%7D%0A%5B%22popupshown%22%2C%20%22popuphidden%22%5D.forEach%28function%28type%29%20addEventListener%28type%2C%20handlePopup%2C%20true%29%29%3B%0A%0Aconst%20topic%20%3D%20custombuttons.cbService.getNotificationPrefix%28window%29%20+%20%22removeButton%22%3B%0Aconst%20obsrv%20%3D%20%7B%20observe%3A%20function%28%29%20handlePopup%28%7B%20type%3A%20%22popuphidden%22%2C%20target%3A%20%7B%20nodeName%3A%20%22menupopup%22%20%7D%20%7D%29%20%7D%3B%0AServices.obs.addObserver%28obsrv%2C%20topic%2C%20false%29%3B%0AaddDestructor%28function%28%29%20Services.obs.removeObserver%28obsrv%2C%20topic%29%29%3B%0A%0A%0A%0Afunction%20fsl%28%29%20FullScreen._isAnimating%20%3F%20lock%28setTimeout%28fsl%2C%2050%29%29%20%3A%20window.setTimeout%28lock%2C%2050%29%3B%0AaddEventListener%28%22fullscreen%22%2C%20function%28%29%20setTimeout%28lock%2C%200%29%20%26%26%20fsl%28%29%2C%20true%29%3B%0A%0A%0A%0Afunction%20n%28id%29%20document.getElementById%28id%29%3B%0Aconst%20page%20%3D%20n%28%22content%22%29%2C%20box%20%3D%20n%28%22sidebar-box%22%29%2C%20sidebar%20%3D%20n%28%22sidebar%22%29%3B%0Avar%20tvtc%2C%20timeout%3B%0A%0Afunction%20listenMO%28node%2C%20listen%29%20%7B%0A%20%20%20%20var%20func%20%3D%20node%20%3D%3D%20box%20%3F%20onBMO%20%3A%20onPMO%3B%0A%20%20%20%20%28listen%20%3F%20addEventListener%20%3A%20removeEventListener%29%0A%20%20%20%20.apply%28this%2C%20%5B%22mouseover%22%2C%20func%2C%20false%2C%20node%5D%29%3B%0A%7D%0Afunction%20onPMO%28%29%20%7B%0A%20%20%20%20listenMO%28page%2C%20false%29%3B%0A%20%20%20%20timeout%20%3D%20setTimeout%28hideSB%2C%20autoCloseDelay%20%29%3B%0A%20%20%20%20listenMO%28box%2C%20true%29%3B%0A%7D%0Afunction%20onBMO%28%29%20%7B%0A%20%20%20%20listenMO%28box%2C%20false%29%3B%0A%20%20%20%20clearTimeout%28timeout%29%3B%0A%20%20%20%20listenMO%28page%2C%20true%29%3B%0A%7D%0Afunction%20hideSB%28%29%20%7B%0A%20%20%20%20listenMO%28box%2C%20false%29%3B%0A%20%20%20%20if%20%28box.hidden%29%20return%3B%0A%20%20%20%20var%20id%20%3D%20box.getAttribute%28%22sidebarcommand%22%29%20%7C%7C%20%22viewBookmarksSidebar%22%3B%0A%20%20%20%20n%28id%29.setAttribute%28%22checked%22%2C%20true%29%3B%0A%20%20%20%20toggleSidebar%28id%29%3B%0A%7D%0Afunction%20onSBL%28%29%20%7B%0A%20%20%20%20var%20time%20%3D%20Date.now%28%29%3B%0A%20%20%20%20listenMO%28page%2C%20false%29%3B%0A%20%20%20%20if%20%28time%20-%20tvtc%20%3C%20800%29%20listenMO%28page%2C%20true%29%3B%0A%7D%0Afunction%20onVTC%28e%29%20%7B%0A%20%20%20%20var%20time%20%3D%20Date.now%28%29%3B%0A%20%20%20%20for%20%28var%20node%20%3D%20e.target%3B%20node%3B%20node%20%3D%20node.parentNode%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28node%20%21%3D%20toolbar%29%20continue%3B%0A%20%20%20%20%20%20%20%20tvtc%20%3D%20time%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%7D%0Afunction%20ael%28add%29%20%7B%0A%20%20%20%20%5B%20%20%20%20%5B%22DOMContentLoaded%22%2C%20onSBL%2C%20false%2C%20sidebar%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22click%22%2C%20onVTC%2C%20false%2C%20window%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22command%22%2C%20onVTC%2C%20false%2C%20window%5D%0A%20%20%20%20%5D.forEach%28function%28args%29%20%7B%0A%20%20%20%20%20%20%20%20%28add%20%3F%20addEventListener%20%3A%20removeEventListener%29.apply%28this%2C%20args%29%3B%0A%20%20%20%20%7D%29%3B%0A%7D%0Aif%20%28%20sideBarAutoClose%20%29%20ael%28true%29%3B%0A%0A%0A%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%09browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09if%20%28%21toolbar.hasAttribute%28%22customizing%22%29%29%20removeListeners%28%29%3B%0A%09if%20%28reason%20%3D%3D%20%22delete%22%29%20pref.reset%28%29%3B%0A%09if%20%28%21getAttr_pref%28%29%29%20return%3B%0A%09setAttr_pref%28%29%3B%0A%09%0A%09ael%28false%29%3B%0A%7D%3B%0A%0A%0A%0Athis.style.cssText%20%3D%20%22opacity%3A%201%20%21important%3B%22%3B%20//%20Css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

02-09-2017 10:26:22

Quartz1t пишет

Также хочу задать вопрос о кнопке VT. Можно ли в ней ограничить размер иконок? Скажем, чтобы иконки были 16 пикс.

Да, можно. В userChrome.css:

Выделить код

Код:

#vertical_toolbar .toolbarbutton-icon { -moz-appearance: none !important; height: 16px !important; width: 16px !important; }
Quartz1t пишет

Помогите найти кнопку. Кнопка регулировала количество загрузки вкладок. Похожа на это дополнение.

Посмотрите здесь Приведённый ниже код почти то же, но учитывает конфликт с расширением Link Status Redux:

LoadTabProgressively

Выделить код

Код:

var allTabMax = 20; // максимальное число табов 
var tabArray = [];  

// Отслеживать открытие, закрытие вкладок и восстановление сессии ..... 
function tabHandler(e) {
   var tab = e.target; 
   var selTabPos = gBrowser.selectedTab._tPos;
   var xbw = XULBrowserWindow.statusTextField.label.split(' ')
      [(XULBrowserWindow.statusTextField.label.split(' ').length>1)+0];
   
   // прятать и закрывать лишние вкладки, сохранить их адреса в массив 
   if ( e.type !== "TabClose" && gBrowser.tabs.length > allTabMax ) {
        tabArray.push( (e.type == 'TabOpen') ? 
        (tab.label == "Новая вкладка") ? xbw : tab.label : 
        tab.linkedBrowser.contentDocument.location );
        tab.style.display = 'none';
        setTimeout(function() { gBrowser.removeTab( tab ); }, 150);     
    
    // открывать сохранение адреса и удалять их из массива     
    if ( e.type == "TabClose" && gBrowser.tabs.length < allTabMax && tabArray.length > 0 ) {
         gBrowser.loadOneTab( (tabArray.shift()).trim(), null, null, null, true, false);   }
};
var container = gBrowser.tabContainer;
addEventListener("TabOpen", tabHandler, true, container );
addEventListener("TabClose", tabHandler, false, container );
addEventListener("SSTabRestoring", tabHandler, false, container );


Сейчас я её не использую и не проверял - работает ли она на новейших версиях [firefox]
Это код bunda1, oн не требует отдельной кнопки. Можно добавить в существующую.

bunda1 пишет

А ты менял тему или обои?

Я кнопку установил впервые.Заметил ошибку в консоли,поэтому сообщил сюда.
Сейчас ошибки нет.
Спасибо!

difabor пишет

Посмотрите здесь Приведённый ниже код почти то же, но учитывает конфликт с расширением Link Status Redux:

Похожее, но не то, и на РМ не работает.

Нашёл.

не работатет кнопка Tab History, (брал там)
позволяла новой вкладке наследовать историю родительской вкладки,

Инициализация

Выделить код

Код:

var TU_hookCode = TU_hookMethod;
function TU_hookMethod(aStr) {
  try {
    var namespaces = aStr.split(".");

    try {
      var object = this;
      while (namespaces.length > 1) {
        object = object[namespaces.shift()];
      }
    }
    catch (e) {
      throw TypeError(aStr + " is not a function");
    }

    var method = namespaces.pop();
    if (typeof object[method] != "function")
      throw TypeError(aStr + " is not a function");

    return object[method] = TU_hookFunc.apply(this, Array.concat(object[method], Array.slice(arguments, 1)));
  }
  catch (e) {
    Components.utils.reportError("Failed to hook " + aStr + ": " + e.message);
  }
}
function TU_hookFunc(aFunc) {
  var myCode = aFunc.toString();
  for (var i = 1; i < arguments.length;) {
    if (arguments[i].constructor.name == "Array") {
      var [orgCode, newCode, flags] = arguments[i++];
    }
    else {
      var [orgCode, newCode, flags] = [arguments[i++], arguments[i++], arguments[i++]];
    }

    if (typeof newCode == "function" && newCode.length == 0)
      newCode = newCode.toString().replace(/^.*{|}$/g, "");

    switch (orgCode) {
      case "{": [orgCode, newCode] = [/{/, "$&\n" + newCode];break;
      case "}": [orgCode, newCode] = [/}$/, newCode + "\n$&"];break;
    }

    if (typeof orgCode == "string")
      orgCode = RegExp(orgCode.replace(/[{[(\\^|$.?*+/)\]}]/g, "\\$&"), flags || "");

    myCode = myCode.replace(orgCode, newCode);
  }

  return eval("(" + myCode + ")");
}

  TU_hookCode("gBrowser.loadOneTab",
    ["{", function() {
      var currentTab = this.mCurrentTab;
    }],
    [/(?=return tab;)/, function() {
      if (aReferrerURI/* && TU_getPref("extensions.tabutils.openLinkWithHistory", false)*/) {
        let currentHistory = currentTab.linkedBrowser.sessionHistory;
        let newHistory = tab.linkedBrowser.sessionHistory.QueryInterface(Ci.nsISHistoryInternal);
        for (let i = 0; i <= currentHistory.index; i++) {
          newHistory.addEntry(currentHistory.getEntryAtIndex(i, false), true);
        }
      }
    }]
  );


посмотрите пожалуйста, можно поправить?

опять не работает кнопка вставки спецсимволов
код взят Insert special symbol(Firefox) All the versions
раньше всё работало ,не могу понять в чём проблема:angry:
пробовал с версией CB из магазина (вообще кнопки не работают)
скачал с sourceforge.net custom_buttons-0.0.5.8.9-fixed4-signed.xpi.zip
удалил старую версию CB и саму кнопку ,поставил новую = другие кнопки заработали ,а эта не работает:blush:
пробовал отключать все дополнения стили и темы (оставил только CB)

Firefox 52.3.0 (64бити)ESR Linux

Спасибо за отличную кнопку: https://forum.mozilla-russia.org/viewtopic.php?pid=708281#p708281
С помощью этой кнопки создаю различные кнопки запусков .CMD файлов.

Можно добавить сюда?:

2di1103.png

cmd и bat

и еще, на данный момент иконку невозможно назначить, если запуск указан  cmd и bat файла.
Иконка не отображается, а если зайти в редактирование панелей  - видно назначенную иконку.

Спасибо!

делюсь способом быстрого бэкапа firefox, возможно, кому-то пригодится)

Backup Firefox.cmd - кладем в корень портативного Ferefox.

скрытый текст
https://pastebin.com/dWNfn3Gg

Запускаем Backup Firefox.cmd \ в папке Backup Firefox создается архивная копия.
Я запускаю кнопкой в firefox - быстро и удобно. Рекомендую)

2wod2fk.png

Нужен 7-Zip

SOTVM пишет

опять не работает кнопка вставки спецсимволов
код взят Insert special symbol(Firefox) All the versions
раньше всё работало ,не могу понять в чём проблема:angry:
пробовал с версией CB из магазина (вообще кнопки не работают)
скачал с sourceforge.net custom_buttons-0.0.5.8.9-fixed4-signed.xpi.zip
удалил старую версию CB и саму кнопку ,поставил новую = другие кнопки заработали ,а эта не работает:blush:
пробовал отключать все дополнения стили и темы (оставил только CB)

Firefox 52.3.0 (64бити)ESR Linux

А что именно не работает?
У меня на Windows работает. Правда, у меня она слегка модифицирована...

difabor пишет

А что именно не работает?
У меня на Windows работает. Правда, у меня она слегка модифицирована...

уже починил :lol: пол дня "парился"
когда вставлял свои символы в код,затёр случайно пару символов в самом конце строки ";
нашёл методом сравнения  двух файлов/кода  по содержанию (в linux программа Meld

Прошу поправить кнопку Save( Firefox 24 + ) от 07.03.2017 для работы в Pale Moon 27.
Не работют пункты меню "Сохранить выделенную область страницы как PNG-изображение,
Сохранить выбранный элемент страницы как PNG-изображение,
Сохранить видимую область страницы как PNG-изображение,
Сохранить всю страницу как  PNG-изображение".
В Консоле ошибок запись
Метка времени: 22.09.2017 14:11:25
Ошибка: NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments [nsIWebBrowserPersist.saveURI]
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button36@init line 1 > Function
Строка: 75

rgdru пишет

Not enough arguments

Выделить код

Код:

//parseInt(Services.appinfo.version) < 36
      wbp.saveURI.length < 8

Dumby
Спасибо! Сейчас все нормально.

Можно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?

difabor пишет

Можно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?

Кажется Dumby что то такое делал с VT. Может посмотри в его комментариях год или два назад.

bunda1 пишет
difabor пишет

Можно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?

Кажется Dumby что то такое делал с VT. Может посмотри в его комментариях год или два назад.

Спасибо.
Я комментарии Dumby не нашёл, но сумел полуклонировать его  VT, чтобы получился второй  VT, рядом с первым так, чтобы они выскакивали оба сразу и была возможность посадить на них в два раза больше иконок.
Изменения должны быть минимальными:
1. Надо изменить id: в оригинале: id: "cb-vt" -> я изменил на id: "cb-vt2". Менять надо это ещё в одном месте (почти в конце кода): var toolbar = document.getElementById('cb-vt'); -> var toolbar = document.getElementById('cb-vt2');
2. Надо изменить имя: name: "VT" -> name: "VT2" - это тоже в самом начале. Если это не изменить, катастрофы не произойдёт, но будет некрасиво - будут присутствовать два тулбара с одним и тем же именем. А вот id надо менять обязательно!
3. Надо изменить в стиле (это ближе к концу кода, ищите 'style: "-moz-appearance" и в этой строке добавить: left: 33px; после position: fixed; Примечание: 33рх - у меня, я немного сузил сам тулбар, вы должны подобрать для себя своё значение.
Сделайте сначала больше, скажем, >40рх. Между тулбарами при выскакивании будет щёлочка, оценив её величину -> уменьшите выбранное вами значение до приемлемого, чтобы щёлочка исчезла, но тулбары не налазили друг на друга.
4. Увеличьте distanceHide: (это в начале кода) на эту величину, чтобы второй тулбар прятался не вместе с первым.
----------------------------------------------------------------------------------------------------------------------
При перетаскивании иконок на второй тулбар, первый должен быть закрыт, и наоборот, если перетаскиваете иконку на первый тулбар. Открыт должен быть только тот верт. тулбар, на который вы собираетесь иконку перетащить
Если вы собираетесь перетащить иконку с одного тулбара на другой, используйте для этого промежуточный тулбар: сначала перетащите на него, выйдите из режима перетаскивания, закройте тот верт.тулбар, с которого перетаскивали и откройте тот, куда будете перетаскивать. Затем снова включите режим перетаскивания и перетащите с промежуточного тулбара на вертикальный.
----------------------------------------------------------------------------------------------------------------------
В принципе можно создать сколько угодно VT, а вне VT оставить только иконки-информеры, несущие какую-то информацию (часы, расход памяти и т.д., а также иконки самих VT)

difabor
Была кнопка VT2, панели появлялись и справа и слева, но она перестала работать в новых версиях, может удастся исправить.

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

Выделить код

Код:

const leftVT = true;
const optLeftVT = {
    showDelay: 0,
    distanceShow: 10,
    distanceHide: 100,    // relative ∏↔
    widthCorrection: 7,
    animateTime: 0
};

const rightVT = true;
const optRightVT = {
    showDelay: 0,
    distanceShow: 1,
    distanceHide: 50,    // relative ↔∏
    widthCorrection: 7,
    animateTime: 0
};
this.tooltipText = "L:   toggle left VT\nM:  toggle background image\nR:   toggle right VT";

const sep = "\u00A0";
const firstAttributes = "\
class chromeclass-toolbar fullscreentoolbar true context toolbar-context-menu pwidth 20 \
customizable true flex 1 iconize large mode icons orient vertical bgimage true".replace(/ /g, sep);

const pn = "custombutton.VT2.", pnl = pn + "left", pnr = pn + "right";
const prefs = Application.prefs;
if (!prefs.has(pnl)) prefs.setValue(pnl, firstAttributes);
if (!prefs.has(pnr)) prefs.setValue(pnr, firstAttributes);
const vtlPref = prefs.get(pnl), vtrPref = prefs.get(pnr);

function setAttrs(vt) {
    vt.textContent = "";
    var attrs = (vt == vtl ? vtlPref : vtrPref).value.split(sep);
    for (var i = 0, l = attrs.length - 1; i < l; i += 2)
        vt.setAttribute(attrs[i], attrs[i + 1]);
    var currentSet = vt.getAttribute("currentset").split(",");
    currentSet.forEach(function(id) vt.insertItem(id));
}
function saveAttrs(vt) {
    var pref = vt == vtl ? vtlPref : vtrPref;
    if (!pref.value) return;
    pref.value = "";
    Array.slice(vt.attributes).forEach(function(attr) {
        if (attr.name != "width" && attr.name != "height")
            pref.value += attr.name + sep + attr.value + sep;
    });
}
const idp = "cb-vt";
function n(id) document.getElementById(id);

var vtl = n(idp + "-left"), vtlBox = n(idp + "-left-box");
var vtr = n(idp + "-right"), vtrBox = n(idp + "-right-box");
const browser = n("browser");

function createVT(left) {
    var side = left ? "-left" : "-right"

    var toolbox = document.createElement("toolbox");
    toolbox.id = idp + side + "-box";
    toolbox.palette = gNavToolbox.palette;

    var toolbar = document.createElement("toolbar");
    toolbar.id = idp + side;

    if (left) {
        vtlBox = browser.insertBefore(toolbox, browser.firstChild);
        vtl = toolbox.appendChild(toolbar);
    } else {
        vtrBox = browser.appendChild(toolbox);
        vtr = toolbox.appendChild(toolbar);
    }
    setAttrs(toolbar);
    gNavToolbox.externalToolbars.push(toolbar);
}
function removeButtons(vt) {
    Array.slice(vt.children).forEach(function(node) {
        var nn = node.nodeName;
        if (nn == "toolbarbutton" || nn == "toolbaritem")
            gNavToolbox.palette.appendChild(node);
    });
}
function removeVT(vt) {
    removeButtons(vt);
    gNavToolbox.externalToolbars.forEach(function(et, i, ets) {
        if (et == vt) ets.splice(i, 1);
    });
    browser.removeChild(vt.parentNode);
    if (vt == vtl) vtl = null;
    if (vt == vtr) vtr = null;
}
function forEachVT(func) {
    var toolbars = [];
    if (vtl) toolbars.push(vtl);
    if (vtr) toolbars.push(vtr);
    toolbars.forEach(func);
}
function forEachBtn(func, arg) {
    var btns = [];
    var en = Services.ww.getWindowEnumerator();
    while(en.hasMoreElements()) {
        var win = en.getNext();
        var btn = win.document.getElementById(self.id);
        if (btn) btns.push(btn);
    }
    btns.forEach(function(btn) {
        btn[func.name].call(this, arg);
    });
}
function widthCorr(vt)
    vt.setAttribute("width", parseInt(vt.getAttribute("pwidth")) + vt.opt.widthCorrection);

if (leftVT && !vtl) createVT(true);
if (!leftVT && vtl) removeVT(vtl);

if (rightVT && !vtr) createVT(false);
if (!rightVT && vtr) removeVT(vtr);

forEachVT(function(vt) {
    vt.opt = vt == vtl ? optLeftVT : optRightVT;
    widthCorr(vt);
});
function setHeight(box) {
    box.style.height =
    box.firstChild.style.height = 
    browser.boxObject.height + "px";
}
function onMousemove(e) {

    var distanceLeft = e.screenX - browser.boxObject.screenX;
    var distanceRight = browser.boxObject.width - distanceLeft;

    if (vtl) {
        vtlBox.show = distanceLeft <= vtl.opt.distanceShow;
        vtlBox.hide = distanceLeft > vtl.opt.distanceHide + vtlBox.boxObject.width;
        vt(vtlBox);
    }
    if (vtr) {
        vtrBox.show = distanceRight <= vtr.opt.distanceShow;
        vtrBox.hide = distanceRight > vtr.opt.distanceHide + vtrBox.boxObject.width;
        vt(vtrBox);
    }
    function vt(box) {
        var vt = box.firstChild;
        if (box.show) {
            if (box.waiting) return;
            box.waiting = true;
            setTimeout(function() {
                box.waiting = false;
                if (box.hide) return;
                box.setAttribute("show", true);
                setHeight(box);
            }, vt.opt.showDelay);
        }
        if (box.hide) {
            var st = "-" + vt.boxObject.width + "px";
            box.style[box == vtlBox ? "left" : "right"] = st;
            box.removeAttribute("show");
            setHeight(box);
        }
    }
}
function mm()
    onMousemove({ screenX: browser.boxObject.screenX + browser.boxObject.width / 2 });
mm();

function onBeforecustomization() {
    forEachVT(function(vt) {
        var st = vt.parentNode.style;
        st[vt == vtl ? "left" : "right"] = 0;
        st.position = "static";
        vt.removeAttribute("width");
    });
}
addEventListener("beforecustomization", onBeforecustomization, false, gNavToolbox);

function toggleAutohide(e) {
    var ahBefore, ahAfter;
    forEachVT(function(vt) {
        if (vt.hasAttribute("autohide")) ahBefore = true;
        if (e && !e.button && vt == vtr) return;
        if (e && e.button == 2 && vt == vtl) return;

        var box = vt.parentNode;
        if (vt.hasAttribute("autohide")) {
            vt.removeAttribute("autohide");
            box.style.position = "static";
        } else {
            vt.setAttribute("autohide", true);
            box.style.position = "fixed";
        }
        saveAttrs(vt);
    });
    forEachVT(function(vt) { if (vt.hasAttribute("autohide")) ahAfter = true; });
    var func;
    if (ahBefore && !ahAfter) func = removeEventListener;
    if ((!ahBefore || !e) && ahAfter) func = addEventListener;
    if (func) func("mousemove", onMousemove, false, browser);
}
toggleAutohide({ button: -1 }), toggleAutohide();

this.onclick = function(e) {
    if (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) return;
    if (e.button == 1) {
        forEachBtn(toggleBackgroundImage, true);
        return;
    }
    if (vtr) e.preventDefault();
    forEachBtn(toggleAutohide, e);
};
forEachVT(function(vt) {
    vt.ondblclick = function(e) {
        var nn = e.target.nodeName;
        if (    (["toolbar", "toolbarspring", "toolbarspacer", "toolbarseparator"].indexOf(nn) > -1)
            && !e.button && (e.target.parentNode == this || e.target == this)
        ) {
            forEachBtn(toggleAutohide, { button: this == vtl ? 0 : 2 })
            mm();
        }
    }
});
[setAttrs, removeButtons, forEachVT, widthCorr, toggleAutohide, toggleBackgroundImage]
    .forEach(function(f) self[f.name] = f);
var upd;
forEachVT(function(vt) {
    if (vt.upd) {
        upd = true;
        delete vt.upd;
    }
});
if (upd) {
    var en = Services.ww.getWindowEnumerator();
    while(en.hasMoreElements()) {
        var win = en.getNext();
        var btn = win.document.getElementById(this.id);
        if (!btn || win == window) continue;
        btn.forEachVT(function(vt) {
            btn.removeButtons(vt);
            btn.setAttrs(vt);
            btn.widthCorr(vt);
            btn.toggleBackgroundImage(false);
        });
    }
}
const cssStr = '\
\
    toolbar[id^="%idp%"] {\n\
        -moz-appearance: none;\n\
        border-bottom: 0;\n\
        border-top: 0;\n\
    }\n\
    toolbar[id^="%idp%"] > toolbarseparator,\n\
    toolbar[id^="%idp%"] > [id^="wrapper-separator"] {\n\
        -moz-appearance: none;\n\
        margin: 0.2em 2px;\n\
        border-bottom: 1px solid ThreeDHighlight;\n\
        border-top: 1px solid ThreeDShadow;\n\
        height: 2px;\n\
        border-left: none;\n\
        border-right: none;\n\
    }\n\
    toolbar[id^="%idp%"] > toolbarspacer,\n\
    toolbar[id^="%idp%"] > [id^="wrapper-spacer"] {\n\
        height: 15px;\n\
    }\n\
    toolbox[id^="%idp%"] {\n\
        -moz-appearance: none; border-top: 0;\n\
    }\n\
\n\
    #%idp%-left-box[show] {\n\
        left: 0;\n\
    }\n\
    #%idp%-left-box {\n\
        -moz-transition: left %lefttime%s ease;\n\
    }\n\
    #%idp%-right-box[show] {\n\
        right: 0;\n\
    }\n\
    #%idp%-right-box {\n\
        -moz-transition: right %righttime%s ease;\n\
    }\n\
\n\
    toolbar[id^="%idp%"][customizing] {\n\
        min-width: 20px;\n\
    }\n\
    toolbar[id^="%idp%"] toolbarpaletteitem {\n\
        margin-top: -2px;\n\
        margin-bottom: -2px;\n\
        border-top: 2px solid transparent;\n\
        border-bottom: 2px solid transparent;\n\
        border-left-color: transparent;\n\
        border-right-color: transparent;\n\
    }\n\
    toolbar[id^="%idp%"] toolbarpaletteitem[dragover="left"] {\n\
        border-top-color: black;\n\
    }\n\
    toolbar[id^="%idp%"] toolbarpaletteitem[dragover="right"] {\n\
        border-bottom-color: black;\n\
    }\
'
    .replace(/;/g, " !important;")
    .replace(/%idp%/g, idp)
    .replace("%lefttime%", optLeftVT.animateTime)
    .replace("%righttime%", optRightVT.animateTime);

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
const cssURI = makeURI("data:text/css," + encodeURIComponent(cssStr), null, null);
if (!sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);

function setBackground(backgroundColor, borderColor) {
    forEachVT(function(vt) {
        vt.style.backgroundColor = backgroundColor;
        var side = vt == vtl ? "Right" : "Left";
        vt.style["border" + side] = "1px solid " + borderColor;
        toggleBackgroundImage(false);
    });
}
function onLWT() {
    setTimeout(function() {
        
        var win = n("main-window");
        var backgroundImage = window.getComputedStyle(win).backgroundImage;

        if (backgroundImage == "none") {
            var backgroundColor = window.getComputedStyle(win).backgroundColor;
            var borderColors = backgroundColor.match(/\d+/g).map(function(color) Math.round(color / 1.5));
            var borderColor = "rgb(" + borderColors.join(", ") + ")";
            setBackground(backgroundColor, borderColor);
            return;
        }
        var url = backgroundImage.replace('url("', "").replace('")', "");

        var img = document.createElementNS(xhtmlns, "img");
        var canvas = document.createElementNS(xhtmlns, "canvas");
        img.src = url;
        img.onload = function() {

            var width = canvas.width = img.width;
            var height = canvas.height = img.height;
            var context = canvas.getContext("2d");
            context.drawImage(img, 0, 0);
            var arr = context.getImageData(0, 0, width, height).data;

            var r = 0, g = 0, b = 0;
            var len = arr.length;
            for (var i = 0; i < len; i += 4) {
                r += arr[i];
                g += arr[i + 1];
                b += arr[i + 2];
            }
            var colors = [r, g, b];
            var backgroundColors = colors.map(function(color) Math.round(4 * color / len));
            var borderColors = backgroundColors.map(function(color) Math.round(color / 1.5));
            
            var backgroundColor = "rgb(" + backgroundColors.join(", ") + ")";
            var borderColor = "rgb(" + borderColors.join(", ") + ")";
            setBackground(backgroundColor, borderColor);
        }
    }, 200);
}
onLWT();
function toggleBackgroundImage(toggle) {
    forEachVT(function(vt) {
        var st = vt.style;
        if (vt.hasAttribute("bgimage") - !toggle) {
            vt.removeAttribute("bgimage");
            st.backgroundImage = "";
        } else {
            vt.setAttribute("bgimage", true);
            st.backgroundImage = n("main-window").style.backgroundImage;
        }
        saveAttrs(vt);
    });
}
toggleBackgroundImage(false);

const observer = { observe: onLWT };
const topic = "lightweight-theme-styling-update";
Services.obs.addObserver(observer, topic, false);

this.onDestroy = function(reason) {
    try { Services.obs.removeObserver(observer, topic) } catch(ex) {}
    if (reason == "update" || reason == "delete") {
        if (sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.unregisterSheet(cssURI, sss.USER_SHEET);
    }
    if (reason == "constructor") {
        forEachVT(function(vt) {
            vt.removeAttribute("width");
            vt.setAttribute("pwidth", Math.max(vt.boxObject.width, 20));
            saveAttrs(vt);
            vt.upd = true;
        });
    }
    if (reason == "delete") {
        forEachVT(function(vt) removeVT(vt));
        if (custombuttons.confirmBox("VT2", "Reset prefs ?", "Yes", "No")) {
            vtlPref.reset(); vtrPref.reset();
        }
    }
};

villa7 пишет

difabor
Была кнопка VT2, панели появлялись и справа и слева, но она перестала работать в новых версиях, может удастся исправить.

Вы знаете, villa7, а ведь иметь два вертикальных тулбара рядом имхо даже удобнее...
Не надо думать - какие кнопки слева, какие справа. Выскакивают они вместе - создаётся впечатление одного широкого...
Я, конечно, подумаю как сделать открытие справа (для спортивного интереса), но так даже лучше.
Я бы вообще подумал бы над тем, как размешать в одну строку несколько кнопок на широком VT.
Тогда кнопки можно было бы группировать по 2-3 в один ряд - была бы лучшая организация кнопок - каждый ряд имел бы некое семантическое значение.
Но это мне пока не по зубам... :(

bunda1
Кнопка Autocopy+3 не работает на SM 2.53. Возможно решить эту проблему?

Господа здравствуйте, есть такая кнопка SONCO Timer можно сделать чтоб она отображала кириллицу? Спасибо.

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

Выделить код

Код:

'use strict';

var {classes: Cc, interfaces: Ci, utils: Cu} = Components,
    helpCSS = encodeURIComponent(this.Help);
    
Cu.import("resource://gre/modules/Timer.jsm");
    
const sound = Cc['@mozilla.org/sound;1'].getService(Ci.nsISound),
      aFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile),
      as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService),
      ios = Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService),
      sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService),
      wm = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getMostRecentWindow;

pref.root = 'extensions.custombuttons.soncoTimer' + this.id.match(/\d+/) + '.';
pref.defaults = {
  alertCancel: 'Do you wish to cancel the alert?',
  alertEmpty: 'Alert message',
  alertHour: 0,
  alertIcon: 'https://raw.githubusercontent.com/srazzano/Images/master/Aalarm.gif',
  alertLabel: 'Change Alert Icon',
  alertTerminatedIcon: 'https://raw.githubusercontent.com/srazzano/Images/master/Aclock1-48.png',
  alertMinute: 0,
  alertNo: 'No',
  alertSecond: 0,
  alertTerminated: 'Alert Terminated',
  alertTitle: 'Alert Notification',
  alertYes: 'Yes',
  am: 'AM',
  audio: true,
  audioFile: 'Sound',
  audioLabel: 'Play Sound File',
  cancel: 'Cancel',
  clear: 'Clear Message Field',
  close: 'Close',
  countdown: 0,
  editPreset: 'Edit Presets',
  getFile: 'Get Sound File',
  getIcon: 'Change Toolbarbutton Icon',
  hours: 12,
  hour12Label: '12hr',
  hour24Label: '24hr',
  hrLabel: 'Hrs',
  image: 'https://raw.githubusercontent.com/srazzano/Images/master/Aclock1-16.png',
  imageLabel: 'Change Button Icon',
  message: '',
  messageLabel: 'Message:',
  minLabel: 'Min',
  pm: 'PM',
  posAlertLeft: 200,
  posAlertTop: 200,
  posEditLeft: 200,
  posEditTop: 200,
  posTimerLeft: 200,
  posTimerTop: 200,
  preset1: 'Preset Message 1',
  preset2: 'Preset Message 2',
  preset3: 'Preset Message 3',
  preset4: 'Preset Message 4',
  preset5: 'Preset Message 5',
  presetLabel1: 'Preset 1',
  presetLabel2: 'Preset 2',
  presetLabel3: 'Preset 3',
  presetLabel4: 'Preset 4',
  presetLabel5: 'Preset 5',
  reset1: 'Clear Hrs Field',
  reset2: 'Clear Min Field',
  reset3: 'Clear Sec Field',
  repeat: 'Repeat',
  secLabel: 'Sec',
  showTime: true,
  showTimeLabel: 'Show Current Time',
  soundFile: 'C:\\Windows\\Media\\notify.wav',
  soundFileLabel: 'Sound File',
  startTimer: 'Start Timer',
  timer: 'Duration:',
  timerNotSet: 'Timer not set',
  timerTitle: 'Timer Notification',
  timerWarning: 'https://raw.githubusercontent.com/srazzano/Images/master/Aalarm2-64.png',
  timestart: '',
  tt1: 'Left-click to set timer',
  tt2: 'Middle-click to terminate the timer',
  tt3: 'Hover to view remainig time when active',
  tt4: 'SONCO Timer remaining time',
  urlbar: false,
  urlbarLabel: 'In Urlbar'
}

for (let key in pref.defaults) {
  if (pref.defaults.hasOwnProperty(key)) {
    let val = pref.defaults[key];
    switch (typeof val) {
      case 'boolean':
        Services.prefs.getDefaultBranch(pref.root).setBoolPref(key, val);
        break;
      case 'number':
        Services.prefs.getDefaultBranch(pref.root).setIntPref(key, val);
        break;
      case 'string':
        let str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString);
        str.data = val;
        Services.prefs.getDefaultBranch(pref.root).setComplexValue((key), Ci.nsISupportsString, str);
        break;
} } }

pref.observe = function(prefs, callback) {
  let {root} = pref;
  function observe(subject, topic, data) {
    if (topic !== 'nsPref:changed') return;
    let pref = data.slice(root.length);
    if (prefs.indexOf(pref) === -1) return;
    callback(pref);
  }
  Services.prefs.addObserver(root, observe, false);
  unload => Services.prefs.removeObserver(root, observe);
}

var gRoot = Services.prefs.getBranch(pref.root),
    alertTimer = 0, dialog, curTime, remTime;

function pref(key) {
  let {branch, defaults} = pref;
  if (branch == null) branch = Services.prefs.getBranch(pref.root);
  switch (typeof defaults[key]) {
    case 'boolean': return branch.getBoolPref(key);
    case 'number': return branch.getIntPref(key);
    case 'string': return branch.getCharPref(key);
  }
  return null;
}

function getSS(filepath) { return ios.newURI('data:text/css,' + filepath, null, null) }

function loadSheet(filepath) { sss.loadAndRegisterSheet(getSS(filepath), sss.AGENT_SHEET) }

function unloadSheet(filepath) {
  let uri = getSS(filepath);
  if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) sss.unregisterSheet(uri, sss.AGENT_SHEET);
}

function getCurrentTime() {
  if (pref('showTime')) {
    var today = new Date(),
        h = today.getHours(),
        m = today.getMinutes(),
        s = today.getSeconds(),
        ampm = '';
    m = checkCurrentTime(m);
    s = checkCurrentTime(s);
    if (pref('hours') === 12) {
      ampm = (h < 12) ? pref('am') : pref('pm');
      if (h > 12) {h = h - 12;}
      if (h === 0) {h = 12;}
    }
    if (wm('sonco:timer')) var mrw = wm('sonco:timer');
    else var mrw = wm('sonco:alert');
    mrw.document.getElementById('time').value = h + ':' + m + ':' + s + ' ' + ampm;
} }

function checkCurrentTime(i) {
  if (i < 10) {i = '0' + i};
  return i;
}

function formatTimeDuration(millisec) {
  var seconds = (millisec / 1000).toFixed(0),
      minutes = Math.floor(seconds / 60),
      hours = '';
  if (minutes > 59) {
    hours = Math.floor(minutes / 60);
    minutes = minutes - (hours * 60);
  }
  minutes = (minutes >= 10) ? minutes : '0' + minutes;
  seconds = Math.floor(seconds % 60);
  seconds = (seconds >= 10) ? seconds : '0' + seconds;
  if (hours != '') return hours + ':' + minutes + ':' + seconds;
  return '0:' + minutes + ':' + seconds;
}

function remainingTime() {
  if (pref('countdown')) {
    var val = Date.now() - pref('timestart'),
        diff = getTimerDuration() - parseInt(val),
        mrw = wm('sonco:timer'),
        mrd = wm('navigator:browser');
    mrd.document.getElementById('sonco-time-remaining').value = formatTimeDuration(diff);
    mrw.document.getElementById('remaining').value = formatTimeDuration(diff);
  } else mrw.document.getElementById('remaining').value = '';
}

function getTimerDuration() {
  var a = pref('alertHour'), h = a * 3600000,
      b = pref('alertMinute'), m = b * 60000,
      c = pref('alertSecond'), s = c * 1000;
  return h + m + s;
}

this.image = pref('image');
this.tooltipText = this.label + '\n\u2022 ' + pref('tt1') + '\n\u2022 ' + pref('tt2');

loadSheet(helpCSS);

this.onclick = function(e) {
  if (e.button == 0) {
    if (wm('sonco:timer')) {
      wm('sonco:timer').focus();
      return;
    }
    this.onTimer();
  }
  if (e.button === 1) {
    if (wm('sonco:alert')) wm('sonco:alert').close();
    if (wm('sonco:timer')) wm('sonco:timer').close();
    var el = document.getElementById('sonco-time-remaining'),
        mra = wm('sonco:alert'),
        mrt = wm('sonco:timer');
    if (pref('countdown')) as.showAlertNotification(pref('alertTerminatedIcon'), pref('alertTitle'), pref('alertTerminated'), false, '', null);
    gRoot.setIntPref('countdown', 0);
    gRoot.setCharPref('timestart', '');
    el.parentNode.removeChild(el);
    clearInterval(curTime);
    clearInterval(remTime);
    alertTimer = 0;
} }

this.onAlert = function() {
  if (pref('countdown') === 0) return;
  var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\
    <window xmlns="' + xulns + '" windowtype="sonco:alert" id="soncoAlert" title="' + pref("alertTitle") + '" \
      minwidth="300" onload="self.onAlertLoad(this)" onclose="self.onAlertClose(this)">\
      <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\
      <hbox id="hbox1" class="hbox" align="center">\
        <vbox id="vbox1">\
          <textbox id="time" class="textbox"/>\
          <hbox id="image-container" pack="center">\
            <image id="alertImage" src="' + pref("alertIcon") + '"/>\
          </hbox>\
        </vbox>\
        <textbox id="alertMessage" class="textbox" value="' + pref("message") + '" multiline="true" rows="4" flex="1"/>\
      </hbox>\
      <hbox id="buttonGroup" class="hbox" align="center">\
        <button id="alertIcon" class="button" label="' + pref("alertLabel") + '" oncommand="self.onButton(this)"/>\
        <spacer id="alert-spacer" flex="1"/>\
        <button id="repeat" class="button" label="' + pref("repeat") +'" oncommand="self.onButton(this); close()"/>\
      </hbox>\
    </window>';
  data = data.replace(/self/g, 'opener.document.getElementById(&quot;' + self.id + '&quot;)');
  var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data);
  dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable');
}

this.onAlertLoad = function(e) {
  var mrw = wm('navigator:browser');
  mrw.document.getElementById(self.id).hidden = false;
  e.document.getElementById('time').hidden = !pref('showTime');
  gRoot.setIntPref('countdown', 0);
  gRoot.setCharPref('timestart', '');
  e.moveTo(pref('posAlertLeft'), pref('posAlertTop'));
  wm('sonco:timer').close()
  alertTimer = 0;
  clearInterval(remTime);
  if (pref("showTime")) curTime = setInterval(getCurrentTime, 200);
  else clearInterval(curTime);
  e.removeAttribute('height');
  e.sizeToContent();
}

this.onAlertClose = function(e) {
  gRoot.setIntPref("posAlertLeft", e.screenX);
  gRoot.setIntPref("posAlertTop", e.screenY);
  clearInterval(curTime);
}

this.onButton = function(e) {
  switch (e.id) {
    case 'audioFile':
      var mrw = wm('sonco:timer'),
          fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
      fp.init(window, null, fp.modeOpen);
      fp.appendFilters(fp.filterAudio);
      if (fp.show() != fp.returnCancel) {
        var file = fp.fileURL.spec.replace('file:///', '').replace(/\//g, '\\').replace(/%20/g, ' ');
        gRoot.setCharPref('soundFile', file);
        e.nextSibling.value = file;
      }
      mrw.focus();
      break;
    case 'image': case 'alertIcon':
      if (e.id === 'image') var mrw = wm('sonco:timer');
      else var mrw = wm('sonco:alert');
      var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
      fp.init(window, null, fp.modeOpen);
      fp.appendFilters(fp.filterImages);
      if (fp.show() != fp.returnCancel) {
        var url = fp.fileURL.spec;
        gRoot.setCharPref(e.id, url);
        if (e.id === 'image') {
          e.nextSibling.src = url;
          wm('navigator:browser').document.getElementById(this.id).image = pref('image');
        }
        if (e.id === 'alertIcon') {
          var mrw = wm('sonco:alert');
          mrw.document.getElementById('alertImage').src = pref('alertIcon');
      } }
      mrw.focus();
      break;
    case 'startTimer':
      var mrw = wm('sonco:timer');
      this.onStartTimer();
      mrw.close();
      break;
    case 'repeat':
      this.onStartTimer();
      break;
    case 'preset1': case 'preset2': case 'preset3': case 'preset4': case 'preset5':
      var mrw = wm('sonco:timer');
      mrw.document.getElementById('message').value = pref(e.id);
      gRoot.setCharPref('message', mrw.document.getElementById('message').value);
      break;
    case 'reset1': case 'reset2': case 'reset3':
      var mrw = wm('sonco:timer');
      e.previousSibling.value = '';
      e.previousSibling.select();
      break;
    case 'clear':
      var mrw = wm('sonco:timer');
      mrw.document.getElementById('message').value = '';
      mrw.document.getElementById('message').select();
      gRoot.setCharPref('message', '');
      break;
    case 'editPreset':
      this.onEdit();
      break;
} }

this.onCheckbox = function(e) { 
  gRoot.setBoolPref(e.id, pref(e.id) !== false ? false : true);
  if (e.id === 'url') {
    var mrw = wm('navigator:browser'),
        textbox = mrw.document.getElementById('sonco-time-remaining');
    mrw.document.removeElement(tetbox);
  }
  if (e.id === 'showTime') {
    var mrt = wm('sonco:timer');
    mrt.document.getElementById('time').hidden = !pref('showTime');
    if (pref('showTime'))  curTime = setInterval(getCurrentTime, 200);
    else clearInterval(curTime);
    e.nextSibling.disabled = !pref('showTime');
} }

this.onDestroy = function(reason) {
  if (reason === 'delete') {
    clearInterval(curTime);
    clearInterval(remTime);
    unloadSheet(this.Help);
} }

this.onEdit = function() {
  if (wm('sonco:edit')) {
    wm('sonco:edit').focus();
    return;
  }
  var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\
    <window xmlns="' + xulns + '" windowtype="sonco:edit" id="soncoEdit" title="' + pref("editPreset") + '" \
      minwidth="445" onload="self.onEditLoad(this)" onclose="self.onEditClose(this)" persist="width height screenX screenY">\
      <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\
      <hbox id="hbox1" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel1") + '"/>\
        <textbox id="preset1" class="textbox" value="' + pref("preset1") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox2" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel2") + '"/>\
        <textbox id="preset2" class="textbox" value="' + pref("preset2") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox3" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel3") + '"/>\
        <textbox id="preset3" class="textbox" value="' + pref("preset3") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox4" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel4") + '"/>\
        <textbox id="preset4" class="textbox" value="' + pref("preset4") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox5" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel5") + '"/>\
        <textbox id="preset5" class="textbox" value="' + pref("preset5") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
    </window>';
  data = data.replace(/self/g, 'opener.document.getElementById(&quot;' + self.id + '&quot;)');
  var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data);
  dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable');
  dialog.focus();
}

this.onEditLoad = function(e) { e.moveTo(pref("posEditLeft"), pref("posEditTop")) }

this.onEditClose = function(e) {
  gRoot.setIntPref("posEditLeft", e.screenX);
  gRoot.setIntPref("posEditTop", e.screenY);
  wm('sonco:timer').close();
  this.onTimer();
}

this.onRadio = function(e) { gRoot.setIntPref(e.id, e.value) }

this.onRemaining = function(e) {
  if (e === 0) self.onTimer();
  if (e === 1) {
    var mrw = wm('navigator:browser'),
        mrd = wm('sonco:timer'),
        toolbar = mrw.document.getElementById('sonco-time-remaining');
    as.showAlertNotification(pref('alertTerminatedIcon'), pref('alertTitle'), pref('alertTerminated'), false, '', null);
    toolbar.parentNode.removeChild(toolbar);
    mrw.document.getElementById(self.id).hidden = false;
    gRoot.setIntPref('countdown', 0);
    gRoot.setCharPref('timestart', '');
    mrd.close();
    clearInterval(curTime);
    clearInterval(remTime);
    alertTimer = 0;
} }

this.onRemoveTime = function() {
  var mrw = wm('navigator:browser'),
      mrt = wm('sonco:timer');
  if (pref('urlbar')) var toolbar = mrw.document.getElementById('urlbar');
  else {
    var toolbar = mrw.document.getElementById(this.parentNode.id)
    mrw.document.getElementById(self.id).hidden = false;
  }
  toolbar.removeChild(document.getElementById('sonco-time-remaining'));
  mrt.document.getElementById('remaining').value = '';
}

this.onStartTimer = function() {
  if (!getTimerDuration()) {
    as.showAlertNotification(pref('timerWarning'), pref('timerTitle'), pref('timerNotSet'), false, '', null);
    return;
  }
  var start = new Date(),
      mrw = wm('navigator:browser'),
      tbIcon = mrw.document.getElementById(self.id),
      textbox = mrw.document.createElement('textbox');
  gRoot.setIntPref('countdown', getTimerDuration());
  gRoot.setCharPref('timestart', start.getTime());
  textbox.id = 'sonco-time-remaining';
  textbox.tooltipText = pref('tt4') + '\n\u2022 ' + pref('tt1') + '\n\u2022 ' + pref('tt2');
  textbox.onclick = function(e){self.onRemaining(e.button);}
  if (pref('urlbar')) {
    var toolbar = mrw.document.getElementById('urlbar');
    toolbar.appendChild(textbox);
    tbIcon.hidden = false;
  } else {
    var toolbar = mrw.document.getElementById(self.parentNode.id);
    toolbar.insertBefore(textbox, self.nextSibling);
    tbIcon.hidden = true;
  }
  remTime = setInterval(remainingTime, 200);
  alertTimer = setTimeout(function() {
    if (pref('audio') && pref('soundFile')) {
      var file = pref('soundFile').replace('file:///', '').replace(/\//g, '\\');
      aFile.initWithPath(file);
      sound.play(ios.newFileURI(aFile));
    }
    toolbar.removeChild(textbox);
    self.onAlert();
  }, getTimerDuration());
}

this.onTextbox = function(e) {
  if (e.id.match('alert')) {
    var mrw = wm('navigator:browser');
    e.value = e.value.replace(/[^\d+]/g, '');
    gRoot.setIntPref(e.id, e.value);
    mrw.document.getElementById(self.id).hidden = false;
    gRoot.setIntPref('countdown', 0);
    gRoot.setCharPref('timestart', '');
    alertTimer = 0;
  } else {
    gRoot.setCharPref(e.id, e.value);
    gRoot.setCharPref('message', e.value);
} }

this.onTimer = function() {
  var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\
    <window xmlns="' + xulns + '" windowtype="sonco:timer" id="soncoTimer" title="' + this.label + '" \
      onload="self.onTimerLoad(this)" onclose="self.onTimerClose(this)">\
      <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\
      <hbox id="hbox1" class="hbox" align="center">\
        <label id="timer" class="caption" value="' + pref("timer") + '"/>\
        <textbox id="alertHour" class="integer" value="' + pref("alertHour") + '" oninput="self.onTextbox(this)" \
          onmousedown="self.onRemoveTime()"/>\
        <button id="reset1" class="reset button" label="' + pref("hrLabel") + '" tooltiptext="' + pref("reset1") + '" \
            oncommand="self.onButton(this)"/>\
        <textbox id="alertMinute" class="integer" value="' + pref("alertMinute") + '" oninput="self.onTextbox(this)" \
          onmousedown="self.onRemoveTime()"/>\
        <button id="reset2" class="reset button" label="' + pref("minLabel") + '" tooltiptext="' + pref("reset2") + '" \
            oncommand="self.onButton(this)"/>\
        <textbox id="alertSecond" class="integer" value="' + pref("alertSecond") + '" oninput="self.onTextbox(this)" \
          onmousedown="self.onRemoveTime()"/>\
        <button id="reset3" class="reset button" label="' + pref("secLabel") + '" tooltiptext="' + pref("reset3") + '" \
            oncommand="self.onButton(this)"/>\
        <textbox id="time" class="textbox"/>\
        <textbox id="remaining" class="textbox"/>\
      </hbox>\
      <hbox id="hbox2" class="hbox" align="center">\
          <label id="messageLabel" class="caption" value="' + pref("messageLabel") + '"/>\
          <button id="preset1" class="preset" label="' + pref("presetLabel1") + '" tooltiptext="' + pref("preset1") + '" \
            oncommand="self.onButton(this)"/>\
          <button id="preset2" class="preset" label="' + pref("presetLabel2") + '" tooltiptext="' + pref("preset2") + '" \
            oncommand="self.onButton(this)"/>\
          <button id="preset3" class="preset" label="' + pref("presetLabel3") + '" tooltiptext="' + pref("preset3") + '" \
            oncommand="self.onButton(this)"/>\
          <button id="preset4" class="preset" label="' + pref("presetLabel4") + '" tooltiptext="' + pref("preset4") + '" \
            oncommand="self.onButton(this)"/>\
          <button id="preset5" class="preset" label="' + pref("presetLabel5") + '" tooltiptext="' + pref("preset5") + '" \
            oncommand="self.onButton(this)"/>\
          <spacer id="spacer1" class="spacer" flex="1"/>\
          <button id="clear" class="button" tooltiptext="' + pref("clear") + '" \
            oncommand="self.onButton(this)"/>\
      </hbox>\
      <hbox id="hbox3" class="hbox" align="center">\
        <textbox id="message" class="textbox" value="' + pref("message") + '" oninput="self.onTextbox(this)" \
          multiline="true" rows="1" flex="1" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox4" class="hbox" align="center">\
        <button id="audioFile" class="button" label="' + pref("audioFile") + '" tooltiptext="' + pref("getFile") + '" \
          oncommand="self.onButton(this)"/>\
        <textbox id="soundFile" class="textbox" flex="1" value="' + pref("soundFile") + '" placeholder="' + pref("soundFileLabel") + '"/>\
      </hbox>\
      <hbox id="hbox5" class="hbox" align="center">\
        <checkbox id="urlbar" class="checkbox" label="' + pref("urlbarLabel") + '" checked="' + pref("urlbar") + '" \
          oncommand="self.onCheckbox(this)"/>\
        <checkbox id="audio" class="checkbox" label="' + pref("audioLabel") + '" checked="' + pref("audio") + '" \
          oncommand="self.onCheckbox(this)"/>\
        <checkbox id="showTime" class="checkbox" label="' + pref("showTimeLabel") + '" checked="' + pref("showTime") + '" \
          oncommand="self.onCheckbox(this)"/>\
        <radiogroup id="hours" value="' + pref("hours") + '" orient="horizontal" onclick="self.onRadio(this)">\
          <radio id="hour12" class="radio" label="' + pref("hour12Label") + '" value="12"/>\
          <radio id="hour24" class="radio" label="' + pref("hour24Label") + '" value="24"/>\
        </radiogroup>\
      </hbox>\
      <hbox id="buttonGroup" class="hbox" align="center">\
        <button id="image" class="button" label="' + pref("imageLabel") + '" tooltiptext="' + pref("getIcon") + '" \
          oncommand="self.onButton(this)"/>\
        <image id="imageIcon" src="' + pref("image") + '"/>\
        <spacer id="spacer2" class="spacer" flex="1"/>\
        <button id="editPreset" class="button" label="' + pref("editPreset") + '" oncommand="self.onButton(this)"/>\
        <button id="startTimer" class="button" label="' + pref("startTimer") + '" oncommand="self.onButton(this)"/>\
      </hbox>\
    </window>';
  data = data.replace(/self/g, 'opener.document.getElementById(&quot;' + self.id + '&quot;)');
  var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data);
  dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable');
  dialog.focus();
}

this.onTimerLoad = function(e) {
  e.moveTo(pref("posTimerLeft"), pref("posTimerTop"));
  if (pref('showTime')) curTime = setInterval(getCurrentTime, 200);
  else clearInterval(curTime);
  e.document.getElementById('time').hidden = !pref('showTime');
  e.document.getElementById('hours').disabled = !pref('showTime');
  if (pref('countdown')) {
    remTime = setInterval(remainingTime, 200);
    e.document.getElementById('remaining').style.display = '-moz-box';
  } else {
    clearInterval(remTime);
    e.document.getElementById('remaining').value= '';
    e.document.getElementById('remaining').style.display = 'none';
} }

this.onTimerClose = function(e) {
  gRoot.setIntPref("posTimerLeft", e.screenX);
  gRoot.setIntPref("posTimerTop", e.screenY);
  clearInterval(curTime);
  clearInterval(remTime);
}

// BUTTON ATTRIBUTES
// Name: SONCO Timer
// Author: Sonny Razzano a.k.a. srazzano
// Updated: Oct 15, 2017
// Download: https://sonco.synthasite.com/custom-buttons-%E2%96%BA.php
// Discussion: http://custombuttons.sourceforge.net/forum/viewtopic.php?f=4&t=866

Приветствую ! Ребята подскажите пожалуйста , кнопку/код , которая/й запрещает на сайте сторонние запросы исключая при этом гугл капчу, аналог third-party для adblock. Может есть кнопка замена adblock/ublock0 ?

11-11-2017 20:21:25
Хотелось бы еще узнать, если кнопка аналог расширений https://addons.mozilla.org/ru/firefox/addon/tile-tabs/ и панели закладок https://addons.mozilla.org/ru/firefox/a … serprofile ?

В ESR 52 плохо работает CB Mouse Gestures+

скрытый текст
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECB%20Mouse%20Gestures+%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBAwEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAgEBAwAAAAACAQECAAAAAHdLNaSlZkbqkFY60ZNZO9aSWDrWkVY51o9VONaOVDfWjVI11oxSNdaMUDPWhkww0ZdYOupsQCykAAAAAAIBAQIAAAAAc0k1oNebe//0yrD/+djC/vjWv//418D/+Na///fWv//31r//99W///XTuv/11Lz/9tfA/u3Dqf/Jjm//Zz4qoAAAAAAAAAAAq2tL1vXMsf/w4c327di9++nStfvs1bn77Na7++zWu/vs1rv77NS5+/Tk0Pvt2L377NW4+/Ll0vbtxar/mFk61gAAAAAAAAAAl10/0Pvdxv/q07b71quB/9iuhP/VqX//06J0/9Khcf/SonL/z5pm/+7dzf/q1cH/1ah9/+zStPv22MP/hkww0AAAAAAAAAAAnF9C1vzcxv/kxaT70aBw/9mtg//euJX/6c+3/+zVv//s1sD/6tG5//r18P//////48Wo/+bHpvv22ML/i1Az1gAAAAAAAAAAnWBC1v3eyv/iwp/7ypFY/9qwiP/u3Mr/9+7k//jw6P/48Oj/9+/m//z69///////5862/+XHpvv42cT/jFE01gAAAAAAAAAAnmJE1v7hzv/fvZf7wX06/+LBof/27OP/z5dh/8mLTv/JjE//xIE+//Pl1v/05tn/zJJb/963jfv53cv/jVEz1gAAAAAAAAAAn2JE1v/i0f/dt477u28k/+PDo//47+j/w348/8qNUv/JjVH/xoZH/9+6l//VpXf/vnUw/963jvv53cv/jlM11gAAAAAAAAAAoGNF1v/j0f/duJD7u3Ao/+PDpf/48Oj/w4A//8qNU//JjFH/yYxR/8qOVP/KkFb/wX8+/922jfv63cv/j1Q21gAAAAAAAAAAoWVH1v/i0P/gwJ77w4FD/+bLsP/58uv/yo9X/9Cbaf/Pmmf/z5pn/86YZP/Qm2n/yY9Y/+G/m/v63Mr/kVU31gAAAAAAAAAAo2ZJ1v/hz//kyav7ypRf/+jRuv/58uz/0J9w/9Spfv/UqH3/1Kh9/9Wpfv/VqoD/z59v/+XJqfv53Mn/klc51gAAAAAAAAAApGhK1v/fzf/n0Lf70aR5/+3Zx//69fH/166I/9u3lP/btpP/27aT/9u2k//cuJX/1q2H/+fPtvv42sj/k1g71gAAAAAAAAAAoWZJ0P7fz//s3Mr72riZ/+bPuf/s3Mz/3L2e/97Ao//ewKP/3sCj/97Ao//ewaP/3Luf/+7cy/v428n/kFU50AAAAAAAAAAAunhY1vvTvf/u5Nv27+LU++rax/vq2MX77eDP++3fzvvt38777d/O++3fz/vt38778OLT+/Hm3Pb0zLT/p2dG1gAAAAAAAAAAflM+oOSpi//71L7//d/N/v7ey//+383//d3K//zdyv/83cn//NzJ//vcyP/72sf/+tzK/vTNt//XnH3/ckgzoAAAAAACAQECAAAAAINXQaS4d1fqomZK0aVoS9akZ0rWomZJ1qFkR9agZEbWnmNF1p1hRNacYELWl11A0apqSup4TDakAAAAAAIBAQIAAAAAAgEBAwEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAgEBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28%7B%0A%20%20%20//%20%u0416%u0435%u0441%u0442%u044B%20%u043C%u044B%u0448%u0438%20....%0A%20%20%20GESTURES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20//%20%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%u0439%20................................%0A%20%20%27W-%27%3A%7Bname%3A%27%u0423%u0432%u0435%u043B%u0438%u0447%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%27%2Ccmd%3Afunction%28%29%7B%20FullZoom.enlarge%28%29%20%7D%7D%2C%0A%20%20%27W+%27%3A%7Bname%3A%27%u0423%u043C%u0435%u043D%u044C%u0448%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%27%2Ccmd%3Afunction%28%29%7B%20FullZoom.reduce%28%29%20%7D%7D%2C%0A%20%20%27UDU%27%3A%7Bname%3A%27%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%27%2Ccmd%3Afunction%28%29%7B%20FullZoom.reset%28%29%20%7D%7D%2C%0A%20%20%27L%3CR%27%3A%7Bname%3A%27%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%27%2Ccmd%3Afunction%28%29%7B%20FullZoom.reset%28%29%20%7D%7D%2C%0A%20%20%27L%27%3A%7Bname%3A%27%u041D%u0430%u0437%u0430%u0434%27%2Ccmd%3Afunction%28%29%7B%20BrowserBack%28%29%20%7D%7D%2C%0A%20%20%27R%27%3A%7Bname%3A%27%u0412%u043F%u0435%u0440%u0451%u0434%27%2Ccmd%3Afunction%28%29%7B%20BrowserForward%28%29%20%7D%7D%2C%0A%20%20//%20%27DR%27%3A%7Bname%3A%27%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%27%2Ccmd%3Afunction%28%29%7B%20gBrowser.reload%28%29%20%7D%7D%2C%0A%20%20%27L%3ER%27%3A%7Bname%3A%27%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%27%2Ccmd%3Afunction%28%29%7B%20gBrowser.reload%28%29%20%7D%7D%2C%0A%20%20%27DR%27%3A%7Bname%3A%27%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u043A%u044D%u0448%27%2Ccmd%3Afunction%28%29%7B%20BrowserReloadSkipCache%28%29%20%7D%7D%2C%0A%20%20%27U%27%3A%7Bname%3A%27%u0421%u0442%u043E%u043F%27%2Ccmd%3Afunction%28%29%7B%20BrowserStop%28%29%20%7D%7D%2C%0A%20%20%7D%2C%0A%0Ainit%3Afunction%28%29%20%7B%0A%20%20%20var%20func%20%3D%20this%3B%0A%0A%20%20%20%5B%22mousedown%22%2C%20%22mousemove%22%2C%20%22mouseup%22%2C%20%22contextmenu%22%2C%20%22draggesture%22%2C%20%22DOMMouseScroll%22%5D%0A%20%20%20%20.forEach%28%28type%29%3D%3E%20addEventListener%28type%2C%20this%2C%20true%2C%20gBrowser%29%20%29%3B%20%0A%7D%2C%0A%0AhandleEvent%3Afunction%28event%29%20%7B%0A%20%20%20%20switch%28event.type%29%20%7B%0A%20%20%20%20%20%20%20%20case%22mousedown%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.button%20%3D%3D%202%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownR%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._startGesture%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.button%20%3D%3D%202%20%26%26%20this._isMouseDownL%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownR%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._directionChain%20%3D%20%22L%3ER%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._stopGesture%28event%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28%20event.button%20%3D%3D%200%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownR%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._directionChain%20%3D%20%22L%3CR%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._stopGesture%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22mousemove%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownR%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._progressGesture%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22mouseup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20content.xdTrailArea%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content.xdTrailArea.parentNode.removeChild%28%20content.xdTrailArea%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content.xdTrailArea%20%3D%20content.document.documentElement.appendChild%28document.createElementNS%28xhtmlns%2C%20%22xdTrailArea%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.ctrlKey%20%26%26%20event.button%20%3D%3D%202%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownR%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._directionChain%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20XULBrowserWindow.statusTextField.label%20%3D%20%22Reset%20Gesture%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownR%20%26%26%20event.button%20%3D%3D%202%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._directionChain%20%29%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownR%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._stopGesture%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._shouldFireContext%20%26%26%20%21this._hideFireContext%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._displayContextMenu%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28%20event.button%20%3D%3D%200%20%26%26%20this._isMouseDownL%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28%20%28event.button%20%3D%3D%200%20%7C%7C%20event.button%20%3D%3D%201%29%20%26%26%20event.target.localName%20%3D%3D%27menuitem%27%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20popup%20%3D%20document.getElementById%28%27GesturePopup%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20activeItem%20%3D%20event.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20switch%28%20popup.getAttribute%28%22gesturecommand%22%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%22WebSearchPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20selText%20%3D%20popup.getAttribute%28%22selectedtext%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20engine%20%3D%20activeItem.engine%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20%21engine%20%29%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20submission%20%3D%20engine.getSubmission%28%20selText%2C%20null%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20%21submission%20%29%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.getElementById%28%27searchbar%27%29.textbox.value%20%3D%20selText%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.loadOneTab%28%20submission.uri.spec%2Cnull%2Cnull%2Csubmission.postData%2Cnull%2Cfalse%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%22ClosedTabsPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20undoCloseTab%28%20activeItem.index%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%22HistoryPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.webNavigation.gotoIndex%28%20activeItem.index%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%22AllTabsPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.mTabs%5BactiveItem.index%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20popup.hidePopup%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%20document.getElementById%28%22statusbar-display%22%29.label%20%3D%20%22%22%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20case%22popuphiding%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20popup%20%3D%20document.getElementById%28%27GesturePopup%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20popup.removeEventListener%28%22popuphiding%22%2Cthis%2Ctrue%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.documentElement.removeEventListener%28%22mouseup%22%2Cthis%2Ctrue%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20while%28%20popup.hasChildNodes%28%29%20%29%20popup.removeChild%28%20popup.lastChild%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22contextmenu%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownL%20%7C%7C%20this._isMouseDownR%20%7C%7C%20this._hideFireContext%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22DOMMouseScroll%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownR%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._directionChain%20%3D%20%22W%22%20+%20%28%20event.detail%20%3E%200%20%3F%20%22+%22%20%3A%20%22-%22%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._stopGesture%28event%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22draggesture%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%2C%0A%0A_displayContextMenu%3Afunction%28%20event%20%29%20%7B%0A%20%20%20%20var%20evt%20%3D%20event.originalTarget.ownerDocument.createEvent%28%22MouseEvents%22%29%3B%0A%20%20%20%20evt.initMouseEvent%28%22contextmenu%22%2Ctrue%2Ctrue%2Cevent.originalTarget.defaultView%2C0%2Cevent.screenX%2Cevent.screenY%2Cevent.clientX%2Cevent.clientY%2Cfalse%2Cfalse%2Cfalse%2Cfalse%2C2%2Cnull%29%3B%0A%20%20%20%20event.originalTarget.dispatchEvent%28evt%29%3B%0A%7D%2C%0A%0A_startGesture%3Afunction%28%20event%20%29%20%7B%0A%20%20%20%20this._lastX%20%3D%20event.screenX%3B%0A%20%20%20%20this._lastY%20%3D%20event.screenY%3B%0A%20%20%20%20this._directionChain%20%3D%20%22%22%3B%0A%7D%2C%0A%0A_progressGesture%3Afunction%28%20event%20%29%20%7B%0A%20%20%20%20var%20x%20%3D%20event.screenX%2C%20y%20%3D%20event.screenY%3B%0A%20%20%20%20var%20lastX%20%3D%20this._lastX%2C%20lastY%20%3D%20this._lastY%3B%0A%20%20%20%20var%20subX%20%3D%20x-lastX%2C%20subY%3Dy-lastY%3B%0A%20%20%20%20var%20distX%20%3D%20%28%20subX%20%3E%200%20%3F%20subX%20%3A%20%28-subX%29%20%29%2C%20distY%20%3D%20%28%20subY%20%3E%200%20%3F%20subY%20%3A%20%28%20-subY%20%29%20%29%3B%0A%20%20%20%20var%20direction%3B%0A%20%20%20%20if%20%28%20distX%20%3C%2010%20%26%26%20distY%20%3C%2010%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20if%20%28%20distX%20%3E%20distY%20%29%20direction%20%3D%20subX%20%3C%200%20%3F%20%22L%22%20%3A%20%22R%22%3B%0A%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20direction%20%3D%20subY%20%3C%200%20%3F%20%22U%22%20%3A%20%22D%22%3B%0A%0A%20%20%20%20var%20dChain%20%3D%20this._directionChain%3B%0A%20%20%20%20if%20%28%20direction%20%21%3D%3D%20dChain.charAt%28%20dChain.length-1%20%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20dChain%20+%3D%20direction%3B%0A%20%20%20%20%20%20%20%20%20this._directionChain%20+%3D%20direction%3B%0A%20%20%20%20%20%20%20%20%20var%20gesture%20%3D%20this.GESTURES%5BdChain%5D%3B%0A%20%20%20%20%20%20%20%20%20XULBrowserWindow.statusTextField.label%20%3D%20%22%u0416%u0435%u0441%u0442%20%u043C%u044B%u0448%u0438%3A%20%22+%20dChain%20+%20%28%20gesture%20%3F%20%27%20%28%27+%20gesture.name%20+%27%29%27%20%3A%20%27%27%20%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20this._lastX%20%3D%20x%3B%0A%20%20%20%20this._lastY%20%3D%20y%3B%0A%7D%2C%0A%0A_stopGesture%3Afunction%28event%29%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%20dChain%20%3D%20this._directionChain%20%29%20this.GESTURES%5BdChain%5D.cmd%28%20this%2C%20event%20%29%3B%0A%20%20%20%20%20%20%20%20XULBrowserWindow.statusTextField.label%20%3D%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20XULBrowserWindow.statusTextField.label%20%3D%20%22%u041D%u0435%u0438%u0437%u0432%u0435%u0441%u0442%u043D%u044B%u0439%20%u0436%u0435%u0441%u0442%20%u043C%u044B%u0448%u0438%3A%20%22%20+%20dChain%20%7D%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20XULBrowserWindow.statusTextField.label%20%3D%20%22%22%20%7D%2C%20600%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20this._directionChain%20%3D%20%22%22%3B%0A%7D%2C%0A%0AshowAlert%3Afunction%28image%2C%20label%2C%20notification%29%20%7B%0A%20%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20%20.showAlertNotification%28image%2C%20label%2C%20notification%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0A%7D%2C%0A%0A_buildPopup%3Afunction%28event%2C%20gestureCmd%29%20%7B%0A%20%20%20%20var%20popup%20%3D%20document.getElementById%28%27GesturePopup%27%29%3B%0A%20%20%20%20if%20%28%20%21popup%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20popup%20%3D%20document.createElement%28%22popup%22%29%3B%0A%20%20%20%20%20%20%20%20%20popup.id%20%3D%20%27GesturePopup%27%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20document.getElementById%28%22mainPopupSet%22%29.appendChild%28%20popup%20%29%3B%0A%20%20%20%20popup.setAttribute%28%22gesturecommand%22%2C%20gestureCmd%20%29%3B%0A%20%20%20%20%0A%20%20%20%20switch%28%20gestureCmd%20%29%20%7B%0A%20%20%20%20%20%20%20%20case%22WebSearchPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20engines%20%3D%20Services.search.getVisibleEngines%28%7B%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20engines.length%20%3C%201%20%29%20throw%22%u041F%u043E%u0438%u0441%u043A%u043E%u0432%u044B%u0435%20%u0441%u0438%u0441%u0442%u0435%u043C%u044B%20%u043D%u0435%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u044B%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%20%3D%20engines.length%20-%201%3B%20i%20%3E%3D%200%3B--i%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20engine%20%3D%20engines%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20menuitem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20engine.name%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20engine.iconURI%20%29%20menuitem.setAttribute%28%22src%22%2C%20engine.iconURI.spec%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20popup.insertBefore%28%20menuitem%2C%20popup.firstChild%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.engine%20%3D%20engine%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20popup.setAttribute%28%22selectedtext%22%2C%20getBrowserSelection%28%29.toString%28%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20case%22ClosedTabsPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20%21gPrefService.getBoolPref%28%22browser.sessionstore.enabled%22%29%20%29%20throw%22%u0424%u0443%u043D%u043A%u0446%u0438%u044F%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u044F%20%u0441%u0435%u0441%u0441%u0438%u0439%20%u043E%u0442%u043A%u043B%u044E%u0447%u0435%u043D%u0430%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20catch%28e%29%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20ss%20%3D%20Cc%5B%22@mozilla.org/browser/sessionstore%3B1%22%5D.getService%28Ci.nsISessionStore%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20ss.getClosedTabCount%28window%29%20%3D%3D0%20%29%20throw%22%u041D%u0435%u0442%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0435%u043C%u044B%u0445%20%u0432%u043A%u043B%u0430%u0434%u043E%u043A%20%u0432%20%u044D%u0442%u043E%u043C%20%u043E%u043A%u043D%u0435.%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20undoItems%20%3D%20eval%28%22%28%22+ss.getClosedTabData%28window%29+%22%29%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%3D0%2C%20LEN%20%3D%20undoItems.length%3B%20i%3CLEN%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20menuitem%3Dpopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2CundoItems%5Bi%5D.title%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22class%22%2C%22menuitem-iconic%20bookmark-item%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.index%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20iconURL%20%3D%20undoItems%5Bi%5D.image%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20iconURL%20%29%20menuitem.setAttribute%28%22image%22%2C%20iconURL%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20case%22HistoryPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20sessionHistory%20%3D%20gBrowser.webNavigation.sessionHistory%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20sessionHistory.count%3C1%20%29%20throw%22%u041D%u0435%u0442%20%u0438%u0441%u0442%u043E%u0440%u0438%u0438%20%u0432%20%u044D%u0442%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435.%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20curIdx%20%3D%20sessionHistory.index%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%20%3D%200%2C%20shc%20%3D%20sessionHistory.count%3B%20i%20%3C%20shc%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20entry%20%3D%20sessionHistory.getEntryAtIndex%28i%2Cfalse%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20%21entry%20%29%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20menuitem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20popup.insertBefore%28menuitem%2Cpopup.firstChild%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2Centry.title%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20iconURL%20%3D%20Cc%5B%22@mozilla.org/browser/favicon-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Ci.nsIFaviconService%29.getFaviconForPage%28entry.URI%29.spec%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.style.listStyleImage%20%3D%20%22url%28%22+iconURL+%22%29%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20catch%28e%29%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.index%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20i%3D%3DcurIdx%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.style.listStyleImage%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22type%22%2C%22radio%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22checked%22%2C%22true%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.className%20%3D%20%22unified-nav-current%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20activeItem%20%3D%20menuitem%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.className%20%3D%20i%20%3C%20curIdx%20%3F%20%22unified-nav-back%20menuitem-iconic%22%20%3A%20%22unified-nav-forward%20menuitem-iconic%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20case%22AllTabsPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20tabs%20%3D%20gBrowser.mTabs%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20tabs.length%20%3C%201%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%3D0%2C%20LEN%20%3D%20tabs.length%3B%20i%20%3C%20LEN%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20menuitem%20%3D%20popup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20tab%20%3D%20tabs%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%20bookmark-item%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20tab.label%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22crop%22%2C%20tab.getAttribute%28%22crop%22%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22image%22%2C%20tab.getAttribute%28%22image%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.index%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20tab.selected%20%29%20menuitem.setAttribute%28%22style%22%2C%20%22color%3A%20red%3B%20font-weight%3A%20bold%3B%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20tab.hasAttribute%28%27unread%27%29%20%29%20menuitem.setAttribute%28%22style%22%2C%20%22color%3A%20blue%3B%22%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20document.popupNode%20%3D%20null%3B%0A%20%20%20%20document.tooltipNode%20%3D%20null%3B%0A%20%20%20%20popup.addEventListener%28%22popuphiding%22%2C%20this%2C%20true%29%3B%0A%20%20%20%20popup.openPopup%28%20null%2C%20%22%22%2C%20event.clientX%2C%20event.clientY%2C%20false%2C%20false%20%29%3B%0A%20%20%20%20document.documentElement.addEventListener%28%22mouseup%22%2C%20this%2C%20true%29%3B%0A%7D%0A%7D%29.init%28%29%3B%0A%0A%0A%0A%0A//%20%u041A%u043D%u043E%u043F%u043A%u0430%20%u0434%u043B%u044F%20%u0443%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u044F%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u043E%u043C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0432%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0435%2C%20%u043E%u0442%2024.11.2016.%20..........................%0A%28%28%29%3D%3E%20%7B%0A%20%20%20//%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u0438%u0437%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0438%20FF51%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u0443%u044E%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%0A%20%20%20var%20but%20%3D%20document.getElementById%28%27urlbar-zoom-button%27%29%3B%0A%20%20%20if%20%28but%29%20but.style.display%20%3D%20%22none%22%3B%0A%20%20%20%0A%20%20%20//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u0432%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0435%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%0A%20%20%20var%20zoomButton%20%3D%20document.createElement%28%22statusbarpanel%22%29%3B%0A%20%20%20var%20urlbarIcons%20%3D%20document.getElementById%28%22urlbar-icons%22%29%3B%0A%20%20%20urlbarIcons.insertBefore%28zoomButton%2C%20urlbarIcons.lastChild%29%3B%20//%20%u043F%u0435%u0440%u0435%u0434%20%u043F%u043E%u0441%u043B%u0435%u0434%u043D%u0435%u0439%20%u043A%u043D%u043E%u043F%u043A%u043E%u0439%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0438%0A%20%20%20addDestructor%28%28%29%3D%3E%20zoomButton.remove%28%29%29%3B%0A%20%20%20%20%20%0A%20%20%20updateZoomButton%28%29%3B%20%0A%20%20%20zoomButton.id%20%3D%20%22zoomButton%22%3B%0A%20%20%20zoomButton.style.cssText%20%3D%20%22-moz-appearance%3A%20none%3B%20border%3A%200%3B%20margin-right%3A%20-5px%3B%22%3B%20//%20Css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%0A%20%20%20zoomButton.tooltipText%20%3D%20%22%u041B%3A%20%u041C%u0435%u043D%u044F%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%u043B%u0438%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%5Cn%u0421%3A%20%u0415%u0434%u0438%u043D%u044B%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0434%u043B%u044F%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%20%5Cn%u041F%3A%20%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u043D%u0430%20100%25%20%22%3B%0A%0A%20%20%20%0A%20%20%20//%20%u041E%u0442%u0441%u043B%u0435%u0436%u0438%u0432%u0430%u0442%u044C%20%u043A%u043B%u0438%u043A%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20addEventListener%28%22click%22%2C%20e%3D%3E%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20ZoomManager.toggleZoom%28%29%3B%20//%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0440%u0435%u0436%u0438%u043C%20%u0438%u0437%u043C%u0438%u043D%u0435%u043D%u0438%u044F%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20%7B%20//%20%u0435%u0434%u0438%u043D%u044B%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0434%u043B%u044F%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%0A%20%20%20%20%20%20%20%20%20%20%20cbu.isPref%28%22CB.zoom.allEvenly%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20cbu.setPrefs%28%22CB.zoom.allEvenly%22%2C%20%21cbu.getPrefs%28%22CB.zoom.allEvenly%22%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20cbu.setPrefs%28%22CB.zoom.Percent%22%2C%20ZoomManager.zoom.toFixed%282%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20updateZoomButton%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20%7B%20e.preventDefault%28%29%3B%20FullZoom.reset%28%29%3B%20%7D%3B%20//%20%u0441%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%7D%2C%20false%2C%20zoomButton%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20//%20%u041C%u0435%u043D%u044F%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u043A%u043E%u043B%u0435%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%0A%20%20%20addEventListener%28%22DOMMouseScroll%22%2C%20e%3D%3E%20%7B%0A%20%20%20%20%20%20e.detail%20%3E%200%20%3F%20FullZoom.reduce%28%29%20%3A%20FullZoom.enlarge%28%29%3B%0A%20%20%20%7D%2C%20false%2C%20zoomButton%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%0A%20%0A%20%20%20//%20%u0421%u043B%u0435%u0434%u0438%u043C%20%u0437%u0430%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u0435%u043C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20%u0438%20%u0437%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u043C%20%u043E%u0431%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u043A%u043D%u043E%u043F%u043A%u0438%20....%0A%20%20%20var%20str%20%3D%20%22%7B%20setTimeout%28%28%29%3D%3E%20%7B%20updateZoomButton%28%29%20%7D%2C%2050%29%3B%22%3B%0A%20%20%20var%20handleEvent%20%3D%20parseInt%28Services.appinfo.version%29%20%3E%2033%20%3F%20FullZoom.handleEvent%20%3A%20FullZoom._handleMouseScrolled%3B%0A%20%20%20var%20array%20%3D%20%5BFullZoom.reset%2C%20FullZoom.reduce%2C%20FullZoom.enlarge%2C%20ZoomManager.toggleZoom%2C%20handleEvent%5D%3B%0A%20%20%20array.forEach%28func%3D%3E%20%7B%20setTimeout%28%28%29%3D%3E%20%7B%20eval%28%20%28func.toString%28%29.replace%28%27_%27%2C%20%27.%27%29.match%28/function%20%28%5B%5E%28%5D*%29%5C%28/%29%5B1%5D%20+%20%22%20%3D%20%22%20+%20func.toString%28%29.replace%28%22%7B%22%2C%20str%29%29%20%29%7D%2C%2050%29%20%7D%29%3B%20%0A%20%20%20addDestructor%28%28%29%3D%3E%20%7B%20%0A%20%20%20%20%20%20array.forEach%28func%3D%3E%20%7B%20eval%28%20%28func.toString%28%29.replace%28%27_%27%2C%20%27.%27%29.match%28/function%20%28%5B%5E%28%5D*%29%5C%28/%29%5B1%5D%20+%20%22%20%3D%20%22%20+%20func.toString%28%29%29.replace%28str%2C%22%7B%22%29%20%29%20%7D%29%3B%20%20%0A%20%20%20%7D%29%3B%20%20%20%0A%20%20%20%0A%20%20%20%0A%20%20%20//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u0438%20%u0438%u0437%u043C%u0435%u043D%u044F%u0442%u044C%20%u0446%u0432%u0435%u0442%20%u0438%20%u0448%u0440%u0438%u0444%u0442%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%0A%20%20%20function%20updateZoomButton%28e%29%20%7B%0A%20%20%20%20%20%20zoomButton.label%20%3D%20Math.round%28ZoomManager.zoom*100%29%20+%20%22%25%22%3B%20%0A%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20zoomButton.style.fontWeight%20%3D%20ZoomManager.useFullZoom%20%3F%20%27%27%20%3A%20%27bold%27%3B%0A%20%20%20%20%20%20%20%20%20zoomButton.style.color%20%3D%20cbu.getPrefs%28%22CB.zoom.allEvenly%22%29%20%3F%20%22red%22%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%7D%2C%205%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20//%20%u0437%u0430%u043F%u043E%u043C%u043D%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0432%20%27about%3Aconfig%27%0A%20%20%20%20%20%20if%20%28%20e%20%3D%3D%20undefined%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20try%20%7B%20window.clearTimeout%28zoomButton.prefTimeout%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20zoomButton.prefTimeout%20%3D%20window.setTimeout%28%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cbu.setPrefs%28%22CB.zoom.Percent%22%2C%20ZoomManager.zoom.toFixed%282%29%20%29%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20250%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%20%20%20%7D%3B%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20//%20%u0423%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0442%u044C%20%u0435%u0434%u0438%u043D%u044B%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0434%u043B%u044F%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20....%0A%20%20%20addEventListener%28%22TabAttrModified%22%2C%20e%3D%3E%20%7B%0A%20%20%20%20%20%20if%20%28%20e.target.linkedBrowser.currentURI.spec%20%21%3D%3D%20gBrowser.currentURI.spec%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20cbu.getPrefs%28%22CB.zoom.allEvenly%22%29%20%26%26%20content.location.protocol.startsWith%28%22http%22%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20var%20value%20%3D%20cbu.getPrefs%28%22CB.zoom.Percent%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20if%20%28%20ZoomManager.zoom.toFixed%282%29%20%3D%3D%20value%20%29%20return%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.markupDocumentViewer%5BZoomManager.useFullZoom%20%3F%20%27fullZoom%27%20%3A%20%27textZoom%27%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20updateZoomButton%28e%29%3B%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%7D%2C%200%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%0A%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20updateZoomButton%28e%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%7D%2C%20true%2C%20gBrowser.tabContainer%29%3B%20%20%20%0A%7D%29%28%29%3B%0A%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.tooltipText%20%3D%20%22CB%20Mouse%20Gestures+%20%20%5Cn%u0417%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u0442%20%u0436%u0435%u0441%u0442%u0438%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u041F%u041A%u041C%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%5Cn%u041B%3A%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u043A%u043D%u043E%u043F%u043A%u0443%22%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B//%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u043A%u043D%u043E%u043F%u043A%u0443%20....%0Acustombuttons.editButton%28this%29%3B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Жесты срабатывают через раз, грешил на мышь, но с заменой мыши проблемы не ушли. Может кто проверит на работоспособность?

В Firefox 57 не работают кнопки, отвечающие за запуск внешних программ/батников.
Например Запуск программы( Firefox24+ ) от 28.01.2017
Или, к примеру, такой код, работающий на 55:

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

Выделить код

Код:

/*CODE*/
var prgpath="C:\\Portable\\test.cmd";
var args = ['']; 
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(prgpath);
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
process.run(false, args, args.length)


Это какие-то ограничения новой версии или всё-таки запустить можно?

Coroner
Научите как установить CB в 57?? Пробовал custom_buttons-0.0.5.8.9-fixed7pre, и отключал совместимость. Не завелось.

Mishania пишет

Научите как установить CB в 57?? Пробовал custom_buttons-0.0.5.8.9-fixed7pre, и отключал совместимость. Не завелось.

У меня сейчас закладки на нужные комментарии нет, поэтому сейчас скину в личку ссылку на инструкцию "как у меня делалось".
Делал вроде с custom_buttons-0.0.5.8.9-fixed6pre, но думаю что без разницы.

Mishania пишет

Старая распорка от совместимости более не работает, нужна новая.

Infocatcher, а 6pre или 7pre — без разницы?
Я товарищу как раз ссылку давал на новую распорку, но у него 7, а у меня 6 и работает всё.

Coroner пишет

Или, к примеру, такой код, работающий на 55:

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

Выделить код

Код:

/*CODE*/
var prgpath="C:\\Portable\\test.cmd";
var args = ['']; 
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(prgpath);
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
process.run(false, args, args.length)

nsILocalFile выпилен в Firefox 57

Если для кнопки не планируется устанавливать её ещё и на лису древнее чем Firefox 14,
то просто замени nsILocalFile на nsIFile

А если такая вероятность имеется, то пиши что-то типа
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile || Components.interfaces.nsIFile);

В Firefox 57 должны работать обе версии, без визуальных отличий.
В свежих Nightly – только custom_buttons-0.0.5.8.9-fixed7pre.xpi.

Dumby, спасибо, добрый человек :beer: Первый вариант работает, второй не пробовал, но и не понадобится!
Infocatcher, спасибо :beer: , вопрос решился, на 57 работают обе версии, на свежих Nightly — действительно нужно custom_buttons-0.0.5.8.9-fixed7pre.xpi

"Переключаться на левую вкладку после закрытии текущей вкладки" посмотрите ато мозиловцы совсем все поломали:cry:.

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

Выделить код

Код:

// Переключаться на левую вкладку после закрытии текущей вкладки,  от 22.08.2013. ................................
 function tabCloseHandler(e) {
    var tab = e.target;
    if ( tab == gBrowser.mCurrentTab ) { 
         if ( !gBrowser.visibleTabs.length ) gBrowser.addTab("about:blank");
         else             
              if ( !tab.hasAttribute('first-visible-tab') ) { gBrowser.mTabContainer.advanceSelectedTab(-1,true) }; 
         }
 }
 addEventListener("TabClose", tabCloseHandler, true, gBrowser.tabContainer );

Народ, нельзя ничего исправить?:cry: или тема умерла?:(

broker пишет

Народ, нельзя ничего исправить?:cry: или тема умерла?:(

Попробуй обновить кнопку: forum.mozilla-russia.org/viewtopic.php? … 40#p493040

A так да, мало кто ответит) тема при смерти.
Здесь хоть кто то ответит: forum.mozilla-russia.org/viewtopic.php? … 81#p748081

Gladius333
Спасибо, заработало я не обновлял ее давно сам виноват.

Copy the text of the link ,тако веб.аддонство есть в FF57/ А, кноп можно? , у Sm надо...Она веб.аддоны не берет.

Есть несколько отвалившихся кнопок.
Может кто поправит

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

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке, от 24.11.2016. ..........................................................................
(()=> {   
   // Удалить из адресной строки FF51 стандартную кнопку масштаба ....
   var but = document.getElementById('urlbar-zoom-button');
   if (but) but.style.display = "none";
         
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons");
   urlbarIcons.insertBefore(zoomButton, urlbarIcons.lastChild); // перед последней кнопкой адресной строки
   addDestructor(()=> zoomButton.remove());
         
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -6px;"; // Css стиль для кнопки масштаба
   zoomButton.tooltipText = "Л: Менять масштаб страницы или только текста\nС: Единый масштаб для всех страниц \nП: Сбросить масштаб на 100% ";

   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", e=> {                  
      if ( e.button == 0 ) ZoomManager.toggleZoom(); // переключить режим изменения масштаба
      
      if ( e.button == 1 ) { // единый масштаб для всех страниц
           cbu.isPref("CB.zoom.allEvenly", false);
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
                
           updateZoomButton();
           }

      if ( e.button == 2 ) { e.preventDefault(); FullZoom.reset(); }; // сбросить масштаб
               
   }, false, zoomButton);

         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", e=> {
      e.detail > 0 ? FullZoom.enlarge() : FullZoom.reduce();
   }, false, zoomButton);
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var str = "{ setTimeout(()=> { updateZoomButton() }, 50);";
   var handleEvent = parseInt(Services.appinfo.version) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled;
   var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, handleEvent];
   array.forEach(func=> { setTimeout(()=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace("{", str)) )}, 50) }); 
   addDestructor(()=> { 
      array.forEach(func=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace(str,"{") ) });  
   });   
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; 
      setTimeout(()=> {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);
      
      // запомнить текущий масштаб в 'about:config'
      if ( e == undefined ) { 
           try { window.clearTimeout(zoomButton.prefTimeout) } catch(e) {};
           zoomButton.prefTimeout = window.setTimeout(()=> {
              cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )  
           }, 250);
           }     
   };
     
     
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", e=> {
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
      if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
           var value = cbu.getPrefs("CB.zoom.Percent");
           if ( ZoomManager.zoom.toFixed(2) == value ) return;

           setTimeout(()=> { 
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0); 
           }      
      else 
           updateZoomButton(e);
                 
   }, true, gBrowser.tabContainer);   
})();




// Добавить подменю "Поиск изображения в ..." в контекстном меню изображений, от 05.06.2015. ...........................................................
((contextMenu) => {
  var menu = document.createElement("menu");      
  menu.setAttribute("label", "Поиск изображения в ...");
  menu.setAttribute("class", "menu-iconic");
  menu.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADTUlEQVQ4ja2TX2xTZRjGv62xg4lpUoRME+e/YcYWxRS3BEEDF0SLtIvA2RpDx+lKTqTr2c7Xc77v/U47twPRYVyMGqlothEaiLCOcWGWUIgaySALZpmRsnVubGNs4IClsGwsJkBeL8QlGvXK5/r5vTfv7yHk/45lWa7W1tbDx48dH+nqOnkrkUhgPB6fampquiBE9H0AKPxH0DCMlalU6vzA4CBmMhns6+vD7u5uTCQS9/bv/xAbGt5DIUwEEAsAUP8XWNdjT/f0nMv29vZiW1v7uCwHbnq9FQ+kSh9u9b6Na8vWoWtt+X2v13stHFYn/jgEghBCSCgUWtbZ2TWVTHYOVVZWpRv37us/23PuwWcHDmLj3mbc4avGVSUutC11Yvn6TfdaPv6kZcuWrT9yDiOUiiIihGDRaMMXO6tl6/r0zI25+QX8uuMEyrv34A5fNZa9ugmXP/EsErsD7csex9m5ecyMTDRv3vzGpwAgSJ2m+c/8cN7ff3Hwt+lbWZy7u4BHjiXxRdc6XFXiWoSJ3YHPF7+Md2bn8af0IPanh9rD4fBGEtL1Dae+PfvdpV/G8eeBIbwzO48z2dtY/FIZ2pY6F2Fid2D8yzYcvjyO6aGx+6fPfN9sAHgIY6zA984uJf7VofbM6EQ2PZDByalfcXTsCm6v8uOKJ5/DNa9swAMHW3H0yiQOX74619HR2Q5gfkAplBJJKrVzrq0OBAO7K7ZXfdR2+MiJi5eGrw6PTeD0zSxOXZvGGzO3cWzy+t2T35y6oGqRo7puxHWTbwtFYk8tfoJzvtqIxTy7gkEuVfk+3+mvObqnNpJSNeN0fYSn/H45WVdXfwgAWkzeEGAac9Fg0PmnfbmWx8oHgEJOY+WmaXpNzoNCRHXBRZMQ0X0mY41cCAYA1Yyar9UrUCjL8pKHKmEOISRHVd15QRp0apr2TAQia3QdXmeMvWkYUMG5uQ0MeIsxc70VMV+wKHUqivLI343OJYTkbpTlJYqiOFiIFVBKi/SwWayregmltFRQWmQxVuD3+x8lJGn7t03lEEJy3W41T/FY+YoCjoCqrjDeNVbW1tYur6mpeUySJPvD3n8mhxBis0olu+p253kUT76iKPmSJdklSbIRQsjv4dqcl7QFgvMAAAAASUVORK5CYII=");
  
  contextMenu.insertBefore( menu, document.getElementById("context-viewimage") ); 
  addEventListener("popupshowing", ()=> menu.hidden = !gContextMenu.onImage, false, contextMenu);
  addDestructor(()=> contextMenu.removeChild(menu) );
  
  var array = [
        [ 'Яндекс', 'http://yastatic.net/morda-logo/i/favicon_islands.ico', 'http://yandex.ru/images/search?rpt=imageview&img_url=' ],
        [ 'Tineye', 'http://tineye.com/favicon.ico', 'http://tineye.com/search?pluginver=bookmark_1.0&url=' ],
        [ 'Bing', 'https://www.bing.com/s/a/bing_p.ico', 'http://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl='],
        [ 'Google', 'https://www.google.lv/favicon.ico', 'http://www.google.com/searchbyimage?image_url=' ]        
              ];
  var menuPopup = menu.appendChild( document.createElement("menupopup") );              
  array.forEach(function( m ) { 
       var mItem = menuPopup.appendChild( document.createElement("menuitem") );
       mItem.setAttribute("label", m[0]);       
       mItem.setAttribute("image", m[1]);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.finder = m[2];
  });
  
  menuPopup.onclick =e=> {
     var url = e.target.finder +
              encodeURIComponent(gContextMenu.imageURL);
     gBrowser.selectedTab = gBrowser.addTab(url);
     setTimeout(()=> contextMenu.hidePopup(), 20);
  };
  
})(document.getElementById("contentAreaContextMenu") );



// CB code 2 link (кликабельные custombutton ссылки)....................................................................................................
addEventListener(
    "DOMContentLoaded",
    function(e) {
        var doc = e.target;
        var win = doc.defaultView;
        if(win != win.top) // Ignore frames
            return;

if (doc.location.host=="forum.mozilla-russia.org"){
var boxes = [];
var pres = doc.getElementsByTagName("pre");

 for(var i = 0, l = pres.length; i < l; ++i) {
        var pre = pres[i];
        if(pre.parentNode.parentNode.parentNode.className == "codebox")
            boxes.push(pre);
    }
for(var i = 0, l = boxes.length; i < l; ++i) {
        var box = boxes[i];
        if(box.hasAttribute("data-highlight-js-parsed"))
            continue;
        box.setAttribute("data-highlight-js-parsed", "true");

        // Special "codes"
        var tc = box.textContent;
        if(
            /^custombutton:\/\/\S+%3C\/custombutton%3E\s*$/.test(tc)
            || /^data:[\w-]+\/[\w-]+;base64,\S+\s*$/.test(tc)
        ) {
            tc = tc.replace(/\s+$/, "");
            var a = doc.createElement("a");
            a.href = tc;

            var icon;
            if(/^data:image\//.test(tc))
                icon = tc;
            else if(
                /^custombutton:\/\//.test(tc)
                && /%3Cimage%3E%3C%21%5BCDATA%5B(data%3A\S+)%5D%5D%3E%3C\/image%3E/.test(tc)
            )
                try { icon = decodeURIComponent(RegExp.$1); } catch(e) {}
            if(icon) {
                var img = doc.createElement("img");
                img.src = icon;
                img.alt = "";
                var s = img.style;
                s.marginRight = "4px";
                s.verticalAlign = "middle";
                a.appendChild(img);
            }

            a.appendChild(doc.createTextNode(tc));
            var s = a.style;
            s.background = "none";
            s.margin = s.padding = 0;

            box.innerHTML = "";
            box.appendChild(a);
            continue;
        }
    }

  }
},
    true,
    document.getElementById("appcontent")
);



// Добавлять новые СВ кнопки справа от этой кнопки ......................................................................................................
this._handleClick =()=> cbu.setPrefs(s, !cbu.getPrefs(s));


var observer = {
   observe: button=> {
      if ( !cbu.getPrefs(s) ) return;
      var toolbar = self.parentNode;
      toolbar.insertBefore(button, self.nextSibling);
      custombuttons.persistCurrentSets(toolbar.id, _id, button.id);

      if ( parseInt(Services.appinfo.version) < 43 ) return;

      function observer(subject, topic, data) {
         setTimeout(()=> Services.ww.unregisterNotification(observer), 500);
         subject.close();
      };
      Services.ww.registerNotification(observer);      
    }
};
var notificationPrefix = custombuttons.notificationPrefix + "installButton";
Services.obs.addObserver(observer, notificationPrefix, false);
addDestructor(()=> Services.obs.removeObserver(observer, notificationPrefix) );


var s = "CB.newButtonAtRightFromCurrent";
function toggleImage() self.style.filter = cbu.getPrefs(s) ? '' : 'grayscale(1)';  
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );

Ultima2m пишет

Есть несколько отвалившихся кнопок.
Может кто поправит

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке, от 27.11.2017. ..........................
(()=> {
   // Удалить из адресной строки FF51 стандартную кнопку масштаба ....
   var but = document.getElementById('urlbar-zoom-button');
   if (but) but.style.display = "none";
   
   // Создать в адресной строке кнопку масштаба ....userContext-icons  page-action-buttons
   var zoomButton = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons") || document.getElementById("page-action-buttons"); // FF57
   urlbarIcons.insertBefore(zoomButton, urlbarIcons.lastChild); // перед последней кнопкой адресной строки
   addDestructor(()=> zoomButton.remove());
     
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.setAttribute("context", "event.stopPropagation()");
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -1px;"; // Css стиль для кнопки масштаба   
   zoomButton.tooltipText = "Л: Менять масштаб страницы или только текста\nС: Единый масштаб для всех страниц \nП: Сбросить масштаб на 100% ";

   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", e=> {                  
      if ( e.button == 0 ) ZoomManager.toggleZoom(); // переключить режим изминения масштаба
      
      if ( e.button == 1 ) { // единый масштаб для всех страниц
           cbu.isPref("CB.zoom.allEvenly", false);
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
                
           updateZoomButton();
           }

      if ( e.button == 2 ) FullZoom.reset(); // сбросить масштаб
               
   }, false, zoomButton);

         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", e=> {
      e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge();
   }, false, zoomButton);
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var str = "{ setTimeout(()=> { updateZoomButton() }, 50);";
   var handleEvent = parseInt(Services.appinfo.version) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled;
   var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, handleEvent];
   array.forEach(func=> { setTimeout(()=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace("{", str)) )}, 50) }); 
   addDestructor(()=> { 
      array.forEach(func=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace(str,"{") ) });  
   });   
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; 
      setTimeout(()=> {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);
      
      // запомнить текущий масштаб в 'about:config'
      if ( e == undefined ) { 
           try { window.clearTimeout(zoomButton.prefTimeout) } catch(e) {};
           zoomButton.prefTimeout = window.setTimeout(()=> {
              cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )  
           }, 250);
           }     
   };
     
     
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", e=> {
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
      if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
           var value = cbu.getPrefs("CB.zoom.Percent");
           if ( ZoomManager.zoom.toFixed(2) == value ) return;

           setTimeout(()=> { 
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0); 
           }      
      else 
           updateZoomButton(e);
                 
   }, true, gBrowser.tabContainer);   
})();



// Добавить подменю "Поиск изображения в ..." в контекстном меню изображений, от 05.06.2015. ...........................................................
((contextMenu) => {
  var menu = document.createElement("menu");      
  menu.setAttribute("label", "Поиск изображения в ...");
  menu.setAttribute("class", "menu-iconic");
  menu.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADTUlEQVQ4ja2TX2xTZRjGv62xg4lpUoRME+e/YcYWxRS3BEEDF0SLtIvA2RpDx+lKTqTr2c7Xc77v/U47twPRYVyMGqlothEaiLCOcWGWUIgaySALZpmRsnVubGNs4IClsGwsJkBeL8QlGvXK5/r5vTfv7yHk/45lWa7W1tbDx48dH+nqOnkrkUhgPB6fampquiBE9H0AKPxH0DCMlalU6vzA4CBmMhns6+vD7u5uTCQS9/bv/xAbGt5DIUwEEAsAUP8XWNdjT/f0nMv29vZiW1v7uCwHbnq9FQ+kSh9u9b6Na8vWoWtt+X2v13stHFYn/jgEghBCSCgUWtbZ2TWVTHYOVVZWpRv37us/23PuwWcHDmLj3mbc4avGVSUutC11Yvn6TfdaPv6kZcuWrT9yDiOUiiIihGDRaMMXO6tl6/r0zI25+QX8uuMEyrv34A5fNZa9ugmXP/EsErsD7csex9m5ecyMTDRv3vzGpwAgSJ2m+c/8cN7ff3Hwt+lbWZy7u4BHjiXxRdc6XFXiWoSJ3YHPF7+Md2bn8af0IPanh9rD4fBGEtL1Dae+PfvdpV/G8eeBIbwzO48z2dtY/FIZ2pY6F2Fid2D8yzYcvjyO6aGx+6fPfN9sAHgIY6zA984uJf7VofbM6EQ2PZDByalfcXTsCm6v8uOKJ5/DNa9swAMHW3H0yiQOX74619HR2Q5gfkAplBJJKrVzrq0OBAO7K7ZXfdR2+MiJi5eGrw6PTeD0zSxOXZvGGzO3cWzy+t2T35y6oGqRo7puxHWTbwtFYk8tfoJzvtqIxTy7gkEuVfk+3+mvObqnNpJSNeN0fYSn/H45WVdXfwgAWkzeEGAac9Fg0PmnfbmWx8oHgEJOY+WmaXpNzoNCRHXBRZMQ0X0mY41cCAYA1Yyar9UrUCjL8pKHKmEOISRHVd15QRp0apr2TAQia3QdXmeMvWkYUMG5uQ0MeIsxc70VMV+wKHUqivLI343OJYTkbpTlJYqiOFiIFVBKi/SwWayregmltFRQWmQxVuD3+x8lJGn7t03lEEJy3W41T/FY+YoCjoCqrjDeNVbW1tYur6mpeUySJPvD3n8mhxBis0olu+p253kUT76iKPmSJdklSbIRQsjv4dqcl7QFgvMAAAAASUVORK5CYII=");
  
  contextMenu.insertBefore( menu, document.getElementById("context-viewimage") ); 
  addEventListener("popupshowing", ()=> menu.hidden = !gContextMenu.onImage, false, contextMenu);
  addDestructor(()=> contextMenu.removeChild(menu) );
  
  var array = [
        [ 'Яндекс', 'http://yastatic.net/morda-logo/i/favicon_islands.ico', 'http://yandex.ru/images/search?rpt=imageview&img_url=' ],
        [ 'Tineye', 'http://tineye.com/favicon.ico', 'http://tineye.com/search?pluginver=bookmark_1.0&url=' ],
        [ 'Bing', 'https://www.bing.com/s/a/bing_p.ico', 'http://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl='],
        [ 'Google', 'https://www.google.lv/favicon.ico', 'http://www.google.com/searchbyimage?image_url=' ]        
              ];
  var menuPopup = menu.appendChild( document.createElement("menupopup") );              
  array.forEach(function( m ) { 
       var mItem = menuPopup.appendChild( document.createElement("menuitem") );
       mItem.setAttribute("label", m[0]);       
       mItem.setAttribute("image", m[1]);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.finder = m[2];
  });
  
  menuPopup.onclick =e=> {
     var url = e.target.finder +
              encodeURIComponent(gContextMenu.imageURL);
     gBrowser.selectedTab = gBrowser.addTab(url);
     setTimeout(()=> contextMenu.hidePopup(), 20);
  };
  
})(document.getElementById("contentAreaContextMenu") );



// CB code 2 link (кликабельные custombutton ссылки)....................................................................................................
addEventListener(
    "DOMContentLoaded",
    function(e) {
        var doc = e.target;
        var win = doc.defaultView;
        if(win != win.top) // Ignore frames
            return;

if (doc.location.host=="forum.mozilla-russia.org"){
var boxes = [];
var pres = doc.getElementsByTagName("pre");

 for(var i = 0, l = pres.length; i < l; ++i) {
        var pre = pres[i];
        if(pre.parentNode.parentNode.parentNode.className == "codebox")
            boxes.push(pre);
    }
for(var i = 0, l = boxes.length; i < l; ++i) {
        var box = boxes[i];
        if(box.hasAttribute("data-highlight-js-parsed"))
            continue;
        box.setAttribute("data-highlight-js-parsed", "true");

        // Special "codes"
        var tc = box.textContent;
        if(
            /^custombutton:\/\/\S+%3C\/custombutton%3E\s*$/.test(tc)
            || /^data:[\w-]+\/[\w-]+;base64,\S+\s*$/.test(tc)
        ) {
            tc = tc.replace(/\s+$/, "");
            var a = doc.createElement("a");
            a.href = tc;

            var icon;
            if(/^data:image\//.test(tc))
                icon = tc;
            else if(
                /^custombutton:\/\//.test(tc)
                && /%3Cimage%3E%3C%21%5BCDATA%5B(data%3A\S+)%5D%5D%3E%3C\/image%3E/.test(tc)
            )
                try { icon = decodeURIComponent(RegExp.$1); } catch(e) {}
            if(icon) {
                var img = doc.createElement("img");
                img.src = icon;
                img.alt = "";
                var s = img.style;
                s.marginRight = "4px";
                s.verticalAlign = "middle";
                a.appendChild(img);
            }

            a.appendChild(doc.createTextNode(tc));
            var s = a.style;
            s.background = "none";
            s.margin = s.padding = 0;

            box.innerHTML = "";
            box.appendChild(a);
            continue;
        }
    }

  }
},
    true,
    document.getElementById("appcontent")
);



// Добавлять новые СВ кнопки справа от этой кнопки ......................................................................................................
this._handleClick =()=> cbu.setPrefs(s, !cbu.getPrefs(s));


var observer = {
   observe: button=> {
      if ( !cbu.getPrefs(s) ) return;
      var toolbar = self.parentNode;
      toolbar.insertBefore(button, self.nextSibling);
      custombuttons.persistCurrentSets(toolbar.id, _id, button.id);

      if ( parseInt(Services.appinfo.version) < 43 ) return;

      function observer(subject, topic, data) {
         setTimeout(()=> Services.ww.unregisterNotification(observer), 500);
         subject.close();
      };
      Services.ww.registerNotification(observer);      
    }
};
var notificationPrefix = custombuttons.notificationPrefix + "installButton";
Services.obs.addObserver(observer, notificationPrefix, false);
addDestructor(()=> Services.obs.removeObserver(observer, notificationPrefix) );


var s = "CB.newButtonAtRightFromCurrent";
function toggleImage() self.style.filter = cbu.getPrefs(s) ? '' : 'grayscale(1)';  
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );

здрасти. в связи с возвратом на ФФ и почти полного допиливания этого субъекта появилось парочку вопросов. Уважаемые мастера, никак не могу заставить функционировать Save( Firefox 24 + ) от 07.03.2017. Конкретно - не могу сохранять ярлыки страниц, в смысле значки сайтов. при этом иконки и выделенный текст прекрасно сохраняются. это у меня руки кривые опять или же можно что-то подправить в коде? спс заранее :blush:

sonyas75
Подтверждаю не работает данный пункт меню.

broker пишет

"Переключаться на левую вкладку после закрытии текущей вкладки" посмотрите ато мозиловцы совсем все поломали:cry:.

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

Выделить код

Код:

// Переключаться на левую вкладку после закрытии текущей вкладки,  от 22.08.2013. ................................
 function tabCloseHandler(e) {
    var tab = e.target;
    if ( tab == gBrowser.mCurrentTab ) { 
         if ( !gBrowser.visibleTabs.length ) gBrowser.addTab("about:blank");
         else             
              if ( !tab.hasAttribute('first-visible-tab') ) { gBrowser.mTabContainer.advanceSelectedTab(-1,true) }; 
         }
 }
 addEventListener("TabClose", tabCloseHandler, true, gBrowser.tabContainer );

Ну, можно попробовать приглядеться
как себя поведёт такой, например, код

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

Выделить код

Код:

((tabs, flag) => {
    if (!tabs) return;
    addEventListener("TabSelect", () => flag = new Error().stack.includes(
        "\n_blurTab@chrome://browser/content/tabbrowser.xml:"
    ), false, tabs);
    addEventListener("TabClose", ({target: tab}) => {
        if (flag) while((tab = tab.previousSibling)) {
            if (tab.hidden || tab.closing) continue;
            if (!tab.selected) gBrowser.selectedTab = tab;
            break;
        }
    }, false, tabs);
})(gBrowser.tabContainer);

Поигрался с главным меню в Firefox 57. Добавил новое меню "Папки" в главное меню

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

Выделить код

Код:

// Добавить новый пункт "Папки" в главном меню от 28.11.2017. ......................

(function() {
var info1="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAkAAAAPAAAAFgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABYAAAAQAAAACgAAAAUAAAAOAAAAdAAAAH0AAACCAAAAggAAAIIAAACCAAAAggAAAIIAAACCAAAAggAAAIIAAAB9AAAAeAAAABAAAAAGKa3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/wAAAH0AAAAWAAAABymt1v947f7/g+7+/47w/v+V8f7/mvH+/5zy/v+a8f7/lfH+/47w/v+D7v7/eO3+/ymt1v8AAACCAAAAGQAAAAcprdb/cez+/3zu/v+G7/7/jvD+/5Lw/v+U8f7/kvD+/47w/v+G7/7/fO7+/3Hs/v8prdb/AAAAggAAABkAAAAHKa3W/2jr/v9y7P7/e+3+/4Hu/v+G7/7/h+/+/4bv/v+B7v7/e+3+/3Ls/v9o6/7/Ka3W/wAAAIIAAAAZAAAABymt1v9b6f7/ZOr+/2vr/v9x7P7/de3+/3bt/v917f7/cez+/2vr/v9k6v7/W+n+/ymt1v8AAACCAAAAGQAAAAcprdb/S+f+/1Lo/v9Z6f7/Xer+/2Dq/v9h6v7/YOr+/13q/v9Z6f7/Uuj+/0vn/v8prdb/AAAAggAAABkAAAAGKa3W/2Dp/f9l6v3/aer9/23r/v9u6/3/b+z+/27r/f9t6/7/aer9/2Xq/f9g6f3/Ka3W/wAAAH0AAAAWAAAABSmt1v9/7f3/ge7+/4Pu/f+F7v3/he7+/4bu/f+F7v7/he79/4Pu/f+B7v7/f+39/ymt1v8AAAB0AAAADwAAAAMprdb/pPL9/6Xy/v+m8v3/p/P+/6fz/v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/AAAADgAAAAkAAAABAAAABCmt1v/Q+P7/0Pj+/9D4/v8prdb/AAAAFQAAAA0AAAAIAAAABgAAAAYAAAAGAAAABQAAAAQAAAADAAAAAAAAAAEAAAAEKa3W/ymt1v8prdb/AAAADwAAAAkAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAEAAAABQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AADAfwAA//8AAA==";
var info2="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjVJivzgAAACwElEQVQ4T7VUX0hTcRRWCV+0i5lRiRhqRbCEULSZ/5qa021ddd1td3Nuu9P5Z+ZmuimSGRVWD4H1EpFPIT1IEPQYBtWLEaXMHqSyh9CiOVqmoj2eft9tDnMJ9dCFH+d+3/nOdw/n/La4uP/9fPiydJid/E0n56+/yYp2RwwSYJCUnDKTtCeTOC51KmIIHh9I3dYUQre316QsLr0QeD9fAJylyCOVzkiIwOCR9/oHDMAxZugEJty+A+vph3IpLT37SWBuoUBZUUuCvZ0QgcEjz+3NXPcNDOlZXcpvZozIqak3Dh49XkbVDRYqrNBQoap2tuaMlcwtXYQIDB55RWEpaepNA6wuK6arz+HVKqHRMaERGknf5CKt0U4awRI9wOCRN1gdjz+FVyu3dhPdTnBprc7sbJ8VbG102mhdHBt/OBxe/dGKCCzYWsnS0vEGupht/tpO6sz+gwo6VlJJvEUiXrTT3Xv3Ly18XSli+XhEYPA6UZJ10HNcmrxNuTO85OTmk84skYnNw9HlJ53RSs9eBtQslxjRJAKDRx466LNZXaSzeNmoXK2dPsUL1NDoJLu7hxqamkmU2rojop2IwODlPNNBX16tmd7cUUZoed2IWcwvht0uj29O6vJRBW8I1+jFvmu37mgRgR1nfeTy+N8Fv620Q486ZpQRHToDOyYDb5X5xaqnpmY3dfYPkeTxk97mIrXBKkdg8CZnB+UVn5TvGatL2Lq5I0Uq9ZUSNU9Obx85Os9Rz+DlqQ7/IPUP3yBEYPCS108nqjRUqdX34/5tNeJGx8btZWrtUp1oI1dn90Roec1gd3vp/PURNhcvAYNHHrqxB49EZpQccyE/hpaVz1+87r55e3Rk457wZhv1XrxKiBgqeOQnXwU80G/7w2XCXewoNq4FL4jTdWITIW5sB/ng9zXuX/5SotuM2c4fXH4C3BQJxGxDNfsAAAAASUVORK5CYII=";
var info3="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA25JREFUeNosU1toHFUY/s6ZM7szuzs72e4t1zVGrZEoRBOQUo1W0QpSKIKXBymKmPrgQ9EKaV4EH4w+CH2Qgn0Q8fbSSrFQ8RJtaQm1thVrSwJtitnGbDbJZm+zO/eZ48zggZ/znfNfz3++n3DOceu1/EkAc/d9sXV18uDxycGVP9/sS3WmLuemCsE9XMddcW2nDI5TUkr+Kry78tl0uIH8H4CHhyN3nv9QU4uvfKp+PnLthgbt5HZkVK21ceG3RSzfXMPkP9//fED54QPHNBdCHf1IEl4NQWbEx1zpzGzoHGLb9rDVdVHrOLDAkOwrIG63MHtAe9aW0vPqUPalKEBCEZ6kqhBlyj+sInUvi7Bp+ci9sAPfjWehcwKiSAAT4Q7fhfGXxyTdpMfzY4VemkyTCTFFfaZm4No+PJ3Cs4DHd+2I5BEV2NBcOIIIW5Dw43UVudEiMgOyamnOEZrKkP644tMordEGNzlss4jcc2/gwsU61r/dRKvtYbtiwA8qWFy20Wq5GJjIwtWMPSye9NOgXuRvWwTCWCnCTFyEGAe2VuvgnSY6lQo8X8DVJQo5sKcZCZbujTImO3H4gOA38Nd5HbVvrsCNR5+Cw4PvQz53HowJIKYG2xMw3KOjJ11H0zDg2S6jgarTWHPgBNkffExGXvGhKMA7hRlQScbRzhzmkl/D6nThGl08MXgHaNRhlzfAYkRn1MKv1WV7f2GAIaVS5EoxFAnB2cQxJCUXbV/G3/Nn4d39NMR2GQfHl2BVbWxfqwcM868zFzhhNqy96zeZ3LczhtKEgtYax2a1i3LZQ72pYyY7g9ftE9i3T0dWsNC81UT5Ng0qLP5CTu9FAjpZSLD4+OijEmKSAMsIxBRx+VIL6FWQIF2UCg6Gh+MwAlKt39YCksntnmz+/pA1uhnjb7UN6zT+4IXSAxIU1UfQXOx+Kg5GTDgmgRsE1DY86NRBXXPNpZr29j31ZjWi3Yvz/NKhh8j0Tss+Ztxw+9UYQyYdtJcScJGAMgLPc1AzOBoG9DMr/qH9JR4NVfiEaDWsIcmudvbobutoKo3BbJonaIyDhEpOYYPamxVsi7TnPTErn8rEV/UowEgiMsHC/E/o3fUM3h1i/UGfdkscUyLQF85LwOx/LUp+92P83CerbmX5y48xfXgWawFr/xNgANPvgmYH0Mg8AAAAAElFTkSuQmCC";
var info4="chrome://global/skin/dirListing/folder.png";   
var info5="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg==";

//Добавить подменю "Папки"
    var menuItem = document.createElement("panelview");
    menuItem.setAttribute("id", "appMenu-Folders");               
    menuItem.setAttribute("title", "Папки");
    menuItem.setAttribute("class", "PanelUI-subView");
    var it = document.getElementById("PanelUI-bookmarkingTools");
    it.parentNode.insertBefore(menuItem, it);  
//Добавить новый пункт "Папки" в главном меню  
    var menuItem1 = document.createElement("toolbarbutton");
    menuItem1.setAttribute("id", "Folders-menu");               
    menuItem1.setAttribute("label", "Папки");
    menuItem1.setAttribute("closemenu", "none");
    menuItem1.setAttribute("class", "subviewbutton subviewbutton-nav");
    menuItem1.setAttribute("image", info1 );
    menuItem1.setAttribute("oncommand", "PanelUI.showSubView('appMenu-Folders', this)");   
    var it = document.getElementById("appMenu-more-button");
    it.parentNode.insertBefore(menuItem1, it);
//Добавить пункты подменю "Папки"  
    var menuItem2 = document.createElement("toolbarbutton");
    menuItem2.setAttribute("id", "Folders2");
    menuItem2.setAttribute("label", "Текущий профиль");
    menuItem2.setAttribute("class", "subviewbutton");
    menuItem2.setAttribute("image", info2);
    menuItem2.addEventListener("command", Folders2, false);
    menuItem.insertBefore(menuItem2, null);
    
    var menuItem3 = document.createElement("toolbarbutton");
    menuItem3.setAttribute("id", "Folders3");
    menuItem3.setAttribute("label", "Папка Firefox");
    menuItem3.setAttribute("class", "subviewbutton");
    menuItem3.setAttribute("image", info3);
    menuItem3.addEventListener("command", Folders3, false);
    menuItem.insertBefore(menuItem3, null);
    
    var menuItem4 = document.createElement("toolbarbutton");
    menuItem4.setAttribute("id", "Folders4");
    menuItem4.setAttribute("label", "Папка Chrome");
    menuItem4.setAttribute("class", "subviewbutton");
    menuItem4.setAttribute("image", info4);
    menuItem4.addEventListener("command", Folders4, false);
    menuItem.insertBefore(menuItem4, null);
 
    var menuItem5 = document.createElement("toolbarbutton");
    menuItem5.setAttribute("id", "Folders5");
    menuItem5.setAttribute("label", "Папка Extensions");
    menuItem5.setAttribute("class", "subviewbutton");
    menuItem5.setAttribute("image", info5);
    menuItem5.addEventListener("command", Folders5, false);
    menuItem.insertBefore(menuItem5, null);
 
//----------Текущий профиль------------   
function Folders2(){
var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("ProfD", Components.interfaces.nsIFile);
    file.launch();  
}

 //----------Папка Firefox------------
function Folders3(){
var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("GreD", Components.interfaces.nsIFile);
    file.launch();   
}

//----------Папка Chrome------------
function Folders4(){
 var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("ProfD", Components.interfaces.nsIFile);
    file.append("chrome");
    file.launch();   
}

//-----------Папка Extensions-------------
function Folders5(){
var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("ProfD", Components.interfaces.nsIFile);
    file.append("extensions");
    file.launch();       
}

 })();


Вопрос к знающим людям. Как можно сократить код? Или как по другому добавлять в главное меню - новые пункты с подменю?

Dumby
Кнопка работает но есть одно но, после закрытия текущей вкладки, грузится левая и правая одновременно но фокус на левой.

About: (Firefox24+) от 13.01.2015

При нажатии ПКМ по этой кнопке происходит наложение контекстного меню расширения Custom Buttons и самой кнопки (на скриншоте видно). bunda1, посмотрите, пожалуйста - может, чего можно подправить. Версия Сustom Buttons 0.0.5.8.9-fixed5-signed

19615824_s.png

Viatcheslav пишет

При нажатии ПКМ по этой кнопке происходит наложение контекстного меню расширения Custom Buttons и самой кнопки (на скриншоте видно). bunda1, посмотрите, пожалуйста - может, чего можно подправить. Версия Сustom Buttons 0.0.5.8.9-fixed5-signed

About

На FF57 перестали работать:
Экспорт/импорт закладок в HTML-файл
Кодировать изображение или текстовой файл в base64
Save snapshot to html

Если возможно, то поправьте пожалуйста.

broker пишет

после закрытия текущей вкладки, грузится левая и правая одновременно

Да, вижу такое. Тут, наверно, без переопределения _blurTab не обойтись.
Если загрузка вкладки справа беспокоит, то попробуй
заменить тот код на этот, и понаблюдать уже за ним.

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

Выделить код

Код:

(bt => addDestructor(() => gBrowser._blurTab = bt) || eval(
    ("gBrowser._blurTab = " + bt)
        .replace(/if \(a[^}]+}/, "")
        .replace("previousSibling", "nextSibling")
        .replace("nextSibling", "previousSibling")
))(gBrowser._blurTab);

Andrey_Krropotkin пишет

Поигрался с главным меню в Firefox 57. Добавил новое меню "Папки" в главное меню

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

Выделить код

Код:

// Добавить новый пункт "Папки" в главном меню от 28.11.2017. ......................

(function() {
var info1="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAkAAAAPAAAAFgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABYAAAAQAAAACgAAAAUAAAAOAAAAdAAAAH0AAACCAAAAggAAAIIAAACCAAAAggAAAIIAAACCAAAAggAAAIIAAAB9AAAAeAAAABAAAAAGKa3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/wAAAH0AAAAWAAAABymt1v947f7/g+7+/47w/v+V8f7/mvH+/5zy/v+a8f7/lfH+/47w/v+D7v7/eO3+/ymt1v8AAACCAAAAGQAAAAcprdb/cez+/3zu/v+G7/7/jvD+/5Lw/v+U8f7/kvD+/47w/v+G7/7/fO7+/3Hs/v8prdb/AAAAggAAABkAAAAHKa3W/2jr/v9y7P7/e+3+/4Hu/v+G7/7/h+/+/4bv/v+B7v7/e+3+/3Ls/v9o6/7/Ka3W/wAAAIIAAAAZAAAABymt1v9b6f7/ZOr+/2vr/v9x7P7/de3+/3bt/v917f7/cez+/2vr/v9k6v7/W+n+/ymt1v8AAACCAAAAGQAAAAcprdb/S+f+/1Lo/v9Z6f7/Xer+/2Dq/v9h6v7/YOr+/13q/v9Z6f7/Uuj+/0vn/v8prdb/AAAAggAAABkAAAAGKa3W/2Dp/f9l6v3/aer9/23r/v9u6/3/b+z+/27r/f9t6/7/aer9/2Xq/f9g6f3/Ka3W/wAAAH0AAAAWAAAABSmt1v9/7f3/ge7+/4Pu/f+F7v3/he7+/4bu/f+F7v7/he79/4Pu/f+B7v7/f+39/ymt1v8AAAB0AAAADwAAAAMprdb/pPL9/6Xy/v+m8v3/p/P+/6fz/v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/AAAADgAAAAkAAAABAAAABCmt1v/Q+P7/0Pj+/9D4/v8prdb/AAAAFQAAAA0AAAAIAAAABgAAAAYAAAAGAAAABQAAAAQAAAADAAAAAAAAAAEAAAAEKa3W/ymt1v8prdb/AAAADwAAAAkAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAEAAAABQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AADAfwAA//8AAA==";
var info2="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjVJivzgAAACwElEQVQ4T7VUX0hTcRRWCV+0i5lRiRhqRbCEULSZ/5qa021ddd1td3Nuu9P5Z+ZmuimSGRVWD4H1EpFPIT1IEPQYBtWLEaXMHqSyh9CiOVqmoj2eft9tDnMJ9dCFH+d+3/nOdw/n/La4uP/9fPiydJid/E0n56+/yYp2RwwSYJCUnDKTtCeTOC51KmIIHh9I3dYUQre316QsLr0QeD9fAJylyCOVzkiIwOCR9/oHDMAxZugEJty+A+vph3IpLT37SWBuoUBZUUuCvZ0QgcEjz+3NXPcNDOlZXcpvZozIqak3Dh49XkbVDRYqrNBQoap2tuaMlcwtXYQIDB55RWEpaepNA6wuK6arz+HVKqHRMaERGknf5CKt0U4awRI9wOCRN1gdjz+FVyu3dhPdTnBprc7sbJ8VbG102mhdHBt/OBxe/dGKCCzYWsnS0vEGupht/tpO6sz+gwo6VlJJvEUiXrTT3Xv3Ly18XSli+XhEYPA6UZJ10HNcmrxNuTO85OTmk84skYnNw9HlJ53RSs9eBtQslxjRJAKDRx466LNZXaSzeNmoXK2dPsUL1NDoJLu7hxqamkmU2rojop2IwODlPNNBX16tmd7cUUZoed2IWcwvht0uj29O6vJRBW8I1+jFvmu37mgRgR1nfeTy+N8Fv620Q486ZpQRHToDOyYDb5X5xaqnpmY3dfYPkeTxk97mIrXBKkdg8CZnB+UVn5TvGatL2Lq5I0Uq9ZUSNU9Obx85Os9Rz+DlqQ7/IPUP3yBEYPCS108nqjRUqdX34/5tNeJGx8btZWrtUp1oI1dn90Roec1gd3vp/PURNhcvAYNHHrqxB49EZpQccyE/hpaVz1+87r55e3Rk457wZhv1XrxKiBgqeOQnXwU80G/7w2XCXewoNq4FL4jTdWITIW5sB/ng9zXuX/5SotuM2c4fXH4C3BQJxGxDNfsAAAAASUVORK5CYII=";
var info3="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA25JREFUeNosU1toHFUY/s6ZM7szuzs72e4t1zVGrZEoRBOQUo1W0QpSKIKXBymKmPrgQ9EKaV4EH4w+CH2Qgn0Q8fbSSrFQ8RJtaQm1thVrSwJtitnGbDbJZm+zO/eZ48zggZ/znfNfz3++n3DOceu1/EkAc/d9sXV18uDxycGVP9/sS3WmLuemCsE9XMddcW2nDI5TUkr+Kry78tl0uIH8H4CHhyN3nv9QU4uvfKp+PnLthgbt5HZkVK21ceG3RSzfXMPkP9//fED54QPHNBdCHf1IEl4NQWbEx1zpzGzoHGLb9rDVdVHrOLDAkOwrIG63MHtAe9aW0vPqUPalKEBCEZ6kqhBlyj+sInUvi7Bp+ci9sAPfjWehcwKiSAAT4Q7fhfGXxyTdpMfzY4VemkyTCTFFfaZm4No+PJ3Cs4DHd+2I5BEV2NBcOIIIW5Dw43UVudEiMgOyamnOEZrKkP644tMordEGNzlss4jcc2/gwsU61r/dRKvtYbtiwA8qWFy20Wq5GJjIwtWMPSye9NOgXuRvWwTCWCnCTFyEGAe2VuvgnSY6lQo8X8DVJQo5sKcZCZbujTImO3H4gOA38Nd5HbVvrsCNR5+Cw4PvQz53HowJIKYG2xMw3KOjJ11H0zDg2S6jgarTWHPgBNkffExGXvGhKMA7hRlQScbRzhzmkl/D6nThGl08MXgHaNRhlzfAYkRn1MKv1WV7f2GAIaVS5EoxFAnB2cQxJCUXbV/G3/Nn4d39NMR2GQfHl2BVbWxfqwcM868zFzhhNqy96zeZ3LczhtKEgtYax2a1i3LZQ72pYyY7g9ftE9i3T0dWsNC81UT5Ng0qLP5CTu9FAjpZSLD4+OijEmKSAMsIxBRx+VIL6FWQIF2UCg6Gh+MwAlKt39YCksntnmz+/pA1uhnjb7UN6zT+4IXSAxIU1UfQXOx+Kg5GTDgmgRsE1DY86NRBXXPNpZr29j31ZjWi3Yvz/NKhh8j0Tss+Ztxw+9UYQyYdtJcScJGAMgLPc1AzOBoG9DMr/qH9JR4NVfiEaDWsIcmudvbobutoKo3BbJonaIyDhEpOYYPamxVsi7TnPTErn8rEV/UowEgiMsHC/E/o3fUM3h1i/UGfdkscUyLQF85LwOx/LUp+92P83CerbmX5y48xfXgWawFr/xNgANPvgmYH0Mg8AAAAAElFTkSuQmCC";
var info4="chrome://global/skin/dirListing/folder.png";   
var info5="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg==";

//Добавить подменю "Папки"
    var menuItem = document.createElement("panelview");
    menuItem.setAttribute("id", "appMenu-Folders");               
    menuItem.setAttribute("title", "Папки");
    menuItem.setAttribute("class", "PanelUI-subView");
    var it = document.getElementById("PanelUI-bookmarkingTools");
    it.parentNode.insertBefore(menuItem, it);  
//Добавить новый пункт "Папки" в главном меню  
    var menuItem1 = document.createElement("toolbarbutton");
    menuItem1.setAttribute("id", "Folders-menu");               
    menuItem1.setAttribute("label", "Папки");
    menuItem1.setAttribute("closemenu", "none");
    menuItem1.setAttribute("class", "subviewbutton subviewbutton-nav");
    menuItem1.setAttribute("image", info1 );
    menuItem1.setAttribute("oncommand", "PanelUI.showSubView('appMenu-Folders', this)");   
    var it = document.getElementById("appMenu-more-button");
    it.parentNode.insertBefore(menuItem1, it);
//Добавить пункты подменю "Папки"  
    var menuItem2 = document.createElement("toolbarbutton");
    menuItem2.setAttribute("id", "Folders2");
    menuItem2.setAttribute("label", "Текущий профиль");
    menuItem2.setAttribute("class", "subviewbutton");
    menuItem2.setAttribute("image", info2);
    menuItem2.addEventListener("command", Folders2, false);
    menuItem.insertBefore(menuItem2, null);
    
    var menuItem3 = document.createElement("toolbarbutton");
    menuItem3.setAttribute("id", "Folders3");
    menuItem3.setAttribute("label", "Папка Firefox");
    menuItem3.setAttribute("class", "subviewbutton");
    menuItem3.setAttribute("image", info3);
    menuItem3.addEventListener("command", Folders3, false);
    menuItem.insertBefore(menuItem3, null);
    
    var menuItem4 = document.createElement("toolbarbutton");
    menuItem4.setAttribute("id", "Folders4");
    menuItem4.setAttribute("label", "Папка Chrome");
    menuItem4.setAttribute("class", "subviewbutton");
    menuItem4.setAttribute("image", info4);
    menuItem4.addEventListener("command", Folders4, false);
    menuItem.insertBefore(menuItem4, null);
 
    var menuItem5 = document.createElement("toolbarbutton");
    menuItem5.setAttribute("id", "Folders5");
    menuItem5.setAttribute("label", "Папка Extensions");
    menuItem5.setAttribute("class", "subviewbutton");
    menuItem5.setAttribute("image", info5);
    menuItem5.addEventListener("command", Folders5, false);
    menuItem.insertBefore(menuItem5, null);
 
//----------Текущий профиль------------   
function Folders2(){
var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("ProfD", Components.interfaces.nsIFile);
    file.launch();  
}

 //----------Папка Firefox------------
function Folders3(){
var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("GreD", Components.interfaces.nsIFile);
    file.launch();   
}

//----------Папка Chrome------------
function Folders4(){
 var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("ProfD", Components.interfaces.nsIFile);
    file.append("chrome");
    file.launch();   
}

//-----------Папка Extensions-------------
function Folders5(){
var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("ProfD", Components.interfaces.nsIFile);
    file.append("extensions");
    file.launch();       
}

 })();

Ну, так-то, хорошая работа.
Только меню "Папки" будет дублироваться при переинициализации кнопки.

Как можно сократить код?

Да как угодно. Пережать код можно вплоть до полной потери человекочитаемости.
Это всё весьма субъективно и зависит от предпочтений и привычек.
Вот, например, лишь слегка

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

Выделить код

Код:

(n => {
    // Добавить новый пункт "Папки" в главном меню
    var btn = n({
        id:        "Folders-menu",
        label:     "Папки",
        closemenu: "none",
        class:     "subviewbutton subviewbutton-nav",
        image:     "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAkAAAAPAAAAFgAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABYAAAAQAAAACgAAAAUAAAAOAAAAdAAAAH0AAACCAAAAggAAAIIAAACCAAAAggAAAIIAAACCAAAAggAAAIIAAAB9AAAAeAAAABAAAAAGKa3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/Ka3W/wAAAH0AAAAWAAAABymt1v947f7/g+7+/47w/v+V8f7/mvH+/5zy/v+a8f7/lfH+/47w/v+D7v7/eO3+/ymt1v8AAACCAAAAGQAAAAcprdb/cez+/3zu/v+G7/7/jvD+/5Lw/v+U8f7/kvD+/47w/v+G7/7/fO7+/3Hs/v8prdb/AAAAggAAABkAAAAHKa3W/2jr/v9y7P7/e+3+/4Hu/v+G7/7/h+/+/4bv/v+B7v7/e+3+/3Ls/v9o6/7/Ka3W/wAAAIIAAAAZAAAABymt1v9b6f7/ZOr+/2vr/v9x7P7/de3+/3bt/v917f7/cez+/2vr/v9k6v7/W+n+/ymt1v8AAACCAAAAGQAAAAcprdb/S+f+/1Lo/v9Z6f7/Xer+/2Dq/v9h6v7/YOr+/13q/v9Z6f7/Uuj+/0vn/v8prdb/AAAAggAAABkAAAAGKa3W/2Dp/f9l6v3/aer9/23r/v9u6/3/b+z+/27r/f9t6/7/aer9/2Xq/f9g6f3/Ka3W/wAAAH0AAAAWAAAABSmt1v9/7f3/ge7+/4Pu/f+F7v3/he7+/4bu/f+F7v7/he79/4Pu/f+B7v7/f+39/ymt1v8AAAB0AAAADwAAAAMprdb/pPL9/6Xy/v+m8v3/p/P+/6fz/v8prdb/Ka3W/ymt1v8prdb/Ka3W/ymt1v8prdb/AAAADgAAAAkAAAABAAAABCmt1v/Q+P7/0Pj+/9D4/v8prdb/AAAAFQAAAA0AAAAIAAAABgAAAAYAAAAGAAAABQAAAAQAAAADAAAAAAAAAAEAAAAEKa3W/ymt1v8prdb/AAAADwAAAAkAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAEAAAABQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AADAfwAA//8AAA==",
        oncommand: "PanelUI.showSubView('appMenu-Folders', this)"
    }, null, document.getElementById("appMenu-more-button"));

    // Добавить подменю "Папки"
    var panelview = n({
        id:        "appMenu-Folders",
        title:     "Папки",
        class:     "PanelUI-subView",
        oncommand: "this.launch(event);"
    }, null, document.getElementById("PanelUI-bookmarkingTools"), "panelview");

    var pmw = panelview.panelMultiView;
    if (pmw) pmw._panelViews.push(panelview);
    addDestructor(() => {
        var pmv = panelview.panelMultiView;
        if (pmv) {
            var arr = pmv._panelViews;
            var ind = arr.indexOf(panelview);
            if (ind != -1) {
                arr.splice(ind, 1);
                arr.currentView = pmv._mainView;
            }
        }
        btn.remove(); panelview.remove();
    });
    panelview.launch = e => {
        if (e.target == panelview) return;
        var [root, ...sub] = e.target.data;
        var file = Services.dirsvc.get(root, Ci.nsIFile);
        sub.length && sub.forEach(file.append);
        file.exists() && file.isDirectory() ? file.launch() : alert(
            "Folder not found.\n\n" + file.path
        );
    }

    // Добавить пункты подменю "Папки"
    n({
        id:    "Folders2",
        label: "Текущий профиль",
        image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjVJivzgAAACwElEQVQ4T7VUX0hTcRRWCV+0i5lRiRhqRbCEULSZ/5qa021ddd1td3Nuu9P5Z+ZmuimSGRVWD4H1EpFPIT1IEPQYBtWLEaXMHqSyh9CiOVqmoj2eft9tDnMJ9dCFH+d+3/nOdw/n/La4uP/9fPiydJid/E0n56+/yYp2RwwSYJCUnDKTtCeTOC51KmIIHh9I3dYUQre316QsLr0QeD9fAJylyCOVzkiIwOCR9/oHDMAxZugEJty+A+vph3IpLT37SWBuoUBZUUuCvZ0QgcEjz+3NXPcNDOlZXcpvZozIqak3Dh49XkbVDRYqrNBQoap2tuaMlcwtXYQIDB55RWEpaepNA6wuK6arz+HVKqHRMaERGknf5CKt0U4awRI9wOCRN1gdjz+FVyu3dhPdTnBprc7sbJ8VbG102mhdHBt/OBxe/dGKCCzYWsnS0vEGupht/tpO6sz+gwo6VlJJvEUiXrTT3Xv3Ly18XSli+XhEYPA6UZJ10HNcmrxNuTO85OTmk84skYnNw9HlJ53RSs9eBtQslxjRJAKDRx466LNZXaSzeNmoXK2dPsUL1NDoJLu7hxqamkmU2rojop2IwODlPNNBX16tmd7cUUZoed2IWcwvht0uj29O6vJRBW8I1+jFvmu37mgRgR1nfeTy+N8Fv620Q486ZpQRHToDOyYDb5X5xaqnpmY3dfYPkeTxk97mIrXBKkdg8CZnB+UVn5TvGatL2Lq5I0Uq9ZUSNU9Obx85Os9Rz+DlqQ7/IPUP3yBEYPCS108nqjRUqdX34/5tNeJGx8btZWrtUp1oI1dn90Roec1gd3vp/PURNhcvAYNHHrqxB49EZpQccyE/hpaVz1+87r55e3Rk457wZhv1XrxKiBgqeOQnXwU80G/7w2XCXewoNq4FL4jTdWITIW5sB/ng9zXuX/5SotuM2c4fXH4C3BQJxGxDNfsAAAAASUVORK5CYII=",
    }, panelview)
        .data = ["ProfD"];
    n({
        id:    "Folders3",
        label: "Папка Firefox",
        image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA25JREFUeNosU1toHFUY/s6ZM7szuzs72e4t1zVGrZEoRBOQUo1W0QpSKIKXBymKmPrgQ9EKaV4EH4w+CH2Qgn0Q8fbSSrFQ8RJtaQm1thVrSwJtitnGbDbJZm+zO/eZ48zggZ/znfNfz3++n3DOceu1/EkAc/d9sXV18uDxycGVP9/sS3WmLuemCsE9XMddcW2nDI5TUkr+Kry78tl0uIH8H4CHhyN3nv9QU4uvfKp+PnLthgbt5HZkVK21ceG3RSzfXMPkP9//fED54QPHNBdCHf1IEl4NQWbEx1zpzGzoHGLb9rDVdVHrOLDAkOwrIG63MHtAe9aW0vPqUPalKEBCEZ6kqhBlyj+sInUvi7Bp+ci9sAPfjWehcwKiSAAT4Q7fhfGXxyTdpMfzY4VemkyTCTFFfaZm4No+PJ3Cs4DHd+2I5BEV2NBcOIIIW5Dw43UVudEiMgOyamnOEZrKkP644tMordEGNzlss4jcc2/gwsU61r/dRKvtYbtiwA8qWFy20Wq5GJjIwtWMPSye9NOgXuRvWwTCWCnCTFyEGAe2VuvgnSY6lQo8X8DVJQo5sKcZCZbujTImO3H4gOA38Nd5HbVvrsCNR5+Cw4PvQz53HowJIKYG2xMw3KOjJ11H0zDg2S6jgarTWHPgBNkffExGXvGhKMA7hRlQScbRzhzmkl/D6nThGl08MXgHaNRhlzfAYkRn1MKv1WV7f2GAIaVS5EoxFAnB2cQxJCUXbV/G3/Nn4d39NMR2GQfHl2BVbWxfqwcM868zFzhhNqy96zeZ3LczhtKEgtYax2a1i3LZQ72pYyY7g9ftE9i3T0dWsNC81UT5Ng0qLP5CTu9FAjpZSLD4+OijEmKSAMsIxBRx+VIL6FWQIF2UCg6Gh+MwAlKt39YCksntnmz+/pA1uhnjb7UN6zT+4IXSAxIU1UfQXOx+Kg5GTDgmgRsE1DY86NRBXXPNpZr29j31ZjWi3Yvz/NKhh8j0Tss+Ztxw+9UYQyYdtJcScJGAMgLPc1AzOBoG9DMr/qH9JR4NVfiEaDWsIcmudvbobutoKo3BbJonaIyDhEpOYYPamxVsi7TnPTErn8rEV/UowEgiMsHC/E/o3fUM3h1i/UGfdkscUyLQF85LwOx/LUp+92P83CerbmX5y48xfXgWawFr/xNgANPvgmYH0Mg8AAAAAElFTkSuQmCC",
    }, panelview)
        .data = ["GreD"];
    n({
        id:    "Folders4",
        label: "Папка Chrome",
        image: "chrome://global/skin/dirListing/folder.png",
    }, panelview)
        .data = ["UChrm"];
    n({
        id:    "Folders5",
        label: "Папка Extensions",
        image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg==",
    }, panelview)
        .data = ["ProfD", "extensions"];

})((attrs, parent, before, name = "toolbarbutton") => {
    var node = (parent || before.parentNode)
        .insertBefore(document.createElement(name), before);
    for(var name in attrs) node.setAttribute(name, attrs[name]);
    if (!node.className) node.className = "subviewbutton";
    return node;
});

Dumby спасибо. Переинициализацию кнопки я уже подправил. Но ваш код намного приятнее глазу.

Привет.
Подскажите, убрать ошибку из кнопки. Переделал, чуть, кнопку для автозакрытия Sidebar :

Выделить код

Код:

(function() {    this.clickPageSB = function(event) {gBrowser.addEventListener('mousedown',on, false);   };

    function go() {
            clickPageSB(event);
            toggleSidebar();
      }

   function on() {   gBrowser.removeEventListener('mousedown',on, false);     timeoutId = setTimeout(go, 1000)   }
   function off() {   clickPageSB(event);     clearTimeout(timeoutId)   }
   sidebar.addEventListener('click',off, false);
     clickPageSB(event);
 })();

работает, закрывает бок.панель как и хотелось, но постоянно при клике на страницах(после закрытия бок.панели) ошибка в консоли:

Выделить код

Код:

Метка времени: 29.11.2017 20:58:40
Ошибка: TypeError: sidebarBroadcaster is null
Источник: chrome://browser/content/browser.js
Строка: 11170

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

Dumby

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

Теперь работает, спасибо.:D

unter_officer пишет

На FF57 перестали работать:
Экспорт/импорт закладок в HTML-файл
Кодировать изображение или текстовой файл в base64
Save snapshot to html

Если возможно, то поправьте пожалуйста.

Вот, поправленная gyra, кнопка Save snapshot to html для FF57 .

rubel, огромное спасибо. Отлично работает.

Теперь поправил бы кто оставшиеся две кнопочки:
Экспорт/импорт закладок в HTML-файл
Кодировать изображение или текстовой файл в base64

Viatcheslav пишет

About: (Firefox24+) от 13.01.2015

При нажатии ПКМ по этой кнопке происходит наложение контекстного меню расширения Custom Buttons и самой кнопки (на скриншоте видно). bunda1, посмотрите, пожалуйста - может, чего можно подправить. Версия Сustom Buttons 0.0.5.8.9-fixed5-signed

http://images.vfl.ru/ii/1511955622/08ff … 5824_s.png

можно и этой кнопкой обойтись

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESidebar%20Sites%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAiEAAAIhAENVwL6AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAHqSURBVHjarJM9aBVBFIW/s2wkgmDnDxoUgoJWokXERlEbf5pY2AhCCkWUgCaNvs3b2Z335lmZoETRINhKLPxD0CZgI0GtLFQUG8FGmxSBmBRzbSYSJE2IB4b5u/cMc+65MjOWYsT57cAVM9sL7AIi8EnSuxjjWKdV/Vgar0WCRrPqknQDuAB0AR+BsbS+DOwEfku6GWNsdFpV/EvQaFa5pElJ+8xsFlhrZn2dVvUrkW+R9Bb4CWyW9CrGONBpVTEHkDQK9JvZHNADzEv6WpQ16R6gG9gELJjZ2SzLvgNNXRtx2yR9AS5JOmJmfcAQy+Me8Bz4AFw3s95cUi8wHLy7X5T1LPA4ePdkueyirNcDM8G7p0VZr5G0Q41mdTB497oo6/3Bu+mirA+b2beUEwGyLMuTXj0p9kDw7k1R1kfVaFYvgUfA3VSBfqANXAUMyNPsgQ7wEJgAzgOnMuA2MJ4O7gCjwbtpYKOkBUDAuuDd+/TIOHBxMTYzsxfAieDdA+BY8G4qKT8QYxyWNCjpHICZPQOOB+8mgJPBu6lc0iFgNzAFbCjK+nTwbrJdl5//FVHSGWAmbfcUZT2/6jLKzCjK+hYwCMwlw8ynsRTdydYLQLekdrsum3n625CkrSuw8mSM0f2/ZlpNO/8ZAGBFAEu2Gqq+AAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.onclick%20%3De%3D%3E%20%7B%0A%20%20if%20%28e.target%20%21%3D%20this%29%20return%3B%0A%20%20let%20clipboard%20%3D%20gClipboard.read%28%29%3B%0A%20%20if%20%28e.button%20%3D%3D%200%29%0A%20%20%20%20menuPopup.openPopup%28this%2C%20%27after_start%27%29%3B%0A%20%20if%20%28e.button%20%3D%3D%201%29%0A%20%20%20%20openWebPanel%28clipboard%2C%20clipboard%29%3B%0A%20%20if%20%28e.button%20%3D%3D%202%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%29%20%7B%0A%20%20%20%20e.preventDefault%28%29%3B%20e.stopPropagation%28%29%3B%0A%20%20%20%20openWebPanel%28window.content.document.title%2C%20window.content.document.location%29%0A%20%20%7D%0A%7D%0Athis.tooltipText%20%3D%20%27%u041B%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u0441%u043E%20%u0441%u043F%u0438%u0441%u043A%u043E%u043C%20%u0437%u0430%u0434%u0430%u043D%u043D%u044B%u0445%20%u0430%u0434%u0440%u0435%u0441%u043E%u0432%5Cn%5C%u0421%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%5Cn%5C%u041F%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%27%3B%0A%0Avar%20menuPopup%20%3D%20createNode%28%22menupopup%22%2C%20self%2C%20false%2C%20%7Bcontext%3A%20%22%22%7D%29%2C%0A%20%20%20%20sbBox%20%3D%20SidebarUI._box%2C%0A%20%20%20%20sbClsBtn%20%3D%20sbBox.querySelector%28%22.close-icon.tabbable%22%29%2C%0A%20%20%20%20wps%20%3D%20%22SidebarUI.browser.contentDocument.querySelector%28%27browser%23web-panels-browser%27%29.%22%2C%0A%20%20%20%20sep%20%3D%20%22%5Cn%5Cn%22%2C%0A%20%20%20%20help%20%3D%20self.Help.trim%28%29%2C%0A%20%20%20%20items%20%3D%20help%0A%20%20%20%20%20%20%3F%20help.split%28sep%29%0A%20%20%20%20%20%20%3A%20%5B%22New%20Tab%5Cnabout%3Anewtab%5Cnchrome%3A//mozapps/skin/places/defaultFavicon.png%22%5D%2C%0A%20%20%20%20menugroup%20%3D%20createNode%28%22menugroup%22%2C%20menuPopup%2C%20false%2C%20%7B%0A%20%20%20%20%20%20orient%3A%20%22vertical%22%2C%0A%20%20%20%20%20%20oncommand%3A%20%22openPage%28event.target%29%3B%22%2C%0A%20%20%20%20%20%20oncontextmenu%3A%20%22removePage%28event.target%29%3B%22%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20cnMenu%20%3D%20document.getElementById%28%22contentAreaContextMenu%22%29%2C%0A%20%20%20%20cnOpen%20%3D%20document.getElementById%28%22context-sep-open%22%29%2C%0A%20%20%20%20cnItem%20%3D%20createNode%28%22menuitem%22%2C%20cnOpen%2C%20true%2C%20%7B%0A%20%20%20%20%20%20id%3A%20%22open-in-sidebar%22%2C%0A%20%20%20%20%20%20label%3A%20%22Open%20in%20Sidebar%22%2C%0A%20%20%20%20%20%20oncommand%3A%20%22openWebPanel%28gContextMenu.getLinkURL%28%29%2C%20gContextMenu.getLinkURL%28%29%29%3B%20document.getElementById%28%27verticaltoolbar-button%27%29.click%28%29%3B%22%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20cnListener%20%3D%20cnMenu.addEventListener%28%22popupshowing%22%2C%20%28%29%3D%3E%20cnItem.hidden%20%3D%20%21gContextMenu.onLink%29%2C%0A%20%20%20%20cnDestructor%20%3D%20addDestructor%28%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20cnMenu.removeEventListener%28%22popupshowing%22%2C%20cnListener%29%3B%0A%20%20%20%20%20%20cnMenu.removeChild%28cnItem%29%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20sbNav%20%3D%20%5B%0A%20%20%20%20%20%20%5B%22back%22%2C%20%22goBack%28%29%3B%22%2C%20%22back-button-tooltip%22%5D%2C%0A%20%20%20%20%20%20%5B%22forward%22%2C%20%22goForward%28%29%3B%22%2C%20%22forward-button-tooltip%22%5D%2C%0A%20%20%20%20%20%20%5B%22reload%22%2C%20%22reload%28%29%3B%22%2C%2C%20%22Reload%20current%20page%22%5D%2C%0A%20%20%20%20%20%20%5B%22stop%22%2C%20%22stop%28%29%3B%22%2C%2C%20%22Stop%20loading%20this%20page%22%5D%0A%20%20%20%20%5D%3B%0A%0Aitems.forEach%28%28item%2C%20index%29%20%3D%3E%20%7B%0A%20%20var%20%5Btitle%2C%20url%2C%20icon%5D%20%3D%20item.split%28%22%5Cn%22%29%3B%0A%20%20icon%20%3D%20%28icon.startsWith%28%27chrome%3A%27%29%20%7C%7C%20icon.startsWith%28%27data%3A%27%29%29%20%3F%20icon%20%3A%20%27moz-anno%3Afavicon%3A%27%20+%20icon%3B%0A%20%20createNode%28%22menuitem%22%2C%20menugroup%2C%20false%2C%20%7B%0A%20%20%20%20tooltiptext%3A%20url%2C%0A%20%20%20%20class%3A%20%22menuitem-iconic%22%2C%0A%20%20%20%20label%3A%20title%2C%0A%20%20%20%20image%3A%20icon%0A%20%20%7D%29.index%20%3D%20index%3B%0A%7D%29%3B%0Amenugroup.openPage%20%3D%20%28%7Bindex%7D%29%20%3D%3E%20openWebPanel%28...items%5Bindex%5D.split%28%22%5Cn%22%29%29%3B%0Amenugroup.removePage%20%3D%20%28%7Bindex%7D%29%20%3D%3E%20items.splice%28index%2C%201%29%20%26%26%20installButton%28items.join%28sep%29%29%3B%0A%0A%5B%0A%20%20%5B%27menuseparator%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0443%27%2C%20%27custombuttons.editButton%28this.parentNode.parentNode%29%3B%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%27%2C%20%27openWebPanel%28gClipboard.read%28%29%2C%20gClipboard.read%28%29%29%3B%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u0441%u0430%u0439%u0442%27%2C%20%27this.parentNode.parentNode.addPage%28window.content.document.title%2C%20window.content.document.location.href%2C%20gBrowser.mCurrentTab.image%29%3B%27%5D%0A%5D.forEach%28%28%5Btype%2C%20lbl%2C%20cmd%5D%29%20%3D%3E%20%0A%20%20%20%20%20%20%20%20%20%20createNode%28type%2C%20menuPopup%2C%20false%2C%20%7Blabel%3A%20lbl%2C%20oncommand%3A%20cmd%7D%29%29%3B%0A%0Aif%20%28%21sbBox.hasAttribute%28%22navbuttons%22%29%29%20%7B%0A%20%20sbNav.forEach%28%28%5Bid%2C%20cmd%2C%20tltp%2C%20ttxt%5D%29%20%3D%3E%20%7B%0A%20%20%20%20var%20icon%20%3D%20%22chrome%3A//browser/skin/content-contextmenu.svg%23%22%20+%20id%3B%0A%20%20%20%20id%20%3D%20%27sb-%27%20+%20id%20+%20%27-button%27%3B%0A%20%20%20%20createNode%28%22toolbarbutton%22%2C%20sbClsBtn%2C%20true%2C%20%7B%0A%20%20%20%20%20%20id%3A%20id%2C%0A%20%20%20%20%20%20oncommand%3A%20wps%20+%20cmd%2C%0A%20%20%20%20%20%20tooltip%3A%20tltp%2C%0A%20%20%20%20%20%20tooltiptext%3A%20ttxt%2C%0A%20%20%20%20%20%20style%3A%20%27list-style-image%3A%20url%28%22%27%20+%20icon%20+%20%27%22%29%3B%20-moz-image-region%3A%20rect%280%2011px%2011px%200%29%3B%27%0A%20%20%20%20%7D%29%0A%20%20%7D%29%0A%20%20sbBox.setAttribute%28%27navbuttons%27%2C%20%27true%27%29%3B%0A%7D%0A%0Afunction%20installButton%28help%29%20%7B%0A%20%20%20%20var%20link%20%3D%20custombuttons.makeButtonLink%28%22edit%22%2C%20_id%29%3B%0A%20%20%20%20var%20param%20%3D%20custombuttons.cbService.getButtonParameters%28link%29%3B%0A%20%20%20%20param%20%3D%20param.wrappedJSObject%20%7C%7C%20param%3B%0A%20%20%20%20param.help%20%3D%20help%3B%0A%20%20%20%20custombuttons.cbService.installButton%28param%29%3B%0A%7D%0A%0Afunction%20createNode%28type%2C%20elm%2C%20before%2C%20attrs%29%20%7B%0A%20%20var%20node%20%3D%20before%0A%20%20%3F%20elm.parentNode.insertBefore%28document.createElement%28type%29%2C%20elm%29%0A%20%20%3A%20elm.appendChild%28document.createElement%28type%29%29%3B%0A%20%20for%28var%20name%20in%20attrs%29%20%7B%0A%20%20%20%20if%20%28attrs%5Bname%5D%29%0A%20%20%20%20%20%20node.setAttribute%28name%2C%20attrs%5Bname%5D%29%3B%0A%20%20%7D%0A%20%20return%20node%3B%0A%7D%0A%0Athis.addPage%20%3D%28title%2C%20url%2C%20icon%29%3D%3E%20%7B%0A%20%20title%20%3D%20%21title%20%3F%20url%20%3A%20title%3B%0A%20%20icon%20%3D%20%21icon%20%3F%20%27chrome%3A//mozapps/skin/places/defaultFavicon.png%27%20%3A%20icon%3B%0A%20%20var%20newItem%20%3D%20%5Btitle%2C%20url%2C%20icon%5D.join%28%27%5Cn%27%29%3B%0A%20%20installButton%28%5Bhelp%2C%20newItem%5D.join%28sep%29%29%3B%0A%7D%0A%0A%28%28browser%2C%20listener%2C%20br%29%20%3D%3E%20%7B%20if%20%28browser%29%20%7B%0A%20%20addEventListener%28%22DOMFrameContentLoaded%22%2C%20listener%2C%20true%2C%20browser%29%3B%0A%20%20var%20getBr%20%3D%20%28%29%20%3D%3E%20browser.contentDocument.querySelector%28listener.selector%29%3B%0A%20%20if%20%28%28br%20%3D%20getBr%28%29%29%29%20br.window%20%3D%20%7Bparent%3A%20listener.parent%7D%3B%0A%20%20addDestructor%28%28%29%20%3D%3E%20%7B%0A%20%20%20%20if%20%28%28br%20%3D%20getBr%28%29%29%29%20delete%20br.window%3B%0A%20%20%7D%29%3B%0A%7D%7D%29%28SidebarUI.browser%2C%20%7B%0A%20%20selector%3A%20%22browser%23web-panels-browser%22%2C%0A%20%20handleEvent%28e%29%20%7B%0A%20%20%20%20if%20%28e.target.matches%28this.selector%29%20%26%26%20%21e.target.hasAttribute%28%22disableglobalhistory%22%29%29%20%7B%0A%20%20%20%20%20%20sbNav.forEach%28%28%5Bid%2C%20cmd%5D%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20id%20%3D%20%27%23context-%27%20+%20id%3B%0A%20%20%20%20%20%20%20%20var%20mItem%20%3D%20SidebarUI.browser.contentDocument.querySelector%28id%29%3B%0A%20%20%20%20%20%20%20%20if%20%28id%20%3D%3D%20%22%23context-reload%22%29%0A%20%20%20%20%20%20%20%20%20%20mItem.style.setProperty%28%27display%27%2C%20%27-moz-box%27%2C%20%27important%27%29%3B%0A%20%20%20%20%20%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20eval%28wps%20+%20cmd%29%3B%0A%20%20%20%20%20%20%7D%29%0A%20%20%20%20%20%20e.target.setAttribute%28%22disableglobalhistory%22%2C%20%27false%27%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28e.target.matches%28this.selector%29%20%26%26%20%21%28%22window%22%20in%20e.target%29%29%0A%20%20%20%20%20%20e.target.window%20%3D%20%7Bparent%3A%20this.parent%7D%3B%0A%20%20%7D%2C%0A%20%20get%20parent%28%29%20%7B%0A%20%20%20%20delete%20this.parent%3B%0A%20%20%20%20var%20parent%20%3D%20%7B%7D%3B%0A%20%20%20%20parent.contentAreaClick%20%3D%20eval%28%60%28%24%7B%0A%20%20%20%20%20%20contentAreaClick.toString%28%29.replace%28%0A%20%20%20%20%20%20%20%20%27linkNode.getAttribute%28%22onclick%22%29%27%2C%0A%20%20%20%20%20%20%20%20%22%21target%20%26%26%20this.shouldLoadInPanelBrowser%28linkNode%29%20%7C%7C%20%24%26%22%0A%20%20%20%20%20%20%29%0A%20%20%20%20%7D%29%60%29%3B%0A%20%20%20%20parent.shouldLoadInPanelBrowser%20%3D%20link%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20%28%21%28link.ownerDocument.location.protocol%20%3D%3D%20%22file%3A%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20link.className%20%3D%3D%20%27file%27%29%29%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20this.parent%20%3D%20parent%3B%0A%20%20%7D%0A%7D%29%3B%0A%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Avar%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28%0A%20%20%5B%0A%20%20%20%20%27@namespace%20xul%20url%28%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%29%3B%27%2C%0A%20%20%20%20%27@namespace%20html%20url%28%22http%3A//www.w3.org/1999/xhtml%22%29%3B%27%2C%0A%20%20%20%20%27@namespace%20svg%20url%28http%3A//www.w3.org/2000/svg%29%3B%27%2C%0A%20%20%20%20%27%27%2C%0A%20%20%20%20%27@-moz-document%20url%28%22chrome%3A//browser/content/browser.xul%22%29%20%7B%27%2C%0A%20%20%20%20%27%20%20%23sidebar-throbber%5Bloading%5D%20%7E%20%23sb-reload-button%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-throbber%3Anot%28%5Bloading%5D%29%20%7E%20%23sb-stop-button%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20-moz-appearance%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20padding%3A%203.5px%206px%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20margin%3A%20.5px%200%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20background%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20background-clip%3A%20border-box%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20border%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20border-radius%3A%200%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20box-shadow%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%3Anot%28%5Bsidebarcommand%3D%22viewWebPanelsSidebar%22%5D%29%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20.toolbarbutton-icon%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20opacity%3A%200.5%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20transition%3A%20opacity%20ease%20200ms%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%3Ahover%20.toolbarbutton-icon%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20opacity%3A%200.9%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%7D%27%0A%20%20%5D.join%28%27%5Cn%27%29%29%29%3B%0AaddDestructor%28%28%29%3D%3E%20sss.unregisterSheet%28this.uri%2C%200%20%7C%7C%20uri%2C%200%29%29%3B%0Athis.uri%20%3D%20uri%3B%0Asss.loadAndRegisterSheet%28uri%2C%200%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5Babout%3Aconfig%0Aabout%3Aconfig%0A-%0A%0Aabout%3Aabout%0Aabout%3Aabout%0A-%0A%0Aabout%3Aaddons-memory%20%5BAddon%5D%0Aabout%3Aaddons-memory%0A-%0A%0Achrome%3A//browser/content/places/places.xul%0Achrome%3A//browser/content/places/places.xul%0A-%0A%0Aabout%3Asessionrestore%0Aabout%3Asessionrestore%0A-%0A%0A------------%0A------------%0A------------%0A%0AWatch%0Adata%3Atext/html%3Bbase64%2CPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCjx0aXRsZT5UaGUgQ2xvY2sgaXMgVGlja2luZyB8IE5ldyBUYWIgQmlnIENsb2NrIEJhY2tncm91bmQ8L3RpdGxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KCWZ1bmN0aW9uIHBhaW50VGltZSgpew0KCQl2YXIgbm93ICAgID0gbmV3IERhdGUoKTsNCgkJdmFyIGhvdXIgICA9IG5vdy5nZXRIb3VycygpOw0KCQl2YXIgbWludXRlID0gbm93LmdldE1pbnV0ZXMoKTsNCgkJdmFyIHNlY29uZCA9IG5vdy5nZXRTZWNvbmRzKCk7DQoJCWlmIChob3VyICAgPT0gMCkgeyBob3VyID0gMTI7ICAgICAgICAgICAgIH0NCgkJaWYgKDEwICAgPiBob3VyKSB7IGhvdXIgICA9ICIwIiArIGhvdXI7ICAgfQ0KCQlpZiAoMTAgPiBtaW51dGUpIHsgbWludXRlID0gIjAiICsgbWludXRlOyB9DQoJCQ0KCQlpZiAoMTAgPiBzZWNvbmQpIHsgc2Vjb25kID0gIjAiICsgc2Vjb25kOyB9DQoJCXZhciB0aW1lU3RyaW5nID0gaG91ciArDQoJCQkJCQknOicgKw0KCQkJCQkJbWludXRlICsNCgkJCQkJCSc6JyArDQoJCQkJCQlzZWNvbmQ7IA0KCQl2YXIgbW9udGhzID0gbmV3IEFycmF5KDEzKTsNCgkJbW9udGhzWzBdICA9ICJKYW51YXJ5IjsNCgkJbW9udGhzWzFdICA9ICJGZWJydWFyeSI7DQoJCW1vbnRoc1syXSAgPSAiTWFyY2giOw0KCQltb250aHNbM10gID0gIkFwcmlsIjsNCgkJbW9udGhzWzRdICA9ICJNYXkiOw0KCQltb250aHNbNV0gID0gIkp1bmUiOw0KCQltb250aHNbNl0gID0gIkp1bHkiOw0KCQltb250aHNbN10gID0gIkF1Z3VzdCI7DQoJCW1vbnRoc1s4XSAgPSAiU2VwdGVtYmVyIjsNCgkJbW9udGhzWzldICA9ICJPY3RvYmVyIjsNCgkJbW9udGhzWzEwXSA9ICJOb3ZlbWJlciI7DQoJCW1vbnRoc1sxMV0gPSAiRGVjZW1iZXIiOw0KCQl2YXIgbm93ICAgICAgICAgPSBuZXcgRGF0ZSgpOw0KCQl2YXIgbW9udGhudW1iZXIgPSBub3cuZ2V0TW9udGgoKTsNCgkJdmFyIG1vbnRobmFtZSAgID0gbW9udGhzW21vbnRobnVtYmVyXTsNCgkJdmFyIG1vbnRoZGF5ICAgID0gbm93LmdldERhdGUoKTsNCgkJdmFyIHllYXIgICAgICAgID0gbm93LmdldFllYXIoKTsNCgkJaWYoeWVhciA8IDIwMDApIHsgeWVhciA9IHllYXIgKyAxOTAwOyB9DQoJCXZhciBkYXRlU3RyaW5nID0gbW9udGhuYW1lICsNCgkJCQkJCScgJyArDQoJCQkJCQltb250aGRheSArDQoJCQkJCQknLCAnICsNCgkJCQkJCXllYXI7DQogICAJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0uaW5uZXJIVE1MID0gIjxkaXY+Iit0aW1lU3RyaW5nKyI8YnIvPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MzhweDsnPiIrZGF0ZVN0cmluZysiPC9zcGFuPjwvZGl2PiI7DQoJfQ0KCWZ1bmN0aW9uIGJnQ29sb3IoKXsNCgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0uc3R5bGUuYmFja2dyb3VuZENvbG9yID09ICJyZ2IoMjA2LCAyMDYsIDIwNikiKXsNCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIjMDAwIjsNCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLnN0eWxlLmNvbG9yID0gIiNDRUNFQ0UiOw0KCQkJfQ0KCQ0KCX0NCglmdW5jdGlvbiBvbmJvZHlsb2FkKCl7DQoJCXBhaW50VGltZSgpOw0KCQlpbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtwYWludFRpbWUoKTt9LCAxMDAwKTsNCgkJaW50ZXJ2YWxJRDIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpe2JnQ29sb3IoKTt9LCA1MDAwKTsNCgl9DQoJCTwvc2NyaXB0Pg0KPHN0eWxlPg0KYm9keSB7DQoJY29sb3I6ICMwMEZGMDA7DQoJZm9udDogOTRweCBBcmlhbDsNCgltYXJnaW46IGF1dG87DQoJcGFkZGluZzoxMDBweCAwIDAgMDsNCglsZWZ0OjA7DQoJcmlnaHQ6MDsNCgl0b3A6MDsNCglib3R0b206MDsNCgliYWNrZ3JvdW5kLWNvbG9yOiMwMDA7DQogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkOw0KCXRleHQtYWxpZ246Y2VudGVyOw0KCWhlaWdodDogMTAwJTsNCgl3aWR0aDogMTAwJTsNCn0NCjwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keSBvbkxvYWQ9Im9uYm9keWxvYWQoKTsiPg0KPGRpdiBpZD0iZG50Ij48L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4%0Adata%3Aimage/ico%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXpJREFUeNqkU7uKwkAUvUnMGlSIWNhql3Z/wG+wtBOExY8QbAT/YMFmK3/C1EJ6CwsftYKFqEUUk5jsPQMTYnZS7YHDTO7jzL13MlqSJPQfaOPx+JPXL2Y/64Dw7XYz6/V6qMibM38mk8mKRqPR9/F4fDGSLJ/PZ7JcLpO8HbxerzHycIjOhn6z2dTxkSVQqVQobwdrtZqGPMSUoiiiOI7/9qZpxOUrfQDyAD0MQxGk4na7LfQhLxXgcpTc7XaFPilQkgIq7Pf7Ql9awePxMAaDAc1mM9GXZBAEdDqd6HK5vNk9zyPE+77/IQS4n9d0OqVut0t8PXAIdewNw6DNZpP2fL/fyXEcQjwjEC3gJFmOXCWGwyEtFguybZuq1eqbD3npDPKJEo1Gg3q9Hh0OB2q1WsoZCAHceRFM06R2u108RGwQlKeu67Rer5U+MBXgyc55UFG5XKYsIeC6LuXt4Pl8fiFP/LGdTkf5GtGWZVkmX3Pha+THtvoVYADFFmv7Z4SugwAAAABJRU5ErkJggg%3D%3D%0A%0AMyRadio%20-%20Online%20Player%0Ahttp%3A//myradio.ua/flashplayer/53%0Adata%3Aimage/ico%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABMLAAATCwAAAAAAAAAAAABzChH/zQ8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/80PHf9zChH/0A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/zQ8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/3zZC/+t7gv/0uLz/9LS4/+p2ff/cKjb/1A8d/9QPHf/UDx3/1A8d/9EPHf/UDx3/1A8d/9QPHf/XFyT/8Jie///////2wMT/63uC/+2Ei//3ycz//////+t6gv/VEiD/1A8d/9QPHf/RDx3/1A8d/9QPHf/UER//9r3A//vi4v/fNkL/1A8d/9QPHf/UDx3/1A8d/+JHUf/98fP/8Jie/9QPHf/UDx3/0Q8d/9QPHf/UDx3/5FJc///////bKDT/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/4D5J///////fNkL/1A8d/9EPHf/UDx3/1A8d//a9wP/wmJ7/1A8d/9QPHf/ZHSr/8Z2i/9ojL//UDx3/1A8d/9QPHf/2wMT/75KX/9QPHf/RDx3/1A8d/9QPHf/+9fb/5ltk/9QPHf/UDx3/2yg0////////////5l1m/9QPHf/UDx3/63qC//fJzP/UDx3/0Q8d/9QPHf/UDx3//vX2/+ZbZP/UDx3/1A8d/9soNP///////vX2/+NKVP/UDx3/1A8d/+t6gv/3ycz/1A8d/9EPHf/UDx3/1A8d//a9wP/wmJ7/1A8d/9QPHf/YHCn/8Z2i/9kgLP/UDx3/1A8d/9QPHf/2wMT/7o2T/9QPHf/RDx3/1A8d/9QPHf/kUlz//////9wqNv/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/gPkn//////940P//UDx3/0Q8d/9QPHf/UDx3/1BEf//S4vP/74uL/3zpF/9QPHf/UDx3/1A8d/9QPHf/jTVf//fHz/++Sl//UDx3/1A8d/9EPHf/UDx3/1A8d/9QPHf/XFyT/7o2T///////2wMT/63uC/+2Ei//3ycz//////+p2ff/VEiD/1A8d/9QPHf/RDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/eND//63qC//S4vP/0sLX/6nR8/9wqNv/UDx3/1A8d/9QPHf/UDx3/0Q8d/9APHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/84PHf9rCQ//yQ8c/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/9QPHf/UDx3/1A8d/8gPHP9wChH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%0A%0A2ip.ru.Panel%0Ahttps%3A//2ip.ru/opera-panel/%0Adata%3Aimage/ico%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8AlF8AfJNfAP+TXwD/lF8A/5VgAP+VYAD/l2IA/5ZiAP+YYwD/mWUA/5tmAP+bZwD/m2cA/51qAP+jbwD/lF8AcZVgAP+UYAD/lV8A/5VhAP+WYgD/l2IA/5hjAP+YZAD/mmUA/5tnAP+bZwD/nWkA/51pAP+fawD/pnIA/5VgAO+WYgD/lmEA/5VgAP+VXwD/l2EA/5hkAP+ZZAD/mGMA/5plAP+daQD/nmoA/55qAP+fawD/o3AA/6p4AP+VYADvlmIA/5hjAP+VXwD/lF0A/5VgAP+bZwD/mGIA/5dgAP+aZAD/n2sA/6BsAP+fbAD/oG0A/6NwAP+pdwD/mGQA7ZplAP+XYQD/7ePW//bw6P/WwaH/lFwA/+rfz//18Oj/2cOi/55qAP+kcgD/pXIA/6Z0AP+pdgD/rn0A/5toAO2fawD/mGIA//Lr4P//////3cuy/5RbAP/v5db//////+DNrf+cZAD/pG8A/6h2AP+sewD/rn0A/7KFAP+gbQDtoGwA/55oAP/x6d3//////9zJq/+aYwD/7uXU///////28ej/5de8/9nCmv+9li3/rXsA/7SGAP+3iwD/o3AA7aRyAP+ibQD/8enb///////eyqv/oGkA/+/m0///////////////////////+/n0/7uSEP+1hwD/vJIA/6d2AO2ndwD/pXIA//Lr3f//////3cur/6VvAP/w5tT//////+vfyP/Or17/9O3d///////ZxJT/tYcA/8CWAP+qewDtq3sA/6t4AP/z693//////97Mq/+rdgD/8ejV///////j07L/tYkA/+3iyP//////382h/7iNAP/DnAD/r38A7bB/AP+tegD/9e7h///////h0bP/rnwA//Lr1////////////////////////////9G0W/++lQD/xaEA/7GDAO20hQD/soIA/+zgxf/z7d3/1rt5/7WGAP/r4L7/9O7e//Xv3v/28N//8ObL/9rGff+/mAD/w54A/8akAP+2hwDtt4gA/7mLAP+4igD/t4oA/7yPAP+9lQD/vJIA/7uSAP+9lAD/vJQA/76WAP+/lwD/w54A/8WiAP/IpwD/tYYA7beIAP+6jQD/u48A/7uRAP++lAD/vpcA/7+YAP+/lwD/v5gA/8GaAP/AmgD/w5wA/8WgAP/FogD/yKcA/7mLAPG7jgD/u48A/76UAP+/lwD/wJcA/7+ZAP/BmwD/wZwA/8KdAP/DnwD/w54A/8agAP/GogD/x6YA/8qqAH+9kADcvZMA7cCWAO3AmQDtw50A7cOcAO3EngDtxJ8A7cahAO3GogDtxqMA7ceiAO3HpADtyqcA7cuqAG////8AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA%3D%3D%0A%0AYandex.Panel%0Ahttp%3A//op.yandex.ru/%0Adata%3Aimage/ico%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAAsAAAAUwAAAF8AAABfAAAAXwAAAF8AAABfAAAAXwAAAF8AAABfAAAAXwAAADjBwcEAwcHBAMHBwQDBwcEAAAAAUbq6uurExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP9ubm6QAAAALcTExADExMQAxMTEAAAAAFrHx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/vr6+7h4eHmQAAAAQx8fHAMfHxwAAAABXy8vL/8vLy/+UlM3/AADU/4+Pzv/Ly8v/g4PO/wwM0//Ly8v/y8vL/8vLy/+kpKS6AAAAM8vLywDLy8sAAAAAU9DQ0P/Q0ND/0NDQ/05O2f8dHd3/y8vQ/4eH1f8MDN7/0NDQ/9DQ0P/Q0ND/0NDQ/2VlZXsAAAAk0NDQAAAAAE/U1NT/1NTU/9TU1P/Fxdb/FBTq/3Bw3/+Jidz/DAzr/9TU1P/U1NT/1NTU/9TU1P/JycnkDw8PUwAAAAcAAABL2dnZ/9nZ2f/Z2dn/2dnZ/4WF5f8KCvb/ODjv/w0N9f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6ioqKYAAAAqAAAASOLi4v/i4uL/4uLi/6io6v8LC/7/QkL2/zo69/8NDf3/4uLi/+Li4v/i4uL/4uLi/+Li4v/g4OD7AAAARgAAAETx8fH/8fHx//Hx8f81Ovz/bG/5//Hx8f+fovb/GB3+//Hx8f/x8fH/8fHx//Hx8f/x8fH/7+/v+wAAAEIAAABA9vb2//b29v/29vb/HSz//7K3+f/29vb/qK35/yUz/v/29vb/9vb2//b29v/29vb/9vb2/8jIyKMAAAAkAAAAPPn5+f/5+fn/+fn5/z5U/v+osvv/+fn5/6+4+/80TP//+fn5//n5+f/5+fn/+fn5//Dw8OMXFxdBAAAABgAAADj7+/v/+/v7//v7+/+Ro/3/UG7+/7/J/P+crf3/Q2P///v7+//7+/v/+/v7//v7+/+Tk5NnAAAAGfv7+wAAAAA1/f39//39/f/9/f3/9vj9/4yk/v9Td///QWn//05z///9/f3//f39//39/f/c3NysAAAAH/39/QD9/f0AAAAAMv7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/5+fnpPj4+PgAAAAn+/v4A/v7+AAAAACn39/fi////////////////////////////////////////////////tbW1cgAAABf///8A////AP///wAAAAAVAAAAKAAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAABv///8A////AP///wD///8AAA8AAAAHAAAAAwAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAADAAAABwAAAA8AAA%3D%3D%0A%0AYandex.Weather%0Ahttps%3A//yandex.kz/pogoda/almaty/%0Adata%3Aimage/ico%3Bbase64%2CAAABAAIAICAAAAEAIAAoEAAAJgAAABAQAAABACAAKAQAAE4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqqthWqr7FsqK+zk6iwsoGqr7M2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpr7JTqq6x8aqvsv+qr7L/qq+y/6qvsv+prrGhqqqqBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqK2yNaqvsvqqr7L/qq+y/6qvsv+qr7L/qq+y/6qvsv+pr7KSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqrbKyqq+y/6qvsv+pr7Hqqa+yj6mvscOqr7L/qq+y/6mvsvynsbEaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvs/Cqr7L/qq+y/6qusUUAAAAAv7+/BKmtstuqr7L/qq+y/6uusVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+y/6qvsv+qr7L/p7GxGgAAAAAAAAAAqq+ys6qvsv+qr7L/qa6xZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7L/qq+y/6qvsv+nsbEaAAAAAAAAAACqrbKyqq+y/6qvsv+qr7JmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvsv+qr7L/qq+y/6exsRoAAAAAAAAAAKmvso+qr7LMqq+yzKqws1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+y/6qvsv+qr7L/p7GxGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7L/qq+y/6qvsv+nsbEaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvsv+qr7L/qq+y/6exsRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+y/6qvsv+qr7L/p7GxGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7L/qq+y/6qvsv+nsbEaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvsv+qr7L/qq+y/6exsRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+y/6qvsv+qr7L/p7GxGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7L/qq+y/6qvsv+nsbEaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvsv+qr7L/qq+y/6exsRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP70AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+9QAAAAAAAAAAAAAAAAAA/t0AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP7fAAAAAAAAAAAAAAAAAAD+xAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/skAAAAAAAAAAAAAAAAAAP2VAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD9mgAAAAAAAAAAAAAAAAAA/1AAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP9XAAAAAAAAAAAAAAAAAAD/DgAA/vkAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+/AAA/xUAAAAAAAAAAAAAAAAAAAAAAAD9mwAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP2kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8jAAD++wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+/gAA/ywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2RAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP2ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wUAAP7GAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+0wAA/woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/yAAAP7dAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/uEAAP8lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/xMAAP7FAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP7RAAD/HQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/woAAP2PAAD++wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP78AAD9kQAA/wsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8jAAD9lAAA/uwAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP7sAAD9lQAA/yQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BAAA/zkAAP9uAAD9kgAA/6oAAP+qAAD/qgAA/ZIAAP9uAAD/OQAA/wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqA6qvsWypsLGkqa6za6qqqgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKuvsXmqr7L/qq+xzamusfuqrrN4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpr7HDqa6y2AAAAACrr7Kmqa+xwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+yzKqvsswAAAAAqK2ymaqvsswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvssyqr7LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqr7LMqq+yzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqq+yzKqvsswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqvssyqr7LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP72AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+9QAAAAAAAAAAAAD+2wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/tkAAAAAAAAAAAAA/Z8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP2dAAAAAAAAAAAAAP9DAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/QAAAAAAAAAAAAAAAAAAA/rsAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+uAAAAAAAAAAAAAAAAAAAAAAAAP8aAAD+3QAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+3AAA/xkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/xsAAP63AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+tQAA/xkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/zYAAP2EAAD9pAAA/aQAAP2EAAD/NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

01-12-2017 15:34:56

Andrey_Krropotkin пишет

Dumby спасибо. Переинициализацию кнопки я уже подправил. Но ваш код намного приятнее глазу.

вот еще альтернатива

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EOpen%20Firefox%20folders%20and%20files%20%5BFix%21%5D%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAABsAAAAoAAAAFgAAAAAAAAAADggMA0MoOjIXDxQWAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAQEBCgAAADksLCytMDAw4gAAAI0bHBuDKR8lan1IaZfSg7XS+K3f/zwtN2IAAAAAAwIDAwAAAAAAAAAAAAAAAQMDAwADAwMUAgICZUtLS+xgYWH/RURF8W1tbfpQS07/hm99/8Czu/2tsK7/IiMijwAAAAADAgMCAAAAAAAAAAAAAAAAJSUlH1dXV8ROTk7cl5eX/7Gxsfytra3/fX19/UpMS/t2enf7tLe1+7u7u/8lJCSkAAAAGQUFBQABAQECAAAAAAAAAAAfHx8tYGBg8ZiYmP+Li4v9UlJS/pubm/6xsbH+paWl/qWlpf6GhYX+xsjH/1Q9R+JxQV3LRzFAWQAAAAACAQICAAAAAAMDAwNhYWHViIiI/zMzM/xvb2/+ioqK/p2dnf7n5+f+u7u7/pycnP7IyMj+WFBT/HZkb/9JQUeTAAAAAgMDAwESEhIAWlpaj4KCgv9aWlr+SUlJ/pGRkf6RkZH+i4uL/tzc3P6AgID+ysrK/sfHx/5MTk36U1ZU/zc4N4MBAAEBAgICAgkJCQB2dna+lZWV/2lpaf05OTn+bm5u/l9fX/7AwMD++vr6/ru7u/7CwsL+ysrK/lRUVPtkY2T/SEhIaQAAAAACAgIEAAAAAwcHBwBVVVWBqamp/5ubm/qQkJD+ysrK/uDg4P7b29v+0NDQ/sPDw/7Nzc3+WFhY+2xsbP9ISEhiAAAAAAICAgQCAgIFAAAAAFtbW3bKysr/x8fH+vX19f729vb+pKSk/re3t/7FxcX+zc3N/tLS0v5cXFz7dHR0/0hISGIAAAAAAwMDBAICAgQAAAAAMTExdY2Njf91dXX6tLS0/uDg4P65ubn+wsLC/s3Nzf7W1tb+29vb/mBgYPt6enr/S0tLYgAAAAADAwMEAgICBAAAAAAtLS1zd3d3/4qKivqdnZ3+pqam/re3t/7Gxsb+1NTU/t3d3f7f39/+Y2Nj+4CAgP9OTk5iAAAAAAMDAwQCAgIEAAAAAC4uLnN/f3//jIyM+p2dnf6pqan+tra2/sfHx/7Z2dn+6Ojo/u/v7/5sbGz7g4OD/1FRUWIAAAAAAwMDBAICAgQAAAAALy8vc39/f/+JiYn6nZ2d/rCwsP7AwMD+ysrK/sfHx/60tLT+mZmZ/mBgYPuTk5P/UlJSYgAAAAADAwMEAgICBAAAAAAvLy9zhISE/5CQkPmYmJj9i4uL/XZ2dv1lZWX9XFxc/WJiYv14eHj9mpqa+snJyf9RUVFhAAAAAAMDAwQCAgIEAAAAADAwMHRoaGj/SUlJ+z09Pf86Ojr/SEhI/2JiYv99fX3/lpaW/6ysrP+8vLz70tLS/1JSUmIAAAAAAwMDBAEBAQQAAAAAIyMjVzY2Nu8wMDDjS0tL5mFhYedzc3PnfHx85oeHh+WWlpbkqKio5La1tuHNzMzzb29vWAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis._handleClick%20%3D%28%29%3D%3E%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20..................%0Avar%20array%20%3D%20%5B%7Blabel%3A%20%22Profile%22%2Cimage%3A%20%22chrome%3A//mozapps/skin/profile/profileicon.png%22%2Cvalue%3A%20%22ProfD%22%7D%2C%0A%7Blabel%3A%20%22Firefox%22%2Cimage%3A%20%22chrome%3A//branding/content/icon16.png%22%2Cvalue%3A%20%22CurProcD%22%7D%2C%0A////%7Blabel%3A%20%22Download%22%2Cimage%3A%20%22chrome%3A//mozapps/skin/downloads/downloadIcon.png%22%2Cvalue%3A%20%22DfltDwnld%22%7D%2C%0A%7Bseparator%3A%27%27%7D%2C%0A%7Blabel%3A%20%22Extensions%22%2Cimage%3A%20%22chrome%3A//mozapps/skin/extensions/extensionGeneric-16.png%22%2Cvalue%3A%20%22ProfD%2Cextensions%22%7D%2C%0A%7Blabel%3A%20%22Custom%20buttons%22%2Cimage%3A%20%22chrome%3A//custombuttons/skin/cbicon.png%22%2Cvalue%3A%20%22ProfD%2Ccustombuttons%22%7D%2C%0A%7Blabel%3A%20%22Bookmark%20backups%22%2Cimage%3A%20%22chrome%3A//custombuttons/skin/button.png%22%2Cvalue%3A%20%22ProfD%2Cbookmarkbackups%22%7D%2C%0A%7Blabel%3A%20%22Search%20plugins%28default%29%22%2Cstyle%3A%20%22chrome%3A//global/skin/icons/Search-glass.png%22%2Cvalue%3A%20%22CurProcD%2Csearchplugins%22%7D%2C%0A%7Blabel%3A%20%22Search%20plugins%28user-defined%29%22%2Cstyle%3A%20%22chrome%3A//global/skin/icons/Search-glass.png%22%2Cvalue%3A%20%22UsrSrchPlugns%22%7D%2C%0A%7Bseparator%3A%27%27%7D%2C%0A////%7Blabel%3A%20%22Chrome%22%2Cimage%3A%20%22chrome%3A//global/skin/dirListing/folder.png%22%2Cvalue%3A%20%22UChrm%22%7D%2C%0A////%7Blabel%3A%20%22userChrome.css%22%2Cstyle%3A%20%22chrome%3A//global/skin/icons/folder-item.png%22%2Cvalue%3A%20%22ProfD%2Cchrome%2CuserChrome.css%22%7D%2C%0A////%7Blabel%3A%20%22userContent.css%22%2Cstyle%3A%20%22chrome%3A//global/skin/icons/folder-item.png%22%2Cvalue%3A%20%22ProfD%2Cchrome%2CuserContent.css%22%7D%2C%0A%7Blabel%3A%20%22user.js%22%2Cstyle%3A%20%22chrome%3A//global/skin/icons/folder-item.png%22%2Cvalue%3A%20%22ProfD%2Cuser.js%22%7D%2C%0A%7Blabel%3A%20%22prefs.js%22%2Cstyle%3A%20%22chrome%3A//global/skin/icons/folder-item.png%22%2Cvalue%3A%20%22ProfD%2Cprefs.js%22%7D%2C%0A%7Blabel%3A%22-%20-%20-%20%20Utilities%20%20-%20-%20-%22%7D%2C%0A////%7Blabel%3A%22KeePass%20Password%20Safe%22%2Cvalue%3A%22ProfD%2C%25Soft%2CKeePass2Portable.exe%22%2Cimage%3A%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAAAAABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQMAAAAJcNDAvZNjAu+TYwLfkNDAvZAAAAlxAQEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx8fEJV1dXmkM9O/23pp/+883A/vG4pP/xtaD/8ce4/ragmf5COjf9V1dXmvHx8QkAAAAAAAAAAAAAAADx8fEJOjo5wZqOiv720cT+7aOJ/+mLa//ohWL/5n5a/+V4Uv/oiGb/8r2r/piGf/46OTnB8fHxCQAAAAAAAAAAV1dXmpqRjf71y7z/7aOJ/+ybf//qlHX/6Yxs/+iGY//mf1v/5XlT/+V0Tf/upo3/mIaA/ldXV5oAAAAAEBAQMENAP/354Nf+8LSf/yEXFP8gFhP/IBUR/yAUEP8gEw//IBIN/yARDP8gEQz/5XVO//K+rP5COjf9EBAQMAAAAJe5sq/+9c2///K9q/9UPzf/VDw0/1Q5MP+zdmH/qGxW/1IxJv9SLyP/bTwr/+Z7Vv/pimn/tqGZ/gAAAJcODQ3Z+Ozn/vXOwP/0xrb/IBEM/yARDP8gEQz/tH1q/1M4L/8gEQz/IBEM/yARDP/ngl//5nxX//LIuv4NDAvZNzY1+fvs5//318v/9s/C/1ZGQf9VQz3/VUE6/5VsXv9TOC//Uzgv/1M2K/9uRDX/6Ypo/+eDYP/xuKT/NjAu+Tc2Nvn88Oz/+N/W//fYzf8gEQz/IBEM/yARDP8gEQz/IBEM/yARDP8gEQz/IBEM/+qSc//pi2r/8ryp/zYwLvkODg7Z+vTy/vrm3//54Nf/s56W/25ENf/zybr/88Kx//K6p//jqZT/bkQ1/8WGcP/smn7/6pN0//PQxP4NDAzZAAAAl7q5uP787+v/+ufh/+bQyP8kIB7/wqWb//XLvP/zw7L/pIBz/y4iHv/rqZH/7aOJ/++qkv+3p6L+AAAAlxAQEDBEREP9/fn3/vvu6v/66OL/Zl1a/1ZMSP/00cX/7MW3/0E0MP99YVf/8bSf/++tlf/31sr+Qz48/RAQEDAAAAAAV1dXmpycm/799/X//O/r/+DRy/83MjH/SkE+/0A3NP9EOTX/5rur//K+q//20cT/mpCN/ldXV5oAAAAAAAAAAPHx8Qk6OjrBnZyb/v35+P788e7/49TP/5SIhP+YiIL/6Mm+//fVyf/55d3+m5OQ/jo6OcHx8fEJAAAAAAAAAAAAAAAA8fHxCVdXV5pERET9urm5/vr29P788/D//PDs//nv6/66tLH+REFA/VdXV5rx8fEJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQMAAAAJcODg7ZNzY2+Tc2NvkODQ3ZAAAAlxAQEDAAAAAAAAAAAAAAAAAAAAAA8A8AAMADAACAAQAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAIABAADAAwAA8A8AAA%3D%3D%22%2C%7D%2C%0A%7Blabel%3A%22QTranslate%206.3.1%22%2Cvalue%3A%22ProfD%2C%25Soft%2CQTranslate%206.3.1.exe%22%2C%7D%2C%0A%7Blabel%3A%22Everything%201.3.4%22%2Cvalue%3A%22ProfD%2C%25Soft%2CEverything%201.3.4.exe%22%2C%7D%2C%0A%7Blabel%3A%22VTUploader%202.2b%22%2Cvalue%3A%22ProfD%2C%25Soft%2CVTUploader.exe%22%2Cimage%3A%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAAAAABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0IQc0IQc0IQc0IQc0IQc0IQc0IQc0IQc0IQc0IQc0IQcAAAAAAAAAAAAAAAAAAAA0IQdsSxvEkUK8iz+9iz+9iz+9iz+9iz+9iz/Ik0Q0IQc0IQc0IQcAAAAAAAAAAAAAAAA0IQdkQRC1eyazeia0eiW0eiW0eiW0eiWwdyQ0IQc0IQdyUSM0IQcAAAAAAAAAAAAAAAA0IQdjQBCrcyGrciGscyGscyGscyGocCA0IQc0IQfEizdoRRQ0IQcAAAAAAAAAAAAAAAA0IQdhPw+laxykaxykaxykaxyhaRs0IQc0IQerdCOzeidkQRA0IQcAAAAAAAAAAAAAAAA0IQdgPhCeZBidZBieZRibYxc0IQc0IQeZYRabYxefZhlfPQ40IQcAAAAAAAAAAAAAAAA0IQdfPQ+SWxKVXRKUWxE0IQc0IQeMVhGPVxGOVxGQWBFfPRA0IQcAAAAAAAAAAAAAAAA0IQeYYBaYYBaTXBU0IQc0IQfMp3nPrH7Pq33WsoV9YDg0IQcAAAAAAAAAAAAAAAAAAAA0IQfUr3/Kpnc0IQc0IQfiyarmz7Du17qFbkw0IQcAAAAAAAAAAAAAAAAAAAA0IQfIrIffw53avZc0IQc0IQfr3cj37NuLd1o0IQcAAAAAAAAAAAAAAAAAAABuWDbVvZ3kza7lza7fx6c0IQc0IQft6+mMf2U0IQcAAAAAAAAAAAAAAAAAAABxXDzayK7s2sLs2sLs28Ll07s0IQc0IQeQg200IQcAAAAAAAAAAAAAAAAAAAByX0He08Dz6Nfz6Nbz6Nbz6Nbs4M40IQc0IQc0IQcAAAAAAAAAAAAAAAAAAABzY0be2tD69Ov69Or69Or69Or69Ort6uE0IQc0IQcAAAAAAAAAAAAAAAAAAAB5aU3c2dTt6+jt6+ft6+ft6+ft6+ft6+fw7u00IQcAAAAAAAAAAAAAAAAAAAA0IQc0IQc0IQc0IQc0IQc0IQc0IQc0IQc0IQc0IQc0IQf4AP//+AD//zwA//8eAP//DwD//weA//8DwP//AeD//wHw//8D4P//B8D//w+A//8fAP//PgD//3wA///4AP//%22%2C%7D%2C%5D%3B%0A%0Avar%20version%20%3D%20parseInt%28Services.appinfo.version%29%3B%0Avar%20menuPopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Aarray.forEach%28m%3D%3E%20%7Bif%20%28%20%22separator%22%20in%20m%20%29%20%7B%20menuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%20return%20%7D%3B%20LOG%28m.label.slice%280%2C6%29%29%0Aif%20%28%20version%20%3E%2040%20%26%26%20m.label.startsWith%28%22Search%22%29%20%29%20return%3Bvar%20mItem%20%3D%20menuPopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3BmItem.setAttribute%28%22label%22%2C%20m.label%29%3B%0AmItem.setAttribute%28%22value%22%2C%20m.value%29%3BmItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%28%22image%22%20in%20m%29%20%26%26%20mItem.setAttribute%28%22image%22%2C%20m.image%29%3B%0A%28%22style%22%20in%20m%29%20%26%26%20mItem.setAttribute%28%22style%22%2C%20%22list-style-image%3A%20url%28%27%22+%20m.style%20+%22%27%29%3B%20-moz-image-region%3A%20rect%280%2C%2016px%2C%2016px%2C%200%29%22%29%3B%7D%29%3B%0AmenuPopup.addEventListener%28%22click%22%2C%20e%3D%3E%20openFirefoxFolders%28e.target.value%29%29%3B%0A//%u0444%u0443%u043D%u043A%u0446%u0438%u044F%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u043F%u0430%u043F%u043A%u0438%20%u0438%20%u0444%u0430%u0439%u043B%u044B%20Firefox%2C%20%u0432%u044B%u0431%u043E%u0440%20%u0437%u0430%u0432%u044B%u0441%u0438%u0442%20%u043E%u0442%20%u0430%u0440%u0433%u0443%u043C%u0435%u043D%u0442%u0430%20%27value%27%20...................toString%28%29.startsWith%28%22Search%22%29%0Afunction%20openFirefoxFolders%28value%29%20%7Bvar%20array%20%3D%20value.split%28%22%2C%22%29%2Cdirectory%20%3D%20array%5B0%5D%2C%20folders%20%3D%20array%5B1%5D%2C%20file%20%3D%20array%5B2%5D%3B%0Avar%20dir%20%3D%20Services.dirsvc.get%28directory%2C%20Ci.nsIFile%29%3Bfolders%20%26%26%20dir.append%28folders%29%3Bfile%20%26%26%20%28dir.append%28file%29%2C%20dir.launch%28%29%29%3Bdir.exists%28%29%20%26%26%20%21file%20%26%26%20dir.reveal%28%29%3B%7D%3B%0A%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


еще есть такая кнопка
скрытый текст

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%u043D%u0435%u0448%u043D%u0438%u0435%20win%20%u043F%u0440%u0438%u043B%u043E%u0436%u0435%u043D%u0438%u044F%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMAAwQAKCImDyo4IWkYaBzFQ6xI8FG/V/VCq0jcGGQbkwAQACQAAAAAAAIAAwAAAAAAAAAAAAAAAAEAAAIAAgIAQy4iYp9YOuZUah3/QMJQ/nfxgP97+Yb/f/+L/m/7ev87v0L1BzwIawAAAAAAAgADAAAAAAEAAAIAAAAAQR4Ki7pwNP//tG79aXQg/CGwM/tL3lP+SeJU/krmVf5I5lT8ROZQ/SjIMf8DQgWFAAAAAAACAAMAAAAAMRoKX5hKHP/qoVT69JtU/WVsGP8RmyP/LMAz/ynHM/4ozTP8Jc4w+x/KK/sbxyn7Daoa/wAlA1QAAAEAAgAAA2o5G9GhVyT/z305/N54Nv9eWxTyAnMR6Qp+DvsIig//CpQR/wucE/8KnQ//CpkG/QedAf8FZADWAwIACigYIklrMln7h0VB/6dcJPvBaCz/XC8RlgABAAACDgAlABUANAAfAUsAKABeAz8RlAhfUvkDZnP/CFtw+gcXKklSLEeVlUiB/6VamPykYGD7o1wl/2A4H5YAAAAAAgEBBAAAAAAAAQMEAAAAAAUoVmcHcfT/AIL5+QCK//8BOZ2rXjJRsJtOhf/SgLr9zoK++5hbW/9AKhaGAAAAAAICAQYAAQACAAMDBwAAAAABLlprD4///wqh9/oJsf//Al7M1FsxT6ucUYf/1Iq//Oyd1vzYkMf/X0FVhQAAAAADAgMEAAAAAAACBAQBAAAAAC1aYRSQ//8lpPr6Irj//wtt1t5GJT2DmlCF/82Juvz2reH/8Kbb/eej1P9jR1t+AAAAAAMCAwQBAwUGAAAAAAYkV2wjkv//PLP7+jzE//8VaMXMHhAaP5FLff+4d6b++rno//iz5P/3suP88rLg/2hPYn8AAAAAAQAAAAgPYW1bXeD/PJL0/1DB/fxSy///EkiRlwAAAABqOFzBp16S/+ev2Pz/we///b7s//u86vr7wev/dFxfcgAJYmhxeP//lJH+/juS+/5q0f/+V7n4/AASODwAAAAAHA4YP5NMgP+6fKj9/Mzw/f3H8/7/y/X/7LvU811Ywd54gPv8r6z//puZ/P1Akff5g+L//y5hmZ8AAAAAAgECAwAAAAA1Gy5vmlGG/8iOuP3/1vX/8sfe811YxNZ6g/f5ubb9/a6u+/uvrfz8TZPt/1GFvMcAAQwNAQAAAAAAAAACAQEDAAAAACoVJVh/QW3umWuP7V5fzeSMk/j9zcn//7+//v7Av///o6Pz+yU2XH0AAwYKAQAAAAAAAQEAAAAAAAAAAAEBAQMAAAAADwkHFAcCKUsJGb3VO0vn9lRf5/RdZMzXRkmTmw4OKTUAAAAAAgIDAwABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis._handleClick%20%3D%28%29%3D%3E%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0Avar%20array%20%3D%20%5B%5B%22IE%22%2C%20%22c%3A%5C%5CProgram%20files%5C%5CInternet%20Explorer%5C%5Ciexplore.exe%22%5D%2C%0A%20%20%20%5B%22Explorer%22%2C%20%22c%3A%5C%5Cwindows%5C%5Cexplorer.exe%22%5D%2C%0A%20%20%20%5B%22separator%22%5D%2C%0A%20%20%20%5B%22Cmd%20Prompt%22%2C%20%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ccmd.exe%22%5D%2C%0A%20%20%20%5B%22Media%20Player%22%2C%20%22C%3A%5C%5CProgram%20Files%5C%5CWindows%20Media%20Player%5C%5Cwmplayer.exe%22%5D%2C%0A%20%20%20%5B%22Task%20Manager%22%2C%20%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ctaskmgr.exe%22%5D%2C%20%0A%20%20%20%5B%22Control%20Panel%22%2C%20%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ccontrol.exe%22%5D%2C%0A%20%20%20%5B%22separator%22%5D%2C%0A%20%20%20%5B%22Notepad%22%2C%20%22c%3A%5C%5Cwindows%5C%5Cnotepad.exe%22%5D%2C%0A%20%20%20%5B%22Calculator%22%2C%20%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ccalc.exe%22%5D%2C%0A%20%20%20%5B%22Virtual%20Keyboard%22%2C%20%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5COSK.exe%22%5D%2C%0A%20%20%20%5B%22Character%20table%22%2C%20%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ccharmap.exe%22%5D%5D%3B%0Avar%20menuPopup%20%3D%20self.appendChild%28%20document.createElement%28%22menupopup%22%29%20%29%3B%0Aarray.forEach%28%28m%29%3D%3E%20%7B%0A%20%20%20if%20%28m%20%3D%3D%20%22separator%22%29%20%7B%20menuPopup.appendChild%28%20document.createElement%28%22menuseparator%22%29%20%29%3B%20return%20%7D%3B%0A%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2C%20m%5B0%5D%29%3B%0A%20%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20mItem.setAttribute%28%22image%22%2C%20%22moz-icon%3A//file%3A//%22%20+%20m%5B1%5D%29%3B%0A%20%20%20mItem.onclick%20%3De%3D%3E%20Components.Constructor%28%22@mozilla.org/file/local%3B1%22%2C%20%22nsIFile%22%2C%20%22initWithPath%22%29%28m%5B1%5D%29.launch%28%29%3B%0A%20%20%20menuPopup.appendChild%28mItem%29%3B%7D%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

mokujin пишет

Пробовал что-то какие-то проверки вставлять, смотрел в исходнег... да видно не те и не туда.
может подскажет кто, как прально ?

походу, так прально:

auto-hide SideBar on click page

Выделить код

Код:

// ---------12--------------------------- (auto-hide SideBar on click page) ---------------------------------------------------------------
(function() {    this.clickPageSB = function(event) {gBrowser.addEventListener('mousedown',on, false);   };

    function go() {
           clickPageSB(event);
          var sidebarBox = document.getElementById("sidebar-box");
        if ( sidebarBox.hidden = "true") return;
           toggleSidebar();
           }

   function on() {
      gBrowser.removeEventListener('mousedown',on, false);
      timeoutId = setTimeout(go, 1000)   
      }
   function off() {   clickPageSB(event);     clearTimeout(timeoutId)   }
   sidebar.addEventListener('click',off, false);
     clickPageSB(event);
 })();


ошибки нету, панель закрывает, но... кнопка(на VerticalToolbar) сохраняет состояние "нажатости", что тоже хреново, но терпимо. млин, чёж так сложно-то и так тупо все с этой бок.панелью :sick:

mokujin пишет:
ошибки нету, панель закрывает, но... кнопка(на VerticalToolbar) сохраняет состояние "нажатости",

добавь в код
knopka.checked=false
где knopka это кноопка которую нужно отжать (получи её через ид например)

ну это да... только вот не оно ;)  knopka.checked может быть любая. History , Bookmark, printPages2Pdf_toolbar_sidebar и др.
можно конечно их все обходить... только это КМК фигня будит полная. Хотя как вариант, благодарю.

Тут еще одно что: с этим кодом в Init при старте бравзера теперь открываеццо бок.панель. оно и логично, так записано

Выделить код

Код:

if ( sidebarBox.hidden = "true") return;
           toggleSidebar();

.. и открывает посл. состояние бок.панели.

Надо наверно, заводить... как это... observer вроде, но даже не представляю что это и как. Пока, нехай будет так. придумаю что, изменю.
такая очевидно-нужная штука(при клике на странице закрывать панель + в настройках для каждой да\нет) и такой гемор с нею.

Сделал. Плазал в browser.js ... всё было рядом :) Панель закрываеццо, кнопки отжимаюццо. Все как должно.... сюдаб еще добавить отмену действия(скрытия) при выделении текста и при кликах кроме ЛКМ - былоб шикарно. (сделал)
пока не знаю каки куда.

Скрывать боковую панель по клику на странице

Выделить код

Код:

// ---------12---------------------------  (auto-hide SideBar ) ---------------------------------------------------------------
// при открытой бок.панели  и клике ЛКМ( ПКМ и СКМ игнор.) на странице, будет закрыта.
// + можно делать выделение текста для копирования , панель не будет закрываться.
// + исключения для адресов где не нужно закрывать бок.панель. Например расш-е ScrapBook. исключения можно убрать или добавить в переменную disable

(function() { this.clickPageSB = function(event) { gBrowser.addEventListener('mousedown',on, false);   };

    function go() {
           clickPageSB(event);
           var selection = getBrowserSelection();
           const sidebarbox = window.document.getElementById("sidebar-box").hidden;
             if ( !sidebarbox && !selection && getDomain() ) toggleSidebar();
           }

    function on(e) {
      if ( e.button != 0 ) return;
       gBrowser.removeEventListener('mousedown',on, false);
       timeoutId = setTimeout(go, 500)   
       }

    function off() {   clickPageSB(event);     clearTimeout(timeoutId)   }
      sidebar.addEventListener('click',off, false);
       clickPageSB(event);
       
       

// -------- Получить домен или пусто если это внутренние адреса about , chrome, file:/// т.д. ---------------------------
 function getDomain() {
     var protocol = content.location.protocol;
     var disable = ["about:", "chrome:", "jar:", "data:"];
     
     if ( disable.indexOf( protocol ) !== -1 ) return; 
          var domName = content.document.domain;
          return domName.replace(/^www./g,'');
 };       
       
 })();


Лучше даже так:
скрытый текст

Выделить код

Код:

// ---------12--------------------------- (auto-hide SideBar) ---------------------------------------------------------------
(function() { this.clickPageSB = function(event) { gBrowser.addEventListener('mousedown',on, false);   };

    function go() {
           clickPageSB(event);
           var selection = getBrowserSelection();
           const sidebarbox = window.document.getElementById("sidebar-box").hidden;
             if ( !sidebarbox && !selection && getLoc() ) toggleSidebar();
           }

    function on(e) {
      if ( e.button != 0 ) return;
       gBrowser.removeEventListener('mousedown',on, false);
       timeoutId = setTimeout(go, 500)   
       }

    function off() {   clickPageSB(event);     clearTimeout(timeoutId)   }
      sidebar.addEventListener('click',off, false);
       clickPageSB(event);

// Ф-ция вернет текущий адресс или undefined если начало адреса совпадает с исключениями в arr 
//  Исключения в массиве arr - если положение совпадает, начинается с ... то выход. иначе возврат текущего урл.
 function getLoc() {
      let loc = content.location.href;
      let arr = ["chrome://scrapbook/","data:"];
   for (var i = 0; i < arr.length; i++) {
      if ( loc.startsWith(arr[i]) == 1 ) return;
      }
    return loc;
 };
       
 })();

доброго времени..
симанки 2.49.1
нужен следующий функционал - закрывать автоматически страницы с одинаковым url  (копии одной и той же страницы)
ничего работающего из аддонов найти не смог. посоветовали сюда обратиться

если у кого есть мысли поделитесь

ds(ds)

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

Выделить код

Код:

// Запретить дублирование вкладок, от 07.01.2015. ................................
function stopDuplicateTab(aURI) {
   var stop = false;
   for( var tab of gBrowser.tabs) {
        if ( tab.linkedBrowser.currentURI.spec == aURI ) {
             gBrowser.selectedTab = tab;
             stop = true;
             break;
             }
        }
   if (stop) return true;
};
const handle = gBrowser.addTab;
eval("gBrowser.addTab = " + handle.toString().replace('{', '{ \n\n if (stopDuplicateTab(aURI)) return;'));
addDestructor(()=> eval("gBrowser.addTab = " + handle) );

В 57+ какие-нибудь из кнопок серии "открыть видео в..." / "скачать видео с помощью..." работают?
Те что по ПКМ по ссылке.

В 52.5.2 ESR x64 больше не работает Menuitem hider. Без неё очень плохо.

Mishania пишет

В 52.5.2 ESR x64 больше не работает Menuitem hider. Без неё очень плохо.

У меня работает. Да и чего бы ей не работать? В ESR только безопасность обновляется.

Ultima2m,   у меня тоже работала, пока на x64 yt обновил. Вот и думаю что случилось.

Какая версия кнопки Autocopy+3  для 57 сейчас самая последняя и самая рабочая?
Вроде видел где-то от 2015 года, но найти не могу.

usalex пишет

Какая версия кнопки Autocopy+3  для 57 сейчас самая последняя и самая рабочая?Вроде видел где-то от 2015 года, но найти не могу.

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EAutocopy%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20Autocopy%2C%20%u043E%u0442%2008.12.2015.%20...............%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...............%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20cbu.setPrefs%28%22Autocopy%22%2C%20%21cbu.getPrefs%28%22Autocopy%22%29%29%3B%20%0A%20%20%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%7D%3B%20%0A%0A%0A%0A//%20%u0421%u043E%u043C%u0435%u043D%u044E%20%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20...............%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0430%u0432%u0442%u043E%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%u043F%u0440%u0438%20%u0432%u044B%u0445%u043E%u0434%u0435%20%u0438%u0437%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%27%2C%20value%3A%20%27Autocopy.reset%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043C%u0438%u0433%u0430%u0435%u0442%20%u043F%u0440%u0438%20%u0430%u0432%u0442%u043E%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0438%27%2C%20value%3A%20%27Autocopy.selectingTextBlink%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0414%u0432%u043E%u0439%u043D%u043E%u0439%20%u043F%u0440%u0430%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%27%2C%20value%3A%20%27Autocopy.copyWithDoubleClick%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0414%u0432%u043E%u0439%u043D%u043E%u0439%20%u043B%u0435%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u0432%u044B%u0434%u0435%u043B%u044F%u0435%u0442%20%u0432%u0441%u0435%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0445%20%u043F%u043E%u043B%u044F%u0445%27%2C%20value%3A%20%27Autocopy.selectWithDoubleClick%27%20%7D%2C%0A%20%20%20%20%7B%20label%3A%20%27%u0414%u0432%u043E%u0439%u043D%u043E%u0439%20%u043F%u0440%u0430%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%20%u0441%u043E%u0445%u0440%u0430%u043D%u044F%u0435%u0442%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%27%2C%20value%3A%20%27Autocopy.saveWithDoubleClick%27%20%7D%2C%20%0A%20%20%20%20%7B%20label%3A%20%27%u0421%u0440%u0435%u0434%u043D%u0438%u043C%20%u043A%u043B%u0438%u043A%u043E%u043C%20%u0432%u0441%u0442%u0430%u0432%u043B%u044F%u0442%u044A%20%u0442%u0435%u043A%u0441%u0442%20%u0441%20%u0437%u0430%u043C%u0435%u043D%u043E%u0439%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%27%2C%20value%3A%20%27middlemouse.paste%27%20%7D%2C%0A%20%20%20%20%7B%20separator%3A%20%27%27%7D%2C%0A%5D%3B%0A%0Avar%20menuPopup%20%3D%20self.appendChild%28%20document.createElement%28%22menupopup%22%29%20%29%3B%0Aarray.forEach%28%28m%29%3D%3E%20%7B%0A%20%20%20%20if%20%28%20%22separator%22%20in%20m%20%29%20%7B%20menuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%20return%20%7D%3B%0A%20%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20mItem.setAttribute%28%22label%22%2C%20m.label%29%3B%0A%20%20%20%20mItem.setAttribute%28%27type%27%2C%20%27checkbox%27%29%3B%0A%20%20%20%20mItem.setAttribute%28%27checked%27%2C%20cbu.getPrefs%28m.value%29%20%29%3B%0A%20%20%20%20mItem.onclick%20%3De%3D%3E%20%7B%20e.stopPropagation%28%29%3B%20cbu.setPrefs%28m.value%2C%20%21cbu.getPrefs%28m.value%29%29%20%7D%3B%20%20%0A%20%20%20%20menuPopup.appendChild%28%20mItem%20%29%3B%0A%7D%29%3B%0A%0A//%20%u0434%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20CB%20%u043C%u0435%u043D%u044E%20....%0AmenuPopup.appendChild%28document.createElement%28%22menu%22%29%29.setAttribute%28%22label%22%2C%20%22%u041C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%22%29%3B%0AmenuPopup.lastChild.appendChild%28document.getElementById%28%22custombuttons-contextpopup%22%29.cloneNode%28true%29%20%29%3B%0AmenuPopup.setAttribute%28%22onpopupshowing%22%2C%20%22document.popupNode%20%3D%20document.getElementById%28%27%22%20+%20_id%20+%20%22%27%29%22%29%3B%0A%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u043D%u0430%u0441%u0442%u0440%u043E%u0435%u043A%20%u0432%20%27about%3Aconfig%27%20...............%0Aconst%20s%20%3D%20%22Autocopy%22%3B%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29.%0A%20%20%20src%20%3D%20cbu.getPrefs%28s%29%0A%20%20%20%3F%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%0A%20%20%20%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%3B%0A%7D%3B%20%20%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%20%29%3B%0A%0A%0A%0A//%20%u0412%u044B%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043F%u0440%u0438%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0438%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20...............%0Avar%20toggleButton%20%3D%20%7B%0A%20%20%20observe%3A%28subject%2C%20topic%2C%20data%29%3D%3E%20%7B%0A%20%20%20%20%20%20cbu.getPrefs%28%22Autocopy.reset%22%29%20%26%26%20data%20%3D%3D%20%22shutdown%22%20%26%26%20cbu.setPrefs%28%22Autocopy%22%2C%20false%29%3B%20%20%0A%20%20%20%7D%0A%7D%3B%0AServices.obs.addObserver%28toggleButton%2C%20%22quit-application%22%2C%20false%29%3B%0A%0A%0A%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u0438%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%2C%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20...............%0Afunction%20autocopy%28e%29%20%7B%0A%20%20%20if%20%28%20e.button%20%7C%7C%20e.target%20instanceof%20Ci.nsIDOMNSEditableElement%20%29%20return%3B%0A%20%20%20var%20win%20%3D%20e.target.ownerDocument.defaultView%3B%0A%20%20%20if%20%28%20win.top%20%21%3D%20content%20%29%20return%3B%0A%20%20%20%0A%20%20%20if%20%28%20e.type%20%3D%3D%20%27mousedown%27%20%29%20autocopy.lastSelection%20%3D%20e.target.ownerDocument.defaultView.getSelection%28%29.toString%28%29%3B%20%0A%20%20%20%0A%20%20%20if%20%28%20e.type%20%21%3D%3D%20%27mouseup%27%20%29%20return%3B%20%0A%20%20%20%0A%20%20%20var%20selection%20%3D%20e.target.ownerDocument.defaultView.getSelection%28%29.toString%28%29%3B%0A%20%20%20if%20%28%20cbu.getPrefs%28%22Autocopy%22%29%20%26%26%20selection%20%26%26%20selection%20%21%3D%3D%20autocopy.lastSelection%20%29%20%7B%0A%20%20%20%20%20%20%20%20goDoCommand%28%27cmd_copy%27%29%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043C%u0438%u0433%u0430%u0435%u0442%20....%0A%20%20%20%20%20%20%20%20if%20%28%20%21cbu.getPrefs%28%22Autocopy.selectingTextBlink%22%29%20%29%20return%3B%0A%20%20%20%20%20%20%20%20document.activeElement.blur%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20window.content.focus%28%29%2C%20300%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0AaddEventListener%28%22mouseup%22%2C%20autocopy%2C%20false%2C%20gBrowser%20%29%3B%0AaddEventListener%28%22mousedown%22%2C%20autocopy%2C%20false%2C%20gBrowser%20%29%3B%0A%0A%0A%0A//%20C%u0440%u0435%u0434%u043D%u0435%u0439%20%u043A%u043D%u043E%u043F%u043A%u043E%u0439%20%u043C%u044B%u0448%u0438%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0435%20%u043F%u043E%u043B%u044F%20%u0441%20%u0437%u0430%u043C%u0435%u043D%u043E%u0439%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20...............%0Afunction%20middleMousePaste%28e%29%20%7B%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%201%20%26%26%20cbu.getPrefs%28%27middlemouse.paste%27%29%20%29%20%7B%0A%0A%20%20%20%20%20%20%20%20if%20%28%20/input%7Cpassword%7Ctextarea%7Ctextbox%7Csearchbar%7Cfindbar%7Ccbeditor/.test%28%20e.target.localName.toLowerCase%28%29%20%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20document.commandDispatcher.getControllerForCommand%28%22cmd_paste%22%29%20%29%20%7B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20var%20cmd%20%3D%20%22cmd_insertText%22%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20var%20commandDispatcher%20%3D%20%28%20this.document%20%7C%7C%20document%20%29.commandDispatcher%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20var%20controller%20%3D%20commandDispatcher.getControllerForCommand%28cmd%29%3B%0A%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20controller%20%26%26%20controller.isCommandEnabled%28cmd%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20controller%20%3D%20controller.QueryInterface%28Components.interfaces.nsICommandController%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20params%20%3D%20Cc%5B%22@mozilla.org/embedcomp/command-params%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Ci.nsICommandParams%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20params.setStringValue%28%22state_data%22%2C%20gClipboard.read%28%29%20%29%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20controller.doCommandWithParams%28cmd%2C%20params%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0AaddEventListener%28%22click%22%2C%20middleMousePaste%2C%20true%2C%20document.documentElement%29%3B%0A%0A%0A%0A//%20%u0414%u043E%u043F%u043E%u043B%u043D%u0438%u0442%u0435%u043B%u044C%u043D%u044B%u0435%20%u0432%u043E%u0437%u043C%u043E%u0436%u043D%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0437%u043D%u0430%u0447%u043A%u0430%20%u0438%u0434%u0435%u043D%u0442%u0438%u0444%u0438%u043A%u0430%u0446%u0438%u0438%20%u0441%u0430%u0439%u0442%u0430%20%u0432%20%u0441%u0442%u0440%u043E%u043A%u0435%20%u0430%u0434%u0440%u0435%u0441%u0430%20...............%0AaddEventListener%28%22click%22%2C%20e%3D%3E%20%7B%0A%20%20%20e.preventDefault%28%29%3B%0A%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%0A%20%20%20//%20%u041B%u041A%u041C%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u0438%u043D%u0444%u043E%u0440%u043C%u0430%u0446%u0438%u044E%20%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%u0432%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%27%u0420%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u0438%u044F%27%20....%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%0A%20%20%20%20%20%20%20%20BrowserPageInfo%28content.document%2C%20%28gURLBar.value.startsWith%28%22http%22%29%20%3F%20%22permTab%22%20%3A%20%22generalTab%22%29%29%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20//%20%u041F%u041A%u041C%20%u043A%u043E%u043F%u0438%u0440%u0443%u0435%u0442%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u0430%u0434%u0440%u0435%u0441%20....%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20gClipboard.write%28%20content.location%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20//%20%u0437%u043D%u0430%u0447%u043E%u043A%20%u0438%u0434%u0435%u043D%u0442%u0438%u0444%u0438%u043A%u0430%u0446%u0438%u0438%20%u0441%u0430%u0439%u0442%u0430%20%u043C%u0438%u0433%u0430%u0435%u0442%20%u043A%u0440%u0430%u0441%u043D%u044B%u043C%20....%0A%20%20%20%20%20%20%20%20document.getElementById%28%22identity-box%22%29.style.background%20%3D%20%22red%22%3B%0A%20%20%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20document.getElementById%28%22identity-box%22%29.style.background%20%3D%20%22%22%2C%20300%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%2C%20true%2C%20document.getElementById%28%22identity-box%22%29%20%29%3B%0A%0A%20%0A%20%20%20%0A//%20%u0414%u043E%u043F%u043E%u043B%u043D%u0438%u0442%u0435%u043B%u044C%u043D%u044B%u0435%20%u0432%u043E%u0437%u043C%u043E%u0436%u043D%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u043A%u043B%u0438%u043A%u0430%20%u043C%u044B%u0448%u0438%2C%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20...............%0Afunction%20handleDblClick%28e%29%20%7B%0A%20%20var%20node%20%3D%20e.target%3B%0A%20%20var%20editor%20%3D%20node.editor%3B%0A%20%20%0A%20%20//%20%u0432%u044B%u0434%u0435%u043B%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0445%20%u043F%u043E%u043B%u044F%u0445%20....%0A%20%20if%20%28%20e.button%20%3D%3D%200%20%26%26%20cbu.getPrefs%28%22Autocopy.selectWithDoubleClick%22%29%20%29%20%7B%20%20%20%20%0A%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%0A%20%20%20%20%20%20%20if%20%28%20/input%7Ctextbox%7Ctextarea/.test%28%20node.localName%20%29%20%29%20%21editor%20%3F%20node.select%28%29%20%3A%20editor.selectAll%28%29%3B%0A%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%0A%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20....%20%20%20%20%0A%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20cbu.getPrefs%28%22Autocopy.saveWithDoubleClick%22%29%20%26%26%20node.localName%20%3D%3D%20%27img%27%20%29%20%7B%0A%20%20%20%20%20%20%20saveImageURL%28%20gContextMenu.imageURL%2C%200%2C%200%2C%200%2C%201%2C%20null%2C%20content.document%20%29%3B%0A%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20document.getElementById%28%22contentAreaContextMenu%22%29.hidePopup%28%29%20%7D%2C%2020%29%3B%0A%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%0A%20%20//%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20....%0A%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20cbu.getPrefs%28%22Autocopy.copyWithDoubleClick%22%29%20%26%26%20%21/findbar%7Ctabbrowser/.test%28%20node.localName%20%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%21editor%20%3F%20goDoCommand%28%22cmd_copy%22%29%20%3A%20editor.copy%28%29%3B%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20try%20%7B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20var%20box%20%3D%20%28%20node.textbox%20%7C%7C%20node%20%29.inputField.parentNode%3B%0A%20%20%20%20%20%20%20%20%20%20%20var%20popup%20%3D%20box.ownerDocument.getAnonymousElementByAttribute%28box%2C%20%22anonid%22%2C%20%22input-box-contextmenu%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20popup.hidePopup%28%29%2C%2050%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20catch%28e%29%20%7B%20document.getElementById%28%22contentAreaContextMenu%22%29.hidePopup%28%29%20%7D%3B%20%0A%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%0A%7D%3B%0AaddEventListener%28%22dblclick%22%2C%20handleDblClick%2C%20false%2C%20gBrowser%20%29%3B%0A%0A%0A%0A//%20%u041D%u0430%u0431%u043B%u044E%u0434%u0430%u0442%u0435%u043B%u044C%20%u0441%u043B%u0435%u0434%u0438%u0442%20%u0437%u0430%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0435%u043C%20%u043D%u043E%u0432%u044B%u0445%20%u043E%u043A%u043E%u043D%20...............%0Afunction%20observer%28subject%29%20%7B%0A%20%20%20subject.addEventListener%28%22load%22%2C%20e%3D%3E%20%7B%0A%20%20%20%20%20%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20%20%20var%20view%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20//%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0442%u044C%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u0438%20%u043A%u043B%u0438%u043A%u0430%20%u0434%u043B%u044F%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%u043E%u0432%20CB%20%u043A%u043D%u043E%u043F%u043E%u043A%0A%20%20%20%20%20%20if%20%28%20/custombuttons-editor/.test%28doc.URL%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20view.addEventListener%28%22click%22%2C%20middleMousePaste%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20view.addEventListener%28%22dblclick%22%2C%20handleDblClick%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%7D%29%3B%0A%7D%3B%0AServices.ww.registerNotification%28observer%29%3B%0AaddDestructor%28%28%29%3D%3E%20Services.ww.unregisterNotification%28observer%29%20%29%3B%0A%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.tooltipText%20%3D%20%22Autocopy%20%5Cn%u041B%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u043E%u0435%20%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%5Cn%u041F%3A%20%u041C%u0435%u043D%u044E%20+%20CB%20%u043C%u0435%u043D%u044E%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Ultima2m
Спасибо!
А где вы ее взяли, где она опубликована и кто автор?
Это самая последняя версия?

Есть такая кнопка - "Экспорт в HTML"  в контекстном меню закладок для выборочного экспорта закладок.

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

Выделить код

Код:

//-------------------- Экспорт в HTML файл в контекстном меню закладок

 (function () { 
function ImageConverter(imageURL) {
this.imageURL = imageURL;
this.channel = Services.io.newChannel(imageURL, null, null);
this.channel.asyncOpen(this, null);
}
ImageConverter.prototype = {
imageURL : "",
channel : null,
bytes : [],
stream : null,
Database64 : null,
iscompleted : false,
QueryInterface : function (iid) {
if (!iid.equals(Components.interfaces.nsISupports) &&
!iid.equals(Components.interfaces.nsIRequestObserver) &&
!iid.equals(Components.interfaces.nsIStreamListener)) {
throw Components.results.NS_ERROR_NO_INTERFACE;
}
return this;
},

onStartRequest : function (aRequest, aContext) {
this.stream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
this.iscompleted = false;
},

onStopRequest : function (aRequest, aContext, aStatusCode) {
this.Database64 = 'data:' + this.channel.contentType + ';base64,' + btoa(String.fromCharCode.apply(null, this.bytes));
this.iscompleted = true;
},

onDataAvailable : function (aRequest, aContext, aInputStream, aOffset, aCount) {
this.stream.setInputStream(aInputStream);
var chunk = this.stream.readByteArray(aCount);
this.bytes = this.bytes.concat(chunk);
}
};
var ExportHTMLFolder = {
escapeHTML: function(str) {
return str.replace(/[&"<>]/g, function (m) ({ "&": "&amp;", '"': "&quot", "<": "&lt;", ">": "&gt;" })[m]);
},
onMenuItemCommand: function(event) {
var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService);
var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService);
var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
var MPMenu = PlacesUtils.getString("BookmarksMenuFolderTitle");
var NodeID = document.popupNode._placesNode || document.popupNode.parentNode.selectedNode;
fp.init(window, PlacesUIUtils.getString("EnterExport"),Ci.nsIFilePicker.modeSave);
fp.appendFilters(Ci.nsIFilePicker.filterHTML);
fp.defaultString = NodeID.title+".html";
if (fp.show() != Ci.nsIFilePicker.returnCancel) {
var file = fp.file;
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
.createInstance(Components.interfaces.nsIFileOutputStream);
var charset = "UTF-8";
foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0);
var os = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
.createInstance(Components.interfaces.nsIConverterOutputStream);
os.init(foStream, charset, 0, 0x0000);
var nbTab = 5;
var data = '<!DOCTYPE NETSCAPE-Bookmark-file-1>\n';
data = data + '<!-- This is an automatically generated file.\n';
data = data + '\tIt will be read and overwritten.\n';
data = data + '\tDO NOT EDIT! -->\n';
data = data + '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">\n';
data = data + '<TITLE>Bookmarks</TITLE>\n';
data = data + '<H1>'+ExportHTMLFolder.escapeHTML(MPMenu)+'</H1>\n';
data = data + '\n';
data = data + '<DL><p>\n';
os.writeString(data);
var options = historyService.getNewQueryOptions();
var query = historyService.getNewQuery();
if( NodeID.type != 0 )
{
query.setFolders([NodeID.itemId], 1);
var result = historyService.executeQuery(query, options);
node = result.root;
}
else
{
query.setFolders([NodeID.parent.itemId], 1);
var result = historyService.executeQuery(query, options);
var rootNode = result.root;
rootNode.containerOpen = true;
inc = 0;
var node = rootNode.getChild(inc);
while(( inc < rootNode.childCount )&&( node.itemId != NodeID.itemId )) {
inc++;
var node = rootNode.getChild(inc);
}
rootNode.containerOpen = false;
}
this.ecrireUnMP( os, node, nbTab );
data = '</DL></p>\n';
os.writeString(data);
os.close();
}
},
ecrireUnMP: function( flux, elem, nbTab ) {
var resultTypes = Ci.nsINavHistoryResultNode;
if( elem.type == resultTypes.RESULT_TYPE_SEPARATOR ) {
var chaine = new Array(nbTab).join(' ') + "<HR>\n";
flux.writeString(chaine);
}
else if( elem.type == resultTypes.RESULT_TYPE_URI ) {
var Description= PlacesUIUtils.getItemDescription(elem.itemId);
var chaine = new Array(nbTab).join(' ') + '<DT><A HREF="' + this.escapeHTML(elem.uri);
if ( elem.icon.indexOf('moz-anno:favicon:http') >= 0 )
{
//Services.console.logStringMessage('[ moz-anno:favicon ]: ' + elem.icon );
if ( elem.icon.indexOf('http://www.mozilla.org/2005/made-up-favicon/') < 0 ){
chaine = chaine + '" ICON_URI="' + elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http') + 'moz-anno:favicon:'.length);
}
var Image = new ImageConverter( elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http')) );
var thread = Cc['@mozilla.org/thread-manager;1'].getService().mainThread;
while ( !Image.iscompleted ) {
thread.processNextEvent(true);
}
chaine = chaine + '" ICON="' + Image.Database64;
}
else if ( elem.icon.indexOf('moz-anno:favicon:data:image') >= 0 )
{
chaine = chaine + '" ICON="' +elem.icon.slice(elem.icon.indexOf('data:image'));
}
var chaine = chaine + '">' + this.escapeHTML(elem.title) + '</A>\n' + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n';
flux.writeString(chaine);
}
else if(( elem.type == resultTypes.RESULT_TYPE_FOLDER )||( elem.type == resultTypes.RESULT_TYPE_FOLDER_SHORTCUT )) {
var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService);
var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService);
var Description= PlacesUIUtils.getItemDescription(elem.itemId);
var chaine = new Array(nbTab).join(' ') + '<DT><H3>' + this.escapeHTML(elem.title) + '</H3>\n';
var chaine = chaine + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n';
chaine = chaine + new Array(nbTab).join(' ') + '<DL><p>\n';
flux.writeString(chaine);
nbTab = nbTab + 4;
var options = historyService.getNewQueryOptions();
var query = historyService.getNewQuery();
query.setFolders([elem.itemId], 1);
var result = historyService.executeQuery(query, options);
var rootNode = result.root;
rootNode.containerOpen = true;
for (var inc = 0; inc < rootNode.childCount; inc ++) {
var node = rootNode.getChild(inc);
this.ecrireUnMP( flux, node, nbTab );
}
rootNode.containerOpen = false;
nbTab = nbTab - 4;
chaine = new Array(nbTab).join(' ') + '</DL></p>\n';
flux.writeString(chaine);
}
},

init: function()
{
var contextMenu = document.getElementById("placesContext");
if (contextMenu) contextMenu.addEventListener("popupshowing", this.ExportHTMLFolderShowHideItem, false);
},
ExportHTMLFolderShowHideItem: function(event)
{
var show = document.getElementById("placesContext_ExportHTMLFolder");
show.hidden = (document.popupNode.localName == "menuseparator")||( document.popupNode.className == "openintabs-menuitem");
document.getElementById("placesContext_ExportHTMLFolderSep").hidden = show.hidden;
},
};

window.addEventListener("load", function load(event) {
window.removeEventListener("load", load, false); //remove listener, no longer needed
ExportHTMLFolder.init();
}, false);


if ( document.getElementById("placesContext_ExportHTMLFolder") ) return; 

  var copyBothMenuItem = document.createElement("menuitem");
    copyBothMenuItem.id = "placesContext_ExportHTMLFolder";
    copyBothMenuItem.setAttribute("label", "Экспорт в HTML");
    copyBothMenuItem.setAttribute("selection", "any");
    copyBothMenuItem.setAttribute("closemenu", "single");
  copyBothMenuItem.addEventListener("command", function () { ExportHTMLFolder.onMenuItemCommand(event); });
  
     var copyMenuItem = document.getElementById("placesContext_openSeparator");
     copyMenuItem.parentNode.insertBefore(copyBothMenuItem, copyMenuItem); 
  
})();


Не помню где нашел. В FF56 она работает, а FF57 перестала работать. Может кто нибудь подправит? Буду очень признателен.

usalex пишет

А где вы ее взяли, где она опубликована и кто автор?

Кнопка на сайте выложена. Кажется вот этот вариант
Автор - bunda1

usalex пишет

Какая версия кнопки Autocopy+3  для 57 сейчас самая последняя и самая рабочая?

Я прошу прощение за то, что вмешиваюсь :blush: Возможно, будет интересно для тех же целей расширение - AutoCopy (WebExtension)

А можно как то отрегулировать ширину этой вертикальной  панели. А то раза в три шире чем хотелось бы. Это VT, вертикальная панель. В 57 работает.
скрин

скрытый текст
c222ea3c10cee653f44aa20a3e5e6487.png

код
скрытый текст

Выделить код

Код:

var vto = {
    distanceShow: 12,
    distanceHide: 64,
    showDelay: 320,
    color: "lightblue",
    fringe: "black",
    padding: 3,
    name: "VT",

    btn: this,
    tcm: document.getElementById("toolbar-context-menu"),
    ctm: document.getElementById("customization-toolbar-menu"),
    deck: document.getElementById("content-deck"),
    id: "cb-vt",

    get cust() gBrowser.currentURI.spec == "about:customizing",
    get xs() {
        delete this.xs;
        return this.xs = Cc["@mozilla.org/xul/xulstore;1"].getService(Ci.nsIXULStore);
    },
    init: function() {
        if (this.cust || this.btn._destructors.length) return;

        var vt = this.initVT();
        var vto = this;

        this.btn.onclick = function(e) {
            e.button || vto.toggleVT();
        }
        window.addEventListener("popupshown", this, false);
        window.addEventListener("popuphidden", this, false);
        window.addEventListener("resize", this, false);
        this.tcm.addEventListener("command", this, false);
        this.tcm.addEventListener("popupshowing", this, false);

        vto.toggleVT(vt.hasOwnProperty("on") ? vt.on
            : !this.xs.hasValue(location, vto.id, "collapsed")
        );
        this.resize();
        vto.btn._destructors.push({context: vto, destructor: vto.destroy});
    },
    destroy: function(reason) {
        window.removeEventListener("popupshown", this, false);
        window.removeEventListener("popuphidden", this, false);
        window.removeEventListener("resize", this, false);
        this.tcm.removeEventListener("command", this, false);
        this.tcm.removeEventListener("popupshowing", this, false);
        this.setCollapser(false);

        if (reason == "destructor" && this.cust) {
            var vto = this;
            vto.resize();

            gNavToolbox.addEventListener("customizationready", vto, false);
            CustomizableUI.addListener(vto);

            this.ctm.addEventListener("command", vto, false);
            this.ctm.addEventListener("popupshowing", vto, false);
            window.addEventListener("resize", vto, false);

            gNavToolbox.addEventListener("aftercustomization", function ac() {
                gNavToolbox.removeEventListener("aftercustomization", ac, false);
                gNavToolbox.removeEventListener("customizationready", vto, false);
                CustomizableUI.removeListener(vto);

                vto.ctm.removeEventListener("command", vto, false);
                vto.ctm.removeEventListener("popupshowing", vto, false);
                window.removeEventListener("resize", vto, false);

                document.getElementById(vto.btn.id) || vto.destroyVT();

            }, false);
        }
        if (reason == "delete") {
            CustomizableUI.removeWidgetFromArea(this.btn.id);
            this.destroyVT();
        }
    },
    handleEvent: function(e) this[e.type](e),

    command: function(e) {
        if (e.target.id != "toggle_" + this.id) return;
        e.preventDefault();
        this.toggleVT();
    },
    popupshowing: function(e) {
        var menuitem = e.target.querySelector("#toggle_" + this.id);
        menuitem && menuitem.setAttribute("checked", this.vt.on);
        if (this.cust || !this.vt.contains(e.target.triggerNode)) return;
        for(var selector of [".customize-context-moveToPanel", ".customize-context-removeFromToolbar"]) {
            menuitem = e.target.querySelector(selector);
            menuitem && menuitem.removeAttribute("disabled");
        }
    },
    mousemove: function collapser(e) {
        var distance = collapser.distance = e.screenX - document.documentElement.boxObject.screenX;
        if (collapser.waiting) return;
        if (distance <= this.distanceShow && this.vt.collapsed) {
            if (this.showDelay < 1) {
                this.vt.collapsed = false;
                return;
            }
            collapser.waiting = true;
            setTimeout(function(vto) {
                if (collapser.distance >= vto.distanceShow) {
                    collapser.waiting = false;
                    return;
                }
                vto.vt.collapsed = false;
                collapser.waiting = false;
            }, this.showDelay, this);
        }
        if (distance >= this.distanceHide && !this.vt.collapsed)
            this.vt.collapsed = true;
    },
    setCollapser: function(set) {
        set
        ? this.cust || window.addEventListener("mousemove", this, false)
        : window.removeEventListener("mousemove", this, false);
    },
    callCollapser: function(e) {
        this.mousemove({screenX: document.documentElement.boxObject.screenX + MousePosTracker._x});
    },
    customizationready: function() {
        window.removeEventListener("customizationready", this, false);
        this.vt.on && this.insertBox(true);
    },
    resize: function(e) {
        this.vt.style.maxHeight = this.deck.boxObject.height + 1 + "px";
    },
    popupshown: function(e) this.handlePopup(e),
    popuphidden: function(e) this.handlePopup(e),

    handlePopup: function(e) {
        if (
            this.vt.collapsed || this.vt.on
            || (e.target.localName != "menupopup" && e.target.localName != "panel")
        ) return;
        setTimeout(function(vto) {
            var hasPopup = Array.concat(
                Array.slice(document.getElementsByTagName("menupopup")),
                Array.slice(document.getElementsByTagName("panel"))
            ).some(function(popup)
                "state" in popup && popup.state == "open" && (
                    vto.vt.contains(popup)
                    || ("triggerNode" in popup && vto.vt.contains(popup.triggerNode))
                    || (
                        "anchorNode" in popup && popup.anchorNode && (
                            vto.vt.contains(popup.anchorNode)
                            || vto.vt.contains(document.getBindingParent(popup.anchorNode))
                        )
                    )
                )
            );
            vto.setCollapser(!hasPopup);
            hasPopup || vto.callCollapser();
        }, 200, this);
    },
    onWidgetAfterDOMChange: function(...a) {
        if (a[2] == this.vt.box) this.vt.hbox.style.minWidth = this.vt.boxObject.width + "px";
    },
    initVT: function() {
        var id = this.id;
        var boxId = id + "-customization-target";
        var vt = this.vt =
            document.getElementById(id) ||
            document.createElement("toolbar");
        var attrs = {
            id: id,
            mode: "icons",
            iconsize: "small",
            orient: "vertical",
            customizable: "true",
            persist: "collapsed",
            toolbarname: this.name,
            fullscreentoolbar: "true",
            class: "chromeclass-toolbar",
            context: "toolbar-context-menu",
            style: "-moz-appearance: none; display: -moz-box; height: 100%; position: fixed; min-width: 20px"
        };
        for(var attr in attrs) vt.setAttribute(attr, attrs[attr]);
        if (!vt.parentNode) {

            var box = vt.box = document.createElement("vbox");
            vt.appendChild(box);
            box.id = boxId;
            box.style.cssText = "height: 100%; width: 100%;"

            vt.customizationTarget = box;
            gNavToolbox.appendChild(vt);

            if (CustomizableUI.areas.indexOf(id) == -1) {
                CustomizableUI.registerArea(id, {legacy: true});
            }
            box.removeAttribute("class");

            box.__defineGetter__("localName", function()
                Components.stack.caller.toString().indexOf("custombutton.buttonConstructor")
                     == -1 ? "vbox" : "toolbar"
            );
            vt.hbox = document.createElement("hbox");
            vt.hbox.id = id + "-hbox";
        }
        vt.box.style.padding = "0 " + this.padding + "px";
        vt.style.backgroundColor = this.color;
        vt.style.borderRight = "1px solid " + this.fringe;
        return vt;
    },
    destroyVT: function(reason) {
        var vt = this.vt;
        CustomizableUI.unregisterArea(vt.id, {});
        vt.hbox.parentNode && vt.hbox.parentNode.removeChild(vt.hbox);
        vt.parentNode && vt.parentNode.removeChild(vt);

        this.xs.removeValue(location, vto.id, "collapsed");
        this.xs.removeValue(location, vto.id, "currentset");
    },
    insertBox: function(ins) {
        var vt = this.vt;
        var box = vt.hbox;
        if (!ins) {
            box.parentNode && box.parentNode.removeChild(box);
            return;
        }
        var id = this.cust ? "customization-palette-container" : "sidebar-box";
        var point = document.getElementById(id);
        point.parentNode.insertBefore(box, point);
        var mw = function() box.style.minWidth = vt.boxObject.width + "px";
        mw(); setTimeout(mw, 100);
    },
    toggleVT: function(on) {
        var vt = this.vt;
        if (on == undefined) on = !vt.on;
        vt.on = on;
        this.setCollapser(!on);
        vt.collapsed = !on;
        this.insertBox(on);
    }
};
vto.init();


function addBackground(e) {
   setTimeout(function() {
      var toolbar = document.getElementById('cb-vt');
      var win = document.getElementById("main-window");
      
      var image = win.style.backgroundImage;
      if ( image == '' ) { 
           toolbar.style.background = '';
           return;
           };
      toolbar.style.background = image;
      toolbar.style.backgroundSize = 'auto 100%';
   }, 500);
};
addBackground(); 
Services.obs.addObserver(addBackground, "lightweight-theme-styling-update", false);
addDestructor(()=> Services.obs.removeObserver(addBackground, "lightweight-theme-styling-update") );

mssign, замените "style: "-moz-appearance: none; display: -moz-box; height: 100%; position: fixed; min-width: 20px"   на
style: "-moz-appearance: none; display: -moz-box; height: 100%; position: fixed; width: 20px" и "играйтесь" с численным значением

Может, кто подскажет, что изменилось, в FF57 по сравнению с FF56, что все кнопки связанные с сохранением в HTML (а также сохранение в PNG (кнопка Save))  перестали работать? Единственное что здесь узнал, что nsILocalFile заменен на nsIFile.

Помогите, пожалуйста. Есть кнопка, добавляющая прогресс-бар в адресной строке (код от Andrey_Krropotkin):

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

Выделить код

Код:

//Полоса загрузки в адресной строке
 
(function(){
//Location Bar Enhancer5.1;Loading Bar0.3.0
    var cssStr = (function(){/*
            #urlbar {
                background-image: -moz-repeating-linear-gradient(top -45deg, rgba(255,255,255,0), rgba(255,255,255,0) 6px, rgba(255,255,255,0) 6px, rgba(255,255,255,0) 12px), -moz-linear-gradient(left, #33FF66 0%, #33FF66 100%);
                background-size:0 0;
             background-repeat:repeat-x, no-repeat;
           //  transition: background-size 350ms ease 0s !important;
            }
            #urlbar:not([connecting])::after {
                        display:none;
                    }
            @-moz-keyframes progress-bar-stripes {
                from {
                    background-position: 0, 0;
                }
                to {
                    background-position: 51px 0, 0;
                }
            }
    */}).toString().replace(/^.+\s|.+$/,"");
    
    var style = document.createProcessingInstruction("xml-stylesheet", "type=\"text/css\"" + " href=\"data:text/css;base64," + btoa(cssStr) + "\"");
    var mainW = document.getElementById("main-window");
    document.insertBefore(style, mainW);

    function main(window) {
      var {document, gBrowser} = window;
      function $(id) document.getElementById(id);
      var urlbar = $("urlbar");
      let pageProgress = 0;
      let async = makeWindowHelpers(window).async;
      var LoadingBar = {
        listener: {
          onChangeTab: function(e) {
            urlbar.style.backgroundSize = '0% 100%';
            pageProgress = 0;
          },
          
          onProgressChange: function(aBrowser,webProgress,request,curSelfProgress,maxSelfProgress,curTotalProgress,maxTotalProgress) {
            if (gBrowser.contentDocument === aBrowser.contentDocument) {
                var val = (curTotalProgress-1)/(maxTotalProgress-1);
                pageProgress = val;
                urlbar.style.backgroundSize = (100*val) + '% 100%';
                if (val > 0.9)
                  async(function() {
                    if (pageProgress > 0.95)
                        urlbar.style.backgroundSize = '100% 100%';
                }, 1000);
            }
          },
          
          onStateChange: function() {
            if (pageProgress > 0.95){
                async(function() {
                    urlbar.style.backgroundSize = '0% 100%';
                    pageProgress = 0;
                }, 1000);
            }else{
                urlbar.style.backgroundSize = '0% 100%';
            }
          }
        }
      };

      gBrowser.tabContainer.addEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
      gBrowser.addTabsProgressListener(LoadingBar.listener);

      unload(function() {
        gBrowser.tabContainer.removeEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);

        gBrowser.removeTabsProgressListener(LoadingBar.listener);
      }, window);
    }

    watchWindows(main, "navigator:browser");

    function runOnLoad(window, callback, winType) {
      window.addEventListener("load", function() {
        window.removeEventListener("load", arguments.callee, false);

        if (window.document.documentElement.getAttribute("windowtype") == winType)
          callback(window);
      }, false);
    }

    function runOnWindows(callback, winType) {
      function watcher(window) {
        try {
          callback(window);
        }
        catch(ex) {}
      }

      let browserWindows = Services.wm.getEnumerator(winType);
      while (browserWindows.hasMoreElements()) {
        let browserWindow = browserWindows.getNext();
        if (browserWindow.document.readyState == "complete")
          watcher(browserWindow);
        else
          runOnLoad(browserWindow, watcher, winType);
      }
    }

    function watchWindows(callback, winType) {
      function watcher(window) {
        try {
          callback(window);
        }
        catch(ex) {}
      }

      runOnWindows(callback, winType);

      function windowWatcher(subject, topic) {
        if (topic == "domwindowopened")
          runOnLoad(subject, watcher, winType);
      }
      Services.ww.registerNotification(windowWatcher);

      unload(function() Services.ww.unregisterNotification(windowWatcher));
    }

    function unload(callback, container) {
      let unloaders = unload.unloaders;
      if (unloaders == null)
        unloaders = unload.unloaders = [];

      if (callback == null) {
        unloaders.slice().forEach(function(unloader) unloader());
        unloaders.length = 0;
        return null;
      }

      if (container != null) {
        container.addEventListener("unload", removeUnloader, false);

        let origCallback = callback;
        callback = function() {
          container.removeEventListener("unload", removeUnloader, false);
          origCallback();
        }
      }

      function unloader() {
        try {
          callback();
        }
        catch(ex) {}
      }
      unloaders.push(unloader);


    function removeUnloader() {
        let index = unloaders.indexOf(unloader);
        if (index != -1)
          unloaders.splice(index, 1);
      }
      return removeUnloader;
    }
    
    function makeWindowHelpers(window) {
      let {clearTimeout, setTimeout} = window;

      function async(callback, delay) {
        delay = delay || 0;
        let timer = setTimeout(function() {
          stopTimer();
          callback();
        }, delay);

        function stopTimer() {
          if (timer == null)
            return;
          clearTimeout(timer);
          timer = null;
        }
      }

      return {
        async: async,
      };
    }

})();


Для полного счастья не хватает отображения степени загрузки страницы в %, как здесь - https://www.w3schools.com/howto/tryit.a … r_label_js. Для удобства метка должна пропадать по окончании загрузки страницы вместе с прогресс-баром. Если такое возможно - сделайте, пожалуйста :blush: Спасибо

difabor пишет

mssign, замените "style: "-moz-appeara...

Спасибо.  Все бы хорошо, но значки не по центру панели.
скрин.

скрытый текст
e0b60f3ac7fe38352875290712ba069b.png

Заметил случайно на FF57 ели параметр - security.data_uri.unique_opaque_origin поставить в false, то работают кнопки с XUL интерфейсом

Infocatcher Скажите пожалуйста, какие из  кнопок,  которые   у Вас опубликованы на github.com совместимы с FF57 ( в частности интересует Custom Buttons Editor: Toggle on Top и Custom Buttons: Source Editor). С уважением к вашему труду.

Andrey_Krropotkin пишет

Скажите пожалуйста, какие из  кнопок,  которые   у Вас опубликованы на github.com совместимы с FF57 ( в частности интересует Custom Buttons Editor: Toggle on Top и Custom Buttons: Source Editor).

Надо проверять.
Часть кнопок подправлена, часть, возможно, нет.
Custom Buttons Editor: Toggle on Top – работает вплоть до текущей Nightly 59.0a1 (2017-12-21)
Custom Buttons: Source Editor – возможно, работает, отвалится в Firefox 58 (хотя это и легко починить, но, увы, обратно-несовместимо).
В Extensions Developer Tools на Firefox 59+ не работает переключение локалей. И успел пропасть Scratchpad (и код на тему интеграции там дико упороли, генерируют XUL из JavaScript, я поизучал и бросил).
Из того, про что мне писали писал Dumby, я все подправил (распорки от security.data_uri.unique_opaque_origin внедрять не стал, лень).

22-12-2017 00:00:30
Custom Buttons: Source Editor – местами не работает контекстное меню, генераторы в Firefox 58+ починил.

Infocatcher Спасибо Вам за информацию. У меня стоит Custom Buttons 0.0.5.8.9.6pre и FF57.02 . Source Editor  по вашей ссылке у меня заработал, а вот Toggle on Top  - кнопка не хочет инилизироваться, постоянно в полутусклом состоянии. Вроде профиль ставил  с нуля. Когда открываю и переинизилирую, значек кнопки становится нормальным, но в в редакторе значек не появляется.  Кстати такая ситуация  бывает и в других кнопках, но там получается так, что инициализация срабатывает, а кнопка в полутусклом состоянии, но далее при открытии  и закрытии окна редактора иконка кнопок становится нормальной. Может я в не курсе, что не так не делаю, или что еще? И ту т я ранее задавал вопрос, может Вы покажите мне путь, где искать ответ , который я задал, несколько постов выше. Еще один вопрос -как изменить цвет фона редактора ( у меня после включения копки становится черным).  Заранее спасибо.

Infocatcher пишет

легко починить, но, увы, обратно-несовместимо

Ой, я когда-то всё-таки склонился к использованию аскетичного редактора,
но тут недавно как-раз понадобилось коё-что проверить, и, соответственно,
пришлось кнопку править. Значит, получается, так нельзя? (в смысле eval)

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

Выделить код

Код:

get loadOverlaysGen() {
            var str = "fround" in Math ? "*" : ""; // Firefox 26+
            var arr = [
                '(function' + str + ' loadOverlaysGen(window, callback/*, overlayData1, ...*/) {',
                '    var gen = loadOverlaysGen.__generator;',
                '    for(var i = 2, l = arguments.length; i < l; ++i) {',
                '        var overlayData = arguments[i];',
                '        this.loadOverlay(window, overlayData[0], overlayData[1], function() {',
                '            gen.next();',
                '        });',
                '        yield 0;',
                '    }',
                '    callback();',
                '    yield 0;',
                '});'
            ];
            delete this.loadOverlaysGen;
            return this.loadOverlaysGen = eval(arr.join("\n"));
        },

mssign пишет
difabor пишет

mssign, замените "style: "-moz-appeara...

Спасибо.  Все бы хорошо, но значки не по центру панели.
скрин.

Попробуйте поиграться с шириной, сделайте 30px, например. У значков есть маргины и поэтому они могут не влезть.

difabor пишет

Попробуйте поиграться с шириной, сделайте 30px, например. У значков есть маргины и поэтому они могут не влезть.

Тогда теряется весь смысл..  Ширина панели раздувается как раз до прежнего состояния. За исключением padding в первых строчках кода, поставил равным 0 - на пару пикселей стало уже. padding  отрицательным пробовал сделать :) , ну не знаю я CSS. Значки стоят как привязанные и не важно им какая  у панели ширина. Отступы от края всегда одни и те же. Если панель уже - значки уезжают за правый край панели.
Вот отступы  по вертикали от края панели для значков понятия не имею как поправить.
скрин

скрытый текст
04543933546ddef8ebbb281bdfcd833b.png

Как открыть файл в Scratchpad ? Нигде не найду ни примеров, ни описаний :(
типа такого чтоб:

Выделить код

Код:

var prof = Services.dirsvc.get('ProfD', Ci.nsIFile);
 var f1 = prof.path + "\\chrome\\userChrome.css";
 var f2 = prof.path + "\\chrome\\userContent.css";

    Scratchpad.openScratchpad(f1);  // не правильно, запускает, но пустым.

GM для PM это как-то делает - все скрипты открываются по ПКМ в Scratchpad-e . Но там столько всего, я понять не могу КАК?!

mssign пишет
difabor пишет

Попробуйте поиграться с шириной, сделайте 30px, например. У значков есть маргины и поэтому они могут не влезть.

Тогда теряется весь смысл..  Ширина панели раздувается как раз до прежнего состояния. За исключением padding в первых строчках кода, поставил равным 0 - на пару пикселей стало уже. padding  отрицательным пробовал сделать :) , ну не знаю я CSS. Значки стоят как привязанные и не важно им какая  у панели ширина. Отступы от края всегда одни и те же. Если панель уже - значки уезжают за правый край панели.
Вот отступы  по вертикали от края панели для значков понятия не имею как поправить.

1. 30px всё-таки будет имхо у́же.
2. Надо маргинам иконок присвоить отрицательные значения.
Но это надо указывать не в этой кнопке, а в  CSS, например, в Classic Theme Restorer.
#ButtonID {margin-left: -6px !important;margin-right: -4px !important;}

ButtonID  - ИД значка
Особенно это важно для значков с дропмаркерами, например:
#tileview-buttonmenu>dropmarker,#textareaCacheButton>dropmarker,#printedit-buttonmenu>dropmarker,#s3gt-toolbar-button>dropmarker{margin-left: -9px !important;margin-right: -9px !important;}
Видите, можно сразу перечислить несколько ИД через запятую и с # перед ИД.

Вот как у меня выглядит кусок VT:

кусочек VT в натуральную величину
mSyOPpi.jpg

del

mokujin пишет: var prof = Services.dirsvc.get('ProfD', Ci.nsIFile); var f1 = prof.path + "\\chrome\\userChrome.css"; var f2 = prof.path + "\\chrome\\userContent.css"; Scratchpad.openScratchpad(f1); // не правильно, запускает, но пустым.

скорее всего там нужен сам файл а не путь
т.е после получения пути надо сделать file init with path
точнее глянь в кодах открывающих папку или запускающих файл
(да я ленивый зато найдя сам лучше запомнишь)

Andrey_Krropotkin пишет

а вот Toggle on Top  - кнопка не хочет инилизироваться, постоянно в полутусклом состоянии.

В консоли ошибок по Ctrl+Shift+J должно чего-нибудь на тему выводить.

Andrey_Krropotkin пишет

как изменить цвет фона редактора ( у меня после включения копки становится черным).

F12 – шестеренка – темы
Или в about:config:
devtools.theme = light
devtools.theme = dark

Dumby пишет

Значит, получается, так нельзя? (в смысле eval)

Ну да... строковые портянки. Я в другой своей штуке в итоге сделал подргузку нужного кода через loadSubScript().
Вот так чуть поприятнее смотрится: https://github.com/Infocatcher/Custom_B … 7b574412ec

22-12-2017 10:43:47

Andrey_Krropotkin пишет

что изменилось, в FF57 по сравнению с FF56, что все кнопки связанные с сохранением в HTML (а также сохранение в PNG (кнопка Save))  перестали работать? Единственное что здесь узнал, что nsILocalFile заменен на nsIFile.

Тут, опять же, должна быть ругань в консоли ошибок.

Infocatcher спасибо за ответы. Я разобрался. Все работает.
В консоли, при включенном Source Editor на редактирование любой кнопки (даже если просто открыл и закрыл) пишет

скрытый текст
[Custom Buttons :: Source Editor] 47:46:479 initWindow(): isFrame: false
TypeError: self._init is not a function[Подробнее]                                                                                                                                       toolbar.xml:145:15
skip getScripts
load chrome://custombuttons/content/editor.xul
[Custom Buttons :: Source Editor] 47:47:092 loadOverlay(): chrome://global/content/editMenuOverlay.xul
[Custom Buttons :: Source Editor] 47:47:204 loadOverlay(): chrome://browser/content/devtools/source-editor-overlay.xul
Не удалось загрузить overlay из chrome://browser/content/devtools/source-editor-overlay.xul.                                                                            button.js:737:6
[Custom Buttons :: Source Editor] 47:50:595 destroyWindow(): isFrame: undefined

okkamas_knife пишет

скорее всего там нужен сам файл а не путь

мда... ЕЯПП то чтоб открыть файл, ему надо передать содержимое файла, имя и какое-то состоянияния, чтоле... Нашел такой кусок в GM(for PM)

openInEditor.js

Выделить код

Код:

function openInEditor(aScript) {
  let editor = GM_util.getEditor();
  if (!editor) {
    // Without DevTools.
    try {
      ScratchpadManager.openScratchpad({
        "filename": aScript.file.path,
        "text": aScript.textContent,
        "saved": true,
      });
    } catch (e) {
      if (GM_util.setEditor(0)) {
        openInEditor(aScript);
      }
    }
    return undefined;
  }

...... ну и дальше for MacOS проверки


и в другом месте и другом скрипте ЕЯПП  ;-)  собсно , читается скрипт для передачи в Scratchpad :rolleyes:

getScriptSource.js

Выделить код

Код:

const EXPORTED_SYMBOLS = ["getScriptSource"];


// Given a script, return its entire source as a plain string.
function getScriptSource(aScript) {
  let parts = [];
  let offsets = [];
  let offset = 0;

  aScript.requires.forEach(function (aReq) {
    let contents = aReq.textContent;
    let lineCount = contents.split("\n").length;
    parts.push(contents);
    offset += lineCount;
    offsets.push(offset);
  });
  aScript.offsets = offsets;

  // These newlines are critical for error line calculation.
  // The last handles a script whose final line is a line comment,
  // to not break the wrapper function.
  // See #1491.
  // The semicolons after requires fix a failure of javascript's semicolon
  // insertion rules.
  parts.push(aScript.textContent);
  let scriptSrc = parts.join(";\n") + "\n";

  return scriptSrc;
}


я ниасилю понять что ита и как. Думал будет просто. буду мутить с AkelPad дальше.
Смысл, хотелка, была простейшая: так же как и GM for PM открывать кнопки на редактирование в Scratchpad , т.к. он уже есть, подсветка есть - а путя к "внешнему редактору" в CB не относительные. Никаких переменных, для переносной не катит.
блин, неудобно всё как.

mokujin пишет

открывать кнопки на редактирование в Scratchpad , т.к. он уже есть, подсветка есть

Это как подсветку синтаксиса можно встроить... через 10 костылей, 15 распорок и ломаться буде раз в две версии.

Содержимое файла надо читать вручную...

Выделить код

Код:

var path = "c:\\autoexec.bat";
OS.File.read(path).then(function(arr) {
    var {ScratchpadManager} = Components.utils.import("resource://devtools/client/scratchpad/scratchpad-manager.jsm", {});
    ScratchpadManager.openScratchpad({
        filename: path,
        text: new TextDecoder().decode(arr),
        saved: true
    });
});

А еще scratchpad-manager.jsm уже как минимум один раз переезжал, раньше он был в resource:///modules/devtools/scratchpad-manager.jsm :sick:

Ага, точно так. нашел в GM файлах, аж четыре проверки на четыре разных пути к scratchpad-manager.jsm  В моём случае подошел путь под нумером 1 (PM жеж не сильно меняли) :lol:
Теперь всё пойдёт веселей.

открыть userChrome.css во встроенном редакторе Scratchpad

Выделить код

Код:

/*CODE*/
// открыть userChrome.css во встроенном редакторе Scratchpad
function spUChrom() {

    const prof = Services.dirsvc.get('ProfD', Ci.nsIFile);
    var path = prof.path + "\\chrome\\userChrome.css";
 
      OS.File.read(path).then(function(arr) {

// Firefox путь  до Scratchpad, подставить нужное
// resource://devtools/client/scratchpad/scratchpad-manager.jsm
//
// Moved in Firefox 44
// http://hg.mozilla.org/mozilla-central/rev/397c69fa1677
// resource:///modules/devtools/client/scratchpad/scratchpad-manager.jsm
//
// Moved in Firefox 44
// http://hg.mozilla.org/mozilla-central/rev/3b90d45a2bbc
// resource:///modules/devtools/scratchpad-manager.jsm

// PaleMoon 27 путь до Scratchpad
          var {ScratchpadManager} = Components.utils.import("resource://gre/modules/devtools/scratchpad-manager.jsm", {});
              ScratchpadManager.openScratchpad({
                     filename: path,
                     text: new TextDecoder().decode(arr),
                     saved: true
                     });
          });
  };

spUChrom();


Запатчу(попробую) CB и будет отлично. Идея такая: добавить ключевое слово, типа если настройки в prefs.js  extensions.custombuttons.external_editor == scratchpad - то открывать файл этим способом. Если нет - стандартное поведение CB (открыть или указать путь к редактору) и пропишу настройку в user.js
Но это я уже сам.
Благодарю за помощь! рукужму.

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

usalex
Поставьте кнопку и не мучайтесь. Масштаб изменяется колёсиком при нажатой ПКМ, и никуда целиться не нужно.
https://forum.mozilla-russia.org/viewtopic.php?pid=733919#p733919

usalex
в области адресной строки тоже можно было вращением колесика изменять масштаб

oleg.sgh
Спасибо.
Там в коде адресная строка обозначена, как "gURLBar"
А, может, есть аналогичное обозначение для самой верхней панели - той, в которой вкладки с их названиями отображаются?

villa7
Да! Спасибо! Поставил эту кнопку и теперь намного удобней крутить масштаб.
Старую кнопку изменения масштаба удалил, но вместе с ней исчезла индикация процентов масштаба из строки адреса.
Можно её как-то вернуть?

Помогите пожайлуста разобраться, что-то запутался в коде

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

Выделить код

Код:

//  Пукт меню - ["В другом профиле", "menuitem-iconic", icon3, "ucjs_Cop.Debug();"],     
 
 var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("GreD", Components.interfaces.nsIFile)
    .path;    

 var fpath = profileDir + "\\firefox.exe";   
 
  window.ucjs_Cop = {
  clipboard: Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper),

  Debug: function() {
       
  var urllink=window._content.document.location.href;
  startProcess(fpath,["-no-remote","-P","Debug",urllink]);
  function startProcess(path, args){
  file.initWithPath(path);
  if(file.exists()){
  var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
  process.init(file);
  process.run(false, args, args.length);} 
  };
        }, 
};


Раньше на старых версиях FF работало, на FF57 не хочет
В консоли пишет "window._content is undefined" и ссылается на строчку "function startProcess(path, args)"

Andrey_Krropotkin пишет

ссылается на строчку

Это сломали где-то с Firefox 54. Из консоли ошибка передаётся
на пару строк дальше, чем на самом деле. Думалось, что само пройдёт, но нет.

В консоли пишет "window._content is undefined"

Ничего удивительного.

что-то запутался в коде

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

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

Выделить код

Код:

function openInProfile(profileName, url = gBrowser.currentURI.spec) {
    var firefox = Services.dirsvc.get("XREExeF", Ci.nsIFile);
    var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
    var args = ["-no-remote", "-p", profileName, url];
    process.init(firefox);
    process.run(false, args, args.length);
}
openInProfile("Debug");

Привет,
Можно ли поправить несколько кнопок?

Кнопка для переключения стиля из справки. Нужно чтобы при запуске ФФ стиль был включен. Или в идеале, чтобы у юзера был выбор режима.

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0426%u0432%u0435%u0442%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/ico%3Bbase64%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%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%20this.hasAttribute%28%22initialized%22%29%20%29%20return%3B%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.onclick%20%3D%20function%28e%29%20%7B%20%20%20%20%20%0A%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20setStyleForPages%28%29%3B%20//%20%u041B%u041A%u041C%0A%7D%3B%0A%0Avar%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28%20self.Help%20%29%29%3B%0Aconst%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0A%0Avar%20icon%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28%20self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0Avar%20styleImage%20%3D%20%22data%3Aimage/ico%3Bbase64%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%3D%22%3B%0A%0Afunction%20setStyleForPages%28%20reason%20%29%20%7B%20%0A%20%20%20%20%20%20var%20style%20%3D%20sss.sheetRegistered%28uri%2C%20sss.AGENT_SHEET%29%3B%20%20%0A%20%20%20if%20%28%20style%20%29%20%7B%20%20%20%0A%20%20%20%20%20%20%20%20sss.unregisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%20%20%20%20%20icon.src%20%3D%20self.image%3B%0A%20%20%20%20%20%20%20%20%7D%20%20%20%20%0A%20%20%20if%20%28%20%28%21style%20%26%26%20reason%20%21%3D%3D%20%27update%27%29%20%7C%7C%20%28style%20%26%26%20reason%20%3D%3D%20%27update%27%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20sss.loadAndRegisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%20%20%20%20%20icon.src%20%3D%20styleImage%3B%20%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0AaddDestructor%28function%28reason%29%20%7B%20if%20%28/update%7Cdelete/.test%28%20reason%20%29%20%29%20setStyleForPages%28reason%29%20%7D%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B/*AGENT_SHEET*/%0A%0A%20%20a%2C%20a%20span%20%0A%7B%0A%20%20text-decoration%3A%20none%20%21important%3B%20%0A%20%20color%3A%20%23BABAFF%20%21important%3B%0A%7D%0Aa%3Avisited%2C%20a%3Avisited%20span%20%7Bcolor%3A%20%23FFBABA%20%21important%3B%7D%0A%0Aa%3Ahover%2C%20a%3Ahover%20span%20%0A%7B%0A%20%20text-shadow%3A%200px%200px%208px%20green%20%21important%3B%20%0A%20%20transition%3A%20text-shadow%20.2s%20%20linear%20%21important%3B%0A%7D%0Aa%3Aactive%2C%20a%3Aactive%20span%20%20%7Bcolor%3A%20Silver%20%21important%3B%7D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


Уменьшить яркость на всех страницах. Кнопка глючит при прокрутке колесика - яркость мигает и устанавливается рандомно
скрытый текст

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0423%u043C%u0435%u043D%u044C%u0448%u0438%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u043D%u0430%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%u0445%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Eykp/xgyMv8YMTH/GDEx/xgxMf8YMTH/GDEx/xgxMf8YMTH/GDEx/xgxMf8YMTH/GDIy/xMpKf8AAAD/AAAA/1Cop/9Nrqv/SKKf/0mkof9JpKH/SaSh/0mkof9JpKH/SaSh/0mkof9JpKH/SKKf/02uq/9QqKf/AAAA/wAAAP9OoqH/PpSQ/zWFgf83iIT/N4iE/zeIhP83iIT/N4iE/zeIhP83iIT/N4iE/zWFgf8+lJD/TqKh/wAAAP8AAAD/U6in/0WgnP88ko3/PpWQ/z6VkP8+lZD/PpWQ/z6VkP8+lZD/PpWQ/z6VkP88ko3/RaCc/1Oop/8AAAD/AAAA/1asrP9HpKD/PpaR/0CZlP9AmZT/QJmU/0CZlP9AmZT/QJmU/0CZlP9AmZT/PpaR/0ekoP9WrKz/AAAA/wAAAP9ZsLH/SKmj/0Calf9CnZj/Qp2Y/0KdmP9CnZj/Qp2Y/0KdmP9CnZj/Qp2Y/0Calf9IqaP/WbCx/wAAAP8AAAD/XLW1/0uuqP9Cn5n/RKKc/0SinP9Eopz/RKKc/0SinP9Eopz/RKKc/0SinP9Cn5n/S66o/1y1tf8AAAD/AwMD/2C4uv9OtK//RKWf/0aoov9GqKL/Rqii/0aoov9GqKL/Rqii/0aoov9GqKL/RKWf/060r/9guLr/AwMD/1NSUv9qw8T/V8XE/1O+u/9Uv73/VL+9/1S/vf9Uv73/VL+9/1S/vf9Uv73/VL+9/1O+u/9XxcT/asPE/1NSUv9XVlb/bcfI/1vLyv9XxML/WMXE/1jFxP9YxcT/WMXE/1jFxP9YxcT/WMXE/1jFxP9XxML/W8vK/23HyP9XVlb/VlVU/3DMzf9f0ND/WsnH/1vKyf9bysn/W8rJ/1vKyf9bysn/W8rJ/1vKyf9bysn/WsnH/1/Q0P9wzM3/VlVU/1ZUVP9zz9H/YtfV/13Qzf9e0c7/XtHO/17Rzv9e0c7/XtHO/17Rzv9e0c7/XtHO/13Qzf9i19X/c8/R/1ZUVP9WVFT/d9PW/2Xc2/9f1dP/YdbU/2HW1P9h1tT/YdbU/2HW1P9h1tT/YdbU/2HW1P9f1dP/Zdzb/3fT1v9WVFT/VlRU/3nV2P9j39z/XdjU/1/Z1f9f2dX/X9nV/1/Z1f9f2dX/X9nV/1/Z1f9f2dX/XdjU/2Pf3P951dj/VlRU/1ZUVP9/4+f/ePX2/3Xu7/927/D/du/w/3bv8P927/D/du/w/3bv8P927/D/du/w/3Xu7/949fb/f+Pn/1ZUVP9XVlb/YXt8/2aBg/9mgIL/ZoCC/2aAgv9mgIL/ZoCC/2aAgv9mgIL/ZoCC/2aAgv9mgIL/ZoGD/2F7fP9XVlb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041B%u041A%u041C%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20%u0441%u0442%u0438%u043B%u044C%20..........%0Athis._handleClick%20%3D%28%29%3D%3E%20setStyleForPages%28%20cbu.setPrefs%28s%2C%20%21cbu.getPrefs%28s%29%29%20%29%3B%0A%0A%0A//%20%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u0435%u043D%u044F%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0432%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%u0445%20%u0438%20%u0441%u0442%u0438%u043B%u0435%20..........%0Athis.onwheel%20%3De%3D%3E%7B%0A%20%20%20var%20i%20%3D%20cbu.getPrefs%28l%29%2C%0A%20%20%20%20%20%20%20i%20%3D%20e.deltaY%20%3C%200%20%3F%20i%20+%20step%20%3A%20i%20-%20step%3B%0A%20%20%20if%20%28%200%20%3C%3D%20i%20%26%26%20i%20%3C%3D%2099%20%29%20cbu.setPrefs%28l%2C%20i%29%3B%0A%0A%20%20%20setStyleForPages%28%20cbu.setPrefs%28s%2C%20true%29%20%29%3B%0A%7D%3B%0A%0A%0A//%20%u0418%u0441%u043F%u0440%u0430%u0432%u0438%u0442%u044C%20%u043F%u0440%u043E%u0431%u043B%u0435%u043C%u0443%20%u0441%20position%20%u0434%u043B%u044F%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0439%20..........%0AaddEventListener%28%22mouseover%22%2C%20e%3D%3E%7B%0A%20%20%20if%20%28%20e.button%20%7C%7C%20e.target.localName%20%21%3D%3D%20%27img%27%20%29%20return%3B%20%20%0A%20%20%20%0A%20%20%20var%20img%20%3D%20e.target%2C%20node%20%3D%20img%3B%0A%20%20%20if%20%28%20getPosition%28img%29%20%3D%3D%20%27absolute%27%29%20%7B%20img.setAttribute%28%27currentPosition%27%2C%20%27true%27%29%3B%20return%3B%20%7D%3B%20%20%0A%0A%20%20%20while%28%20node%20%3D%20node.parentNode%20%29%20%7B%0A%20%20%20%20%20%20if%20%28%20getPosition%28node%29%20%3D%3D%20%27relative%27%20%29%20break%3B%0A%20%20%20%20%20%20if%20%28%20getPosition%28node%29%20%3D%3D%20%27absolute%27%29%20%7B%20img.setAttribute%28%27parentPosition%27%2C%20%27true%27%29%3B%20break%3B%20%7D%3B%20%20%20%0A%20%20%20%7D%3B%0A%20%20%20%20function%20getPosition%28node%29%20%7B%20return%20getComputedStyle%28node%2C%20%27%27%29.position%20%7D%3B%20%20%0A%20%20%20%3B%0A%7D%2C%20false%2C%20gBrowser%29%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0438%20css%20%u043A%u043E%u0434%20%u0438%u0437%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u043F%u0440%u0430%u0432%u043A%u0430%20..........%0Avar%20step%20%3D%202%2C%0A%20%20%20%20s%20%3D%20%22CB.darken%22%2C%0A%20%20%20%20help%20%3D%20self.Help%2C%0A%20%20%20%20l%20%3D%20%22CB.darken.level%22%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0432%20about%3Aconfig%20%u0435%u0441%u043B%u0438%20%u043E%u043D%u0438%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20..........%0Acbu.isPref%28l%2C%2028%29%3B%0Acbu.isPref%28s%2C%20false%29%3B%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u043D%u0430%u0441%u0442%u0440%u043E%u0435%u043A%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29.%0A%20%20%20src%20%3D%20%21cbu.getPrefs%28s%29%20%3F%20self.image%20%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/NTU1/z8/P/89PT3/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv89PT3/Pz8//zU1Nf8AAAD/AAAA/6Ghof+YmJj/ioqK/42Njf+NjY3/jY2N/42Njf+NjY3/jY2N/42Njf+NjY3/ioqK/5iYmP+hoaH/AAAA/wAAAP+dnZ3/hISE/3R0dP94eHj/eHh4/3h4eP94eHj/eHh4/3h4eP94eHj/eHh4/3R0dP+EhIT/nZ2d/wAAAP8AAAD/qKio/5OTk/+CgoL/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+CgoL/k5OT/6ioqP8AAAD/AAAA/6+vr/+ampr/iYmJ/42Njf+NjY3/jY2N/42Njf+NjY3/jY2N/42Njf+NjY3/iYmJ/5qamv+vr6//AAAA/wAAAP+1tbX/oqKi/5GRkf+VlZX/lZWV/5WVlf+VlZX/lZWV/5WVlf+VlZX/lZWV/5GRkf+ioqL/tbW1/wAAAP8CAgL/vb29/6mpqf+Xl5f/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+Xl5f/qamp/729vf8CAgL/AAAA/8PDw/+xsbH/n5+f/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/n5+f/7Gxsf/Dw8P/AAAA/zo6Ov/Pz8//xMTE/7a2tv+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7a2tv/ExMT/z8/P/zo6Ov9aWlr/2dnZ/9PT0//Jycn/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Jycn/09PT/9nZ2f9aWlr/U1NT/9/f3//a2tr/z8/P/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/z8/P/9ra2v/f39//U1NT/1RUVP/m5ub/4+Pj/9jY2P/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9jY2P/j4+P/5ubm/1RUVP9UVFT/7u7u/+3t7f/i4uL/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/i4uL/7e3t/+7u7v9UVFT/VFRU/+/v7//y8vL/5+fn/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fn//Ly8v/v7+//VFRU/1RUVP/8/Pz//////////////////////////////////////////////////////////////////Pz8/1RUVP9WVlb/kJCQ/5WVlf+VlZX/lpaW/5aWlv+Wlpb/lpaW/5aWlv+Wlpb/lpaW/5aWlv+VlZX/lZWV/5CQkP9WVlb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%22%3B%20%0A%7D%3B%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%29%3B%0A%0A%0A//%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20..........%0Afunction%20setStyleForPages%28%29%20%7B%0A%20%20%20var%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0A%20%20%20var%20css%20%3D%20help.replace%28/value/g%2C%20cbu.getPrefs%28l%29/100%20%29%3B%20%20%20%20%20%20%0A%20%20%20var%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%29%3B%20%0A%20%20%20%0A%20%20%20try%20%7B%20sss.unregisterSheet%28Services.previousUri%20%7C%7C%20uri%2C%200%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20Services.previousUri%20%3D%20uri%3B%0A%20%20%20%0A%20%20%20cbu.getPrefs%28s%29%20%26%26%20sss.loadAndRegisterSheet%28uri%2C%200%29%3B%0A%7D%3B%0Acbu.getPrefs%28s%29%20%26%26%20setStyleForPages%28%29%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%20%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%20%5Cn%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u043E%u0436%u043D%u043E%20%u043C%u0435%u043D%u044F%u0442%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B@-moz-document%20url-prefix%28http%3A//%29%2C%20url-prefix%28https%3A//%29%2C%20url-prefix%28ftp%3A//%29%2C%20url-prefix%28file%3A//%29%2C%0Aurl-prefix%28chrome%3A//%29%2C%20url-prefix%28about%29%20%7B%0A%20%20%20browser%7B%20background%3A%20LightGray%20%21important%3B%20%7D%20%20%20%0A%20%20%20%0A%20%20%20/*%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u0430%u0434%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%u0439%20%u0438%20%u0434%u0440%u0443%u0433%u0438%u043C%u0438%20%u044D%u043B%u0435%u043C%u0435%u043D%u0442%u0430%u043C%u0438%20%u043F%u0441%u0435%u0432%u0434%u043E%u044D%u043B%u0435%u043C%u0435%u043D%u0442%20%u0441%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u043D%u043E%u0439%20%u043F%u0440%u043E%u0437%u0440%u0430%u0447%u043D%u043E%u0441%u0442%u044C%u044E%20*/%0A%20%20%20html%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0432%u0435%u0431%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%20%u043D%u0435%u043A%u043E%u0442%u043E%u0440%u044B%u0435%20about%3A%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%2C%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20DOM%20%u0438%20%u0441%u0442%u0438%u043B%u0435%u0439%20*/%0A%20%20%20%23appbar-content%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u043F%u0430%u043D%u0435%u043B%u044C%20%u0441%u0432%u0435%u0440%u0445%u0443%20%u043D%u0430%20youtube%20*/%0A%20%20%20%23txbTextNodeValue%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0440%u0430%u0448%u0438%u0440%u0435%u043D%u0438%u0435%20DOM%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20*/%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23editor%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u0438%u043D%u0441%u043F%u0435%u043A%u0442%u043E%u0440%20DOM%20%u0438%20%u0441%u0442%u0438%u043B%u0435%u0439%20*/%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23profiles-list%3Aafter%2C%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23options-panel%3Aafter%2C%0A%20%20%20window%3Anot%28%5Bclass%3D%22theme-dark%22%5D%29%20%23editor%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23style-editor-chrome%3Aafter%2C%0A%20%20%20%5Bclass%3D%22theme-light%22%5D%20%23network-inspector-view%3Aafter%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20.cbeditor-textbox%3Aafter%2C%20%23newtab-window%3Aafter%2C%20%20%20%20%20%20%20%20%20%20/*%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%20%u0421%u0412%20%u043A%u043D%u043E%u043F%u043A%u0438%2C%20%u043D%u043E%u0432%u0430%u044F%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%20*/%0A%20%20%20treecols%3Anot%28%5Bid%3D%22placeContentColumns%22%5D%29%3Aafter%2C%20%20%20%20%20%20%20%20%20/*%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0438%2C%20%u0438%u0441%u0442%u043E%u0440%u0438%u044F%2C%20%u0431%u0438%u0431%u043B%u0438%u043E%u0442%u0435%u043A%u0430%2C%20about%3Aconfig%20*/%0A%20%20%20%23devtools-webconsole%3Aafter%2C%20%23ConsoleBox%3Aafter%2C%20%20%20%20%20%20%20%20%20%20/*%20%u043A%u043E%u043D%u0441%u043E%u043B%u044C%20%u043E%u0448%u0438%u0431%u043E%u043A%2C%20%u0432%u0435%u0431%20%u043A%u043E%u043D%u0441%u043E%u043B%u044C%20%u043E%u0448%u0438%u0431%u043E%u043A%20*/%0A%20%20%20%5Btitle%3D%22%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%22%5D%5BhasBrowserHandlers%3D%22true%22%5D%3Aafter%2C%20%20%20/*%20%u0440%u0430%u0437%u043D%u044B%u0435%20about%3A%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20*/%0A%20%20%20%5Bid%3D%22permissions-page%22%5D%3Aafter%2C%20%5Bid%20%3D%22tabsList%22%5D%3Aafter%2C%0A%20%20%20%5Bid%3D%22contentAreaDownloadsView%22%5D%3Aafter%2C%20%5Bid%3D%22addons-page%22%5D%3Aafter%20%20%20%0A%20%20%20%7B%0A%20%20%20%20%20content%3A%20%22%22%20%21important%3B%0A%20%20%20%20%20position%3A%20fixed%20%21important%3B%0A%20%20%20%20%20top%3A%200%3B%20bottom%3A%200%3B%20left%3A%200%3B%20right%3A%200%3B%0A%20%20%20%20%20background%3A%20%23000%20%21important%3B%0A%20%20%20%20%20z-index%3A%2099999999%20%21important%3B%0A%20%20%20%20%20pointer-events%3A%20none%20%21important%3B%0A%20%20%20%20%20opacity%3A%20value%20%21important%3B%0A%20%20%20%7D%0A%20%20%20%0A%20%20%20/*%20%u043E%u0442%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0443%u043C%u0435%u043D%u044C%u0448%u0435%u043D%u0438%u0435%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u043A%u0438%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u0437%u0430%u0442%u0435%u043C%u043D%u0435%u043D%u0438%u044F%20%20*/%0A%20%20%20%23comments-test-iframe%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20/*%20%u043A%u043E%u043C%u0435%u043D%u0442%u0430%u0440%u0438%u0438%20%u043D%u0430%20youtube%20*/%0A%20%20%20%0A%20%20%20/*%20%u043E%u0442%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0443%u043C%u0435%u043D%u044C%u0448%u0435%u043D%u0438%u0435%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0439%20%u043F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20*/%0A%20%20%20svg%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22img%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22rel%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22ytp-thumbnail%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bid%3D%22watch7-sidebar-modules%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22right_block%20video_right%20video_today%22%5D%3Ahover%2C%0A%20%20%20DIV%5Bclass%3D%22photo%22%5D%3Ahover%2C%0A%20%20%20img%3Ahover%3Anot%28%5Bparentposition%5D%29%3Anot%28%5Bcurrentposition%5D%29%3Anot%28%5Bid%3D%22keyboard_picture%22%5D%29%3Anot%28%5Bid%3D%22mpiv-preview%22%5D%29%3Anot%28%5Bid%3D%22splashoverlay%22%5D%29%3Anot%28%5Bclass%3D%22prew%22%5D%29%3Anot%28%5Bclass%3D%22rel%22%5D%29%0A%20%20%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20position%3A%20relative%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%20%20%20img%5Bparentposition%5D%3Ahover%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20position%3A%20relative%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%20left%3A%200px%3B%20bottom%3A%200px%3B%0A%20%20%20%7D%0A%20%20%20img%5Bcurrentposition%5D%3Ahover%20%7B%20%0A%20%20%20%20%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%0A%20%20%20/*%20%u043F%u043E%u043B%u043E%u0441%u0430%20%u043F%u043E%u0438%u0441%u043A%u0430%20%u043D%u0430%20youtube%20*/%0A%20%20%20%23yt-masthead-container%20%7B%20background%3A%20LightGray%20%21important%3B%20%7D%0A%0A%20%20%20/*%20%u0438%u0441%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0432%u0438%u0434%u0435%u043E%20*/%0A%20%20%20embed%5Bflashvars%5D%2C%20%20%0A%20%20%20div%5Bclass%3D%22html5-video-container%22%5D%2C%0A%20%20%20*%5Btype*%3D%22application/x-silverlight%22%5D%2C%0A%20%20%20*%5Btype*%3D%22application/x-shockwave-flash%22%5D%20%7B%20%0A%20%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%20z-index%3A%20999999999%20%21important%3B%0A%20%20%20%7D%0A%7D%0A%0A/*%20%u0438%u0441%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043D%u0435%u043A%u043E%u0442%u043E%u0440%u044B%u0435%20%u044D%u043B%u0435%u043C%u0435%u043D%u0442%u044B%20%u043D%u0430%20%u043F%u0440%u043E%u0431%u043B%u0435%u043C%u043D%u044B%u0445%20%u0441%u0430%u0439%u0442%u0430%u0445%20%u0434%u043B%u044F%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u043A%u0438%20%u0434%u0432%u043E%u0439%u043D%u043E%u0433%u043E%20%u0437%u0430%u0442%u0435%u043C%u043D%u0435%u043D%u0438%u044F%20*/%20%0A@-moz-document%20domain%28politobzor.net%29%20%7B%20%0A%20%20%20html%5Bxmlns%3D%22http%3A//www.w3.org/1999/xhtml%22%5D%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%20%20%20.item%20%7B%20background%3A%20LightGray%20%21important%3B%20%7D%0A%7D%0A@-moz-document%20url-prefix%28http%3A//translate.google.com/translate%29%20%7B%20%0A%20%20%20html%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%7D%0A@-moz-document%20url%28about%3Ahealthreport%29%2C%20url%28about%3Asessionrestore%29%2C%20url%28about%3Awelcomeback%29%20%7B%20%0A%20%20%20html%3Aafter%20%7B%20content%3A%20none%20%21important%3B%20%7D%0A%7D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Ultima2m пишет

Кнопка для переключения стиля из справки. Нужно чтобы при запуске ФФ стиль был включен.

Добавьте: setStyleForPages(); предпоследней строкой (перед "addDestructor(function(reason) { if (/update|delete/.test( reason ) ) setStyleForPages(reason) });")

difabor пишет

Добавьте: setStyleForPages();

Спасибо, работает.
И еще одну кнопку нашел
Findbar Persist. СКМ не работает. Хотелось бы переместить панель вправо, а текстовые кнопки заменить иконками.

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EFindbar%20Persist%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACaElEQVR42pWTbUhTURjH7znnnnu91yhMhSidI67T2OaI+tCalFBUBpUSYm/YNqPsbTEpK3phEEEg+WVR0Yf6ZAmDoPJT+bm+RBBjLsqK0FZIZG3a3O495/ZsrgiaZgcOXHjO//f8z/85FwlzLM2+5pQgoNRI7NnN2c6gOcRWSaKXCCEsGOi66+/Y9fi/ADan56yqlqhIQGlNW14Z6b8VnDeg1uG2yrLcLctSHCEhrRvMGjp38kXr9uaHswLAsoIQsggI1VJKnbJEM6IojuUAjPGF1VXLtG/J1MtE4nPMNPnYm+jTdB6gOdyrMEYnqChyjEkSvicIweMEky+Y4CRAp01TIIyxMoOxJZzxcs55GeNcNXTjGgK7miRLIZnSOAjGQTAJewp2GiGcgSZGwaQInWXTNBVm8Iqsbqy+HDr9PH+FrS17towlPm2mIh0mGCAYA0DIAECHMisACAAoY+Yi3TAcxw759QO+3Vd/Z9C29+DO1yPvnFQkUVEkX0E8DS5y3c1feUEWatbgdn9He+nxLm/vX1NoafPt/zD6UZYk8S1G6Ac4yQF4oYyzWWPpjm3NtgtnAr1Fx2hzNW5QS0pWyjKNzWSRd5EHwN1xRjc07772qsBhX3FAXYPHqyhKJTh4BRNJgThbyCB3DZLJMkvTOveKvisXQ8UBLk+PqigMMhjlpoBBUzpzyJzABCVhlIvr62wN/bfD54sC6l2NffD6vufaOe12KXC0873JOQrfuGOJxuK5NzJVWVGuPRkc6C4KqHWsDdfUVKOe4JHhTRvXX/+zdi/yoDVy/1FTMjW5YGhwoPOfP9N810+kr+NMRAKE6QAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%22use%20strict%22%3B%0A%0Aconst%20css%20%3D%20encodeURIComponent%28this.getAttribute%28%22Help%22%29%29%2C%0A%20%20%20%20%20%20fp%20%3D%20Cc%5B%22@mozilla.org/filepicker%3B1%22%5D.createInstance%28Ci.nsIFilePicker%29%2C%0A%20%20%20%20%20%20ios%20%3D%20Cc%5B%22@mozilla.org/network/io-service%3B1%22%5D.getService%28Ci.nsIIOService%29%2C%0A%20%20%20%20%20%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0A%20%20%20%20%20%20%0Apref.root%20%3D%20%22extensions.custombuttons.FindbarPersist.%22%3B%0Apref.defaults%20%3D%20%7B%0A//***%20Editable%20text%20in%20quotes%20below%0A%20%20textAdd%3A%20%22Add%22%2C%0A%20%20textAlert%3A%20%22Alert%22%2C%0A%20%20textAlert1%3A%20%22%20Protocol%20not%20listed.%22%2C%0A%20%20textAlert2%3A%20%22Add%20to%20list%20by%20clicking%20Add%20or%20click%20Settings%20to%20add/delete%20manually.%22%2C%0A%20%20textAlert3%3A%20%22Current%20List%3A%20%22%2C%0A%20%20textAlertDialog%3A%20%22Protocol%20Unlisted%20Alert%22%2C%0A%20%20textCancel%3A%20%22Cancel%22%2C%0A%20%20textClose%3A%20%22Close%22%2C%0A%20%20textEditable%3A%20%22Editable%20List%20Below%20%28No%20spaces%20and%20comma%20separate%29%22%2C%0A%20%20textHelp%3A%20%22Help%20Tab%20CSS%22%2C%0A%20%20textImages%3A%20%22Dialog%20Images%22%2C%0A%20%20textList%3A%20%22Protocol%20List%22%2C%0A%20%20textName%3A%20%22Button%20Name%22%2C%0A%20%20textOff%3A%20%22Off%22%2C%0A%20%20textOn%3A%20%22On%22%2C%0A%20%20textSettings%3A%20%22Settings%22%2C%0A%20%20textSettingsDialog%3A%20%22Findbar%20Persist%20Settings%22%2C%0A%20%20textStates%3A%20%22Button%20States%22%2C%0A%20%20textTooltip%3A%20%22Tooltip%20Text%22%2C%0A//***%20End%20of%20editable%20text%0A%20%20buttonName%3A%20%22Findbar%20Persist%22%2C%0A%20%20cssEnabled%3A%20true%2C%0A%20%20enableFindbar%3A%20false%2C%0A%20%20iconOff%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACaElEQVR42pWTbUhTURjH7znnnnu91yhMhSidI67T2OaI+tCalFBUBpUSYm/YNqPsbTEpK3phEE%5C%0AEg+WVR0Yf6ZAmDoPJT+bm+RBBjLsqK0FZIZG3a3O495/ZsrgiaZgcOXHjO//f8z/85FwlzLM2+5pQgoNRI7NnN2c6gOcRWSaKXCCEsGOi66+/Y9fi/ADan56yqlqhIQGlNW14Z6b8VnDeg1uG2yrLcLctSHC%5C%0AEhrRvMGjp38kXr9uaHswLAsoIQsggI1VJKnbJEM6IojuUAjPGF1VXLtG/J1MtE4nPMNPnYm+jTdB6gOdyrMEYnqChyjEkSvicIweMEky+Y4CRAp01TIIyxMoOxJZzxcs55GeNcNXTjGgK7miRLIZnSOAjGQT%5C%0AAJewp2GiGcgSZGwaQInWXTNBVm8Iqsbqy+HDr9PH+FrS17towlPm2mIh0mGCAYA0DIAECHMisACAAoY+Yi3TAcxw759QO+3Vd/Z9C29+DO1yPvnFQkUVEkX0E8DS5y3c1feUEWatbgdn9He+nxLm/vX1Noaf%5C%0APt/zD6UZYk8S1G6Ac4yQF4oYyzWWPpjm3NtgtnAr1Fx2hzNW5QS0pWyjKNzWSRd5EHwN1xRjc07772qsBhX3FAXYPHqyhKJTh4BRNJgThbyCB3DZLJMkvTOveKvisXQ8UBLk+PqigMMhjlpoBBUzpzyJzABC%5C%0AVhlIvr62wN/bfD54sC6l2NffD6vufaOe12KXC0873JOQrfuGOJxuK5NzJVWVGuPRkc6C4KqHWsDdfUVKOe4JHhTRvXX/+zdi/yoDVy/1FTMjW5YGhwoPOfP9N810+kr+NMRAKE6QAAAABJRU5ErkJggg%3D%3D%22%2C%0A%20%20iconOn%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACiUlEQVR42pWTa0iTURjHn/fddHu3F6UWKKLGdF4YrYYmSo4uqw+GEBmB4jKFhIgyCyNZ0ZdSBlI%5C%0AgK2LQihoiShO6fOnyKWLQoJsm6YarJdN08zJ3v7zveTvvpAjayg48H845z//3PP/zcAj4yxo2aW8nE+G19rN2faYcItOF9d4hpUIemGASawQr0jXV7r3w5L8ALx4eHtm5w9uM2BWwvy+yNepeajYMeDTUolS%5C%0AW+SfkhV4BoBWYciLEUPrWql2nRjMCxu430QJBdgUQRHVxQbittHhJk0MvA3BBWF1lwemWT7nclCkRD9gQYh0nesZDKcADY61WJqPM8q0COUURIBGzIKXCQImDICDWMCAKLMtBOJIFgVA2hMIIgsEkOJyEezU%5C%0Ag6CDM17epK0o5e5WayZZQfEMsFiVSQuBieJ/EgdaDS0IEHy/6SHjzjmZKthu6UxYsxjqdqsJtqSxLkGIxn8gLmPXgGEAIQSwOuAOA714SJj+LEJ3XNXCkdUD/6w2GbmlOq8o/GcsVcVIs+glhsZhLiYNYPO8%5C%0Al4OOkCAnpDuPxk6bzf0zBeremX1M9fSlvSxQ4XJnBbhjcRBw7CgQBHC4hzPoaLZ3dj9vTjtFkULQ1aJcsxQX+lFdeyGJIEkPCEYDpmSzwJ/jqd7rTAswDZX0NWs9lWhoFPx4AD8EOUkl8N555IXxZ2D/W1fv%5C%0A8aFrA8M38kfoaX3MogmB2jsSvLUQkCbB5E0PSEgShCAEzsyrbuSvjmrSAocHcD0WFEbXrGwkLy5W2fQf1IwTOePXM0JIrna6npSzMLeZ/7e33lKQFXOuRvRZJZKK6PRdHdx/ovPH73VPr1WPjb61nYrFYTt+%5C%0AgU/nPz7TR9QMbEh0SkoyVAwAAAABJRU5ErkJggg%3D%3D%22%2C%0A%20%20imageAdd%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACF0lEQVR42o1Tz2sTQRR+s7tJG2OwSctaGxWxWJCkFgXrPQUP4sGTIKIUvErBo2fpqYLQqwjeB%5C%0AA8KCr210pN/QDcq9VKxF6P5UbSbNDPznm8m3W2SpuKD3dlZ5vve9973RkBfXPt4uoQtXNZNnCIFHmoCJFIiAZvkwsLGjcpa93nRvZldzweqgQVCAkIA5BWl+ebVEPE/J03lz7erxUMEs2v5mvqN2X+BUfGLv%5C%0A2EY6l/n67mY4H8yR2Cz14pBx6G89aBRFKZmWdGrg8DB3YpVN/k0B84wADkdsCXlVWRxTlz9MLGf/XDmT/d/WoL8wwwkJ1zOKmKwVcT9EFdWxtvYhMQg2V/mOwT+nTQkz3vgjokYjIrPeCTF5XfjqPdI9Ms+K%5C%0Ak49zgAkuB3C2IskZt6eRN0k0S/7qMjdOwaOz71PckIgEtNv/DaGlIhky18aWlsSZBWh8mrXgk5cTwEPEoBruw/uqAAa4oaaEi699wNZw0JkFbUIeB5AhQTfn+xYgpGbKXBN1jQ/LJ1cBhvFbKWYXvFL7R+42%5C%0Au+zWb89anQIbqXAO+uYrttGa9k5Q8ZGc+Di69FAGRW612dV07C3re0+lh2B01gOl2QxHuULL7M1ucOcXT4jlyP/cFnyQLYFD2E9fCYPRjmKcy9GAlWlQuSzNl63sVf2fuaBt9HEmeeZkg5pWe3SFF9pz2RXf%5C%0AJ3RhU0UuBAuyp7r/Be32NAthDcPUAAAAABJRU5ErkJggg%3D%3D%22%2C%0A%20%20imageAlert%3A%20%22chrome%3A//global/skin/icons/question-64.png%22%2C%0A%20%20imageCancel%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACJklEQVR42p2TQYjTQBSGX5qWNJrZtGJ7sGtsmwXtgmVZFxT04kVREM+CeBH02JO3vehB8e%5C%0AhRwYt48rigXkXQ7VIPQmkV3WhRl26bapImOpHttr7JTkq27nrwwTCZf97/zbzJjEAIgWhUdT2N3RVsl7Ed5XId22Nsj04YhhXNF6IANFewu+5TWto/OwtJSQIYjcAfDKDXbLLxO5y/j5B7fwHQ/LDvOJcOzs%5C%0A/LA9ME2TAgRikIPHGgKPBL06DTbntThDxByNUxgK1s2/YdrVyW49UqLHW7cCGd3lqBA5YsCy4yTRTho6J4+1KpRbYToTE3xzJfyfl8KbG8DM86HbiG234gCHCOQ56jOdTOo7aJ/U9NY+WcZICK1e/fzWQy0o%5C%0AuVlSAxDGZgMamdQchqPO4dyOUWGaC2oaoLcqMBQzysl7a9zRANZj6dSgXf3zFnqlB4wwD+iBBpWK+Pa369A4SZT3EzCx/nk4XC7wCAY8lvtcYHVtsFcJwDWB4dDoEUiwGgZrnuQqLXCybfOs4/S2BxDEEmAr%5C%0ARiMSih0lpfv6lSqjYmzDsdYpXvoi2KPw5r2q3xb/xiGKVkLAYfOISZj6hqkPw+opVQ83D1Q7q+9RvDi/TNNG+MXDcnYtInNOjcHNa8itoMahsI2lSUbj6bvR1cpOhV/mqaZz3Hye3FnUTNYbholgnpFLLZp9%5C%0Auu8uRjaq6tJfqUzshcp2jcI8ufy9PT/q6P6X+f8x86rQqGIF3bbQAAAABJRU5ErkJggg%3D%3D%22%2C%0A%20%20imageClose%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACAklEQVR42qWT309SYRzGP+fE8aCOwdBwFZlASQQjwRajcdWvtf6Ati76B10XXTWW1RWD0RK%5C%0AU4RziD5boxCmTocKRdug9JzFoNWt+r973nO/7vM/3ed5Hoq8OoSuBZgcrf6gGtLugOkDqfTtfLEMpA9MK6I+hcBMi/Ye3IP8Zwh2Q47AaBH9Xkq6YAAWo1Gy2W9r4OPLQEEq1ivv4OB+AqPF/BXLV0dFIx+1%5C%0AGPz1F3d/H1Wxu3YdJyaD9VjRd83h4OTODbreTXFjg+/o6D05OzNu/joxg8fl4MTuL3GjwfnGR7c1N3hgjGHO9A+Wq3y8/j8eRJyZo1+ss53Kk8nkTIBGJEIxGsY6Noe/u8iGToVYq6a+hY45QERKs2Wz3tKk%5C%0ApnsViKKLxcG+PqmBhlNvrxSEYdjSN+WQStVzG12yWPHBXEkIMS91uaxWyK6r68HoohDccxul0CvzOTwUtFuqtFhsCcCedJnB09GUaYucuCBAECNtiOSfLPE0kCAk9EEzMEqIVl5b4mErxSte58buNFwIcHFA%5C%0AUepgAom8A4J9GUBTqQtiNQoGdYpGApg2OcKGIwkKHy0VHMJnPZlErlV8i/peNgpVeqw3aeOmHdOmn3FOzCOU03DbC9ERoMimC0x+mb+KeTxA0wvQI1kJwp+eCJFzoGpvWWZytf4lz+yzOw332/wA3xhvxRw2%5C%0ABzwAAAABJRU5ErkJggg%3D%3D%22%2C%0A%20%20imageSettings%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC0UlEQVR42mOcOnnyThZmZuf0rCwOBgaGPwzYAVtsTMxqby8fv+8/vzN8/f61LScrpxok%5C%0AwcjKwtJ+4+bVijUrVr8or66RxKa7pqbmWFZWluXTp08ZsrOyNxka6IXOnD3nF9gAMMHIWFZWVNTp7e68ws7NKxJZs4yMjOOuXbv2cXBwMMyYMYNBTkEObHtdXd2pvXv3LmSEKeRkZZVKTIh76u/nM9XdNzAH%5C%0AJm5oaJiwdOnS+T9//mS4f/8hw+Onzxmeg1ySnc7g5eWVxohsGzcbK3tcXMyPAG+fFvfA4FqwwVxc1rt37Tpy/PhxBmdnZ4a/f/8ycHNzM9y6detHQECAOSO6f0GGxMRE/Wg3MCgQyiucmGkX8L9hfi/Dsk2b%5C%0AwJpdXV0ZXr16xVBRUTHx7NmzBRgGwAy5HhH14/fRwwzLPnxkyDhwlME/tWDz0+ePHqioSEqePHly15cvX2bDAxEbWCkh+d8pO41hUv9khne//55YIBL88Ov9eRHo6rAawCIX8l/n+SaGMjFBBre8fIaZnb2g%5C%0ABLKx/t3bAIIGsMoH/xd0y2N4deY6g5up0Q+3NZ4csenJDF9Wr2Poe/OGQYKDmbn2xdt/WA0AaRZyy2F4deEOg5C1KcPHVTV/HN7v/WvPxcWev2Auw5uKGoamx48YFnz6xIhhAKtc8H8BrxKGN6evMAhZGTN8%5C%0AXNfw68/TTewgORdOzh8OQENyFy1leN/UyNB84xrD3I8fGeEGsAA1C/qWMbw+ep5B2N6c4eOa+j9AzazIrnPj4vofKiLCEDZ9OsP7xmaG6bdvMnS+f8/IyCIT8Js/qJ7l/bHTDIKWQGevb/j758lGFmyB6w40%5C%0AJF5cnMF70hSGt5UVDJn37v5hZGQXTWCRsJ/PF9LI8HFF+f8/T7cwMeABzpycH6dLSvIVvn7N8PznTzFYGKSxSLpP/PN8JycDEcCBg+PHgR8/7IDMUwAJ9h3/3XPKfAAAAABJRU5ErkJggg%3D%3D%22%2C%0A%20%20protocolList%3A%20%22http%3A%2Chttps%3A%2Cfile%3A%2Cftp%3A%2Cchrome%3A%22%2C%0A%20%20toolTip%3A%20%22Middle-click%20or%20Ctrl%20+%20Left-click%20%20%3E%20%20Settings%22%0A%7D%0A%0Afor%20%28let%20key%20in%20pref.defaults%29%20%7B%0A%20%20if%20%28pref.defaults.hasOwnProperty%28key%29%29%20%7B%0A%20%20%20%20let%20val%20%3D%20pref.defaults%5Bkey%5D%3B%0A%20%20%20%20switch%20%28typeof%20val%29%20%7B%0A%20%20%20%20%20%20case%20%22boolean%22%3A%0A%20%20%20%20%20%20%20%20Services.prefs.getDefaultBranch%28pref.root%29.setBoolPref%28key%2C%20val%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20%22number%22%3A%0A%20%20%20%20%20%20%20%20Services.prefs.getDefaultBranch%28pref.root%29.setIntPref%28key%2C%20val%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20%22string%22%3A%0A%20%20%20%20%20%20%20%20let%20str%20%3D%20Cc%5B%22@mozilla.org/supports-string%3B1%22%5D.createInstance%28Ci.nsISupportsString%29%3B%0A%20%20%20%20%20%20%20%20str.data%20%3D%20val%3B%0A%20%20%20%20%20%20%20%20Services.prefs.getDefaultBranch%28pref.root%29.setComplexValue%28%28key%29%2C%20Ci.nsISupportsString%2C%20str%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%7D%20%7D%20%7D%0A%0Afunction%20pref%28key%29%20%7B%0A%20%20let%20%7Bbranch%2C%20defaults%7D%20%3D%20pref%3B%0A%20%20if%20%28branch%20%3D%3D%20null%29%20branch%20%3D%20Services.prefs.getBranch%28pref.root%29%3B%0A%20%20switch%20%28typeof%20defaults%5Bkey%5D%29%20%7B%0A%20%20%20%20case%20%22boolean%22%3A%20%0A%20%20%20%20%20%20return%20branch.getBoolPref%28key%29%3B%0A%20%20%20%20case%20%22number%22%3A%20%0A%20%20%20%20%20%20return%20branch.getIntPref%28key%29%3B%0A%20%20%20%20case%20%22string%22%3A%20%0A%20%20%20%20%20%20//return%20branch.getCharPref%28key%29%3B%0A%20%20%20%20%20%20return%20branch.getComplexValue%28key%2C%20Ci.nsISupportsString%29.data%3B%0A%20%20%7D%0A%20%20return%20null%3B%0A%7D%0A%0Apref.observe%20%3D%20function%28prefs%2C%20callback%29%20%7B%0A%20%20let%20%7Broot%7D%20%3D%20pref%3B%0A%20%20function%20observe%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20if%20%28topic%20%21%3D%3D%20%22nsPref%3Achanged%22%29%20return%3B%0A%20%20%20%20let%20pref%20%3D%20data.slice%28root.length%29%3B%0A%20%20%20%20if%20%28prefs.indexOf%28pref%29%20%3D%3D%3D%20-1%29%20return%3B%0A%20%20%20%20callback%28pref%29%3B%0A%20%20%7D%0A%20%20Services.prefs.addObserver%28root%2C%20observe%2C%20false%29%3B%0A%20%20unload%20%3D%3E%20Services.prefs.removeObserver%28root%2C%20observe%29%3B%0A%7D%0A%0Afunction%20getSS%28filepath%29%20%7B%20%0A%20%20return%20ios.newURI%28%22data%3Atext/css%2C%22%20+%20filepath%2C%20null%2C%20null%29%3B%0A%7D%0A%0Afunction%20loadSheet%28filepath%29%20%7B%20%0A%20%20sss.loadAndRegisterSheet%28getSS%28filepath%29%2C%20sss.USER_SHEET%29%3B%0A%7D%0A%0Afunction%20unloadSheet%28filepath%29%20%7B%0A%20%20let%20uri%20%3D%20getSS%28filepath%29%3B%0A%20%20if%20%28sss.sheetRegistered%28uri%2C%20sss.USER_SHEET%29%29%20sss.unregisterSheet%28uri%2C%20sss.USER_SHEET%29%3B%0A%7D%0A%0Afunction%20loadAndObserve%28prefName%2C%20filepath%29%20%7B%0A%20%20if%20%28pref%28prefName%29%29%20loadSheet%28filepath%29%3B%0A%20%20pref.observe%28%5BprefName%5D%2C%20function%28%29%20%7Bpref%28prefName%29%20%3F%20loadSheet%28filepath%29%20%3A%20unloadSheet%28filepath%29%3B%7D%29%3B%0A%20%20unload%20%3D%3E%20unloadSheet%28filepath%29%3B%0A%7D%0A%0Afunction%20unload%28callback%2C%20container%29%20%7B%0A%20%20let%20unloaders%20%3D%20unload.unloaders%3B%0A%20%20if%20%28unloaders%20%3D%3D%20null%29%20unloaders%20%3D%20unload.unloaders%20%3D%20%5B%5D%3B%0A%20%20if%20%28callback%20%3D%3D%20null%29%20%7B%0A%20%20%20%20unloaders.slice%28%29.forEach%28unloader%20%3D%3E%20unloader%28%29%29%3B%0A%20%20%20%20unloaders.length%20%3D%200%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%20%20if%20%28container%20%21%3D%20null%29%20%7B%0A%20%20%20%20container.addEventListener%28%22unload%22%2C%20removeUnloader%2C%20false%29%3B%0A%20%20%20%20let%20origCallback%20%3D%20callback%3B%0A%20%20%20%20callback%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20container.removeEventListener%28%22unload%22%2C%20removeUnloader%2C%20false%29%3B%0A%20%20%20%20%20%20origCallback%28%29%3B%0A%20%20%7D%20%7D%0A%20%20function%20unloader%28%29%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20callback%28%29%3B%0A%20%20%20%20%7D%20catch%28ex%29%20%7B%7D%0A%20%20%7D%0A%20%20unloaders.push%28unloader%29%3B%0A%20%20function%20removeUnloader%28%29%20%7B%0A%20%20%20%20let%20index%20%3D%20unloaders.indexOf%28unloader%29%3B%0A%20%20%20%20if%20%28index%20%21%3D%3D%20-1%29%20unloaders.splice%28index%2C%201%29%3B%0A%20%20%7D%0A%20%20return%20removeUnloader%3B%0A%7D%0A%0Afunction%20gCV%28aKey%2C%20aBranch%29%20%7B%0A%20%20return%20Services.prefs.getComplexValue%28%28%28%21aBranch%29%20%3F%20pref.root%20+%20aKey%20%3A%20aKey%29%2C%20Ci.nsISupportsString%29.data%3B%0A%7D%0A%0Afunction%20sCV%28aKey%2C%20aVal%2C%20aBranch%29%20%7B%0A%20%20var%20str%20%3D%20Cc%5B%22@mozilla.org/supports-string%3B1%22%5D.createInstance%28Ci.nsISupportsString%29%3B%0A%20%20str.data%20%3D%20aVal%3B%0A%20%20Services.prefs.setComplexValue%28%28%28%21aBranch%29%20%3F%20pref.root%20+%20aKey%20%3A%20aKey%29%2C%20Ci.nsISupportsString%2C%20str%29%3B%0A%7D%0A%0Afunction%20getProtocol%28%29%20%7B%0A%20%20var%20uri%20%3D%20gBrowser.contentDocument.documentURIObject.spec.split%28%22//%22%29%5B0%5D%2C%20list%20%3D%20pref%28%22protocolList%22%29.split%28%22%2C%22%29%3B%0A%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20list.length%3B%20i++%29%20if%20%28list%5Bi%5D%20%3D%3D%3D%20uri%29%20return%20list%5Bi%5D%3B%0A%7D%0A%0Afunction%20toggleFindbar%28%29%20%7B%0A%20%20removeEventListener%28%22mouseover%22%2C%20toggleFindbar%2C%20false%29%3B%0A%20%20if%20%28pref%28%22enableFindbar%22%29%20%26%26%20getProtocol%28%29%29%20%7B%0A%20%20%20%20gFindBar.hidden%20%3D%20false%3B%0A%20%20%20%20this.image%20%3D%20pref%28%22iconOn%22%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20gFindBar.hidden%20%3D%20true%3B%0A%20%20%20%20this.image%20%3D%20pref%28%22iconOff%22%29%3B%0A%7D%20%7D%0A%0Avar%20gRoot%20%3D%20Services.prefs.getBranch%28pref.root%29%2C%0A%20%20%20%20css2%20%3D%20%27%5C%0A%20%20%20%20%20%20%23settingsDialog%20%23textEditable%20%7B%5C%0A%20%20%20%20%20%20%20%20margin-left%3A%2081px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23settingsDialog%20%23hbox1%20%7B%5C%0A%20%20%20%20%20%20%20%20height%3A%2047px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23settingsDialog%20%23hbox5%20%7B%5C%0A%20%20%20%20%20%20%20%20margin-top%3A%2017px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23settingsDialog%20.button%20%7B%5C%0A%20%20%20%20%20%20%20%20min-width%3A%2032px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23settingsDialog%20.icon%20.button-icon%20%7B%5C%0A%20%20%20%20%20%20%20%20max-height%3A%2032px%20%21important%3B%5C%0A%20%20%20%20%20%20%20%20max-width%3A%2032px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23settingsDialog%20.image%20.button-icon%20%7B%5C%0A%20%20%20%20%20%20%20%20height%3A%2016px%20%21important%3B%5C%0A%20%20%20%20%20%20%20%20width%3A%2016px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23settingsDialog%20.button-text%20%7B%5C%0A%20%20%20%20%20%20%20%20margin%3A%200%202px%200%206px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23alertDialog%20%7B%5C%0A%20%20%20%20%20%20%20%20padding%3A%202px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23alertDialog%20%23image1%20%7B%5C%0A%20%20%20%20%20%20%20%20max-height%3A%2064px%20%21important%3B%5C%0A%20%20%20%20%20%20%20%20max-width%3A%2064px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23alertDialog%20.button%20%7B%5C%0A%20%20%20%20%20%20%20%20min-width%3A%2032px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23alertDialog%20%23protocol%20%7B%5C%0A%20%20%20%20%20%20%20%20border-bottom%3A%201px%20solid%20%21important%3B%5C%0A%20%20%20%20%20%20%20%20font-weight%3A%20bold%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23alertDialog%20.image%20.button-icon%20%7B%5C%0A%20%20%20%20%20%20%20%20height%3A%2016px%20%21important%3B%5C%0A%20%20%20%20%20%20%20%20margin-right%3A%204px%20%21important%3B%5C%0A%20%20%20%20%20%20%20%20width%3A%2016px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20%23alertDialog%20.button-text%20%7B%5C%0A%20%20%20%20%20%20%20%20margin%3A%200%202px%200%202px%20%21important%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%27.replace%28/%23/g%2C%20%22%2523%22%29%3B%0A%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20if%20%28e.ctrlKey%20%26%26%20e.button%20%3D%3D%3D%200%20%7C%7C%20e.button%20%3D%3D%3D%201%29%20this.settingsDialog%28%29%3B%0A%20%20if%20%28%21e.ctrlKey%20%26%26%20e.button%20%3D%3D%3D%200%20%26%26%20%21getProtocol%28%29%29%20this.alertDialog%28%29%3B%0A%20%20if%20%28%21e.ctrlKey%20%26%26%20e.button%20%3D%3D%3D%200%20%26%26%20getProtocol%28%29%29%20%7B%0A%20%20%20%20var%20bool%20%3D%20pref%28%22enableFindbar%22%29%20%21%3D%3D%20true%20%3F%20true%20%3A%20false%3B%0A%20%20%20%20gRoot.setBoolPref%28%22enableFindbar%22%2C%20bool%29%3B%0A%7D%20%7D%0A%0Athis.settingsDialog%20%3D%20function%28%29%20%7B%0A%20%20var%20data%20%3D%20%27%3C%3Fxml%20version%3D%221.0%22%3F%3E%3C%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%20type%3D%22text/css%22%3F%3E%5C%0A%20%20%20%20%3Cwindow%20xmlns%3D%22%27%20+%20xulns%20+%20%27%22%20id%3D%22settingsDialog%22%20windowtype%3D%22settings%3Adialog%22%20minheight%3D%22202%22%20minwidth%3D%22484%22%20%5C%0A%20%20%20%20%20%20title%3D%22%27%20+%20pref%28%22textSettingsDialog%22%29%20+%20%27%22%20persist%3D%22screenX%20screenY%20width%20height%22%3E%5C%0A%20%20%20%20%20%20%3Chbox%20id%3D%22hbox1%22%20class%3D%22hbox%22%20align%3D%22center%22%3E%5C%0A%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22textName%22%20class%3D%22label%22%20value%3D%22%27%20+%20pref%28%22textName%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Ctextbox%20id%3D%22buttonName%22%20class%3D%22textbox%22%20value%3D%22%27%20+%20pref%28%22buttonName%22%29%20+%20%27%22%20flex%3D%221%22%20oninput%3D%22self.onTextbox%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22textStates%22%20class%3D%22label%22%20value%3D%22%27%20+%20pref%28%22textStates%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22iconOn%22%20class%3D%22button%20icon%22%20label%3D%22%27%20+%20pref%28%22textOn%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22iconOn%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22iconOff%22%20class%3D%22button%20icon%22%20label%3D%22%27%20+%20pref%28%22textOff%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22iconOff%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%3C/hbox%3E%5C%0A%20%20%20%20%20%20%3Chbox%20id%3D%22hbox2%22%20class%3D%22hbox%22%20align%3D%22center%22%3E%5C%0A%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22textTooltip%22%20class%3D%22label%22%20value%3D%22%27%20+%20pref%28%22textTooltip%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Ctextbox%20id%3D%22toolTip%22%20class%3D%22textbox%22%20value%3D%22%27%20+%20pref%28%22toolTip%22%29%20+%20%27%22%20flex%3D%221%22%20oninput%3D%22self.onTextbox%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%3C/hbox%3E%5C%0A%20%20%20%20%20%20%3Chbox%20id%3D%22hbox3%22%20class%3D%22hbox%22%20align%3D%22center%22%3E%5C%0A%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22textImages%22%20class%3D%22label%22%20value%3D%22%27%20+%20pref%28%22textImages%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22imageAlert%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textAlert%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageAlert%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22imageAdd%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textAdd%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageAdd%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22imageSettings%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textSettings%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageSettings%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22imageCancel%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textCancel%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageCancel%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22imageClose%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textClose%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageClose%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%3C/hbox%3E%5C%0A%20%20%20%20%20%20%3Clabel%20id%3D%22textEditable%22%20value%3D%22%27%20+%20pref%28%22textEditable%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%3Chbox%20id%3D%22hbox4%22%20class%3D%22hbox%22%20align%3D%22center%22%3E%5C%0A%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22textList%22%20class%3D%22label%22%20value%3D%22%27%20+%20pref%28%22textList%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Ctextbox%20id%3D%22protocolList%22%20class%3D%22textbox%22%20value%3D%22%27%20+%20pref%28%22protocolList%22%29%20+%20%27%22%20flex%3D%221%22%20oninput%3D%22self.onTextbox%28this%29%22%20onblur%3D%22self.onBlur%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%3C/hbox%3E%5C%0A%20%20%20%20%20%20%3Chbox%20id%3D%22hbox5%22%20class%3D%22hbox%22%20align%3D%22center%22%3E%5C%0A%20%20%20%20%20%20%20%20%3Ccheckbox%20id%3D%22cssEnabled%22%20label%3D%22%27%20+%20pref%28%22textHelp%22%29%20+%20%27%22%20checked%3D%22%27%20+%20pref%28%22cssEnabled%22%29%20+%20%27%22%20oncommand%3D%22self.onCheckbox%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cspacer%20id%3D%22spacer1%22%20flex%3D%221%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22btnClose%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textClose%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageClose%22%29%20+%20%27%22%20oncommand%3D%22close%28%29%22/%3E%5C%0A%20%20%20%20%20%20%3C/hbox%3E%5C%0A%20%20%20%20%3C/window%3E%27%3B%0A%20%20data%20%3D%20data.replace%28/self/g%2C%20%22opener.document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29%22%29%3B%0A%20%20var%20url%20%3D%20%22data%3Aapplication/vnd.mozilla.xul+xml%3Btext/plain%2C%22%20+%20encodeURIComponent%28data%29%3B%0A%20%20window.openDialog%28url%2C%20%22%22%2C%20%22chrome%2Ccenterscreen%2Cdialog%2Cresizable%2CalwaysRaised%22%29%3B%0A%7D%0A%0Athis.alertDialog%20%3D%20function%28%29%20%7B%0A%20%20var%20uri%20%3D%20gBrowser.contentDocument.documentURIObject.spec.split%28%22//%22%29%5B0%5D%3B%0A%20%20var%20data%20%3D%20%27%3C%3Fxml%20version%3D%221.0%22%3F%3E%3C%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%20type%3D%22text/css%22%3F%3E%5C%0A%20%20%20%20%3Cwindow%20xmlns%3D%22%27%20+%20xulns%20+%20%27%22%20id%3D%22alertDialog%22%20windowtype%3D%22alert%3Adialog%22%20onblur%3D%22close%28%29%22%20%5C%0A%20%20%20%20%20%20title%3D%22%27%20+%20pref%28%22textAlertDialog%22%29%20+%20%27%22%20persist%3D%22screenX%20screenY%20width%20height%22%3E%5C%0A%20%20%20%20%20%20%3Chbox%20id%3D%22hbox1%22%20class%3D%22hbox%22%3E%5C%0A%20%20%20%20%20%20%20%20%3Cvbox%20id%3D%22vbox1%22%20class%3D%22vbox%22%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%3Cimage%20id%3D%22image1%22%20src%3D%22%27%20+%20pref%28%22imageAlert%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%3C/vbox%3E%5C%0A%20%20%20%20%20%20%20%20%3Cvbox%20id%3D%22vbox2%22%20class%3D%22vbox%22%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%3Chbox%20id%3D%22hbox2%22%20class%3D%22hbox%22%20align%3D%22center%22%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22protocol%22%20class%3D%22label%22%20value%3D%22%27%20+%20uri%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22textAlert%22%20class%3D%22label%22%20value%3D%22%27%20+%20pref%28%22textAlert1%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%3C/hbox%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22textAlert2%22%20class%3D%22label%22%20value%3D%22%27%20+%20pref%28%22textAlert2%22%29%20+%20%27%22/%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%3Clabel%20id%3D%22textAlert3%22%20class%3D%22label%22%20value%3D%22%27%20+%20pref%28%22textAlert3%22%29%20+%20%27%26quot%3B%27%20+%20pref%28%22protocolList%22%29%20+%20%27%26quot%3B%22/%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%3Chbox%20id%3D%22hbox3%22%20class%3D%22hbox%22%20align%3D%22center%22%20pack%3D%22center%22%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22btnAdd%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textAdd%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageAdd%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22btnSettings%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textSettings%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageSettings%22%29%20+%20%27%22%20oncommand%3D%22self.onButton%28this%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22btnCancel%22%20class%3D%22button%20image%22%20label%3D%22%27%20+%20pref%28%22textCancel%22%29%20+%20%27%22%20image%3D%22%27%20+%20pref%28%22imageCancel%22%29%20+%20%27%22%20oncommand%3D%22close%28%29%22/%3E%5C%0A%20%20%20%20%20%20%20%20%20%20%3C/hbox%3E%5C%0A%20%20%20%20%20%20%20%20%3C/vbox%3E%5C%0A%20%20%20%20%20%20%3C/hbox%3E%5C%0A%20%20%20%20%3C/window%3E%27%3B%0A%20%20data%20%3D%20data.replace%28/self/g%2C%20%22opener.document.getElementById%28%27%22%20+%20self.id%20+%20%22%27%29%22%29%3B%0A%20%20var%20url%20%3D%20%22data%3Aapplication/vnd.mozilla.xul+xml%3Btext/plain%2C%22%20+%20encodeURIComponent%28data%29%3B%0A%20%20window.openDialog%28url%2C%20%22%22%2C%20%22chrome%2Ccenterscreen%2Cdialog%2Cresizable%22%29%3B%0A%7D%0A%0Athis.onTextbox%20%3D%20function%28e%29%20%7B%0A%20%20//gRoot.setCharPref%28e.id%2C%20e.value%29%3B%0A%20%20sCV%28e.id%2C%20e.value%29%3B%0A%20%20if%20%28e.id%20%3D%3D%3D%20%22buttonName%22%29%20this.label%20%3D%20pref%28e.id%29%3B%0A%20%20if%20%28e.id%20%3D%3D%3D%20%22toolTip%22%29%20this.tooltipText%20%3D%20pref%28e.id%29%0A%20%20this.label%20%3D%20pref%28%22buttonName%22%29%3B%0A%20%20this.tooltipText%20%3D%20this.label%20+%20%22%5Cn%5Cu2022%20%22%20+%20pref%28%22toolTip%22%29%3B%0A%7D%0A%20%20%0A%0Athis.onButton%20%3D%20function%28e%29%20%7B%0A%20%20addEventListener%28%22mouseover%22%2C%20toggleFindbar%2C%20false%29%3B%0A%20%20if%20%28e.id%20%3D%3D%3D%20%22btnAdd%22%29%20%7B%0A%20%20%20%20var%20mrw%20%3D%20Services.wm.getMostRecentWindow%28%22alert%3Adialog%22%29%2C%20uri%20%3D%20gBrowser.contentDocument.documentURIObject.spec.split%28%22//%22%29%5B0%5D%3B%0A%20%20%20%20//gRoot.setCharPref%28%22protocolList%22%2C%20pref%28%22protocolList%22%29%20+%20%22%2C%22%20+%20uri%29%3B%0A%20%20%20%20sCV%28%22protocolList%22%2C%20pref%28%22protocolList%22%29%20+%20%22%2C%22%20+%20uri%29%3B%0A%20%20%20%20mrw.close%28%29%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%20%20if%20%28e.id%20%3D%3D%3D%20%22btnSettings%22%29%20%7B%0A%20%20%20%20var%20mrw%20%3D%20Services.wm.getMostRecentWindow%28%22alert%3Adialog%22%29%3B%0A%20%20%20%20this.settingsDialog%28%29%3B%0A%20%20%20%20mrw.close%28%29%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%20%20fp.init%28window%2C%20null%2C%20fp.modeOpen%29%3B%0A%20%20fp.appendFilters%28fp.filterImages%29%3B%0A%20%20if%20%28fp.show%28%29%20%21%3D%20fp.returnCancel%29%20%7B%0A%20%20%20%20//gRoot.setCharPref%28e.id%2C%20fp.fileURL.spec%29%3B%0A%20%20%20%20sCV%28e.id%2C%20fp.fileURL.spec%29%3B%0A%20%20%20%20e.image%20%3D%20fp.fileURL.spec%3B%0A%20%20%7D%0A%20%20if%20%28e.id%20%3D%3D%3D%20%22imageClose%22%29%20%7B%0A%20%20%20%20var%20mrw%20%3D%20Services.wm.getMostRecentWindow%28%22settings%3Adialog%22%29%3B%0A%20%20%20%20mrw.document.getElementById%28%22btnClose%22%29.image%20%3D%20pref%28%22imageClose%22%29%3B%0A%7D%20%7D%0A%0Athis.onCheckbox%20%3D%20function%28e%29%20%7B%0A%20%20var%20bol%20%3D%20pref%28e.id%29%20%21%3D%3D%20false%20%3F%20false%20%3A%20true%3B%0A%20%20gRoot.setBoolPref%28e.id%2C%20bol%29%3B%0A%7D%0A%0Athis.onBlur%20%3D%20function%28e%29%20%7B%0A%20%20e.value%20%3D%20e.value.replace%28/%2C%2C+/g%2C%20%22%2C%22%29.replace%28/%5E%2C/%2C%20%22%22%29.replace%28/%2C%24/%2C%20%22%22%29.replace%28/%5Cs+/g%2C%20%22%22%29%3B%0A%20%20//gRoot.setCharPref%28e.id%2C%20e.value%29%3B%0A%20%20sCV%28e.id%2C%20e.value%29%3B%0A%7D%0A%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%20%20if%20%28reason%20%3D%3D%3D%20%22delete%22%29%20%7B%0A%20%20%20%20removeEventListener%28%22click%22%2C%20toggleFindbar%2C%20false%29%3B%0A%20%20%20%20removeEventListener%28%22mouseover%22%2C%20toggleFindbar%2C%20false%29%3B%0A%20%20%20%20removeEventListener%28%22DOMContentLoaded%22%2C%20toggleFindbar%2C%20false%29%3B%0A%20%20%20%20unloadSheet%28css%29%3B%0A%20%20%20%20unloadSheet%28css2%29%3B%0A%20%20%20%20//Services.prefs.deleteBranch%28pref.root%29%3B%0A%7D%20%7D%0A%0Athis.label%20%3D%20pref%28%22buttonName%22%29%3B%0Athis.tooltipText%20%3D%20pref%28%22buttonName%22%29%20+%20%22%5Cn%5Cu2022%20%22%20+%20pref%28%22toolTip%22%29%3B%0A%0Aif%20%28pref%28%22enableFindbar%22%29%20%26%26%20getProtocol%28%29%29%20this.image%20%3D%20pref%28%22iconOn%22%29%3B%0Aif%20%28pref%28%22enableFindbar%22%29%20%26%26%20%21getProtocol%28%29%20%7C%7C%20%21pref%28%22enableFindbar%22%29%29%20this.image%20%3D%20pref%28%22iconOff%22%29%3B%0A%0AloadSheet%28css2%29%3B%0AloadAndObserve%28%22cssEnabled%22%2C%20css%29%3B%0A%0AaddEventListener%28%22click%22%2C%20toggleFindbar%2C%20false%29%3B%0AaddEventListener%28%22DOMContentLoaded%22%2C%20toggleFindbar%2C%20false%29%3B%0A%0A//%20Name%3A%20Findbar%20Persist%0A//%20Author%3A%20Sonny%20Razzano%20a.k.a.%20srazzano%0A//%20Created%3A%20Jul.%201%2C%202016%0A//%20Updated%3A%20Sep.%208%2C%202016%20%28Added%20protocol%20ftp%3A/chrome%3A%20and%20settings%20dialog%29%0A//%20Homepage%3A%20http%3A//custombuttons.sourceforge.net/forum/viewtopic.php%3Ff%3D4%26t%3D3776%0A//%20Description%3A%20Toggles%20Findbar%20and%20persist%20on%20all%20page%20protocols%20http%3A%2C%20https%3A%2C%20file%3A%2C%20ftp%3A%20and%20chrome%3A%20%28editable%20in%20settings%20dialog%29%2C%20while%20initiated%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%23settingsDialog%20%7B%0A%20%20padding%3A%202px%204px%204px%200%20%21important%3B%0A%7D%0A%20%20%20%20%20%20%0A%23settingsDialog%20.hbox%2C%0A%23alertDialog%20%23hbox3%20%7B%0A%20%20margin%3A%202px%200%20%21important%3B%0A%7D%0A%0A%23settingsDialog%20%23hbox3%20.button%20%7B%0A%20%20margin-left%3A%204px%20%21important%3B%0A%7D%0A%0A%23settingsDialog%20%23hbox5%20%7B%0A%20%20margin-top%3A%202px%20%21important%3B%0A%7D%0A%0A%23settingsDialog%20.label%20%7B%0A%20%20margin-top%3A%204px%20%21important%3B%0A%20%20text-align%3A%20right%20%21important%3B%0A%20%20width%3A%2078px%20%21important%3B%0A%7D%0A%0A%23settingsDialog%20.textbox%2C%0A%23settingsDialog%20.button%2C%0A%23alertDialog%20.button%20%7B%0A%20%20-moz-appearance%3A%20none%20%21important%3B%0A%20%20background%3A%20linear-gradient%28%23EEE%2C%20%23BBB%29%20%21important%3B%0A%20%20border%3A%201px%20solid%20%23FFF%20%21important%3B%0A%20%20border-radius%3A%203px%20%21important%3B%20%0A%20%20box-shadow%3A%200px%201px%202px%20rgba%280%2C%200%2C%200%2C%200.3%29%20inset%2C%202px%202px%202px%20%23222%20%21important%3B%0A%7D%0A%0A%23settingsDialog%20.textbox%20%7B%0A%20%20padding%3A%203px%204px%202px%204px%20%21important%3B%0A%7D%0A%0A%23settingsDialog%20.button%2C%0A%23alertDialog%20.button%20%7B%0A%20%20padding%3A%203px%200%200%203px%20%21important%3B%0A%7D%0A%0A%23alertDialog%20.image%20.button-icon%20%7B%0A%20%20margin-right%3A%200%20%21important%3B%0A%7D%0A%0A%23settingstDialog%20.image%20.button-text%20%7B%0A%20%20margin%3A%200%202px%200%204px%20%21important%3B%0A%7D%0A%0A%23alertDialog%20.image%20.button-text%20%7B%0A%20%20margin%3A%200%202px%200%206px%20%21important%3B%0A%7D%0A%0A%23settingsDialog%20.textbox%3Ahover%2C%0A%23settingsDialog%20.textbox%5Bfocused%5D%2C%0A%23settingsDialog%20.button%3Ahover%2C%0A%23alertDialog%20.button%3Ahover%20%7B%0A%20%20background%3A%20%23FFF%20%21important%3B%0A%7D%0A%0A%23settingsDialog%20%23textEditable%20%7B%0A%20%20margin%3A%202px%204px%20-4px%2093px%20%21important%3B%0A%20%20font-style%3A%20italic%20%21important%3B%0A%7D%0A%0A@-moz-document%20url%28chrome%3A//browser/content/browser.xul%29%20%7B%0A%20%20%23main-window%20findbar%20%7B%0A%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%0A%20%20%20%20background%3A%20linear-gradient%28%23EEE%2C%20%23AAA%29%20%21important%3B%0A%20%20%20%20border%3A%201px%20solid%20%23CCC%20%21important%3B%0A%20%20%20%20border-radius%3A%205px%20%21important%3B%0A%20%20%20%20box-shadow%3A%20none%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-closebutton%20%7B%0A%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%0A%20%20%20%20-moz-image-region%3A%20auto%20%21important%3B%0A%20%20%20%20border%3A%201px%20solid%20%23FFF%20%21important%3B%0A%20%20%20%20border-radius%3A%203px%20%21important%3B%0A%20%20%20%20box-shadow%3A%200%201px%202px%20rgba%280%2C%200%2C%200%2C%20.5%29%20inset%20%21important%3B%0A%20%20%20%20height%3A%2024px%20%21important%3B%0A%20%20%20%20list-style-image%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAgUlEQVR42mNkoBAwUt2AhoaGeijdSIw4I7oiIIax4YpxiaMYAFO0cOFCBl5eXoagoCAGZE3r1q1j+Pz5M0N8fDyKIRgGgBQKCQkxvHv3DmwICKCLYTUAlyEgAGKDgIODA24v4DIEBLDZTBsD8HkBlyHUC0SKo5HihESVpEwOoNgAAE1frxFe2fGiAAAAAElFTkSuQmCC%29%20%21important%3B%0A%20%20%20%20margin-right%3A%2048px%20%21important%3B%0A%20%20%20%20min-width%3A%2024px%20%21important%3B%0A%20%20%20%20padding%3A%202px%204px%200%204px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-closebutton%3Ahover%20%7B%0A%20%20%20%20background-color%3A%20%23FFF%20%21important%3B%0A%20%20%20%20list-style-image%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAoUlEQVR42q2TvRWAIAyELzY6g7WbOIez8JjFOdzE2hm0MZqozyg+CuEqOI4Pwg8hUZQVwMtCqKpVO/NcPJLGp7LkAHBN9nyMOSIQs44zEVvfQm7AGXJtC9Q1fN8f4V3qdx0wTfDD8ICHAAk2DTCOCtFVX943wJRgJ6ikLTtxLlLCDhAz2InotfKVzQ+IlmAg8Vv4fYjJ15j6kJKfcpbP9EcblnvEEeDffrAAAAAASUVORK5CYII%3D%29%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-closebutton%20.toolbarbutton-text%20%7B%0A%20%20%20%20margin-left%3A%20-4px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-clear%20%7B%0A%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%0A%20%20%20%20-moz-image-region%3A%20auto%20%21important%3B%0A%20%20%20%20border%3A%201px%20solid%20%23FFF%20%21important%3B%0A%20%20%20%20border-radius%3A%203px%20%21important%3B%0A%20%20%20%20box-shadow%3A%200%201px%202px%20rgba%280%2C%200%2C%200%2C%20.5%29%20inset%20%21important%3B%0A%20%20%20%20height%3A%2024px%20%21important%3B%0A%20%20%20%20list-style-image%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACLklEQVR42qVTW4tSURReRyMdr01qjooonBQTOiD0qIR4eVAjLxCCL4L14O8ZEOZtHicSBcMbmg8hKFQqFg3l7cUHEbyAgoPX1hGNsAZhWvCxzj5nrW9/59trE/CfQdylyWazUev12r9ara6OEuj1eg3CvNlsAPFxNBrdp5udTicZj8dbxwgeIahcLveGJohEIp/6/f5Dk8lE5vP5FhL9W4HX6z3B9DwWi62azebrTCYDYrEY+Hw+XFxcfG40Gqfz+fyq1WrVCZ/Px0B2DjbwMZ9ifszlckmKotQkSUq63S7TarUCTSISiYDD4cDl5eUXrH2fTqevCdztFY/HI/EDWyAQsJVK5QOpVMq/ublhzmYzwDXU63XaOEilUiCRSIDJZEI0Gi1ms9lzwu1265DthcfjebZYLABNgul0ut1NLpfDcDjcNtVqNbDb7ZBMJkEoFAJ6UEScEzunKUx+o9FIqlQqkMlkgAYBygeNRgPL5XK7rlQqYDAYIBQKFc1m84dCofD9t4kOh+MJKnnpcrkM7XYbGAwGaLVaQLO2BPhbMB6PIRwOl7E8ibU//xqkvZJAIEDSKmgiFosFCoUC8PggkUhco5JouVz+duskWiwWPRZ5n2LQsnU63fZXcBZ+4PpdtVr9enSU1Wo1hafiDwaDJJ41lEql5mQyedvpdOq33QU24mSXWfT7s7MzNQ6PjZ7AwWCQ7vV6tOzlATZ7gnsH2MeaLkKsds+HuNtt/DN+AXlHCgCxWmnnAAAAAElFTkSuQmCC%29%20%21important%3B%0A%20%20%20%20margin-right%3A%205px%20%21important%3B%0A%20%20%20%20min-width%3A%2024px%20%21important%3B%0A%20%20%20%20padding%3A%202px%204px%200%204px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-clear%3Ahover%20%7B%0A%20%20%20%20background%3A%20%23FFF%20%21important%3B%0A%20%20%20%20list-style-image%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACc0lEQVR42qWTX0hTYRjGn685p87p/LPM2fyTS6HEtFOCiZpbFystJQqhSEJv9KKrLiIRqRzVRV1YKF6USReWaWKptJXMPwlSKgiFWE0RlJDMzMTU7Zzz9U5WCCWCffDjPbyc9/me853nY/jPxbYydCcLFkmG1e1GxaYCeQJLP7YfJZwDxMPlUR4gSbDm5J8UOptahzcTMBLm8aGbdZ7pjprytvkRbkgzZQuOzt5hUdrAwd1ipqVy7kI9F53O8Vqb7QVMsU4otVo8r7vaPurg+qVVVDyeg43VlDAluQumDcKJSBpM81MHH4jdl5ESFZ0c1zW2Q2E2W2C3dyAn5hN8AwPR3nC7k8u4Vf6E9zDarcpPHXJQpQ5S+2vCNDrD7oiQiJ3h7kWXj7iwgtA9BrT2KmEy5ZJIG8xx41AoFLC31DdWPuVnWfV5liXLuHiooOyE6BKx+OU7lr8tQRsRirBdevycnofGoENTv4JECkikGaZgJ14PtDy69oyfWTuD03thoWI1ZwpClNEAXUwkZFHG3IfPiEo1gq9IYC4ZD94yJCVlorS0sPFyLu5f7+COP4d4o5Blk5NLGXlFR6fGJuHDFYhONkJadq8JaGO2wzW9gLSyey30ejXnvP+vIP12UlScL3hcTL+fhErlB128HosTs2i3N/fRr6uq7UPXhkmsOM5yKGXlCQnpR2SyFJ+SiFn6FFv3qwHqX2kYxMtNo3w4DhZdAKzFZaeEqXeT6HkzNDjzA5WOCdj+dRe2EWoiiNAQ/p5eih6piWEo9UT441dUj8ygm/ouYpVwe58l5hXxJVTeqvT2aBSyF4kQvXU9fEu3cf36BSQ89XDedE3mAAAAAElFTkSuQmCC%29%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-textbox%20%7B%0A%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%0A%20%20%20%20border%3A%201px%20solid%20%23FFF%20%21important%3B%0A%20%20%20%20border-radius%3A%203px%20%21important%3B%0A%20%20%20%20box-shadow%3A%200%201px%202px%20rgba%280%2C%200%2C%200%2C%20.5%29%20inset%20%21important%3B%0A%20%20%20%20height%3A%2024px%20%21important%3B%0A%20%20%20%20margin-right%3A%205px%20%21important%3B%0A%20%20%20%20min-width%3A%20200px%20%21important%3B%0A%20%20%20%20padding%3A%202px%204px%200%204px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-textbox%5Bstatus%3D%27notfound%27%5D%20%7B%0A%20%20%20%20background%3A%20%23F00%20%21important%3B%0A%20%20%20%20color%3A%20%23FFF%20%21important%3B%0A%20%20%20%20text-shadow%3A%201px%201px%202px%20%23000%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.tabbable%20%7B%0A%20%20%20%20-moz-appearance%3A%20none%20%21important%3B%0A%20%20%20%20border%3A%201px%20solid%20%23FFF%20%21important%3B%0A%20%20%20%20border-radius%3A%203px%20%21important%3B%0A%20%20%20%20box-shadow%3A%200%201px%202px%20rgba%280%2C%200%2C%200%2C%20.5%29%20inset%20%21important%3B%0A%20%20%20%20min-width%3A%2024px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-find-next%2C%0A%20%20%23main-window%20findbar%20.findbar-find-previous%20%7B%0A%20%20%20%20height%3A%2024px%20%21important%3B%0A%20%20%20%20padding%3A%202px%204px%200%204px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-find-next%20%7B%0A%20%20%20%20-moz-image-region%3A%20auto%20%21important%3B%0A%20%20%20%20list-style-image%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABSklEQVR42qXQv0sCYRzH8c+lEZWcUOed9MPQJSihoUHaWluCgohqaelPqNVrbWhu6b9oqaGWEKJoac8uMX8l/sjT8/H0mxfpIXn6QJ/lHg7eL3geAf+c0O+ntHlD4cUp1IoMeqWOqsGQ1FKoPx8KXMD68RNF1hRoWYbcp4F8juHtJY7i7TYfEDmKUXBV6caFQh2ZVw3G/S4fEN67I2VZ7salWgPl9wRaD/t8QGjrmsSA3I0rholm+gP0eMAH+DeuaMwn2XGLgGyKH5DagOnx2rG1Qh4U2xkArFyST54Gud1go+Oo0ogdW2MM0L9ARhXIZwDtROgFli6iUmBObUxMQm+gN+6saQLlEigZV9vA6d8rhM6jrpmA2vKIgMs9NO7/BgtnUWE2qEL02ohD7PiIPYg1h9gZ6CD+edU6UjrRNx4M/CI/X4d4OMCxb7reuhENyrkyAAAAAElFTkSuQmCC%29%20%21important%3B%0A%20%20%20%20margin-right%3A%205px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-find-next%5Bdisabled%3Dtrue%5D%20%7B%0A%20%20%20%20list-style-image%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABJElEQVR42qWRvYqDQBRGrxKsEosUol0a8VksQwqxySsItrbWllpZRIQpLfdprExnEVHxF3UdwWHD6mZgPxiuOJzDzDcM/DPM1k/TNJEsy1DXNVRVtcwkSSAIAp1K4HkeUhQFsiyD1+u1zDiOwXVdOoHjOOhyuRA4z3N4Pp/g+z6dwLZtJEkSgcuyhDRN6a9gWRY6n88Exj0URQFhGNIJcImn04nAwzAsk1pgGAY6HA4ExmnbFh6Px75A13UkCALZ6LqOwDjjOELf98vCzxpFkf4m0DTtLoqiyrIsNE3zBq+ZpmkRz918zYLg1xVut9ud53kVH59hmI/wZgfX63WRcBxHJHvwbok/JWsfW/CuYJUcj0cVf8/PuQn/KVgleO7BHwU0+QaQocoRLKElSwAAAABJRU5ErkJggg%3D%3D%29%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-find-next%3Anot%28%5Bdisabled%3Dtrue%5D%29%3Ahover%20%7B%0A%20%20%20%20background-color%3A%20%23FFF%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-find-previous%20%7B%0A%20%20%20%20-moz-image-region%3A%20auto%20%21important%3B%0A%20%20%20%20list-style-image%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR42tXQvUoDQRSG4W+UEAt/CCQhglqJvYUoEisrL8AipLQWbLR15g68CRUbK69BBEEURDBEggHRJAzjqrPubmY97lbrkh93sfLANGd4n+Iw/HHY0M+10310XdBFRaQGwri8OMO15eLqusZxsyUSA2G8vjrHJ0sTkNJB47aF5t09R21b/Ar8jC1tIDte8GzIlzbshzrH464YCPSLlXJhfXbxoV34rwr01AiQPdEDDI0dA/+LAN8Ab1YMiYCVY1qYLWA0kwGyWWgf8djzAP0OcmxAthAAbOAR8xtnZManojgcJUHnm7036weMlU/I5IpRHE77GXRZTQaMLB8R5UvxZRqALR0SitP/GcD8AbFcIbYi1QHqOwmBFPMNG5KzEWHCSEoAAAAASUVORK5CYII%3D%29%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-find-previous%5Bdisabled%3Dtrue%5D%20%7B%0A%20%20%20%20list-style-image%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA/ElEQVR42tWRO4qEQBCGa/CBGHgH72DkDSY3GRARPIBnshU6UDT0GF7AxNhAEd+i7paBrMzOrLLR/FBBdfN9dFfd4J+5vbs0TdOY5xlc1yWXBQgrinJv2xaSJIkppeS0AGFVVe+SJEFZlpBlGaRpGvu+T/4U/ISbptkERVFAnudYcRiG5KXgN7iqKqjreuu7rsM+jqKIPAnewTgHHOa6rjCO40GyCwzDoLIsA8dxwDAM9H1/gJdlgWmatsKXfAseL4do2zZlWXaHMcMwgOM4j1NbsCyL8jy/wxiUeZ53ToDfEQThcHZJoOs6FUXxkwWapj3NANcaBME5wZV8AeRHxBGt/ThhAAAAAElFTkSuQmCC%29%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-find-previous%3Anot%28%5Bdisabled%3Dtrue%5D%29%3Ahover%20%7B%0A%20%20%20%20background-color%3A%20%23FFF%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-find-next%5Bchecked%5D%3Ahover%2C%0A%20%20%23main-window%20findbar%20.findbar-find-previous%5Bchecked%5D%3Ahover%20%7B%0A%20%20%20%20background-color%3A%20%23FFF%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-highlight%2C%0A%20%20%23main-window%20findbar%20.findbar-case-sensitive%20%7B%0A%20%20%20%20height%3A%2024px%20%21important%3B%0A%20%20%20%20padding%3A%200%204px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-highlight%20%7B%0A%20%20%20%20background%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAACRElEQVR42qWTS6hSURSGl2/FIpRwEuQkEB2Y3CAHDZwEotwLiRg4CQpMJ81FnDhQQQwkxEkiCEo0EPLSQNKJJGYgPuI6CSVNUQLfen0fbW97jHxcvQs253DY5/v//a+1SXBECQQCtlgsftHpdHKxWOzzrr2kQ+Fer/cei8U6DQaDtyaTCaD1rVAonPd6PeLaAiqVim2z2V4tFgtGJpMBv98P/X4fyGRytVarva/X65fXEnA6nU94PN59Pp8Pq9UKWq0WPhEg90Cj0Tr5fP5Nt9s9TsBsNj/kcrkK5B44HA6gHgCbzYbRaAQejweKxeLXRCIROeoEOp3urkgkejafzylMJhOWyyUwGAyQSCSA+gHT6XSODLyORqPTgwXkcvlNpVL5EjXzBobhaAiCACqVisF4oohGo/FBr9dfbPp/p4BQKKQYDIbnCH4HOyaRSP/hfyeIKJfLAZ/PV97G2CngcDjOEPQEAykUCuD88RNFhbNftdvtjy6XK7OLsVXAZDI9QE09xe90On3tHI3jWgQ3Frn/YrVaP+2LeKOAVqu9rdFoDKVSad1UDMeF88dwJPIdxfKuUqns428WMBqNQrVa/RSNHjSbzbVrnD+Gown6FQqFfNlsdraXvk3AYrGcKBSKM3yBqtUqDAYDGI/HMJvNLpPJ5NtIJNK7CnyrgN1ufySVSh8Ph8M/m5B7FNcinU77A4FA7arwrQKoRHiFw2ERamwbnaSSSqUu3G73j0PgWwXQDTXmcrlzmUz289+3eDw+PBSO6zdwHx8gUmei8gAAAABJRU5ErkJggg%3D%3D%29%20no-repeat%200%204px%2C%20linear-gradient%28%23EEE%2C%20%23AAA%29%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-highlight%3Ahover%2C%0A%20%20%23main-window%20findbar%20.findbar-highlight%5Bchecked%5D%20%7B%0A%20%20%20%20background%3A%20%23FFF%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAACgElEQVR42qWSXUhTYRjH/zvneI5s1RylJtgHBBGCSCF6UUmghd0IohZEiJE4uwgzEM1AzCZ2YfhBn2wFXqRGkDCLCAxrihkYSxph0oeGupwf286287mz0zHorqmbf3hvXh5+v+d53leHOFJmMu02m0wjP3i+p8rttqxXq4sVbrPZTmdx3IPZtra9QVnGiqI8sbJs5ZSiCFsWnD+Tn3q95e50WJZ3/HY48NViARsIQEcQ719LUvFbQVjckmDZTvdwdGH5L/0VKCoBcWEBruYbUD0eJFLUzy6f78C0LKtxCSYfM5cPJovdskhA2JYJ964OkIkpCGsTOBsbsexyddctLdXENUF/M5NXnCMOiUEiwZCkNag1ySn7MZfeBZHYB1kU+ZaGhrTB4WF/zIK6c3R6a3l4gmfVVL1RB0KJQBV1UBkK/gCD2aRWaWIm8YLZbO6N+ZELsinmhQUOKRDOYQwkKEKBykOD0xA4CZyPkAZdaYWVnfPD0RjrChYHaJshIl0kaRIMrSCyBqdoSLKE0CrUT/Mp5lNNHut6jKiCj1am+lCyeF9VSegNGvzvL0+AhLAGVzHn3dlxuHbl6kYr/q+gpiIvo7lij5Na7qcNRm0tGlxVKISpCELeCPxB48uSdqnI+Z2PxCWw1NeUVpcce4bVXuild6AVPxQG4LwKeM7wufoRedQ+zgY2gkcVdDbVVZ09eeIh510FHRpAqnEQPCuDC9Ce9lfbc28/X5nZDDyqwHrzWn3BkcxbQoBFAimAYYIgfH2CfdyTf+ne0thm4VEFWsrWztTTO6UUpXzzhnyOUedIX23H0JtY4FEFuVkZ/g+TXyqLjmeP/ruzj0y4Y4Wv5Q8F6iIgX85TdgAAAABJRU5ErkJggg%3D%3D%29%20no-repeat%200%204px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-case-sensitive%20%7B%0A%20%20%20%20background%3A%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAABvklEQVR42rWUOYsqURCFT6u4ICouiAtiYqTirzExFMHERAQjg0uHgoobGKiIgfh73HEJDUQQxDURnVcFT2aCx2udmYKGey/d56tz6tISfrmkdz+sVCrifr/j8Xjw4/F4EIvF5B8B5PN5YTKZYLVaWZxA2+0WmUzmZwC5XE4EAgHodDr8dTEYDFAoFL4PkGVZGAwGuFwu7HY7OByOJ6BYLL4HqNVq4vOeOt9sNvD5fFCpVAwYDocolUqvA0h8uVzymuKw2+0wm82w2WyIx+Nyp9NhODkol8uvA/4MTlAcRqORARTL6XTC7XaDJEmIRCJ8ToBqtfoagLofj8cIBoMcBQktFgvo9XpeU4XDYV6PRqPXAYlEQni9Xo5lv9/DYrGAgK1Wi4XS6bQIhULPGdTrdeWAaDQq3G43nE4n7y+XC9+Y2Wz2BUDuyMFkMiHHygHUvd/v5+6ortcrO5nP509Av98Xq9WK3zkcDjifz2g0GvJ/AclkUtBQaZAkrNVqecjkYDqdotvtylBY/wRQ9uv1Gs1mk8Wy2aygq0kdt9vt9wEkTrdErVbjeDw+40ilUkKj0XAM5KrX6ymCvP03VVoflz3vEVRW3O4AAAAASUVORK5CYII%3D%29%20no-repeat%200%204px%2C%20linear-gradient%28%23EEE%2C%20%23AAA%29%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-case-sensitive%3Ahover%2C%0A%20%20%23main-window%20findbar%20.findbar-case-sensitive%5Bchecked%5D%20%7B%0A%20%20%20%20background%3A%20%23FFF%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAACMUlEQVR42rXUS2hTQRQG4P/m5qWJ0aZpb0IxJJG22IAxiSXFokXBgsWCFMWFqAtdaEEQuhQ34kJwoRioIFWIgiiuBME3orQ2L9O86KJtrIqU1FeiMX1Ec483EyiKXSRRh7mLAzPnO5yZuRz+8+Bq3djjHSciEdKEKH2ta1fCu9f2R76agC3nEiSsUsBUr2TJRZHwemYB9wbs/wZwnAyQu1WPFSqeJS8h/tAbxC5s/3ug89RL0muLMDbV492HBZgb1ZB6hUDwLWIXawRS/QP0azzYtgcjH9WwW7WQyTgGhELTiHm7qwdKyefGQhAhY6d5y70fEVsnmhpUuHKomTvsmyzlRyQwheilndUDia3dpLZYwOtWSzdGhI9rxh1FC6hQAMfJ4G63snOI+iXgck91QKn6zOgI6to7ADkPFEWcyZoQEVzluylN5yYLA+L+FKJDVQLDGzykl6pXGU04KByAL30NDydm0f/sJtvnOPaAHG4Ls5L+SUSv7qocmIFA7z3roTKbWZzLL6LOaMCj1KclwHn0Ptld5RaNh6UWDVUBPN/ooYZ1LTjSdoLF58NnsUYw4PF0Zgk4fvsVxeNf2NnkM1+xmMsjef13ZFngqXsb6TUKFL//QLpICApO9M5PQWsyYiKRRG/0RcXvZ9mFftdm0lltSMxmsW/4LlsT3LGbdI0G3EgrcfrJYO1AyNFBvEYDnpcj+y2HrrFytWFPF3FyJXLzc/hcENGXHK0IqflvWun4CYr06hFCjHr8AAAAAElFTkSuQmCC%29%20no-repeat%200%204px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-entire-word%20%7B%0A%20%20%20%20background%3A%20%23CCC%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAACM0lEQVR42q2US4hSYRTHz0Wvr8wXiG+FXI3bFuOuhQUu2rQIWtdCdCM+yJAJRuMi1WJAzRdK4Lo2FUQQgqFIuBB1EYGIlJM0tskX13vVOncoiCHIO3k23+V7/c75/+/5COARgUDgkkwmM1MU9W7bM8S2GyORCGk2m6nBYLCZz+eHuVyO3ikgHo9fdblc1/v9PtRqtTf5fP71zgDhcFiC0lBut1tAkiSUy2V6tVrdz2az7H8DvF6vRCqVBoxGo9TpdCq4uV6vB41G4xVW8fbcgFAoZNLr9Vfw8svtdjusUql0SqXyntVqhWazWVgul98KhcIJb0AwGBQRBBHVarUqm80GAoEA6vV6ar1ef9bpdI/sdjt0u927iUSC8Xg8t3D9eSaTYbcGcBGNRp2Y4U2RSCTAKsBisQACAMGnwEqlcozbhg6HYx+rO95sNlmsZsZLIjR2D4fbKA2J4xe8WItGkygTmEwmmEwmIJFIYDabQbVa/cowzJNisTjhZbLf77dg5jfS6XQSm4xA2Y7QE5hOp98RJMNvUqFQwGKxAKyEoWn6AI1ntgb8GQi4iIAHGo0GWq3WAWa/lMvljzFzFiU6YVn2RTKZ/Mirgt+Bv+ohGnwBPSF/Ad6LxeJn2AsBXH6JJn/gZfLZ8Pl8DrzwDspxajrnA9cHqVTq/H3wF4k8arV6jwMMh8NP4/H4CDv5x84A3HMhFAopg8EAnU7nYalU+meT8QJwEYvFro1GIzO+pE+3PfMT2B/gEZMDjLUAAAAASUVORK5CYII%3D%29%20no-repeat%20left%20center%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-entire-word%5Bchecked%5D%20%7B%0A%20%20%20%20background%3A%20%23FFF%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAACa0lEQVR42q3TS0wTURQG4DNzp5127LulU0uBABpIQ1iA2jbEINFEYqIL48YVWxYoLrBalQCJISYGE6FG3WhCjAtZuNGoCw0mPpo2KKU1EWnlUSpvdNCWTmfu1HbhQl3YQf7lzT35cu85hwAZ0XrDLRaGaJjurR8otoYo9iJ1KanxOHKLkZn13PfUZiUecq1uK1BxZaan65ChNziVhvuvZ/ux33Nx2wDqwgxbxmwmu47YEUMS0D4c38CiUC4O7uP+G1CcDlpUavWr3aX6kjaPzlQ4ezuZgpFAohv73Ze3DCh9sb01NnWnlRZPjobnGLWJdbI65Tt3uQJGQssnMJ+O4RtNYdkAdT5mZCATLbFa7K5qEgxYgntvkq0ZTIYcNuNac5USHkc3jMt9td9QR+AuIOoMvr6HKxooxNwTaxd43p+hzchpR+AuQyBhASQqP6oSwO3n81EM5NhBp6ntWXhpAiThcP41i7K+iPFNHqNAHCkxaJQiUB8RhSp1GpIuMwI05tEVTgSGIYH7iuHOy/lYLptqxTeb47KarOj60AQ4ezVHqfYDiRBrMfGsWoS1H/yS1ag0aXcgRak+BzzHw5PxlVQ6k63Ij+9a0cBvvTn3yZEHErVGDKPj03ZCpU2ZNTSXyQpZkMTJlEB4xYG6p7Je8CvoVGhhp81iBlqrqDEUgM/DBK3pIEQ+KOWIs3iw8ZGsJv8FdI4dV9PUA1JvR/VWBLv0IjwMxLu5a56t78Gf0XgjL8wmXUsVq4Mvibn38VXeld9kYdsAyjfNmql0ss6mgtFIohHfOvDPJZMFFFLdP9U3u7DeIA65jhZb8xNNSOwRvU1bqQAAAABJRU5ErkJggg%3D%3D%29%20no-repeat%20left%20center%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.findbar-highlight%20.toolbarbutton-text%2C%0A%20%20%23main-window%20findbar%20.findbar-case-sensitive%20.toolbarbutton-text%20%7B%0A%20%20%20%20background%3A%20none%20%21important%3B%0A%20%20%20%20border%3A%20none%20%21important%3B%0A%20%20%20%20box-shadow%3A%20none%20%21important%3B%0A%20%20%20%20margin-left%3A%2018px%20%21important%3B%0A%20%20%20%20padding-top%3A%202px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.find-status-icon%5Bstatus%3D%27notfound%27%5D%20+%20.findbar-find-status%2C%0A%20%20%23main-window%20findbar%20.find-status-icon%5Bstatus%3D%27wrapped%27%5D%20+%20.findbar-find-status%20%7B%0A%20%20%20%20border%3A%201px%20solid%20%23FFF%20%21important%3B%0A%20%20%20%20border-radius%3A%203px%20%21important%3B%0A%20%20%20%20box-shadow%3A%200%201px%202px%20rgba%280%2C%200%2C%200%2C%20.5%29%20inset%20%21important%3B%0A%20%20%20%20color%3A%20%23000%20%21important%3B%0A%20%20%20%20font-weight%3A%20bold%20%21important%3B%0A%20%20%20%20height%3A%2024px%20%21important%3B%0A%20%20%20%20margin-left%3A%205px%20%21important%3B%0A%20%20%20%20min-width%3A%2024px%20%21important%3B%0A%20%20%20%20padding%3A%204px%206px%200%2024px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.find-status-icon%5Bstatus%3D%27notfound%27%5D%20+%20.findbar-find-status%20%7B%0A%20%20%20%20background%3A%20%23FFF%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAACqklEQVR42pWUXUgUURTHz8ydGQVpmIwk19U2t2ILVosi+sL2JVkfgkxIg+yDEKFekqKiF333oR4ysc3o40Uf8otAezKQiAqSgtXaJJVg/didTTfd2Z3ZO9uZdbXF1t3tD8M9s/ee/++ee/YOA1noBiFSPss6NnPcPmAY8GvayIyuj7ZTGsiUy6SbvInGe0Xx3m6T6VJxfj7wHAcQi4GGz89AADyy3PZ2bq65k1L5vwF3cbdHi4p67SUlFs3ng4gsg65pawlEEIBIEnh03d05NXWyNxqdyRpwHXdeUVg4ut9stixOTMSNUyUYMUMIjAmCu9/nc3RR6s8K8EAUWyrt9uagxwNSdTVYOzrAU1cHi0ND8XnJ6YRdXV0w2dgIcnc3UOzLa1VtbQ6FbmUF6C8t/bWd56Wl2Vk4trCw9vtXhBiyofmq3uExGSZjquq9oig7MVTSAq4ScuJCWdkbdXoaaDQKW6qqwJ5kmCw3AgODg/E4oOvwQlEqXlI6khZwh+cdZ2y24QUErC7YipDydZDPaC4nzA2F8Z/1OBSq6aW0Jy2gyQBYrcNBr3dtsgABB9YBPiHAlwAY6xSs4Kmi1PRlAlwkZMdps/kHG1i5Q9vQ/BA2MpU+ImQ+AZmnFFpDIdt4LPYtY5PvS9KkmVKLEdcEg38bWlsbH48kAftEceXIVPV7SyRSnrHJhq7x/OWDgvAkl2XBgqaHXS4YwXEmsVsTVnUcIR8aGmAaxyU8nlfhcGMPpY/We214k2/n5Dzfw/P1hGH+WZgcG5+N95HIQLumncXXSNYAFNskCM+sHHc+DytJlfAbzb+oap9L0+rxdSmVSdqPnaFzHFdZTEjTJpZ15iWqWcYj8ev6sIfStkFKB4xCNsrPCEhal3tKEAqKWVZ8GA4bl2QZH5op8Q/uPxcgcP8LuQAAAABJRU5ErkJggg%3D%3D%29%20no-repeat%200%205px%20%21important%3B%0A%20%20%7D%0A%20%20%0A%20%20%23main-window%20findbar%20.find-status-icon%5Bstatus%3D%27wrapped%27%5D%20+%20.findbar-find-status%20%7B%0A%20%20%20%20background%3A%20%23FFF%20url%28data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAAB+UlEQVR42mNkoDFgJFUDd9Du/zA2KyMjw4e1LnjNYCTGsK/rXBnRxWAAWY4oCxYtWgQ3YNYNbTCdpnEVQ2PmBkkwPT3gOYp4XFwcI0ELgsOiGViZGRmc6s+DxXbWGTD8/cfA8OcvEP/7D8QMDGqZhxn+f/nBcHaWM1D8P8MvoNyVQyuJt+DD138M4b2XwGJba2AWIEJHKf0ww5dfjAzXJluB+V9+/me4cYRMCzZV6YNd3T7nKkP/6rsMPLICDF85OSEa3n5m+H/vJUNhih6DochF0i14+uo7w8leC4bffyE+mLD4GsOEQ28YGIR5oBZ8YUgxEWSIDdFkeHBqNWELVq9e/d/LNwhsQUDrWYb3H38ybGsxY2BnZWb4+ec/AzMwafbPv8ow9chrsPoUCxGGxHAtoNwfhsen15FmgX3lSYa3H34yHO+3ZuBgYwZH8DegV77/+M8wf+UNBlCUJIRpMfwHxv7Pf8wMT8+tIsWCvwyOVacY3gAtONaHsOAf0NQvvxgYOFghWt8DHfIbKP73LyPD07NEWACLg59/GBhk4/YxfPvHxPBgth3YEHAyBeJfQEv+Avm/ofy///+D4+f5uTXEWQBj48pM+ABBC1AkPXf8ZxDjZ2D4+I2B4edvsNj/lx8YGM5FEF2G4VdotOI/o7gAihB1LaACAABKph8gxHqCawAAAABJRU5ErkJggg%3D%3D%29%20no-repeat%200%205px%20%21important%3B%0A%20%20%7D%0A%7D%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Ultima2m пишет

Findbar Persist. СКМ не работает

У меня - работает... Окно диалога вызывается.
Чтобы его поместить не в центр, а в другое место, надо в функции this.settingsDialog = function() {... заменить строку:
вместо window.openDialog(url, "", "chrome,centerscreen,dialog,resizable,alwaysRaised"); надо:
window.openDialog(url, "", "chrome,left=1000,top=400,dialog,resizable,alwaysRaised");
Здесь, конечно - 1000 и 400 я взял "с потолка" - Вы должны подобрать по своему вкусу - расстояние в пикселях от левого края и от верха.
Но будьте осторожны - если зададите большое значение для left, окно диалога может "вылезти" из экрана и Вы сможете закрыть его только через Таскбар винды.
Так что надо "поиграться".
В принципе их можно вычислить, зная высоту и длину диалогового окна и получив значения высоты и ширины экрана.
Если Вам это важно, я постараюсь это Вам подготовить.
Но дайте мне сначала знать - открывается ли у Вас диалоговое окно вообще и удалось ли "поиграться" с перемещением его?

У меня при клике СКМ вылетает окошко. ФФ-57

скрытый текст
gSpoiSV.png

Ultima2m пишет

У меня при клике СКМ вылетает окошко. ФФ-57скрытый текст

А если в about:config
параметр security.data_uri.unique_opaque_origin поставить в false и перезапустить?

Ultima2m пишет

У меня при клике СКМ вылетает окошко. ФФ-57

Я не понял, у Вас ФФ57 или 52?
У меня - 52.
А в 57 очень многое не будет работать имхо. Здесь я уже ничем помочь не могу...

difabor пишет

Я не понял, у Вас ФФ57 или 52?

Сижу на FF-52 ESR и допиливаю под себя FF-57

Ultima2m пишет
difabor пишет

Я не понял, у Вас ФФ57 или 52?

Сижу на FF-52 ESR и допиливаю под себя FF-57

Так на 52-й у Вас СКМ работает?
Как переместить диалоговое окно я Вам показал. Попробуйте на 52-й

difabor пишет

Попробуйте на 52-й

На 52 у меня дополнение FindBar Tweak стоит.
Очень нравится

Ultima2m пишет

На 52 у меня дополнение FindBar Tweak стоит.
Очень нравится

У меня оно тоже стоит.
Но я эту кнопку специально поставил, пытаясь Вам помочь. Теперь отключил за ненадобностью.
Для ФФ57 ничем помочь не могу.

Dumby спасибо за ответ с профилями.
Еще один вопрос, в FF57 убрали и теперь не работает if (fp.show() == fp.returnCancel || !fp.file) return;
Смотрел здесь https://developer.mozilla.org/en-US/doc … FilePicker
и если с массивами данных понятно, например

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

Выделить код

Код:

var uc = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    uc.charset = 'utf-8';
    fileContent = uc.ConvertFromUnicode(fileContent);

    var nsIFilePicker = Components.interfaces.nsIFilePicker;
    var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
    fp.init(window, '', fp.modeSave);
    fp.defaultString = fileName;
    fp.appendFilters(fp.filterHTML);
    fp.appendFilters(fp.filterAll);

       fp.open(function (rv) {
    if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
    var stream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
    stream.init(fp.file, 0x02|0x20|0x08, 0666, 0);
    stream.write(fileContent, fileContent.length);
    stream.close();
  }
});


А вот допустим в кнопке   Save+-  fileContent явно не задан и как заменить? (особенно интересует последняя строчка)
скрытый текст

Выделить код

Код:

var fp = window.makeFilePicker();
      fp.init(window, "Сохранить как…", fp.modeSave);
      fp.appendFilter("", "*.png");
      fp.defaultString = getTabLabel() + "  " + (new Date().toLocaleFormat("%d.%m.%Y. %H:%M:%S")) + ".png";
      if (fp.show() == fp.returnCancel || !fp.file) return;


Если у Вас есть время, посмотрите пожалуйста.

Прошу меня простить за дублирование просьбы - думаю, что просто не заметили

Viatcheslav пишет

Есть кнопка, добавляющая прогресс-бар в адресной строке (код от Andrey_Krropotkin):

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

Выделить код

Код:

//Полоса загрузки в адресной строке
 
(function(){
//Location Bar Enhancer5.1;Loading Bar0.3.0
    var cssStr = (function(){/*
            #urlbar {
                background-image: -moz-repeating-linear-gradient(top -45deg, rgba(255,255,255,0), rgba(255,255,255,0) 6px, rgba(255,255,255,0) 6px, rgba(255,255,255,0) 12px), -moz-linear-gradient(left, #33FF66 0%, #33FF66 100%);
                background-size:0 0;
             background-repeat:repeat-x, no-repeat;
           //  transition: background-size 350ms ease 0s !important;
            }
            #urlbar:not([connecting])::after {
                        display:none;
                    }
            @-moz-keyframes progress-bar-stripes {
                from {
                    background-position: 0, 0;
                }
                to {
                    background-position: 51px 0, 0;
                }
            }
    */}).toString().replace(/^.+\s|.+$/,"");
    
    var style = document.createProcessingInstruction("xml-stylesheet", "type=\"text/css\"" + " href=\"data:text/css;base64," + btoa(cssStr) + "\"");
    var mainW = document.getElementById("main-window");
    document.insertBefore(style, mainW);

    function main(window) {
      var {document, gBrowser} = window;
      function $(id) document.getElementById(id);
      var urlbar = $("urlbar");
      let pageProgress = 0;
      let async = makeWindowHelpers(window).async;
      var LoadingBar = {
        listener: {
          onChangeTab: function(e) {
            urlbar.style.backgroundSize = '0% 100%';
            pageProgress = 0;
          },
          
          onProgressChange: function(aBrowser,webProgress,request,curSelfProgress,maxSelfProgress,curTotalProgress,maxTotalProgress) {
            if (gBrowser.contentDocument === aBrowser.contentDocument) {
                var val = (curTotalProgress-1)/(maxTotalProgress-1);
                pageProgress = val;
                urlbar.style.backgroundSize = (100*val) + '% 100%';
                if (val > 0.9)
                  async(function() {
                    if (pageProgress > 0.95)
                        urlbar.style.backgroundSize = '100% 100%';
                }, 1000);
            }
          },
          
          onStateChange: function() {
            if (pageProgress > 0.95){
                async(function() {
                    urlbar.style.backgroundSize = '0% 100%';
                    pageProgress = 0;
                }, 1000);
            }else{
                urlbar.style.backgroundSize = '0% 100%';
            }
          }
        }
      };

      gBrowser.tabContainer.addEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
      gBrowser.addTabsProgressListener(LoadingBar.listener);

      unload(function() {
        gBrowser.tabContainer.removeEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);

        gBrowser.removeTabsProgressListener(LoadingBar.listener);
      }, window);
    }

    watchWindows(main, "navigator:browser");

    function runOnLoad(window, callback, winType) {
      window.addEventListener("load", function() {
        window.removeEventListener("load", arguments.callee, false);

        if (window.document.documentElement.getAttribute("windowtype") == winType)
          callback(window);
      }, false);
    }

    function runOnWindows(callback, winType) {
      function watcher(window) {
        try {
          callback(window);
        }
        catch(ex) {}
      }

      let browserWindows = Services.wm.getEnumerator(winType);
      while (browserWindows.hasMoreElements()) {
        let browserWindow = browserWindows.getNext();
        if (browserWindow.document.readyState == "complete")
          watcher(browserWindow);
        else
          runOnLoad(browserWindow, watcher, winType);
      }
    }

    function watchWindows(callback, winType) {
      function watcher(window) {
        try {
          callback(window);
        }
        catch(ex) {}
      }

      runOnWindows(callback, winType);

      function windowWatcher(subject, topic) {
        if (topic == "domwindowopened")
          runOnLoad(subject, watcher, winType);
      }
      Services.ww.registerNotification(windowWatcher);

      unload(function() Services.ww.unregisterNotification(windowWatcher));
    }

    function unload(callback, container) {
      let unloaders = unload.unloaders;
      if (unloaders == null)
        unloaders = unload.unloaders = [];

      if (callback == null) {
        unloaders.slice().forEach(function(unloader) unloader());
        unloaders.length = 0;
        return null;
      }

      if (container != null) {
        container.addEventListener("unload", removeUnloader, false);

        let origCallback = callback;
        callback = function() {
          container.removeEventListener("unload", removeUnloader, false);
          origCallback();
        }
      }

      function unloader() {
        try {
          callback();
        }
        catch(ex) {}
      }
      unloaders.push(unloader);


    function removeUnloader() {
        let index = unloaders.indexOf(unloader);
        if (index != -1)
          unloaders.splice(index, 1);
      }
      return removeUnloader;
    }
    
    function makeWindowHelpers(window) {
      let {clearTimeout, setTimeout} = window;

      function async(callback, delay) {
        delay = delay || 0;
        let timer = setTimeout(function() {
          stopTimer();
          callback();
        }, delay);

        function stopTimer() {
          if (timer == null)
            return;
          clearTimeout(timer);
          timer = null;
        }
      }

      return {
        async: async,
      };
    }

})();


Для полного счастья не хватает отображения степени загрузки страницы в %, как здесь - https://www.w3schools.com/howto/tryit.a … r_label_js. Для удобства метка должна пропадать по окончании загрузки страницы вместе с прогресс-баром. Если такое возможно - сделайте, пожалуйста :blush: Спасибо

Andrey_Krropotkin пишет

в кнопке   Save+-  fileContent явно не задан

Не готов согласиться. fileContent задан явно в переменной url,
только в виде адреса, представленного интерфейсом nsIURI.
Так что здесь всё аналогично.

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

Выделить код

Код:

var fp = window.makeFilePicker();
      fp.init(window, "Сохранить как…", fp.modeSave);
      fp.appendFilter("", "*.png");
      fp.defaultString = getTabLabel() + "  " + (new Date().toLocaleFormat("%d.%m.%Y. %H:%M:%S")) + ".png";
/*
      if (fp.show() == fp.returnCancel || !fp.file) return;
      
      var wbp = window.makeWebBrowserPersist();
      parseInt(Services.appinfo.version) < 36
      ? wbp.saveURI(url, null, null, null, null, fp.file, null)
      : wbp.saveURI(url, null, null, null, null, null, fp.file, null); // если FF36+
*/
      fp.open(res => {
         if (res == fp.returnCancel || !fp.file) return;

         var save = window.makeWebBrowserPersist().saveURI;
         save.length < 8
            ? save(url, null, null, null, null, fp.file, null)
            : save(url, null, null, null, null, null, fp.file, null);
      });


P.S. Позволю себе напомнить про будущее toLocaleFormat.

Dumby спасибо. Да в 58 не только toLocaleFormat заменят, но и многое другое - Firefox Site Compatibility. Опять придется все править.

Благодаря Dumby подgравил кнопку для FF57 - Создает пункт в контекстном меню закладок "Экспорт в HTML файл"  (сохраняет выборочно папки или любой пункт из контекстного меню закладок в HTML)

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

Выделить код

Код:

//-------------------- Экспорт в HTML файл в контекстном меню закладок
//Источник - https://github.com/ardiman/userChrome.js/blob/master/exporthtmlfolder/ExportHTMLFolder.uc.xul
 (function () { 

 function ImageConverter(imageURL) {
       this.imageURL = imageURL;
       this.channel = Services.io.newChannel(imageURL, null, null);
       this.channel.asyncOpen(this, null);
}
 ImageConverter.prototype = {
       imageURL : "",
       channel : null,
       bytes : [],
       stream : null,
       Database64 : null,
       iscompleted : false,
       QueryInterface : function (iid) {
              if (!iid.equals(Components.interfaces.nsISupports) &&
                  !iid.equals(Components.interfaces.nsIRequestObserver) &&
                  !iid.equals(Components.interfaces.nsIStreamListener)) {
                  throw Components.results.NS_ERROR_NO_INTERFACE;
               }
               return this;
        },

        onStartRequest : function (aRequest, aContext) {
             this.stream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
             this.iscompleted = false;
         },

       onStopRequest : function (aRequest, aContext, aStatusCode) {
             this.Database64 = 'data:' + this.channel.contentType + ';base64,' + btoa(String.fromCharCode.apply(null, this.bytes));
             this.iscompleted = true;
         },

             onDataAvailable : function (aRequest, aContext, aInputStream, aOffset, aCount) {
             this.stream.setInputStream(aInputStream);
             var chunk = this.stream.readByteArray(aCount);
             this.bytes = this.bytes.concat(chunk);
          }
};
 var ExportHTMLFolder = {
      
        escapeHTML: function(str) {
             return str.replace(/[&"<>]/g, function (m) ({ "&": "&amp;", '"': "&quot", "<": "&lt;", ">": "&gt;" })[m]);
          },
          
        onMenuItemCommand: function(event) {
             var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService);
             var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService);
             var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
             var MPMenu = PlacesUtils.getString("BookmarksMenuFolderTitle");
             var NodeID = document.popupNode._placesNode || document.popupNode.parentNode.selectedNode;
             fp.init(window, PlacesUIUtils.getString("EnterExport"),Ci.nsIFilePicker.modeSave);
             fp.appendFilters(Ci.nsIFilePicker.filterHTML);
             fp.defaultString = NodeID.title+".html";

             fp.open(res => {
                   if (res == fp.returnCancel || !fp.file) return;
                   var file = fp.file;
                   var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
                                 .createInstance(Components.interfaces.nsIFileOutputStream);
                   var charset = "UTF-8";
                   foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0);
                   var os = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
                                   .createInstance(Components.interfaces.nsIConverterOutputStream);
                   os.init(foStream, charset, 0, 0x0000);
                   var nbTab = 5;
                   var data = '<!DOCTYPE NETSCAPE-Bookmark-file-1>\n';
                       data = data + '<!-- This is an automatically generated file.\n';
                       data = data + '\tIt will be read and overwritten.\n';
                       data = data + '\tDO NOT EDIT! -->\n';
                       data = data + '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">\n';
                       data = data + '<TITLE>Bookmarks</TITLE>\n';
                       data = data + '<H1>'+ExportHTMLFolder.escapeHTML(MPMenu)+'</H1>\n';
                       data = data + '\n';
                       data = data + '<DL><p>\n';
                   os.writeString(data);
                   var options = historyService.getNewQueryOptions();
                   var query = historyService.getNewQuery();
                   if( NodeID.type != 0 )
                      {
                        query.setFolders([NodeID.itemId], 1);
                        var result = historyService.executeQuery(query, options);
                        node = result.root;
                       }
                   else
                       {
                        query.setFolders([NodeID.parent.itemId], 1);
                        var result = historyService.executeQuery(query, options);
                        var rootNode = result.root;
                        rootNode.containerOpen = true;
                        inc = 0;
                        var node = rootNode.getChild(inc);
                        while(( inc < rootNode.childCount )&&( node.itemId != NodeID.itemId )) {
                            inc++;
                            var node = rootNode.getChild(inc);
                              }
                        rootNode.containerOpen = false;
                         }
                        this.ecrireUnMP( os, node, nbTab );
                        data = '</DL></p>\n';
                        os.writeString(data);
                        os.close();
                 });
          },
          
          ecrireUnMP: function( flux, elem, nbTab ) {
             var resultTypes = Ci.nsINavHistoryResultNode;
             if( elem.type == resultTypes.RESULT_TYPE_SEPARATOR ) {
                 var chaine = new Array(nbTab).join(' ') + "<HR>\n";
                 flux.writeString(chaine);
             }
             else if( elem.type == resultTypes.RESULT_TYPE_URI ) {
                 var Description= PlacesUIUtils.getItemDescription(elem.itemId);
                 var chaine = new Array(nbTab).join(' ') + '<DT><A HREF="' + this.escapeHTML(elem.uri);
                 if ( elem.icon.indexOf('moz-anno:favicon:http') >= 0 )
                 {
                       if ( elem.icon.indexOf('http://www.mozilla.org/2005/made-up-favicon/') < 0 ){
                                  chaine = chaine + '" ICON_URI="' + elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http') + 'moz-anno:favicon:'.length);
                        }
                       var Image = new ImageConverter( elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http')) );
                       var thread = Cc['@mozilla.org/thread-manager;1'].getService().mainThread;
                       while ( !Image.iscompleted ) {
                       thread.processNextEvent(true);
                       }
                        chaine = chaine + '" ICON="' + Image.Database64;
                  }
                  else if ( elem.icon.indexOf('moz-anno:favicon:data:image') >= 0 )
                        {
                        chaine = chaine + '" ICON="' +elem.icon.slice(elem.icon.indexOf('data:image'));
                        }
                        var chaine = chaine + '">' + this.escapeHTML(elem.title) + '</A>\n' + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n';
                        flux.writeString(chaine);
                         }
                  else if(( elem.type == resultTypes.RESULT_TYPE_FOLDER )||( elem.type == resultTypes.RESULT_TYPE_FOLDER_SHORTCUT )) {
                        var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService);
                        var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService);
                        var Description= PlacesUIUtils.getItemDescription(elem.itemId);
                        this.escapeHTML(elem.title) + '</H3>\n';
                        var chaine = new Array(nbTab).join(' ') + '<DT><H3>' + this.escapeHTML(elem.title) + '</H3>\n';
                        var chaine = chaine + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n';
                        chaine = chaine + new Array(nbTab).join(' ') + '<DL><p>\n';
                        flux.writeString(chaine);
                        nbTab = nbTab + 4;
                        var options = historyService.getNewQueryOptions();
                        var query = historyService.getNewQuery();
                        query.setFolders([elem.itemId], 1);
                        var result = historyService.executeQuery(query, options);
                        var rootNode = result.root;
                        rootNode.containerOpen = true;
                        for (var inc = 0; inc < rootNode.childCount; inc ++) {
                              var node = rootNode.getChild(inc);
                              this.ecrireUnMP( flux, node, nbTab );
                         }
                         rootNode.containerOpen = false;
                         nbTab = nbTab - 4;
                         chaine = new Array(nbTab).join(' ') + '</DL></p>\n';
                         flux.writeString(chaine);
                   }
          },

          init: function()
           {
              var contextMenu = document.getElementById("placesContext");
              if (contextMenu) contextMenu.addEventListener("popupshowing", this.ExportHTMLFolderShowHideItem, false);
           },
          ExportHTMLFolderShowHideItem: function(event)
            {
              var show = document.getElementById("placesContext_ExportHTMLFolder");
              show.hidden = (document.popupNode.localName == "menuseparator")||( document.popupNode.className == "openintabs-menuitem");
              document.getElementById("placesContext_ExportHTMLFolderSep").hidden = show.hidden;
            },
};

       window.addEventListener("load", function load(event) {
       window.removeEventListener("load", load, false); //remove listener, no longer needed
       ExportHTMLFolder.init();
}, false);


  if ( document.getElementById("placesContext_ExportHTMLFolder") ) return; 

   
    var contextMenu = document.getElementById("placesContext");
    var copyBothMenuItem = document.createElement("menuitem"); 
    copyBothMenuItem.id = "placesContext_ExportHTMLFolder";
    copyBothMenuItem.setAttribute("label", "Экспорт в HTML");
    copyBothMenuItem.setAttribute("selection", "any");
    copyBothMenuItem.setAttribute("closemenu", "single");
    copyBothMenuItem.addEventListener("command", function () { ExportHTMLFolder.onMenuItemCommand(event); });
    contextMenu.insertBefore(copyBothMenuItem, document.getElementById("placesContext_newSeparator") );
    var SMenuItem = document.createElement("menuseparator"); 
    SMenuItem.id = "placesContext_ExportHTMLFolderSep";
    contextMenu.insertBefore(SMenuItem, document.getElementById("placesContext_ExportHTMLFolder") );
})();


Если есть желающие найти и устранить недостатки - буду очень рад.

На стадии переделки,  (все нет времени довести до ума), но вполне работает для FF57 кнопка - дополняет контекстное меню кнопок дополнительными пунктами:
Показать Id кнопки,
Копировать изображение кнопки в формате base64,
Копировать код кнопки как текст,
Копировать код кнопки как HTML ссылку,
Копировать код кнопки как BBcode сылку,
Сохранить изображение кнопки,
Сохранить код кнопки в HTML файл,
Сохранить все кнопки в HTML файл,
Сохранить код кнопки в XML файл,
Добавить кнопку из XML файла,
Переместить кнопку.
+ Дополняет иконками пукнты меню

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

Выделить код

Код:

/*Дополнительные пункты в контекстном меню кнопки*/

const topicURL = "http://forum.mozilla-russia.org/viewforum.php?id=34"
const cbNamespace = "http://xsms.nm.ru/custombuttons/";
const nsIFilePicker = Ci.nsIFilePicker;
const nsIFile = Ci.nsIFile;

function $(aId) {
  return document.getElementById(aId);
};


/////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Context menus ///////////////////////////////
/////////////////////////////////////////////////////////////////////////////

function addMenuItem(aNewIDs, aNodeIDs, aLabel, aIcon, aCommand) {
  for (var i = 0; i < aNewIDs.length; i++) {
    // Remove previously created menuitems if any
    if ($(aNewIDs[i])) $(aNewIDs[i]).parentNode.removeChild($(aNewIDs[i]));

 let mi = e4xConv_parseXULFromString(
                  '<menuitem xmlns="' + e4xConv_encodeHTML(xulns, true) + '"\n\
                  id="' + e4xConv_encodeHTML(aNewIDs[i], true) + '" class="menuitem-iconic"\n\
                  image="' + e4xConv_encodeHTML(aIcon, true) + '" label="' + e4xConv_encodeHTML(aLabel, true) + '"\n\
                  oncommand="' + e4xConv_encodeHTML(aCommand, true) + '"/>');  


    if (i == 0)
      mi.setAttribute("observes", "custombuttons-contextbroadcaster-primary");

    if ($(aNodeIDs[i])) {
      if ($(aNodeIDs[i]).nextSibling) {
        $(aNodeIDs[i]).parentNode.insertBefore(mi, $(aNodeIDs[i]).nextSibling);
      } else {
        $(aNodeIDs[i]).parentNode.appendChild(mi);
      }
    }
  }
};


var saveImg1 = "data:application/file;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AESqAABHpgAASKAAAEukAQxMpQMYR6MAAEepAQ9MpgOLRKgACUenAABHpgAARKoAAP///wD///8A////AP///wBEqgAARaIAAFS2FVBj0jS3Y9AzyVG0EUROrwt8TKcDs0ikAANInwAAR6YAAESqAAD///8A////AP///wD///8ARKQAAVvJKJtj0jX/SaAJ/0abCv9UtSH/U7QX8lW5IMddwyfQW8Iii0mqBQ1DqQAA////AP///wD///8A////AEWlAAFYwB6YXsYc5F7GFt9bwA+vVbgWvU6rAKBRrgf0RZgA/02oDP9ezCzJR6UBA////wD///8A////AP///wBFrAAASKIAADiGNQAeYIIpF1iJHVa4GKEve0tFLHl1Pla7J51exRnUWL8VjEetAAP///8A////AP///wD///8AC0WuAAk/tAAANdpIAFD6/wA+7f8gd6jqBlPX+QBE9PIGS8uDLnZLADqNJwAzjDMA////AP///wD///8A////AAAw0QAALc0AAEPdegBI4f8AK8P/ADHX/wAwzf8AL8b/AEno/gAz2zYALtEQAC3VAP///wD///8A////AP///wAAMssAADjSMwBA2pIATen/ADG9/wBe1v8ATcz/ADHK/wBN5/4ASeH/AEvl6wA10DP///8A////AP///wD///8AADnTSQBO5/8ANc7/ADnR/xC+9/8C0f//AMj//wCP8P8ALcX/ACrC/wBE3f8ASeOf////AP///wD///8A////AABI4Z4ARN3/ACvG/wJAxP8Z5v//AMT//wDE//8Axv7/AETM/wA51P8AUervADjSPP///wD///8A////AP///wAAOdRiAFry+QBS6/QATOP/H+P8/xDe//8J1///E9H4/wFE2f8AReC6ADTOEwAyywD///8A////AP///wD///8AADDNAAAyzCcARN7WACvG/wVfzf8d0vf/HM30/whf0/8AI7n/ADzV+AA40kUAMswA////AP///wD///8A////AAAwywAAPNdTAEfg/wAsw/8AOdb/ADLP/wAswv8AReP/AC7H/wA40f8AR+GfADDKAP///wD///8A////AP///wAAMswAADfRQgBY8f8AT+j/AE7o7AA+1/8AK8T/AE7o/wBN5f8AVe7/AD/ZbAAwywD///8A////AP///wD///8AADPMAAAyywAANM4vADjSUQA0zikAU+z3AEff/wBJ4sMAN9EtADjROQAyywAAM8wA////AP///wD///8A////AAAzzAAAM8wAADHLAAAwywAAMcsAAD/YXQBK4pYAN9AxAC/KAAAwygAAM8wAADPMAP///wD///8A+R8AAPAfAADABwAAwAMAAPgDAADwHwAA8AcAAOADAADAAwAAwAMAAMAHAADgBwAA4AcAAOAHAADwDwAA/j8AAA==";
var saveImg2 = "data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAADbAAADpcAAA//AAANVwAAD/8AAAKsAAAD/AAAP//AAAP8AAAD/AAAD/8AAAwDAAAP/wAAA/wAAAP8AAA";
var saveImg3 = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf//rEH4j6xB8IesQeHDrEHD4axBh/CsQYf4rEGH8KxBw+GsQeHDrEHwh6xB+I+sQf//rEH//6xB//+sQQ==";
var saveImg4 = "data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAA/wAAAP8AAA";
var saveImg = "data:application/file;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAFwAAAGkAAABzAAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAADkAAAAP////AQAAAIdgZmj/YWlt/2FobP9haGz/YGhr/2Boa/9fZ2v/X2dr/15mav9dZWn/XGRo/0ZNUP8AAACdAAAAFf///wEAAACr2tzc/9ve4P/a3t//1dnZ/7S2tf+foJz/m5ya/6apqP/O0tP/09fZ/9DV1v+hqq//AAAAuQAAABX///8BAAAAq+3u7//e4eL/ub29/2hnXv9oVUX/U0As/zgxGf83Lx3/YWBX/7a5uv/S1tj/o6yx/wAAALkAAAAV////AQAAAKv29/f/19na/1dUQf9jXDv/dmtJ/4FoSP9VQiL/V0Ek/008Iv9HQTP/yc3P/6Wus/8AAAC5AAAAFf///wEAAACr+Pj4/5uamP9tY0L/g31b/6GLa/+McVH/eFY5/4xwUv9yXkD/RTki/4uMiv+nsLT/AAAAuQAAABX///8BAAAAq/n6+v+FfXL/waSM/8qznf/DrZP/ooFi/7WfhP+qh2//blk9/1A+Iv9aWlH/pK2x/wAAALkAAAAV////AQAAAKv6+/v/d3Rr/9zCsP/RxbH/z8Wu/9fJt//Qvab/qItv/5iOb/9tYUH/VVJK/6Wtsf8AAAC5AAAAFf///wEAAACr+/z8/4mHff+3pI//3NK//+HXxf/m3Mz/5trJ/9rMuf+bgWT/d14//2hnYP+osbX/AAAAuQAAABX///8BAAAAq/z9/f/FxL7/j4l+//Xw5f/29ez/8/Dl/+DMuv/VuaP/poZn/2dFKv+srav/oamt/wAAALkAAAAV////AQAAAKv+/v7/+/z8/5iZjf+5uqr/6+PW/+3i1P/kzL3/vZR+/4NhSf+Qh3z/z9HS/4qQkv8AAAC1AAAAFf///wEAAACr/v7+//7+/v/u7u3/tbiv/5WSgP+DfGj/e25Z/29gTv+sppz/vr6+/5aYmP90eHr/AAAApwAAABP///8BAAAAq/////////////////7+/v/9/f3//f39//v8/P/5+fn/1dXV/2pqav9TU1P/QUFB/wEBAYkAAAAJ////AQAAAKv7+/v//////////////////v7+//7+/v/+/v7/+vr6/9fY2P/V1tb/7Ozs/4KCgv8EBAQrAAAAA////wEAAACFlJSU/6ioqP+qqqr/qqqq/6qqqv+qqqr/qKio/6anp/2kpaX9o6Oj/4qKitUZGRk9////Af///wH///8BAAAAFQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABTBAQEUx8fH1dfX18z////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w==";
var saveImg6 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABKklEQVR42mNkQAMNDAxCQMoTiB2BWAEq/ACI9wPxdqD8O2T1jGiao4HUEgb8IAaobimGAUDBGiDVzEAcqAWqb4EbQKTNWF3CCPXzW5ho/f//YDqHkZFhCpQNA7lAMV4gzY4QEmZEtx1mgCtQ8W4o2xLIPg5lJwDZUghDYkAGzAEyktENMAQqPA9l6wDZEkB6D6Yhc0EG7AGynfEZYAxkawHpxVC+A5CvC6RFGBj2Em2AIZCeg8Q3BtLSUAMIegGkwQBIz8U0YC7OQEQ2wAjIPoekGRQTUC/E4IxGkMKzaNEI8jso4chDbGdgA0UjekJ6A8S3gRikFWQyKOF/higGR50UFLPBEhLM9AZoUv4F1cAA1QTi/2SAJFkQnxdCoyZlJEPIz0xIhpCUnQFx83abgfUZOQAAAABJRU5ErkJggg==";
var saveImg7 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAASUlEQVR42mNkoBAw0s6ABob/aHxGkg1I8zEGM2dtOTskDED3MxCgGIBpASOGATANhACyi6hrAGVeoDgQB6UB2PxMvAFEAooNAAC7izYR2pQ0nAAAAABJRU5ErkJggg==";
var loadImg = "data:image/x-icon;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////AQAAAB+yg2l71ZRt+daTa//Wk2v/1pNr/9aTa//Wk2v/v4NlywYEAycAAAAX////Af///wH///8B////Af///wHdo4M53Zx3/+Sgef/innb/4p52/+Kedv/lo3r/5aR6/+mqgfvPj27N////Af///wH///8B////Af///wH///8B4KSD8+mmff/opH3/56N6/+Whef/no3r/66qB/8KBXf/Fg1//0Y5s78+Pbqn///8B////Af///wH///8B////AeGlg//trIX/7ayE/+6thP/urIX/9bWL/8eFYf/GhF//yYZh/9SPa/nkn3j/////Af///wH///8B////Af///wHkn3j/76+G/+6uh//vrob/76+G//W3jP/GhF//y4di/9ONZ//XkWr/5J94/////wH///8B////Af///wH///8B5J94/++wif/wsIj/8LGJ//CxiP/0toz/y4di/8+KZf/vroP/766D/+SfeP////8B////Af///wH///8B////AeSfeP/xs4v/8bOL//Cziv/ws4v/87WL/9CNa+3QjWvt3p96/96fev/en3r/////Af///wH///8B////Af///wHkn3j/8rWN//K2jf/ytY3/8rWN//O2jvfdo4Lj0I5sJdCObCXQjmwl0I5sJf///wH///8B////Af///wH///8B5J94//O3j//zuI//87iP//O4j//zuZDx3aOD7////wH///8B////Af///wHdo4M/5J94/+SfeP/kn3j/5J94/++2j//zupH/9LqR//O6kv/0upL/87qR/+SfeP/kn3j/5J94/+SfeP////8B////Af///wHkoXr/9cCY//W8k//0vJT/9L2T//S8lP/0vZT/9LyU//S8lP/1vJT/9cCY/+Shev////8B////Af///wH///8B9b+WC+SjfP/2yqP/9b+W//a/lf/2v5X/9b6V//W+lv/1vpX/9sqj/+SjfP////8B////Af///wH///8B////Af///wH2wZgX5aZ+//fTrP/2wJj/9sCY//bAmP/2wZj/99Os/+Smf/////8B////Af///wH///8B////Af///wH///8B////Af///wHkqYH/99ax//fCmv/3wpn/99aw/+Sogf////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AeWrhP/317L/99ey/+WrhP////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B5a2F/+Wthf////8B////Af///wH///8B////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w==";
var saveImg5 = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1FQr1FRT7BRUU+wUVFPsFFRT7BRUU+wUVFPsFFRT7BRUU+wUVFPsFFRT7BRUU+wU1FQrwAAAAAAAAAAAAAAAHd0cpz//////////////////////////////////////////////////////////3d0cpwAAAAAAAAAAAAAAAB4d3Sc/////+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg//////94d3ScAAAAAAAAAAAAAAAAenh3nP/////i4uL/4uLi/5yiz/9HYcT/PWrR/1qQ3P+nuNr/4uLi/+Li4v//////enh3nAAAAAAAAAAAAAAAAH18eJz/////5OTk/2FluP8IJ6r/D1TU/wli4v8FZeb/D3He/4y+5f/k5OT/+/v7/318eJwAAAAAAAAAAAAAAACBfXyc/////5Wc0v8JKq//E2Pd/yFTrv9EKTn/LjVZ/xaF2/8OdNP/zNnm//z8/P+BfXycAAAAAAAAAAAAAAAAhIGBnP////89Xc7/Dk7N/wpQ0/8zVp//TGCK/4U2Cf9DW2b/Eqj7/5C+5//8/Pz/hIGBnAAAAAAAAAAAAAAAAIaEgZz/////Kmnf/wlFzf8gPZ7/uXcl/8OAK/+UTBL/b1Az/zfG9f9srdX/+fn5/4aEgZwAAAAAAAAAAAAAAACJhoac/////0iN6P8HQtH/EVzd/2mCqf/dqkz/0pY6/6FnKv9Nvt7/kMfs//X19f+JhoacAAAAAAAAAAAAAAAAiomJnP////+Mr+r/FFnU/xVRyv+LorL/8Oqh//nXbP+5omH/Urvf/8bj7v/s7Oz/iomJnAAAAAAAAAAAAAAAAI6Kipz/////2+n3/5aSm/+hcEn/4uXC////2P/25KD/rqSD/7HR5//o6Oj/4eHh/46KipwAAAAAAAAAAAAAAACPjo6c//////j4+P/4+Pj/3s/F/9i/n//p27n/5NG0/+7r6f/r6+v/3t7e/9LS0v+Pjo6cAAAAAAAAAAAAAAAAk4+PnP/////6+vr/+vr6//r6+v/6+vr/+vr6//j4+P/19fX/r66t/62sq/ObmprrkI2NpgAAAAAAAAAAAAAAAJOTk5z//////Pz8//z8/P/8/Pz/+/v7//r6+v/4+Pj/9fX1/66trfHs7Ozrp6emp4aGhhMAAAAAAAAAAAAAAACWlpOc/////////////////v7+//39/f/6+vr/9/f3//Pz8/+bmprrp6enp3NzcxYAAAAAAAAAAAAAAAAAAAAAmJiWnJiYlpyYmJacmJiWnJeTk52SkZGemJiWnJeTk52SkZGej4+LpIaGhhMAAAAAAAAAAAAAAAAAAAAAgAMAAIADAACAAwAAgAMAAIADAACAAwAAgAMAAIADAACAAwAAgAMAAIADAACAAwAAgAMAAIADAACABwAAgA8AAA==";
var moveToMenu = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABKElEQVR42o3TMUvDQBQH8P+7tLlEwaW4ugl+iU6CCA4i0tbdqavgZ/ErCE79DsVBkYpKLR2kuApOatG297zLJWkqXnIPwrsk937cveQIJXHZBZt8cgFyzaEqYGuTvl7feM2FVAIHR8Bj341UAu1T4PPdjXgBJgzyPKDFy4SDIkJZo1yRASZ+FDB5Itzfct7YBGjuBBBh6oT6ed2OazGjsV3wQ2Cu64bXUKM7FgZJgPaufinTSVFhrDPFheVIe01nwLgfq9HNVCRAaw8Q6USWS4B05mgVIH2/qG+ABh+46im7heP9EELOLRDZpVqAQev8ZwUS/DBLivMtlDWxc7Ycs6yBhyov9vqMGcBBDB5/rxT7/Qfntjn/FXsDrmIvoHUonMVegMllx/kXlvSRMQ0GPE4AAAAASUVORK5CYII=";
var removeFromToolbar = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACMElEQVR42p3Sz2/SUBwA8G9pgQJd6QYZQQkOjUFdXMCLMn9B4l3myRgXhydPZgcTY2KyLfGiF/wT9GTmhfIXjMQ4NP5YD5qZTGdVdEx+9FVKSwttrTV4QD3AN3mH9837fr7v+/Kww1e4ic2HiSYMRGxufcHjxs87nQ5GN0zodnXQNLVomvCAL6ZR/xxmAS9VsX1umz1pJ/dfKGeD4+58OERNYQQO7Y4BWs8E3XCAqvRAEkWkdpTcNptm+4DpMVUOtboZl4tY2reXWmTGvbDTVKFnALicTrvYsFqbpgEOBw6tpgiigOb4Yoa1gTMzY1B+XUexKM1gLid8a3QgQHtBklQQBJm3RuAxDBiPl0z4aMq+eu1rFYmiFLOBowd8QJEEiLIBlbpV7PdArdZCApJX3j9O3e/Pe/Di0zTpJgvB8CSjSG1o7O7mbCA04QIHjoGsGuAfI6FRk0D8ISe3VlPc4OPGL61nab+/QDE0VD9/+T1CKOCCtqoDQRBAe0n4yH/nZUVLVtjTCP4R8cvPN8LRSKL6qVKygUjIC0rXAAMw6+EI6GkmoGaDM0DP8KuzfyHx+WfLe6KRpdpOlbMB+E9oWof78OhEcjB/5OqLbHAyUEB1oYTBCDFz7VWaYZg11BTYkYBj17lFyu3Lo5aYGwk4fuNNHgd8QVHk2EjA7K3NDVM3iuV708tDA2dXtqb0rr5mrWT57jQaGjh1+13eKio+uXOo9Gs/NJC6+TZhdf7zQ38Ceg0HgF1MCP0AAAAASUVORK5CYII=";
var iconADD = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACDUlEQVR42nWT30sUURTHz91Zd9FkVBRrX0oScTMI8weSIYSU/QMFbb5oGAn+AQo9B/UH9BAF+lIr+OLrSETQQ4GhEVRrUFkP/SLRNcvUnXv8nrmz7XVcB86cy7nn+5kz556ryHrueKxIYcFkPMmbxXHgzA6NDyguatQewBzHkKMMQDnWPgDsIwYh8/hATP8HQCRJEFIc5iA1DpljZIGogJU/9WXp39DR1pj99QBwe45dZb6UhCXE2Hx6m4xtQZQ/8SDni+DdSNopVYtysUiFpVbDqp4vPL4uCWc6zt+H+wvbAOBrCBCRFgh0AtIA6BboBVADc6eeZLMCGOq/kkF8Hcs8AO8tgDwav5M0AI/bw87Xw9dml+bvSUamtfsGYmuIrQDwKgIoQirkF3pR9uCbz28vx+tTMWo6VRdsL79eLax80yePtc3MTlwYKwMIT8HTvYufFkc+bq4NOjWN9Kf6cIVsHNr4sePnf9LxytqH06Od1w6oICGA9uZGOnvEpb7tgkrefLl8UXZvdTV5CYe3vv9Wzy6dVnfL9KAKfkcALeihaSKT+yj3Imji1XRPBvFyTTSn4LHMi5Y5SCnrGFc3c5MCqKtMD5c5RnsOisfILlmD1NxA5yThwy96GhkkRtlxrP3oIO0d5ZKXfSSbUYaJ1/tGef9lovAyUeQyAaKCO4nLpPRBABWJlwCWt6vYBccZ9A793wmLAAAAAElFTkSuQmCC";
var customBtn = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjVJREFUeNqcUkuIUmEUPl4fML6bBsFRacRF2EaCcRO48bFLEIJcBIJLxb2b2UWLkIEgQQjauVFaKmgYuclUTMUHKoaKE4GPxnxh5r3ezh0QHJFmmA/OPZfDfx7fdw7AfojQ7qGx4QawdgMymeyRyWR6IZVKucFg8N10Ov0Ot4VGozmNRCLx5XL5F/HHbrefYZh7m1yWWq0+TafTn2kEdqXr9TrtcDje3JR4xRHH1QYCgXOz2Wzs9/sQj8dBIpEATtGrVqu9yWSywmdLNGq3AAeNsFgsz202mxk7QzKZBK1WCzqdjtHjKUmSx41Go4L+slQqpYvF4keKoibXpnA6nWfY+VehUKBSqRTJ0Oh2u3Qul6MHgwE9Ho9pLMD4H16v95zD4RxuU6BbrdYlPh5g8tfFYvET9XiIiRylUsnQgPl8DtgVhsOheL1eS6LRaGy1Wg02FAA5VmKxWB1/yUQioWOxWHKXy2XEYsDQEggEgKJCJpOBcrnMbOliW4MNSOaDCbVKpVISCoVGHBnQQygUgnK1AkeH9z+Ew+HX2xoQezZDjUaj3ygDiMViaLfbV8kK+TGw2WysJzzafry3QK1W+9Lr9RpIDbLZLEhE4vedTsdvMBieuN3ulwRBPLh2B7uYzWYXzWZzjBoc5PP5MJ70K1xfEsVc4cpNeDcnuLFvzM3978gILpcrRy/w+XybGE+v1z/z+/2frFarG9d5AHeBSqUyeDyetwqF4jHcFXw+/4TH44n+CTAA3Ccog288LRAAAAAASUVORK5CYII=";
var saveAll = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOElEQVR42mNkwAJ+7xf7//3tKwZeIUELRqf3JxnwAEZkzrtlwnv/MzE6/WfkWCwS/iTu7RLO/wzMPAwc/z4Lc0f/eIfTgP/7BM0PXDY5ofB9N8M/EB8k+BcoyQw1mEWd4SurLIO97lkUFzX9b/oPNmBznc7/////MbAzfIdoBoI/P77Abfnzn4XhH9A0kOLA7icQV88HKn0EdcH6Ss3/yM76/f0jg2vTXYZ/f39j9fdUgQkMdTp1DNFXoiEGrCzFNMCj6SrD/79/MDQzsbAzCEfyMTBwADkbGBjBBiwrRDXgF9AAz6ZLWF1QIlHCsFRnKdj2pYxLIQYsytPAMMC75SLYBVMkpzDkPM+By0lFSTEwCDAwvJ79eouoqKgv2IB5WWgGfPvI4N95kUEyQQwcJVXbq8CGeEp6MlzUuQi2fcKbCQgDZqWhG/CJIaDrLIPMf0kGBjeggAoDw5YNWxh8rHwYGMQZGB5PfszAysq6RUJCAmLAtCR1DAMCu08zzJSZxtDm0cbA8AQoyAxJGyDbWx+2MrCwsGyRkZGBGDApDpsBx8FhME95HkObfhtYM4MqA8OdnjtgNSAXyMvLQwzoi8JmwGF4NGoc12Bg6IHYXnuzFm6AsrIyxIAJ+UHXfj27oomIhc9AA/ajpAOdPToMV1yuwPnMzMxbNDU14QaEAqnGH28fqYGywt/fP5i8q5czYUtIMABygY6ODsSAJUuWOKMrUFHT2PPvzy90YZhX/79//36dt7d3KACPfPJHOU7GxAAAAABJRU5ErkJggg==";

let cIDs = ["custombuttons-contextpopup-exportXML",
            "custombuttons-contextpopup-exportXML-sub"];
let bIDs = ["custombuttons-contextpopup-bookmarkButton",
            "custombuttons-contextpopup-bookmarkButton-sub"];
addMenuItem(cIDs, bIDs, "Сохранить код кнопки в XML файл", saveImg,
            "document.getElementById('" + this.id
          + "').saveXML(('triggerNode' in this.parentNode) "
          + "? this.parentNode.triggerNode.URI "
          + ": document.popupNode.URI);", "X");
let xIDs = ["custombuttons-contextpopup-importnewbutton",
            "custombuttons-contextpopup-importnewbutton-sub"];
let aIDs = ["custombuttons-contextpopup-addnewbutton",
            "custombuttons-contextpopup-addnewbutton-sub"];
addMenuItem(xIDs, aIDs, "Добавить кнопку из XML файла\u2026", loadImg,
            "document.getElementById('" + this.id +
            "').checkDocumentForCBXML(content.document);");          
let fIDs = ["custombuttons-contextpopup-copyImageURI",
            "custombuttons-contextpopup-copyImageURI-sub"];
let b2IDs = ["custombuttons-contextpopup-copyURI",
            "custombuttons-contextpopup-copyURI-sub"];            
addMenuItem(fIDs, b2IDs, "Копировать изображение кнопки в формате base64", saveImg1,
            "document.getElementById('" + this.id
          + "').copyImageURI();");
let f1IDs = ["custombuttons-contextpopup-saveButtonImage",
            "custombuttons-contextpopup-saveButtonImage-sub"];
addMenuItem(f1IDs, cIDs, "Сохранить изображение кнопки", saveImg1,
            "document.getElementById('" + this.id
          + "').saveImageURI();");  
let f2IDs = ["custombuttons-contextpopup-copyButtonsCodeText",
            "custombuttons-contextpopup-copyButtonsCodeText-sub"];
addMenuItem(f2IDs, b2IDs, "Копировать код кнопки как текст", saveImg2,
            "document.getElementById('" + this.id
          + "').copyButtonsCodeText();");                    
let f3IDs = ["custombuttons-contextpopup-copyAsHTML",
            "custombuttons-contextpopup-copyAsHTML-sub"];
addMenuItem(f3IDs, b2IDs, "Копировать код кнопки как HTML ссылку", saveImg3,
            "document.getElementById('" + this.id
          + "').copyToHTMLCode();");
let f4Ds = ["custombuttons-contextpopup-copyToBBCode",
            "custombuttons-contextpopup-copyToBBCode-sub"];
addMenuItem(f4Ds, b2IDs, "Копировать код кнопки как BBcode сылку", saveImg4,
            "document.getElementById('" + this.id
          + "').copyToBBCode();");          
let f5Ds = ["custombuttons-contextpopup-saveAsHTML",
            "custombuttons-contextpopup-saveAsHTML-sub"];
addMenuItem(f5Ds, bIDs, "Сохранить код кнопки в HTML файл", saveImg5,
            "document.getElementById('" + this.id
          + "').saveToHTMLCode();");
let f8Ds = ["custombuttons-contextpopup-saveAsHTMLAll",
            "custombuttons-contextpopup-AsHTMLAll-sub"];
addMenuItem(f8Ds, f5Ds, "Сохранить все кнопки в HTML файл", saveAll,
            "document.getElementById('" + this.id
          + "').saveToHTMLALLCode();");          
let f6Ds = ["custombuttons-contextpopup-getButtonId",
            "custombuttons-contextpopup-getButtonId-sub"];
let b1IDs = ["custombuttons-contextpopup-remove",
            "custombuttons-contextpopup-remove-sub"];            
addMenuItem(f6Ds, b1IDs, "Показать Id кнопки", saveImg6,
            "document.getElementById('" + this.id
          + "').idMIonclick(content.document);");
let f7Ds = ["custombuttons-contextpopup-addNextButton",
             "custombuttons-contextpopup-addNextButton-sub"];
                                        
var addMI = document.getElementById('custombuttons-contextpopup-addnewbutton');
addMI.setAttribute('image', iconADD);
var addMI1 = document.getElementById('custombuttons-contextpopup-addnewbutton-sub');
addMI1.setAttribute('image', iconADD);
var addMI2 = document.getElementById('custombuttons-contextpopup-move-moveToPanel');
addMI2.setAttribute('image', moveToMenu);
var addMI3 = document.getElementById('custombuttons-contextpopup-move-removeFromToolbar');
addMI3.setAttribute('image', removeFromToolbar);
var addMI4 = document.getElementById('custombuttons-contextpopup-customize');
addMI4.setAttribute('image', customBtn);

var saveToFile = function (fileContent, fileName) {
    var uc = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    uc.charset = 'utf-8';
    fileContent = uc.ConvertFromUnicode(fileContent);

    var nsIFilePicker = Components.interfaces.nsIFilePicker;
    var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
    fp.init(window, '', fp.modeSave);
    fp.defaultString = fileName;
    fp.appendFilters(fp.filterHTML);
    fp.appendFilters(fp.filterAll);
    fp.open(function (rv) {
  if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
    var stream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
    stream.init(fp.file, 0x02|0x20|0x08, 0666, 0);
    stream.write(fileContent, fileContent.length);
    stream.close();
  }
});
};


function readFile(aFile) {
  var data = "";
  var fstream = Cc["@mozilla.org/network/file-input-stream;1"].
                createInstance(Ci.nsIFileInputStream);
  fstream.init(aFile, -1, 0, 0);
  var charset = "UTF-8";
  const replacementChar = Ci.nsIConverterInputStream
                            .DEFAULT_REPLACEMENT_CHARACTER;
  var is = Cc["@mozilla.org/intl/converter-input-stream;1"].
           createInstance(Ci.nsIConverterInputStream);
  is.init(fstream, charset, 1024, replacementChar);
  var str = {};
  while (is.readString(4096, str) != 0) {
    data += str.value;
  }
  is.close();
  return data;
};

function stringToDOM(aString) {
  var parser = new DOMParser();
  var dom = parser.parseFromString(aString, "text/xml");
  if (dom.documentElement.nodeName == "parsererror") {
    return null;
  } else {
    return dom;
  }
};

function importXMLtoButton(aStrXMLData) {
  loadURI("custombutton://" + escape(aStrXMLData));
};

function getCBOverlay() {
  var dirsvc = Cc["@mozilla.org/file/directory_service;1"].
               getService(Ci.nsIProperties);
  var file = dirsvc.get("ProfD", Ci.nsIFile);
  file.append("custombuttons");
  file.append("buttonsoverlay.xul");
  return file;
};

this.checkDocumentForCBXML = function checkDocumentForCBXML(aDocument) {
  if (((aDocument.contentType == "text/xml") ||
       (aDocument.contentType == "application/xml"))&&
      (aDocument.documentElement.localName == "custombutton")) {
    var serializer = new XMLSerializer();
    var xml = serializer.serializeToString(aDocument);
    importXMLtoButton(xml);
  } else {
    this.loadXML();
  }
};



this.loadXML = function loadXML() {
  var fp = window.makeFilePicker();
  fp.init(window, "Установить кнопку из XML файла",
          nsIFilePicker.modeOpen);
  fp.appendFilters(fp.filterXML);
  fp.appendFilter("Все файлы", "*.*");
  fp.displayDirectory = FileUtils.File( getPathToHtmlFileFolder() );
  
  fp.open(re=> { 
      if ( re == fp.returnOK ) gBrowser.selectedTab = gBrowser.addTab(fp.file.path);
   })

  var xmlData = readFile(fp.file);
  var xmlDOM = stringToDOM(xmlData).documentElement;
  if (!xmlDOM) {
    custombuttons.alertBox("Импорт не удался", "Это не XML файл!");
    return;
  }

  if ((xmlDOM.localName == "custombutton") &&
      ((xmlDOM.getAttribute("xmlns:cb") == cbNamespace) ||
       (xmlDOM.getAttribute("xmlns") == cbNamespace))) {
    importXMLtoButton(xmlData);
  } else {
    custombuttons.alertBox("Импорт не удался", "XML файл не содержит кнопок!");
  }
}


this.copyImageURI = function copyImageURI() {
    var btn = document.popupNode;
    if (!btn) return;
    cbu.gClipboard.write(btn.image);
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "Изображение кнопки скопировано в буфер", false, "", null);
}

this.copyToHTMLCode = function copyToHTMLCode() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = "<p><div id=\"install\" style=\"background: transparent -moz-linear-gradient(center top , rgb(224, 102, 255) 30%, rgb(125, 38, 205) 55%); text-shadow: 0pt -1px 0pt rgb(122, 55, 139); border: 1px outset rgb(85, 26, 139); border-radius: 1em; padding: 0; width: 240px; text-align: center;\"><a href=\"" + btn.URI + "\" style=\"display: block; padding: 1em; color: #ffffff; text-decoration: none;\" title=\"Click here to install " + btn.name + "\" rel=\"nofollow\"><img src=\"" + btn.image + "\" alt=\"" + btn.name + "\" style=\"vertical-align: middle; float: left;\"/>" + btn.name + "</a></div></p>";
  cbu.gClipboard.write(code);
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "HTML кнопки скопирован в буфер", false, "", null);

}

this.copyToBBCode = function copyToBBCode() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = "[url=" + btn.URI + "][B]" + btn.name + "[/B][/url]";
  cbu.gClipboard.write(code); //.toXMLString());
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "BBCode кнопки скопирован в буфер", false, "", null);
}

this.saveImageURI = function saveImageURI() {
  var btn = document.popupNode, br = gBrowser;
  if (!btn) return;
  if(btn.image != "") {
      var tab = br.mCurrentTab;    br.selectedTab = br.addTab(btn.image);
        setTimeout( function() {    window.content.document.title = btn.name;
                        saveDocument(window.content.document);
                        //br.removeCurrentTab();    
                        //br.selectedTab = tab;
        }, 200); 
  } else custombuttons.alertBox("Эта кнопка не имееет изображения!");
}

 
this.copyButtonsCodeText = function copyButtonsCodeText() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = ((btn.cbCommand == "") || (btn.Command == "/*CODE*/"))
              ? ""
              : ("\n/*CODE*/\n" + btn.cbCommand + "\n");
    var init = ((btn.cbInitCode == "") || (btn.cbInitCode == "/*Initialization Code*/"))
              ? ""
              : ("\n/*Initialization Code*/\n" + btn.cbInitCode);
    cbu.gClipboard.write(code + init);
    //custombuttons.alertSlide(btn.name, "Код скопирван в буфер");
    var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
        as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "Код скопирван в буфер", false, "", null);

}



this.createNextButton = function(aButton) {
  custombuttons.cloneButton(aButton, true);
  
    window.setTimeout(function(){
      if(!aButton.nextSibling.hasAttribute('initialized')) {
        custombuttons.editButton(aButton.nextSibling);
      }
    })
  
}

this.saveXML = function saveXML(aStrURI) {
  var cbURI = (aStrURI != undefined) ? aStrURI : readFromClipboard();
  if (!cbURI || !/^custombutton\:\/\//.test(cbURI)) {
    custombuttons.uChelpButton(this);
    return;
  }

  var cbXML = cbURI.replace(/^custombutton\:\/\//, "");
  var decodeXML = unescape(cbXML);
  var btnName = decodeXML.match(/\<name\/?.+/).toString();
  var name = "untitled";
  if (!/\<name\/\>/.test(btnName)) {
    name = btnName.replace(/\<\/?\w+\>/g, "").toString();
  }
  var image = decodeXML.match(/\<image\/?.+/).toString();
  var icon = "";
  if (!/\<\image.*\[\].*\>$/.test(image)) {
    icon = image.match(/[^\[\]]+/g)[2].toString()
                .replace(/custombuttons\-stdicon\-\d/, "").toString();
  }

  function htmlEntities(str) {
      return str.replace(/&/g, "&amp;").replace(/</g, "&lt;")
                .replace(/>/g, "&gt;").replace(/"/g, "&quot;");
  }

  var xmlTemplate = "custombuttons/\"\n\
              xmlns:html=\"http://www.w3.org/1999/xhtml\">\n\
  <html:head>\n\
    <html:title><![CDATA[" + name + "]]></html:title>\n\
    <html:link rel=\"shortcut icon\" href=\"" + icon + "\"/>\n\
    <html:style type=\"text/css\"><![CDATA[\n\
body { font-size: medium; margin: 0; }\n\
body, code:before, help:before, initcode:before {\n\
  font-family: \"Verdana\", sans-serif;\n\
}\n\
#wrapper { position: fixed; top: 1em; right: 1em; text-align: center; }\n\
p { font-size: small; text-align: center; }\n\
#button {\n\
  background-color: rgb(85, 168, 2);\n\
  background-image: linear-gradient(to bottom, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -moz-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -o-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -webkit-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  border: 1px solid rgb(58, 116, 4);\n\
  border-radius: .5em;\n\
  -moz-border-radius: .5em;\n\
  -webkit-border-radius: .5em;\n\
  padding: 0;\n\
  margin-bottom: 1em;\n\
  box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -moz-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -o-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -webkit-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
}\n\
#button a {\n\
  color: #000;\n\
  text-shadow: -1pt -1px 0pt rgba(255, 255, 255, .5);\n\
  padding: 1em;\n\
  text-decoration: none;\n\
}\n\
:-moz-any-link:focus {\n\
  color: white;\n\
  outline-color: transparent;\n\
  text-decoration: none;\n\
}\n\
#button a, code, code:before, initcode, initcode:before, help, help:before {\
\n  display: block;\n\
}\n\
#credits { position: fixed; bottom: 1em; right: 1em; font-size: small; }\n\
custombutton { background-color: rgb(171, 171, 171); margin: 1em; }\n\
date, image, mode, accelkey { display: none; }\n\
name { font-weight: bold; font-size: x-large; }\n\
code:before, help:before, initcode:before {\n\
  font-weight: bold;\n\
  font-size: large;\n\
  margin: 0 0 1em;\n\
  padding: .5em;\n\
}\n\
code:before { content: \"Код\"; }\n\
help:before { content: \"Справка\"; }\n\
initcode:before { content: \"Инициализация\"; }\n\
code, initcode, help {\n\
  background-color: rgb(255, 255, 255);\n\
  border: 1px inset rgb(170, 170, 170);\n\
  font: medium monospace;\n\
  margin: 1em 1em 2em 0;\n\
  padding: 1em;\n\
  text-align: left;\n\
  width: 840px;\n\
  white-space: pre-wrap;\n\
  word-wrap: break-word;\n\
}\n\
.clear { clear: both; }\n\
]]></html:style>\n\
  </html:head>\n\
  <html:body>\n\
    <html:div id=\"wrapper\">\n\
      <html:div id=\"button\">\n\
        <html:a href=\"" + cbURI + "\" rel=\"nofollow\" title=\"Установить " +
        htmlEntities(name, "ENT_COMPAT") +"\">\n\
        <![CDATA[Установить кнопку]]>\n\
        </html:a>\n\
      </html:div>\n\
      <html:div id=\"credits\">\n\
        <html:a href=\"" + topicURL +"\">\n\
          <![CDATA[Другие кнопки]]><html:br/>\
<![CDATA[на форуме Mozilla Россия]]>\n\
        </html:a>\n\
      </html:div>\n\
    </html:div>\n\
  </html:body>";

  decodeXML = decodeXML.replace(/custombuttons\/\"\>/, xmlTemplate);

  name += ".xml";
  saveToFile(decodeXML, name);
 var btn = document.popupNode;
 var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
 as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "сохранена в XML файл", false, "", null);
}
var mrw = mostRecentWindow('navigator:browser');
var css = '@-moz-document url("chrome://browser/content/browser.xul"){' + this.Help + '}';
var uri = makeURI('data:text/css,' + encodeURIComponent(css));
var sss = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService);
if (!sss.sheetRegistered(uri, sss.USER_SHEET)) sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
this.idMIonclick = function idMIonclick() {
  var btn = document.popupNode.id;
  var box = custombuttons.confirmBox("Копировать в буфер", btn, "Да", "Нет");
  if (box) {
    custombuttons.cbService.writeToClipboard(btn);
    custombuttons.alertSlide(btn, "Скопирована в буфер");
} }
function  mostRecentWindow(windowType) {
  return Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow(windowType);
}

this.saveToHTMLALLCode = function saveToHTMLALLCode() {
 var fp = window.makeFilePicker();
   fp.init(window, "Укажите папку для экспорта CB кнопок!", fp.modeGetFolder);
   fp.open(re=> { 
      if ( re != fp.returnOK ) return;
      cbu.setPrefs("CB.exportsButtonsToHtmlFile.path", convertFromUnicode("UTF-8", fp.file.path));
      
      exportsButtonsToHtmlFile();
   })
};


this.saveToHTMLCode = function saveToHTMLCode() {

  

 var btn = document.popupNode;
  var xml = '<html xmlns="' + e4xConv_encodeHTML(xhtmlns, true) + '">\n\
    <head>\n\
    <meta http-equiv=\'Content-Type\' content=\'text/html; charset=utf-8\'/>\n\
      <title>' + e4xConv_encodeHTML(btn.name + ' for Custom Buttons') + '</title>\n\
      <link rel=\'icon\' type=\'image/vnd.microsoft.icon\' href="' + e4xConv_encodeHTML(btn.image, true) + '"/>\n\
             <style type="text/css">\n\
.button a{\n\
  background-color: rgb(85, 168, 2);\n\
  background-image: linear-gradient(to bottom, rgb(147, 200, 94), rgb(85, 168, 2));\n\
  background-image: -moz-linear-gradient(top, rgb(147, 200, 94), rgb(85, 168, 2));\n\
  border: 1px solid rgb(58, 116, 4);\n\
  border-radius: .5em;\n\
  -webkit-border-radius: .5em;\n\
  padding: 0;\n\
  margin-bottom: 1em;\n\
  box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -o-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -webkit-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
    color: #000;\n\
  text-shadow: -1pt -1px 0pt rgba(255, 255, 255, .5);\n\
  padding: 0.5em;\n\
  text-decoration: none;\n\
}\n\
pre { border: 1px inset rgb(170, 170, 170); \n\
     background-color: rgb(255, 255, 255);}\n\
body { background-color: rgb(245, 245, 220);} \n\
</style> \n\
    </head>\n\
    <body>\n\
     <section id=\'install\'><h1>' + e4xConv_encodeHTML(btn.name) + '</h1>\n\
      </section>\n\
      <div class="button"><a href="' + e4xConv_encodeHTML(btn.URI, true) + '">Установить кнопку</a></div>\n\
      <section id=\'init\'><h2>Инициализация</h2><pre>' + e4xConv_encodeHTML(btn.cbInitCode) + '</pre></section>\n\
      <section id=\'code\'><h2>Код</h2><pre>' + e4xConv_encodeHTML(btn.cbCommand) + '</pre></section>\n\
      <section id=\'help\'><h2>Справка</h2><pre>' + e4xConv_encodeHTML(btn.Help) + '</pre></section>\n\
    </body>\n\
  </html>';
  var html = '<!DOCTYPE html>\n' + xml;
  
  var name = btn.name + ".HTML";
  saveToFile(html, name);
 
  var as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService);
  as.showAlertNotification(btn.image, "Кнопка: " + btn.name, "сохранена в HTML файл", false, "", null);
}




function e4xConv_parseXULFromString(xul) {
    xul = xul.replace(/>\s+</g, "><");
    return new DOMParser().parseFromString(xul, "application/xml").documentElement;
}
function e4xConv_encodeHTML(s, isAttr) {
    s = String(s)
        .replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, "&quot;");
    if(isAttr) {
        s = s
            .replace(/\t/g, "&#x9;")
            .replace(/\n/g, "&#xA;")
            .replace(/\r/g, "&#xD;");
    }
    return s;
};



function exportsButtonsToHtmlFile() {
   var visibleCBbuttons = [...document.querySelectorAll('[cb-mode]')];
   var paletteCBbuttons = [...custombuttons.palette.querySelectorAll('[cb-mode]')];
   var allCBbuttons = visibleCBbuttons.concat(paletteCBbuttons);

   var array = [];
   allCBbuttons.forEach(but=> {
      if ( !but.URI ) return;
   
      var name = but.getAttribute("label") || "Без названия";
      if ( but.URI.endsWith("custombutton%3E") ) var uri = but.URI;
      var image = but.getAttribute("image") || "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACNFBMVEXDRgDweQDnbwC0NgDCRQC7PQDtpTu+QQD78q3PUwDCRAD//8vbYQDLTgDocAD0iQX1jQbGSgD7iAD4gwDVaw7vdwDyegD+igDweQDlawDyhAXveADmZwDzmBbtcwDwkhHveADmhBTkgxbweADkfRH+igD7hADXZQX0gADyjA/tfgvveQDiawDQVADRXgfnbwD1jAb9iQD9z0PVZAbxpinykRHtdgD5mRbERQDDRgDOYArCRAD9iQD3ewDxegD3dwDFRgDAQAD+hgD4fQDucgDtgQftfwTISQDCRQDvdgD5lxb1kRb2qh7wnynkagD766LDRQDDRwDDRQDspjbtpzbuqDbvqzv//8DUZAbCRQD//83pjhvveQbvggW+QQDfcxLlmUb//8veYADMTwDHSADVVwC8PgDwixb78q3oZgDUWADRVADCRQD9iQDERwDBQQDYVQC+PgC0NgDbYQDWWgDUWADSVQDFSAC+QAC7PAC0NgD+wRL+/kD+/zb+7i3+8Cv+/DX+wBL/+DD/rwz+qgz+rwz/tAz+sQzfbAT+3iP/+jD//Dz1jwP+nwf5iwf7pBz2tRr4lwb/ogfsdQT+2R7/9ET+2iT8yyLmgBL5iQL2egLokhP7zzT60zv1zUr0gAL1ewP50yn9+UL++EXooyngaAH41EPzowzyySj+xxzlhhHvvyruwjXxvTnUag3+zxrwigP+swz86U/ZXwD75lHqegD6xzb//kn+uhPTXAG3OAD/+UC2vFeJAAAAe3RSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAACfnwAIaelpAAA2+wD7UQAAa3oArKzRzMysnwgAvPQA/gAAw3prw0oALr16vS4AACnF6bspAAAA/mIAADQAAAAAAI8AAEwA0vv7kd2yAuuvr+vKABL23U+8Sk/d9vUDIIAQAAAQgCAfvupHAAABB0lEQVR4Xi3IU3fDABgA0C+u26FdZ9u2bdu2vZSzbds2/tyac3IfLxjpGyA6MimqY6gHTNgiiNwkwRM1E7EhTrYyTfMzzsh0ZEPiH+D6+u5mV1jEhpe5haVCYW1T4suEvUOkk7PLpVJ5WFnl7hEUDN5LPvsHJ6cazdn13f3DYxu0B35+/Y2qVSr17NzGeUgohIVHLK/PMDa39qKieRATGxd/9cS4uU1MwnmQktqY/qGlaVr7/ZOVDTmQm5df8PwyNj4xOTVdjOM4kCRZOr+wWFa+srpWQVEU8PnV2zu7NbV19UfHDQRBAIfTdNHc0soVdnR2dfdgGAgEvW99/QNc4eDQ8O8Ihv0D77NPgbVLZ6kAAAAASUVORK5CYII=";

      array.push("<img src=" + image + ">&nbsp<a href=" + uri + ">" + name +"</a><br>\n");
   });
   
   var before = "<html>\n<head>\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>\n</head>\n<body>\n";
   var after = "\n</body>\n</html>";
   var text = before + array.join("") + after;
   var text = convertFromUnicode("UTF-8", text); 

   var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
   file.initWithPath( getPathToHtmlFileFolder() );
   file.append("CB buttons " + new Date().toLocaleFormat("%d.%m.%Y. %H·%M·%S") + ".html");
   custombuttonsUtils.writeFile(file.path, text);

   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   alertsService.showAlertNotification(saveImg5, "Экспорт в HTML", "Экспортировал все CB кнопки как HTML в " + file.path);
   setTimeout(()=> alertsService.closeAlert(), 4000);
};



function getPathToHtmlFileFolder() {     
   try { return Services.prefs.getComplexValue("CB.exportsButtonsToHtmlFile.path", Ci.nsISupportsString).data } 
   catch(e) { return "C:" };
};


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();
};

this.MoveToolbarButtons = MTB = {
    // Start editable preferences
    MoveButtonMICBContext: true, // Add "Move button" menu item to Custom Buttons context menu?
    MoveButtonMITBarContext: false, // Add "Move button" menu item to toolbars context menu?
    ShowMoveAlert: false, // Show the alert with instructions when moving buttons?
    MoveBtnImage: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYklEQVQ4" +
        "jWNgGJTgaAXHf2LEcGrGZQBBQ45WcPz/fZ0XpwG45FAUEDIAqzyyJLIiZIxNHqdmYvHRCo7/DLhsIEYziivQDcHn" +
        "BawxgqyQUCzgjQlC6YCotEB2QkJWTIzY4AAAezv/caeCLKcAAAAASUVORK5CYII=",
    // End editable preferences

    _UID: "__cb_move_toolbar_buttons_" + custombuttons.getNumber(self.id),
    WindowIDs: ["main-window", "messengerWindow", "msgcomposeWindow"],
    ToolbarContexIDs: ["toolbar-context-menu", "aios-toolbar-contextmenu", "aios-sbhtoolbar-contextmenu"],
    Pref: "extensions.custombuttons.MoveToolbarButtons.Id" + custombuttons.getNumber(self.id) + ".MoveButtonID",
    SP: Services.prefs,

    Init: function() {
        if (!(MTB._UID in window)) {
            window[MTB._UID] = {
                Initialized: false
            };
        }

        if (!window[MTB._UID]["Initialized"]) {
            window[MTB._UID]["Initialized"] = true;
            custombuttons.isPref(MTB.Pref, "");

            if ("CustomizableUI" in window) {
                var originalFunction = custombuttons.persistCurrentSets.toString();
                eval("custombuttons.persistCurrentSets=" + originalFunction
                    .replace(", newButtonId)", ", newButtonId, aToRight)")
                    .replace("pos + 1", "aToRight ? pos : pos + 1"));
            }

            if (MTB.MoveButtonMICBContext) {
                var contextPops = document.getElementsByTagName("menupopup");
                let p = 0,
                    pLen = contextPops.length;
                for (; p < pLen; p++) {
                    var cPopID = contextPops[p].id;
                    if (cPopID.substr(0, 26) === "custombuttons-contextpopup") {
                        var cPopEl = document.getElementById(cPopID);
                        var moveMIID = "custombuttons-contextpopup-moveButton" + cPopID.slice(26);
                        var moveMIEl = document.getElementById(moveMIID);
                        if (!moveMIEl)
                            MTB.CreateMoveMI(moveMIID, cPopEl);
                    }
                }
            }

            if (MTB.MoveButtonMITBarContext) {
                Array.prototype.slice.call(MTB.ToolbarContexIDs).forEach(function(aTBCtxID, aIndex) {
                    let Ctx = document.getElementById(aTBCtxID);
                    let tBarCtxMIID = MTB._UID + "moveButton" + aIndex;
                    if (!document.getElementById(tBarCtxMIID)) {
                        if (Ctx) {
                            MTB.CreateMoveMI(tBarCtxMIID, Ctx);
                            Ctx.addEventListener("popupshowing", function(aE) {
                                document.getElementById(tBarCtxMIID).hidden = (document.popupNode.tagName !== "toolbarbutton");
                            }, false);
                        }
                    }
                });
            }

            addDestructor(function(aReason) {
                if (aReason === "delete") {
                    SP.resetUserPrefs(MTB.Pref);
                    delete window[_UID];
                }
                if (aReason === "delete" || aReason === "update") {
                    window[MTB._UID]["Initialized"] = false;
                }
            });
        }
    },

    getPopupNode: function(aEl) {
        if (custombuttons.popupNode)
            return custombuttons.popupNode;
        var popupNode = aEl;
        while (popupNode.tagName.toLowerCase() !== "toolbarbutton") {
            popupNode = popupNode.parentNode;
        }
        return popupNode;
    },

    CreateMoveMI: function(aMItemID, aPopupEl) {
        let moveMIEl = aPopupEl.appendChild(document.createElementNS(xulns, "menuitem"));
        moveMIEl.setAttribute("id", aMItemID);
        moveMIEl.setAttribute("label", "Переместить кнопку...");
        moveMIEl.setAttribute("image", MTB.MoveBtnImage);
        moveMIEl.setAttribute("tooltip", MTB._UID + "moveButtonMI_tooltip");
        moveMIEl.setAttribute("onclick", "document.getElementById(\"" +
            self.id + "\").MoveToolbarButtons.MoveOnClick(event);");
    },

    MoveOnClick: function(aE) {
        var popupNode = MTB.getPopupNode(aE.target);
        if (!popupNode)
            return;
        aE.stopPropagation();
        aE.preventDefault();
        if (aE.button === 0 && !aE.shiftKey && !aE.ctrlKey && !aE.altKey) {
            MTB.SP.setCharPref(MTB.Pref, popupNode.id);
            window.addEventListener('click', MTB.MoveListener, true);
            window.addEventListener('mouseup', MTB.DefaultPrevention, true);
            window.addEventListener('mousedown', MTB.DefaultPrevention, true);
            window.addEventListener('contextmenu', MTB.DefaultPrevention, true);
            MTB.HidePopup(aE.target);
            MTB.ShowMoveAlert && Services.prompt.alert(null, self.name,
                "Now click ANY toolbarbutton element inside ANY toolbar.\n" +
                "Left click will position the button to the left of the target.\n" +
                "Right click will position the button to the right of the target.\n\n" +
                "To cancel the movement, just click ANY element inside the browser that IS NOT a toolbarbutton.\n");
        }
    },

    MoveListener: function(aE) {
        MTB.DefaultPrevention(aE);
        window.removeEventListener('click', MTB.MoveListener, true);
        window.removeEventListener('mouseup', MTB.DefaultPrevention, true);
        window.removeEventListener('mousedown', MTB.DefaultPrevention, true);
        window.removeEventListener('contextmenu', MTB.DefaultPrevention, true);
        var anchor = aE.target;
        if (anchor.tagName !== "toolbarbutton")
            return;
        var toolbar = anchor.parentNode;
        var BtnToMove = document.getElementById(MTB.SP.getCharPref(MTB.Pref));
        if (aE.button === 0 && !aE.shiftKey && !aE.ctrlKey && !aE.altKey)
            toolbar.insertBefore(BtnToMove, anchor);
        else if (aE.button === 2 && !aE.shiftKey && !aE.ctrlKey && !aE.altKey)
            toolbar.insertBefore(BtnToMove, anchor.nextSibling);
        if ("CustomizableUI" in window)
            custombuttons.persistCurrentSets(toolbar.id, anchor.id,
                BtnToMove.id || BtnToMove.getAttribute("id"), !(aE.button === 2));
        else {
            toolbar.setAttribute("currentset", toolbar.currentSet);
            document.persist(toolbar.id, "currentset");
        }
        MTB.SP.setCharPref(MTB.Pref, "");
    },

    DefaultPrevention: function(aE) {
        aE.preventDefault();
        aE.stopImmediatePropagation && aE.stopImmediatePropagation();
        aE.stopPropagation();
    },

    Tooltips: function(aRem) {
        var popSetID = MTB._UID + "popupset";
        var popSetEl = document.getElementById(popSetID);
        if (popSetEl)
            popSetEl.parentNode.removeChild(popSetEl);

        if (aRem)
            return;

        if (!popSetEl) {
            popSetEl = document.createElementNS(xulns, "popupset");
            popSetEl.setAttribute("id", popSetID);
        }

        popSetEl.appendChild(MTB.parseXML("<tooltip xmlns=\"" + xulns + "\" xmlns:html=\"" + xhtmlns +
            "\" id=\"" + MTB._UID + "moveButtonMI_tooltip" + "\">" +
            "<description><html:b>Instructions</html:b> : After clicking this menu item, you can " +
            "click ANY toolbarbutton element inside the application to place the currently " +
            "selected button to the left (with Left click) or to the right (with Right click) " +
            "of the targeted toolbarbutton.</description>" +
            "<separator/>" +
            "<description><html:b>Note</html:b> : It can be ANY toolbarbutton, not just " +
            "other Custom Buttons.</description>" +
            "</tooltip>"));

        setTimeout(function() {
            Array.prototype.slice.call(MTB.WindowIDs).forEach(function(aWinID) {
                let win = document.getElementById(aWinID);
                if (win)
                    !document.getElementById(popSetID) && win.appendChild(popSetEl);
            });
        }, 100);
    },

    parseXML: function(aXML) { // Return parsed XML
        aXML = aXML.replace(/>\s+</g, "><"); // Linearize XML
        return (new DOMParser).parseFromString(aXML, "application/xml").documentElement;
    },

    HidePopup: function(aEl) {
        try {
            aEl.hidePopup();
        } catch (aError) {
            try {
                aEl.parentNode.hidePopup();
            } catch (aError) {
                try {
                    aEl.parentNode.parentNode.hidePopup();
                } catch (aError) {
                    try {
                        aEl.parentNode.parentNode.parentNode.hidePopup();
                    } catch (aError) {}
                }
            }
        }
    }
};

this.MoveToolbarButtons.Init();

difabor
Кнопка FindBar Tweak работает в FF57

Garalf пишет

difaborКнопка FindBar Tweak работает в FF57

Это дополнение. Не работает.
Автор еще год назад сообщил, что функционал FindBar Tweak
невозможно реализовать через web extensions.

Garalf пишет

difabor
Кнопка FindBar Tweak работает в FF57

Так я не спорю на этот счёт. Просто я пока не собираюсь ставить ФФ57 и выше и поэтому не смогу с этим помочь.

Привет. Не знаю, где спросить, поэтому тут пишу. :)
В предыдущих версиях ФФ у меня была такая фишка:
если кликнуть ПКМ по фавиконке в адресной строке,
значок мигал красным, а адрес копировался в буфер.
То ли в CTR была настройка, то ли кнопка какая...
Может, кто вспомнит, где взять или код подскажет?

Ultima2m
я не помню с какой кнопки выдрал этот код, но он работает

Выделить код

Код:

// ... Дополнительные возможности для значка идентификации сайта в строке адреса ...............
addEventListener("click", e=> {
   e.preventDefault();
   e.stopPropagation();
   
   // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
   if ( e.button == 0 )
        BrowserPageInfo(content.document, (gURLBar.value.startsWith("http") ? "permTab" : "generalTab"));
        
   // ПКМ копирует текущий адрес ....     
   if ( e.button == 2 ) { 
        gClipboard.write( content.location );
                 
        // значок идентификации сайта мигает синим ....
        document.getElementById("identity-box").style.background = "blue";
        setTimeout(()=> document.getElementById("identity-box").style.background = "", 1000);
        }
}, true, document.getElementById("identity-icon") );

ну я еще цвет себе на синий поменял

Ultima2m пишет

Привет. Не знаю, где спросить, поэтому тут пишу. :)
В предыдущих версиях ФФ у меня была такая фишка:
если кликнуть ПКМ по фавиконке в адресной строке,

А у меня вообще нет фавиконки в адресной строке ни на одном сайте, только на вкладке. FF-55
Как сделать, чтоб появилась иконка сайта?

sonyas75
Спасибо код работает, только не мигает. И менюшка вылезает, не нужная совсем.
.
ПС. Разобрался. Конфликтует с identitybox_colors.css из CTR.

rubel
Такая же фигня - родные фавиконки заменены на стандартный глобус.
Нужно в CTR посмотреть, может через него, получится исправить.

Ultima2mrubel
Вернуть иконки сайтов в адресной строке от 04.02.2016

вот да - у меня еще и вот эта кнопка с возвратом иконок установлена :)

oleg.sgh пишет

Ultima2mВернуть иконки сайтов в адресной строке от 04.02.2016

Да. Самое то. спасибо.

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

Ultima2m пишет

как запретить выпадение контекстного меню при клике по иконке в адресной строке

Взято из кнопки bunda1 , чуть переделал под себя.

Копир адресс ПКМ по значку идентификации в строке адреса

Выделить код

Код:

// ---05------ Копир адресс ПКМ по значку идентификации сайта в строке адреса ---------------
 (function copyAddrIdentIco() {
     const identBox = document.getElementById("identity-box");

      addEventListener("click", e => {

           switch (e.button) {
                case 0:  // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
                  e.preventDefault();
                  e.stopPropagation();
                var doc = content.document;
                BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "mediaTab" : "generalTab" );
                break;   // generalTab, mediaTab, feedTab, permTab, securityTab

             case 2:  // ПКМ копирует текущий адрес ....     
                identBox.oncontextmenu = function() { return false; }
                if ( e.ctrlKey || e.shiftKey ) {
                      identBox.oncontextmenu = function() { return true; }
                     };

             gClipboard.write(decodeURIComponent( content.location ));
             // значок идентификации сайта мигает красным ....
             document.getElementById("identity-box").setAttribute("style", "background:#0080FF;");
             setTimeout(function() { document.getElementById("identity-box").removeAttribute("style") }, 500);
         }

 } , true, identBox );
 
 })();

mokujin пишет

Взято из кнопки bunda1 , чуть переделал под себя.

Нормально. Только выкинул блок case 0: а то у меня 2 окошка выскакивало.

Ultima2m пишет

Только выкинул блок case 0: а то у меня 2 окошка выскакивало.

а так если :|

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

Выделить код

Код:

// ---05------ Копир адресс ПКМ по значку идентификации сайта в строке адреса ---------------
 (function copyAddrIdentIco() {
     const identBox = document.getElementById("identity-box");
      addEventListener("click", e => {

           switch (e.button) {
                case 0:  // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
                         identBox.onclick = function() { return; }
                         var doc = content.document;
                         BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "mediaTab" : "generalTab" );
                         break;   // generalTab, mediaTab, feedTab, permTab, securityTab

             case 2:  // ПКМ копирует текущий адрес ....     
                identBox.oncontextmenu = function() { return false; }
                if ( e.ctrlKey || e.shiftKey ) {
                      identBox.oncontextmenu = function() { return true; }
                      break;
                     };

             gClipboard.write(decodeURIComponent( content.location ));
             // значок идентификации сайта мигает красным ....
             document.getElementById("identity-box").setAttribute("style", "background:#0080FF;");
             setTimeout(function() { document.getElementById("identity-box").removeAttribute("style") }, 500);
         }
// } , true, document.getElementById("identity-box") );
 } , true, identBox );
 
 })();

Похоже, моя просьба слишком сложная :blush:

Кнопка, добавляющая прогресс-бар в адресной строке (код от Andrey_Krropotkin)

Выделить код

Код:

//Полоса загрузки в адресной строке
 
(function(){
//Location Bar Enhancer5.1;Loading Bar0.3.0
    var cssStr = (function(){/*
            #urlbar {
                background-image: -moz-repeating-linear-gradient(top -45deg, rgba(255,255,255,0), rgba(255,255,255,0) 6px, rgba(255,255,255,0) 6px, rgba(255,255,255,0) 12px), -moz-linear-gradient(left, #33FF66 0%, #33FF66 100%);
                background-size:0 0;
             background-repeat:repeat-x, no-repeat;
           //  transition: background-size 350ms ease 0s !important;
            }
            #urlbar:not([connecting])::after {
                        display:none;
                    }
            @-moz-keyframes progress-bar-stripes {
                from {
                    background-position: 0, 0;
                }
                to {
                    background-position: 51px 0, 0;
                }
            }
    */}).toString().replace(/^.+\s|.+$/,"");
    
    var style = document.createProcessingInstruction("xml-stylesheet", "type=\"text/css\"" + " href=\"data:text/css;base64," + btoa(cssStr) + "\"");
    var mainW = document.getElementById("main-window");
    document.insertBefore(style, mainW);

    function main(window) {
      var {document, gBrowser} = window;
      function $(id) document.getElementById(id);
      var urlbar = $("urlbar");
      let pageProgress = 0;
      let async = makeWindowHelpers(window).async;
      var LoadingBar = {
        listener: {
          onChangeTab: function(e) {
            urlbar.style.backgroundSize = '0% 100%';
            pageProgress = 0;
          },
          
          onProgressChange: function(aBrowser,webProgress,request,curSelfProgress,maxSelfProgress,curTotalProgress,maxTotalProgress) {
            if (gBrowser.contentDocument === aBrowser.contentDocument) {
                var val = (curTotalProgress-1)/(maxTotalProgress-1);
                pageProgress = val;
                urlbar.style.backgroundSize = (100*val) + '% 100%';
                if (val > 0.9)
                  async(function() {
                    if (pageProgress > 0.95)
                        urlbar.style.backgroundSize = '100% 100%';
                }, 1000);
            }
          },
          
          onStateChange: function() {
            if (pageProgress > 0.95){
                async(function() {
                    urlbar.style.backgroundSize = '0% 100%';
                    pageProgress = 0;
                }, 1000);
            }else{
                urlbar.style.backgroundSize = '0% 100%';
            }
          }
        }
      };

      gBrowser.tabContainer.addEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
      gBrowser.addTabsProgressListener(LoadingBar.listener);

      unload(function() {
        gBrowser.tabContainer.removeEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);

        gBrowser.removeTabsProgressListener(LoadingBar.listener);
      }, window);
    }

    watchWindows(main, "navigator:browser");

    function runOnLoad(window, callback, winType) {
      window.addEventListener("load", function() {
        window.removeEventListener("load", arguments.callee, false);

        if (window.document.documentElement.getAttribute("windowtype") == winType)
          callback(window);
      }, false);
    }

    function runOnWindows(callback, winType) {
      function watcher(window) {
        try {
          callback(window);
        }
        catch(ex) {}
      }

      let browserWindows = Services.wm.getEnumerator(winType);
      while (browserWindows.hasMoreElements()) {
        let browserWindow = browserWindows.getNext();
        if (browserWindow.document.readyState == "complete")
          watcher(browserWindow);
        else
          runOnLoad(browserWindow, watcher, winType);
      }
    }

    function watchWindows(callback, winType) {
      function watcher(window) {
        try {
          callback(window);
        }
        catch(ex) {}
      }

      runOnWindows(callback, winType);

      function windowWatcher(subject, topic) {
        if (topic == "domwindowopened")
          runOnLoad(subject, watcher, winType);
      }
      Services.ww.registerNotification(windowWatcher);

      unload(function() Services.ww.unregisterNotification(windowWatcher));
    }

    function unload(callback, container) {
      let unloaders = unload.unloaders;
      if (unloaders == null)
        unloaders = unload.unloaders = [];

      if (callback == null) {
        unloaders.slice().forEach(function(unloader) unloader());
        unloaders.length = 0;
        return null;
      }

      if (container != null) {
        container.addEventListener("unload", removeUnloader, false);

        let origCallback = callback;
        callback = function() {
          container.removeEventListener("unload", removeUnloader, false);
          origCallback();
        }
      }

      function unloader() {
        try {
          callback();
        }
        catch(ex) {}
      }
      unloaders.push(unloader);


    function removeUnloader() {
        let index = unloaders.indexOf(unloader);
        if (index != -1)
          unloaders.splice(index, 1);
      }
      return removeUnloader;
    }
    
    function makeWindowHelpers(window) {
      let {clearTimeout, setTimeout} = window;

      function async(callback, delay) {
        delay = delay || 0;
        let timer = setTimeout(function() {
          stopTimer();
          callback();
        }, delay);

        function stopTimer() {
          if (timer == null)
            return;
          clearTimeout(timer);
          timer = null;
        }
      }

      return {
        async: async,
      };
    }

})();


Можно ли правую сторону прогресс-бара скруглить? Помогите, пожалуйста. Спасибо :)

и как вы представляете скруглить фон?

okkamas_knife пишет

и как вы представляете скруглить фон?

Точно так же, как это было в расширении Status-4-Evar. Правда, скругление там было фиксированное и не настраивалось

Viatcheslav пишет

Можно ли правую сторону прогресс-бара скруглить?

Прогресс-бар занимает же всю строку урла. Вы хотите,  скруглить правую часть урла?

Coroner пишет

Вы хотите,  скруглить правую часть урла?

Не урла, а прогресс-бара

Coroner пишет

Прогресс-бар занимает же всю строку урла

Он перемещается от нуля до максимума, левая сторона неподвижна

mokujin пишет

а так если :|

OK. :)

Viatcheslav пишет

Он перемещается от нуля до максимума, левая сторона неподвижна

Никто никуда не перемещается. Закрашивается urlbar, котрый Вы называете "прогресс-баром"

Выделить код

Код:

#urlbar {
  background-image: ...

Скруглить урлбар можно попробовать.

Coroner пишет
Viatcheslav пишет

Он перемещается от нуля до максимума, левая сторона неподвижна

Никто никуда не перемещается. Закрашивается urlbar, котрый Вы называете "прогресс-баром"

Выделить код

Код:

#urlbar {
  background-image: ...

Скруглить урлбар можно попробовать.

В CTR, в Custom CSS code:

Выделить код

Код:

#urlbar { border-radius: 0px 9px 9px 0px !important;}

С величиной радиуса можно "поиграться".

Coroner пишет

Никто никуда не перемещается. Закрашивается urlbar

Хорошо, пусть будет так

Coroner пишет

Скруглить урлбар можно попробовать

Он у меня и так скруглён комплектом стилей от Aris-T2 - CustomCSSforFx - Custom CSS tweaks for Firefox 57+

difabor пишет

В CTR, в Custom CSS code c величиной радиуса можно "поиграться"

Спасибо, но ожидаемого эффекта - скругление краёв закрашиваемого фона - это не даёт. Я, возможно, что-то неправильно понимаю :blush:

Viatcheslav пишет

Спасибо, но ожидаемого эффекта - скругление краёв закрашиваемого фона - это не даёт. Я, возможно, что-то неправильно понимаю

Попробовал. Выходит когда как.

скрытый текст
kwfjfqqrsshu4zwwyagto1rrtjk.gif

Возможно если сайты грузились бы медленнее — всегда доходило бы до конца.

31-12-2017 14:28:25
Скругление с помощью CTR не включал. Воспользовался кодом от difabor

Старожилы подскажите пожалуйста, как совместить
Как отключить проверку цифровых подписей в дополнениях Firefox | Форум Mozilla Россия и
‭userChrome.js/userChrome at master · Endor8/userChrome.js · GitHub
Я допустим делаю такие манипуляции:
1. Переименовываю  второй config.js как config1.js
2. В config-prefs.js пишу:
pref("general.config.obscure_value", 0);
pref("general.config.filename", "config.js");
pref("general.config.filename", "config1.js");
В результате Firefox 57 не хочет поддерживать  старые или неподписаные расширения (Причем это проявляется не сразу)
Что я делаю неправильно?
Или они может просто не совместимы?

Viatcheslav пишет: но ожидаемого эффекта - скругление краёв закрашиваемого фона - это не даёт

читать документацию по css никто не хочет. да.

Andrey_Krropotkin
config1.js не нужен Вам. В один всё пиши́те (и отключение подписей, и параметры для about:config (и прочее, если ещё не отломали).

okkamas_knife пишет

читать документацию по css никто не хочет. да.

Не ворчи))) и да покарает меня модер за офтопп.
Оно и есть, да?

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

okkamas_knife пишет

что непонятно?

Непонятно то, что у меня на гифке всё закрашивается. Наглядно видно.
Читать доки по CSS, если в нём ни хрена не понимаешь — бесполезно.
Вопрос лишь один — у товарища не закрашивается, у меня закрашивается. Подскажи, если знаешь и хватит ворчать. :)

да закрашивается у него всё. ему подавай чтоб у этой заливки скругление было.
чтоб вот та граница заливки что перемещается не прямая была а скруглённая.

okkamas_knife пишет

читать документацию по css никто не хочет. да.

Может, Вы ещё и разработчиков дополнений [firefox] будете учить возможностям CSS? Так я и адресок могу дать - SparkyBluefang (создатель Status-4-Evar)
Ниже - скриншоты работы дополнения Status-4-Evar на [firefox] 51.0.1. okkamas_knife, рассмотрите их хорошенько (можете лупой воспользоваться, если нужно) - углы правой стороны закрашиваемого фона скруглены

скрытый текст
20010301.gif

20010302.png

okkamas_knife пишет

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

Вы таки губите в себе талант писателя-сказочника ;)

okkamas_knife пишет

да закрашивается у него всё. ему подавай чтоб у этой заливки скругление было.

Насчёт "закрашивается" - всё верно, только не "подавай", а "помогите, пожалуйста, если можно"
Всем СПАСИБО за участие и помощь. С Новым Годом и Рождеством! :)

почему сам то не сделаешь как в том дополнении?
если это цсс то кто мешает посмотреть какие стили у того элемента и тупо применить к фону в кнопке? тупой копипаст же.

только если конечно там это стилем сделано. ога.
и ещё намекну - как думаешь еслиб там было через стили то неужели бы скругление не настраивалось?

ну и если случится чудо то поделись потом свойством цсс которое скругляет фон , сделай шах и мат!

Как выделенный текст послать в портабельный QTranslate?
Нашел такое сообщение https://forum.mozilla-russia.org/viewto … 57#p717757 но не нашел то сообщение, на которое оно ссылается
и не монятно что требовалось и что нужно сделать по совету Dumby

momo2000 пишет

не монятно

Ну, там же, по ссылке, написано: «js-ctypes to send keys winapi».
То есть код делает так, как если бы было дважды нажато Ctrl
А QTranslate это отслеживает

Справка QTranslate пишет

Системные горячие клавиши (по умолчанию):
Double Ctrl => Показать главное окно программы (с переводом, если есть выделенный текст)

Сподобился проверить в такой конфигурции

скрытый текст
VMware® Workstation 11.0.0 build-2305329
Windows 10 Pro 10.0.10240 x64
Firefox Nightly 59.0a1 (2018-01-03) (32-бит), e10s включён
Custom Buttons 0.0.5.8.9.6pre
QTranslate 6.4.0

Работает. Окно QTranslate появляется, и выделенный текст в нём есть.

momo2000
а чего его посылать, QTranslate сам все умеет забирать отовсюду: два раза CTRL жмакни и будет тебе перевод.

mokujin
а чего его посылать, QTranslate сам все умеет забирать отовсюду: два раза CTRL жмакни и будет тебе перевод.
Он у меня закрыт, когда нужен перевод я его открываю и копипастю(
Есть кнопка на тулбаре

var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
file.initWithPath('D:\\DRIVE\\PORTABLE\\QTranslate\\QTranslate.exe');
file.launch();


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

momo2000 пишет

походу морока, тогда черт с ней.

да, вроде, не морока ниразу :)  Dumby всё дал, осталось собрать воедино и запустить:
Код

Запустить QTranslate и жмакнуть(программно) дважды CTRL(код Dumby)

Выделить код

Код:

/* CODE */
// Запустить QTranslate и жмакнуть(программно) дважды CTRL(код Dumby)
// - стандартн. комбин. для захвата текста из окна в QTranslate.
// интервал можно увеличить или уменьшить, зависит от железа
 setTimeout(function() dblCtrlSend(), 2000);

 quickTranslate();

// ----------------------------------- =  QuickTranslate  = ----------------------------------------------
   function quickTranslate() {
//  скопировать выделенный текст в буфер. 
//           gClipboard.write(document.commandDispatcher.focusedWindow.getSelection().toString());
     var profile = Services.dirsvc.get('ProfD', Ci.nsIFile);
     profile.initWithPath(profile.path + "\\Soft\\QTranslate\\QTranslate.exe");
      var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
      var arg = [];
   process.init(profile);
   process.run(false, [arg], 1);
//   setTimeout(function() window.content.focus(), 500);
   };


function dblCtrlSend() {

// See https://gist.github.com/Noitidart/0de3be2442a0295eb386
// vk codes: https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx

// Double Ctrl [Ctrl-Down, Ctrl-Up, Ctrl-Down, Ctrl-Up]
var data = [[0x11, false], [0x11, true], [0x11, false], [0x11, true]];

// Ctrl+Q [Ctrl-Down, Q-Down, Q-Up, Ctrl-Up]
//var data = [[0x11, false], [0x51, false], [0x51, true], [0x11, true]];

var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm", {});
var KEYBDINPUT = ctypes.StructType("tagKEYBDINPUT", [
    {wVk: ctypes.unsigned_short},
    {wScan: ctypes.unsigned_short},
    {dwFlags: ctypes.unsigned_long},
    {time: ctypes.unsigned_long},
    {dwExtraInfo: ctypes.voidptr_t.size == 8 ? ctypes.uint64_t : ctypes.unsigned_long},
    {padding0: ctypes.uint8_t.array(8)}
]);
var INPUT = ctypes.StructType("tagINPUT", [{type: ctypes.unsigned_long}, {ki: KEYBDINPUT}]);
var pInputs = INPUT.array()(data.map(([vkCode, keyup]) => 
    INPUT(1, KEYBDINPUT(vkCode, 0, keyup ? 2 : 0, 0, 0, ctypes.uint8_t.array(8)()))
));
var user32 = ctypes.open("user32"); try {
    var SendInput = user32.declare("SendInput", ctypes.winapi_abi, ctypes.unsigned_int, ctypes.unsigned_int, INPUT.ptr, ctypes.int);
    SendInput(pInputs.length, pInputs, INPUT.size);
 } finally {
    user32.close();
 }
};

05-01-2018 16:55:48
зы. в твоем случае измени ф-цию  function quickTranslate() {.... } на свой путь... хотя каки боком там тогда portable будет ?! Отталкиваться ж нужно от относительных путей , но как хочешь.

Выделить код

Код:

// змени моё тело на своё
 function quickTranslate() {
 
  var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
  file.initWithPath('D:\\DRIVE\\PORTABLE\\QTranslate\\QTranslate.exe');
  file.launch();

 }

mokujin
Не работает. Окно QTranslate появляется, а выделенный текст в него не попадает. Пробовал на FF 57 и FF 52.

Garalf пишет

Не работает. Окно QTranslate появляется, а выделенный текст в него не попадает. Пробовал на FF 57 и FF 52.

все работает. У мя и в PM и в FF 57.3 (расш-е CB отседава взято да прибудет с Infocatcher сила! ) эта кнопка делает то что и задумано - запускает QTranslate и выделенный текст вставляеццо, сразу переводиццо. См. ошибки в консоли у себя.
Может тебе нужно увеличить\уменьшить ожидание, поставь 3 секунды  setTimeout(function() dblCtrlSend(), 3000); или наоборот 1 (1000)

Кнопка никак не предназначена для постоянного использования(жмаканья при выделении взамен нажатия ctrl )! Т.е. весь эффект только на один раз, для сафсем ленивых: программа не запущена - запускаем и жмакаем(программно через 2 сек.) дважды CTRL. Дальше жмакать CTRL можно и нужно ручками. Никаких проверок и условий тут нет. Они и не нужны, QT сам прекрасно отовсюду забирает текст.

а куда подевалось в 57-й  getBrowserSelection(); :angry:  или только у меня глючит?

mokujin пишет

или только у меня

Нет, не только у тебя.

mokujin
Ситуацию разрешил кардинально - заменил QTranslate)).
Спасибо! Все работает...

Dumby пишет

Нет, не только у тебя.

Какой-то абсурд, кароче.
Благодарю.
прост, если добавить проверку на выделение, перед запуском(дабы окно не вылазило ежли ничего не выделено ) и в PM все норм.

Выделить код

Код:

if(getBrowserSelection()) {
       setTimeout(function() dblCtrlSend(), 2000);
       return;
       };
       
 quickTranslate();
........

а в 57-й знач надо добавить еще и эту ф-цию (замену я пока не нашел\не понял как)

Выделить код

Код:

if(getBrowserSelection()) {
       setTimeout(function() dblCtrlSend(), 2000);
       return;
       };
       
 quickTranslate();

// выпиленная в 57-й ф-ция, вернуть её взад и заюзать в кнопке.
function getBrowserSelection(aCharLen) {
    let focusedElement = document.activeElement;
  if (focusedElement && focusedElement.localName == "browser" &&
      focusedElement.isRemoteBrowser) {
    throw "getBrowserSelection doesn't support child process windows";
    }

    return BrowserUtils.getSelectionDetails(window, aCharLen).text;
 }
...........

Dumby Вы когда-то делали кнопку консоль браузера в боковой панели и в новой вкладке для разных версий. Для 57 не посмотрите? Или хотя бы попроще - прикрепить окно снизу или сбоку как у вебконсоли?

Andrey_Krropotkin пишет

Dumby Вы когда-то делали кнопку консоль браузера в боковой панели и в новой вкладке для разных версий. Для 57 не посмотрите?

OK, попробую

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

Выделить код

Код:

({
    title: "Консоль браузера",
    icon: "chrome://devtools/skin/images/tool-webconsole.svg",
    url: "chrome://devtools/content/webconsole/webconsole.xul",
    init() {
        var trg = document.getElementById("browser");
        trg && addEventListener("DOMContentLoaded", this, false, trg);
        var attrs = {
            sidebartitle: this.title, sidebarurl: this.url,
            type: "checkbox", group: "sidebar", checked:
                SidebarUI.isOpen && SidebarUI.browser.getAttribute("src") == this.url
        };
        var broadcaster = this.element("broadcaster", Object.assign({
            id: "viewBrowserConsoleSidebar"
        }, attrs), document.getElementById("mainBroadcasterSet"));

        Object.assign(attrs, {
            autoCheck: "false", label: this.title, observes: broadcaster.id,
            oncommand: `SidebarUI.toggle("${broadcaster.id}");`
        });
        var btn = this.element("toolbarbutton", Object.assign({
            id: "sidebar-switcher-browserconsole",
            class: "subviewbutton subviewbutton-iconic"
        }, attrs));
        this.element("observes", {element: broadcaster.id, attribute: "checked"}, btn);
        document.querySelector("#sidebarMenu-popup > toolbarseparator").before(btn);

        var menuitem = this.element("menuitem", Object.assign({
            id: "menu_browserConsoleSidebar"
        }, attrs), document.getElementById("viewSidebarMenu"));

        var css = `\
            #${btn.id} > .toolbarbutton-icon,
            #sidebar-box[sidebarcommand="${broadcaster.id}"] > #sidebar-header > #sidebar-switcher-target > #sidebar-icon {
                list-style-image: url(${this.icon});
                -moz-context-properties: fill;
                fill: currentColor;
                opacity: 0.8;
            }
            #TabsToolbar[brighttext] .tabbrowser-tab:not([visuallyselected=true]) .tab-icon-image[src="${this.icon}"] {
                filter: url("chrome://devtools/skin/images/filters.svg#icon-normal-dark");
            }`;
        var dwu = QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
        var str = "data:text/css," + encodeURIComponent(css), type = dwu.AGENT_SHEET;
        dwu.loadSheetUsingURIString(str, type);

        addDestructor(() => {
            for(var node of [broadcaster, btn, menuitem]) node.remove();
            dwu.removeSheetUsingURIString(str, type);
        });
        self.onclick = e => {
            if (e.button == 2) return;
            if (!e.button) return SidebarUI.toggle(broadcaster.id);
            var st = gBrowser.selectedTab, tab;
            if (!e.ctrlKey) tab = gBrowser.visibleTabs.find(
                tab => tab.linkedBrowser.currentURI.spec == this.url
            );
            if (tab == st) return;
            if (!tab) tab = gBrowser.addTab(this.url);
            gBrowser.moveTabTo(tab, st._tPos + 1);
            gBrowser.selectedTab = tab;
        }
        if (gBrowser.currentURI.spec == this.url) {
            var doc = gBrowser.selectedBrowser.contentDocument;
            if (!doc.querySelector("link")) this.handleEvent({target: doc});
        }
    },
    handleEvent({target: doc}) {
        if (!doc || Cu.isCrossProcessWrapper(doc)) return;
        var win = doc.defaultView, url = doc.documentURI;
        var inTab = !String(win).includes("ChromeWindow");
        if (url == this.url) {
            if (inTab) {
                var link = doc.createElementNS(xhtmlns, "link");
                link.setAttribute("rel", "shortcut icon");
                link.setAttribute("href", this.icon);
                doc.documentElement.firstChild.before(link);
            }
            this.loader.Services.ww.wins.push(win);
            new this.loader.HUD_SERVICE().toggleBrowserConsole().then(bc => {
                if (!inTab) return;

                var dummy = {close() {}};
                var parent = this.inIDOMUtils.getParentForNode(doc, true);
                if (parent && parent.id == "web-panels-browser") {
                    SidebarUI._title.value = this.title;
                    SidebarUI._icon.src = this.icon;
                    dummy.close = () => SidebarUI._icon.removeAttribute("src");
                }
                win.onbeforeunload = () => {bc.chromeWindow = dummy;}
            }, Cu.reportError);
        } else if (
            inTab && url == "chrome://devtools/content/shared/widgets/VariablesView.xul"
        ) {
            var iframe = win.frameElement;
            if (!iframe || iframe.ownerDocument.documentURI != this.url) return;

            var listener = Services.els.getListenerInfoFor(iframe)
                .find(obj => obj.type == "load").listenerObject;
            iframe.removeEventListener("load", listener, true);
            win.addEventListener("load", () => listener({target: doc}), {once: true});
        }
    },
    get loader() {
        delete this.loader;
        var id = _id + "-browser-console";
        var url = "resource://devtools/shared/Loader.jsm?" + id;
        var loader = {exports: {}}, nsvo = Cu.import(url, loader);
        addDestructor(reason => reason[5] == "e" && Cu.unload(url));

        if (id in nsvo) return this.loader = nsvo[id];

        Services.scriptloader.loadSubScript("resource://devtools/client/webconsole/hudservice.js", loader);
        var e = new CustomEvent("DOMContentLoaded", {bubbles: false}), ww = loader.Services.ww;
        loader.Services.ww = Cu.getGlobalForObject(nsvo).Object.create(ww, {
            wins: {value: []},
            openWindow: {value: function() {
                var win = this.wins.shift();
                setTimeout(() => win.dispatchEvent(e), 0);
                return win;
            }}
        });
        Services.obs.removeObserver(loader.gDevToolsBrowser, "browser-delayed-startup-finished");
        var func = nsvo.require("devtools/client/framework/browser-menus").removeMenus;
        for(var win of CustomizableUI.windows) func(win.document);
        return this.loader = nsvo[id] = loader;
    },
    element(name, attrs, parent) {
        var node = document.createElement(name);
        for(var attr in attrs) node.setAttribute(attr, attrs[attr]);
        if (parent) parent.appendChild(node);
        return node;
    },
    get inIDOMUtils() {
        delete this.inIDOMUtils;
        return this.inIDOMUtils = "inIDOMUtils" in Ci
            ? Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils)
            : InspectorUtils;
    }
}).init();

Dumby спасибо, все отлично работает на 57 версии

Может подскажет кто, с кнопкой для PaleMoon
Сделал чтоб быстро копировать адреса RSS из значка в урл.строке(в PM он есть). Одно что хотел сделал, а вот другое немогу...

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

Выделить код

Код:

// ---------------- Копировать адресс RSS ленты в адр. строке по ПКМ ----------------------------------
 (function copyRSSadr() {
     addEventListener("mousedown", e => {
           var rssadr = e.target.getAttribute('feed');
       switch (e.button) {
          case 2:
            if (rssadr) {
                e.target.oncontextmenu = function() { return false; };
                   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
                   gClipboard.write(rssadr);
                   alertsService.showAlertNotification(gBrowser.mCurrentTab.image, rssadr, "Адресс RSS-ленты скопирован", false, "", null, ""); 
// тут должно быть действие для случая когда  !rssadr - т.е. несколько лент на сайте и надо открыть меню, которое откр-ся по левому клику 
                 break;
               }
         }
      }, false, document.getElementById("ub-feed-button"), document.getElementById("ub-feed-menu"));
  })();


...там сделано по-дураццки КМК: значек один-и-тот же id имеет, но иногда это меню - если на сайте больше одного источника RSS
а когда один источник - это иконка с адресом(в доп.свойствах). Свои действия посадил на ПКМ и норм. копируется адресс RSS . Теперь бы доделать , чтоб по томуже ПКМ, когда else (!rssadr) - открыть список лент.
Ежли кто знает, подскажите как.

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

а в том и моя печаль-беда, что это ничего не изменит ;)  там всегда там всегда type = menu. яж грю, по дурацки сделано. Вот, на этом форуме три источнека
3e9d26720721753.jpg
а на хабре один и он виден сразу в тутлипе
fc649e720721813.jpg
... но в любом случае, я не знаю как открыть то меню, что открывается левый кликом - я хочу открыть правым кликом мыши.
буду ковырять еще, есть подозрение что так просто его нельзя вызвать и надо будет полностью строить самому(на примере исходного кода)

могу предложить такой костыль
1 проверь что меняется в свойствах\атрибутах кнопки когда есть рсс и нет (да она скрывается но в дом дереве по идее должна оставаться)
2 пилишь свою кнопку помещая её туда а родную прячешь стилем (любым подходящим вариантом хоть просто уменьшая до пикселя)
3 в своей кнопке
а) детектишь показ родной и при показе показываешь свою
б) рсс адреса вытаскивешь сам из страницы (по <link rel="alternate" type="application/rss+xml"  )
в) назначаешь на кнопки мыши свои действия как захочешь

скрытый текст
вот тебе заготовка ессно переделай исправив ид
кинь в инициализацию
лкм даст алерт скм стандартное меню св копки пкм откоет меню с рсс

Выделить код

Код:

var btn = this;
this.onclick = function(event) {

if(event.button == 0){
alert("ЛКМ"); // Действие при клике ЛКМ
}
    

else if(event.button == 1) {
// Действие при клике СКМ 
gShowPopup(this); // Показываем контекстное меню кнопки
}
   

else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
// Действие при клике ПКМ без модификаторов 
var ps = document.getElementById("feedsPopup"); // ищи нужный попап в mainPopupSet
ps.openPopup(btn)



}
 };

// Блокируем контекстное меню при клике ПКМ без модификаторов..............
this.oncontextmenu = function(event) {
    if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        event.preventDefault();
        event.stopPropagation();
    }
};

okkamas_knife  :rock:
ну вот, опять чувствую себя дебилом... :lol:   Конечно, благодарю!
Получилась кнопка как хотел, вот такая:
Для PaleMoon (или старых версий FF или др. бравзеров где есть икона RSS в адр. строке) копировать адреса найденых RSS лент по ПКМ.

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

Выделить код

Код:

// ---------------- Скопировать адресс RSS ленты в адр. строке ПКМ или откроется меню с лентами и там тоже ПКМ копирует адрес ----------------------------------
 (function() {
     addEventListener("mousedown", e => {
           var rssadr = e.target.getAttribute('feed');
       switch (e.button) {
          case 2:
          e.target.oncontextmenu = function() { return false; };
            if (rssadr) {
                   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
                   gClipboard.write(rssadr);
                   alertsService.showAlertNotification(gBrowser.mCurrentTab.image, rssadr, "Адресс RSS-ленты скопирован", false, "", null, "5000"); 
            } else {
                    var ps = document.getElementById("ub-feed-menu"); // так просто, а я ковырялся несколько дней и безтолку.
                    ps.showPopup( -1, -1, "popup", "bottomleft", "topleft"); // в других случаях может нужно openPopup()
                    break;
                    };
         }
      }, false, document.getElementById("ub-feed-button"), document.getElementById("ub-feed-menu"));
  })();


... я уже пол исходника(этой ф-ции что создает меню из omni.ja ) в кнопку скопировал, постоянно ошибки всякие.
Благодарю.

Заинтересовала кнопка GrabScroll (Firefox24+) от 24.04.2016. С тех пор, наверное, чего-то поменялось, и кнопочка не фурычит. Прокрутка не работает ни правой, ни левой кнопкой (менял в настройках), двойное нажатие ПКМ не вызывает меню СВ. Думал, конфликтует с установленным Yet Another Smooth Scrolling (хочу попробовать кнопку как альтернативу этому расширению) - отключал, ничего не меняется. bunda1, если можно - поправьте, пожалуйста. Спасибо ;)

Кнопка "увеличить изображение" аж 2014г. Работает,но не с мультипроцессом...FF58 - можно и выкл. мульти, так с запуском тормоза. Кнопку саму нельзя рихтануть?
Жалко.Уделал эту 58 , а только эту кнопку - никак....

Dumby насчет кнопки - консоль браузера в боковой панели и в новой вкладке.
Вы бы не могли посмотреть такой нюанс -после нажатия кнопки и закрытия консоли в любом меню в пункте "Веб - разработка" удваивается количество пунктов начиная  от Панели разработчика до Других инструментов. Или может это только у меня ? Хотя это не критично.
И еще просьба добавить   по любой другой кнопке - в bottom panel.

Viatcheslav пишет

Заинтересовала кнопка GrabScroll (Firefox24+) от 24.04.2016. С тех пор, наверное, чего-то поменялось, и кнопочка не фурычит. Прокрутка не работает ни правой, ни левой кнопкой (менял в настройках), двойное нажатие ПКМ не вызывает меню СВ.

Странно но у меня работает. Двойное нажатие ПКМ не вызывает меню СВ, потому что в Сustom Buttons что-то сломано и иеперь в всех кнопках меню нельзя вызвать двойным нажатием ПКМ. А многопроцессный режим у тебя включен?

bunda1 пишет

А многопроцессный режим у тебя включен?

Да, включен. А как должно быть?

Viatcheslav пишет

Да, включен. А как должно быть?

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

bunda1 пишет

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

Спасибо за ответ. Надеюсь, что ключевое слово - "пока" ;)

Viatcheslav
ScrollAnywhere – Add-ons for Firefox
Drag To Scroll – Add-ons for Firefox
Если что. . .

Вопрос! можно ли менять кнопкой путь? Пример:

network.proxy.autoconfig_url строка  file:///D:/Proxy.pac
                                                            file:///C:/Proxy.pac

drage2

Выделить код

Код:

var path1 = 'file:///D:/Proxy.pac'
var path2 = 'file:///C:/Proxy.pac';
var s = 'network.proxy.autoconfig_url';

this._handleClick =()=> {
   var path = getPath() == path1 ? path2 : path1; 
   cbu.setPrefs(s, convertFromUnicode("UTF-8", path));
};

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();
};

function getPath() {     
   try { return Services.prefs.getComplexValue(s, Ci.nsISupportsString).data } 
   catch(e) { return path1 };
};

function toggleImage() { 
   var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
   icon.src = getPath() == path1  
   ? self.image 
   : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC';
};
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage));

О, спасибо ;) Мне казалось, что кроме Yet Another Smooth Scrolling ничего достойного нет

так же можно эту кнопку заюзать  №148
----
Нашел отличную кнопку, но как обычно и бывает, она на половину хороша :D делает то, но не там. TabSelect переключает вкладки. Попробовал этот кусок кода
посадить на клик по вкладке(из других примеров в теме [CB]Tab Clicking Options но никак.
Сама кнопка такая, отдельная на панель. Запишу тут, ибо сайт чета не открываеццо:

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

Выделить код

Код:

"use strict"

this.onclick = function(e) {
  switch (e.button) {
    case 0:
      var tabs = gBrowser.visibleTabs || gBrowser.tabs,
          recentlyUsedTabs = Array.sort(tabs, function(tab1, tab2) { return tab2.lastAccessed - tab1.lastAccessed }),
          tab = tabs[recentlyUsedTabs.indexOf(gBrowser.selectedTab) + 1] || null;
      if (tab) gBrowser.selectedTab = tab;
      break;
    case 1:
      var tabs = gBrowser.tabContainer.childNodes;
      for (var i = 0, cnt = 0; i < tabs.length; i++) if (tabs[i].hasAttribute("pinned")) cnt++;
      gBrowser.selectedTab = tabs[cnt];
      break;
    case 2:
      if (e.shiftKey || e.ctrlKey) {
        this.oncontextmenu = function() { return true; }
        return;
      }
      this.oncontextmenu = function() { return false; }
      var tabs = gBrowser.tabContainer.childNodes,
          last = tabs.length - 1;
      gBrowser.selectedTab = tabs[last];
  }
  var sTab = gBrowser.selectedTab;
  sTab.scrollIntoView(true);
}

this.tooltipText = this.label + "\n\
 \u2022 Left-click > Last Selected Tab\n\
 \u2022 Middle-click > First Unpinned Tab\n\
 \u2022 Right-click > Last Tab\n\
 \u2022 Shift/Ctrl + Right-click > Context Menu";
 
// Button Name: Tab Select
// Created: Feb 8, 2017
// Updated: July 24, 2017 shift or ctrl + right-click for custombuttons-contextpopup
// Author: Sonny aka srazzano
// Homepage: http://custombuttons.sourceforge.net/forum/viewtopic.php?f=4&t=6420
// Description: See homepage
// Support: srazzano@gmail.com


Взял оттудава только то что проблемное, то что по ЛКМ хочу чтоб было на вкладке:
скрытый текст

Выделить код

Код:

// Клик по активной вкладке - переход на предыд. посещенную... неробит
this.onDestroy = function() {
    removeEventListener("click", TabSwitch, false, gBrowser.mTabContainer);
};

  function TabSwitch(e) {

       switch (e.button) {
            case 0:

             var tabs = gBrowser.visibleTabs || gBrowser.tabs,
             recentlyUsedTabs = Array.sort(tabs, function(tab1, tab2) { return tab2.lastAccessed - tab1.lastAccessed }),
             tab = tabs[recentlyUsedTabs.indexOf(gBrowser.selectedTab) + 1] || null;
              if (e.target == gBrowser.mCurrentTab ) gBrowser.selectedTab = tab; 

            break;
           }

   };
   
   addEventListener("click", TabSwitch, false, gBrowser.mTabContainer);


на активной вкладке как и надо - переключается на предыд. посещенную, - но нельзя выбрать вкладку, срабатывает этот код опять . ЕЯПП , то в момент выбора она мгновенно становится тоже  mCurrentTab и код опять на ней срабатывает еще раз.
если событие поменять на mousedown, не лучше... выбрать тогда нельзя вкладки. :sick:
Помогите знатоки!

bunda1
Ти си краљ дугмади! (Король кнопок)
Жаль в 58 не работает...мульти. выкл. CB 7pre

mokujin пишет

Помогите знатоки!

onDestroy там совсем лишний. И я не понял что ты хочешь добится?

клик по активной вкладке - переход на пред. активную. Создатель кнопки написал этот код, который вычисляет пред.активную вкладку и переходит на нее, но сделал это в кнопке. А я хочу это все чтоб было на активной вкладке.
в оригинале это отдельная кнопка на которую надо жмакать, а я хочу повесить это на вкладку(активную) чтоб клик (LeftMouseClick) по активной(выбранной) вкладке делал тоже самое что и кнопка. CTRL+TAB, TabFlipping или как там еще это назвать можно... из Оперы поведение. Чел сделал, но не так как хотелось :)

mokujin пишет

клик по активной вкладке - переход на пред. активную. Создатель кнопки написал этот код, который вычисляет пред.активную вкладку и переходит на нее, но сделал это в кнопке. А я хочу это все чтоб было на активной вкладке.

А если переделать Активировать вкладку наведением курсора немного над вкладкой или:

Выделить код

Код:

// ЛКМ + ПКМ на текущий таб, переместить таб в новую группу, от 06.12.2014. ................................
function moveTabToNewGroup(e) {     

   if ( e.button == 2 && this.leftButtonDown ) {
               
        // временно блокируем контекстное меню вкладки
        addEventListener("popupshowing", function f(e) {
           e.preventDefault();        
           removeEventListener( e.type, f );
        });           
        
        // переместить текущий таб в новую группу
        setTimeout(function() { 
           var tab = e.target;
           if ( gBrowser.visibleTabs.length == 1 ) return; 
           TabView.moveTabTo( tab, null );
           window.gBrowser.selectedTab = tab;
        }, 50 );
        }
   
   if ( e.button == 0 ) {
        this.leftButtonDown = true;
        
        // сбросить переменную и обработчики       
        function c(e) { 
           this.leftButtonDown = false;
           removeEventListener( e.type, c );
        };
        addEventListener("mouseup", c );
        addEventListener("mousemove", c );
        }       
};
addEventListener("mousedown", moveTabToNewGroup, true, gBrowser.tabContainer);

или:

Выделить код

Код:

// Двойной левый клик на табе закрывает страницу, двойной правый имитирует нажатие на звёздочку в адресной строке ..................
function closeAddBookTab(e) {
   if ( e.target.localName != "tab" ) return;
        e.preventDefault();
        e.stopPropagation();
   
   if ( e.button == 0 ) { gBrowser.removeCurrentTab() };   
    
   if ( e.button == 2 ) {
        PlacesCommandHook.bookmarkPage( e.target.linkedBrowser, undefined, true );
        setTimeout(function() document.getElementById("tabContextMenu").hidePopup(), 0);

        var panel = document.getElementById("editBookmarkPanel");
        addEventListener("popupshown", function() {
            removeEventListener("popupshown", arguments.callee, true, panel );
            
            panel.moveTo( e.screenX, e.screenY ); // переместить рядом с вкладкой
            document.getElementById('editBMPanel_foldersExpander').click(); // показать все папки закладок
        }, true, panel );
    }     
};
addEventListener("dblclick", closeAddBookTab, false, gBrowser.mTabContainer);

19-01-2018 19:21:49
или:

Выделить код

Код:

// Настройка длинного клика мыши для вкладки ..............
addEventListener("mousedown", e=> {
   var targ = e.target;
   if ( e.button || targ.localName !== "tab" ) return;
       
   targ.onclick =()=> clearTimeout(targ.timer);
     
   targ.timer = setTimeout(()=> {
      gBrowser.removeTabsToTheEndFrom(gBrowser.mCurrentTab);
   }, 450);
       
}, true, gBrowser.mTabContainer);
mokujin пишет

клик по активной вкладке - переход на пред. активную. Создатель кнопки написал этот код, который вычисляет пред.активную вкладку и переходит на нее, но сделал это в кнопке. А я хочу это все чтоб было на активной вкладке.в оригинале это отдельная кнопка на которую надо жмакать, а я хочу повесить это на вкладку(активную) чтоб клик (LeftMouseClick) по активной(выбранной) вкладке делал тоже самое что и кнопка. CTRL+TAB, TabFlipping или как там еще это назвать можно... из Оперы поведение. Чел сделал, но не так как хотелось

Надо с другой стороны зайти. ЛКМ по активной вкладке "нажимает" CTRL+TAB

drage2 пишет

Кнопка "увеличить изображение" аж 2014г. Работает,но не с мультипроцессом...FF58 - можно и выкл. мульти, так с запуском тормоза. Кнопку саму нельзя рихтануть?
Жалко.Уделал эту 58 , а только эту кнопку - никак....

Да, есть такая проблема. Перестал работать triggerNode в:

Выделить код

Код:

// отслеживать открытие контекстного меню на странице ....
   addEventListener("popupshowing", function(e) { 

      menuitem.hidden = !gContextMenu.onImage; // скрывать пункт если не контекстное меню изображений         
      if ( !gContextMenu.onImage ) return;

      // получить координаты и размеры изображения
      var trg = e.target.triggerNode;
      g.win = trg.ownerDocument.defaultView;
      g.rect = trg.getBoundingClientRect();

   }, true, contextMenu);

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

bunda1

bunda1 пишет

отслеживать открытие контекстного меню на странице

Это проблема, но ...В 57 мульти не нужен и кнопка работает. А в 58 финал это уже не актуально, кнопка "путь к proxy.pac" не будет работать в 58 никогда...
Там итак косяков навалом, и это ещё.Кстати, этот мультирежим не дает скачать видео кое-где,какого,а?  http://kinokrad.co/   IDM - молчит пока мульти...

drage2 пишет

Кстати, этот мультирежим не дает скачать видео кое-где,какого,а?  http://kinokrad.co/   IDM - молчит пока мульти...

Да, к сожалению мультирежим ломает многие Сustom Buttons кнопки и коды :(

Andrey_Krropotkin пишет

в любом меню в пункте "Веб - разработка" удваивается количество пунктов начиная  от Панели разработчика до Других инструментов. Или может это только у меня ?

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

bunda1 пишет

Двойное нажатие ПКМ не вызывает меню СВ, потому что в Сustom Buttons что-то сломано и иеперь в всех кнопках меню нельзя вызвать двойным нажатием ПКМ.

Двойное нажатие ПКМ не вызывает меню СВ потому,
что в коде кнопки на это есть прямой запрет. А вот так, например, вызывает.

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

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ...............
/*
this.onclick =e=> {
   if ( e.button == 0 ) GrabScroll.toggle();
       
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
        e.preventDefault();  
        menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
        }     
};
this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() };
*/

this.onclick = e => e.button || GrabScroll.toggle();
this.oncontextmenu = e => e.detail == 2 && !menuPopup.hidePopup()
     || e.ctrlKey || !!menuPopup.openPopup(this, "after_start");

mokujin пишет

хочу повесить это на вкладку(активную) чтоб клик (LeftMouseClick) по активной(выбранной) вкладке делал тоже самое что и кнопка

Сначала пишем простой набросок,
затем смотрим что может пойти не так.

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

Выделить код

Код:

((trg, sortFunc, flag) => {
    addEventListener("mousedown", e => flag = e.target != gBrowser.selectedTab, true, trg);
    addEventListener("click", e => {
        if (
            flag || e.button
            || e.ctrlKey || e.shiftKey || e.altKey
            || e.detail != 1 || ~~"что-то ещё"
        )
            return;

        var tabs = [...(gBrowser.visibleTabs || gBrowser.tabs)];
        var recentlyUsedTabs = tabs.sort(sortFunc);
        var tab = tabs[recentlyUsedTabs.indexOf(e.target) + 1];
        if (tab) gBrowser.selectedTab = tab;

    }, false, trg);
})(gBrowser.tabContainer, (tab1, tab2) => tab2.lastAccessed - tab1.lastAccessed);

Dumby пишет

Двойное нажатие ПКМ не вызывает меню СВ потому,
что в коде кнопки на это есть прямой запрет. А вот так, например, вызывает.

Нет, раньше на старых версиях Firefox двойное ПКМ вызывала СВ меню даже если на одиночный ПКМ уже висело меню настроек кнопки. А за код спасибо :)

Dumby

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

теперь не множатся. Все отлично.

В главном меню [firefox] есть пункт Изменить..., который вызывает открытие вкладки Настройка FireFox (аналогично нажатию ПКМ по панели меню -> Изменить). Можно ли эту команду вынести в виде кнопки на панель меню [firefox], или создать кнопку для Custom Buttons такого же назначения? Частенько приходиться настраивать внешний вид [firefox] (удалять/добавлять/перемещать кнопки), и было бы удобно держать эту команду поближе. Помогите, пожалуйста. Прошу прощение за примитивную просьбу :blush: Спасибо

Viatcheslav

Выделить код

Код:

/*CODE*/

gCustomizeMode.enter();

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

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

Выделить код

Код:

/*Initialization Code*/
({
    title: "Консоль браузера",
    icon: "chrome://devtools/skin/images/tool-webconsole.svg",
    url: "chrome://devtools/content/webconsole/webconsole.xul",
    init() {
        var trg = document.getElementById("browser");
        trg && addEventListener("DOMContentLoaded", this, false, trg);
        var attrs = {
            sidebartitle: this.title, sidebarurl: this.url,
            type: "checkbox", group: "sidebar", checked:
                SidebarUI.isOpen && SidebarUI.browser.getAttribute("src") == this.url
        };
        var broadcaster = this.element("broadcaster", Object.assign({
            id: "viewBrowserConsoleSidebar"
        }, attrs), document.getElementById("mainBroadcasterSet"));

        Object.assign(attrs, {
            autoCheck: "false", label: this.title, observes: broadcaster.id,
            oncommand: `SidebarUI.toggle("${broadcaster.id}");`
        });
        var btn = this.element("toolbarbutton", Object.assign({
            id: "sidebar-switcher-browserconsole",
            class: "subviewbutton subviewbutton-iconic"
        }, attrs));
        this.element("observes", {element: broadcaster.id, attribute: "checked"}, btn);
        document.querySelector("#sidebarMenu-popup > toolbarseparator").before(btn);

        var menuitem = this.element("menuitem", Object.assign({
            id: "menu_browserConsoleSidebar"
        }, attrs), document.getElementById("viewSidebarMenu"));

        var css = `\
            #${btn.id} > .toolbarbutton-icon,
            #sidebar-box[sidebarcommand="${broadcaster.id}"] > #sidebar-header > #sidebar-switcher-target > #sidebar-icon {
                list-style-image: url(${this.icon});
                -moz-context-properties: fill;
                fill: currentColor;
                opacity: 0.8;
            }
            #TabsToolbar[brighttext] .tabbrowser-tab:not([visuallyselected=true]) .tab-icon-image[src="${this.icon}"] {
                filter: url("chrome://devtools/skin/images/filters.svg#icon-normal-dark");
            }`;
        var dwu = QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
        var str = "data:text/css," + encodeURIComponent(css), type = dwu.AGENT_SHEET;
        dwu.loadSheetUsingURIString(str, type);

        addDestructor(() => {
            for(var node of [broadcaster, btn, menuitem]) node.remove();
            dwu.removeSheetUsingURIString(str, type);
        });
        
        
        
  function $(aId) {
    return document.getElementById(aId);
  }
  gCBBrowserConsole= this;
  this.panel = false;
  this.togglePanel = function() {
  this.panel = !this.panel;
  $("BrowserConsole-splitter").hidden = !this.panel;
  $("BrowserConsole-panel").hidden = !this.panel;
  $("BrowserConsole-iframe").setAttribute("src", this.panel ? this.url : "");
  }
  
  function makeXML(aXMLString) {
  return (new DOMParser).parseFromString(aXMLString, "application/xml")
                        .documentElement;
  }

  function $xml(aNode, aId, aXML) {
  var node = $(aId);
  node && node.parentNode.removeChild(node);
  aNode && aNode.appendChild(makeXML(aXML))
  } 
        
     $xml($("appcontent"),
      "BrowserConsole-splitter",
     '<splitter xmlns="' + xulns + '" id="BrowserConsole-splitter"'
   + ' orient="vertical" hidden="true">'
   + '<grippy oncommand="this.parentNode.nextSibling.collapsed ='
   + ' !this.parentNode.nextSibling.collapsed;"/></splitter>');

     $xml($("appcontent"),
     "BrowserConsole-panel",
     '<vbox xmlns="' + xulns + '" id="BrowserConsole-panel"'
   + ' height="300" hidden="true">'
   + '<toolbox><toolbar align="center">'
   + '<label value="Консоль браузера" flex="1" crop="end"/>'
   + '<toolbarbutton class="tabs-closebutton"'
   + ' image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACt0lEQVQ4jaWSzUtUYRTGn/fcGZ25H+m9Iyne8fpFq4lGCsFFIW21NiKKuHIn4qpazDraabnMTVEh+Af0B0QIIohBowhlkM1MMTre+VLngzv3PW1SKWvVWR0eOL/zcM4jmBn/U4G/iTuzsyK7unoLUl4HABDtdExNbV1fXr60Tfzp4J1h3Dd1/ak1OHhN7+kBiHCaTsPd2NgrlMsP7x4fv/0nYE3XH9ix2GLbzIwQmvYbmCsVHL16xd+3tx/dOTl5dqbTWfPeMIavOs6COT0tmBmyWAS1toJaWyGLRbCUMKemxFXHWXhvGMOXACrw2BwdJYUITX190MbG4O/twf/yBdrYGJr6+6EQwbx3j1QhHv8GWDfNNjUavR3u6ACyWQRjMQRsG+rkJNSJCQRsG8FYDDKbRbi9Harj3F43zbYLB41Gr2bbRIUCFACnS0vwMhkEbBsB24aXyaCcSEDJZiFyOWidnYRGo/f8jQpQp9NTiFwOACCJACEuDsgMeXAAuC7YMECeBwWonwOaLOtT/evXMhTlSs00oS8vI2jbqGcyADOau7pgvHiB8vg4tMND1F233GRZn87pzIwtXX9eiEb5uLubC2/ecC2V4qOhIT4aGuJqKsX516/52HG4EI3ylq4/P5s7z8FHy2qXnvehOxTqDBGhFongiusCAMqWhVA+j5qU+Far/RDB4M2BfP7gUpCSLS03qr7/NiyEExEC6i+9AsBlRpU5FVaU+zdKpeSlHCSTSazOzW0XNW2gCjzZ9/3Pu77Pu77P+77/uQo8cTVt4OXMzM7a2tpFlBOJhFhZWWkulUphz/NUKWWYmUPM3GwCKgBRAKoA6kRUI6JKIBCo6rpeGRkZqQlmRjqdxuLiIm1ublIul6NKpaI0Gg3yfV8AABFxMBiUoVBIRiIRPx6Py/n5eRmPx/ETBvM/dPD/rBwAAAAASUVORK5CYII="'
   + ' oncommand="gCBBrowserConsole.togglePanel();"/>'
   + '</toolbar></toolbox>'
   + '<iframe id="BrowserConsole-iframe" src="" flex="1"/>'
   + '</vbox>');
        
        
  
       
        
        self.onclick = e => {
           //if (e.button == 2) return;
           //if (!e.button) return SidebarUI.toggle(broadcaster.id);
            if (e.button == 0) return  SidebarUI.toggle(broadcaster.id);
            
            if (e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ){
               e.preventDefault();
               this.togglePanel();
                 }     
            var st = gBrowser.selectedTab, tab;
           // if (!e.ctrlKey) tab = gBrowser.visibleTabs.find(
            if (e.button == 1){ tab = gBrowser.visibleTabs.find(
                tab => tab.linkedBrowser.currentURI.spec == this.url
            )
            
            if (tab == st) return;
            if (!tab) tab = gBrowser.addTab(this.url);
            gBrowser.moveTabTo(tab, st._tPos + 1);
            gBrowser.selectedTab = tab;}
        }
             
        if (gBrowser.currentURI.spec == this.url) {
            var doc = gBrowser.selectedBrowser.contentDocument;
            if (!doc.querySelector("link")) this.handleEvent({target: doc});
        }
    },
    
    handleEvent({target: doc}) {
        if (!doc || Cu.isCrossProcessWrapper(doc)) return;
        var win = doc.defaultView, url = doc.documentURI;
        var inTab = !String(win).includes("ChromeWindow");
        if (url == this.url) {
            if (inTab) {
                var link = doc.createElementNS(xhtmlns, "link");
                link.setAttribute("rel", "shortcut icon");
                link.setAttribute("href", this.icon);
                doc.documentElement.firstChild.before(link);
            }
            this.loader.Services.ww.wins.push(win);
            new this.loader.HUD_SERVICE().toggleBrowserConsole().then(bc => {
                if (!inTab) return;

                var dummy = {close() {}};
                var parent = this.inIDOMUtils.getParentForNode(doc, true);
                if (parent && parent.id == "web-panels-browser") {
                    SidebarUI._title.value = this.title;
                    SidebarUI._icon.src = this.icon;
                    dummy.close = () => SidebarUI._icon.removeAttribute("src");
                }
                win.onbeforeunload = () => {bc.chromeWindow = dummy;}
            }, Cu.reportError);
        } else if (
            inTab && url == "chrome://devtools/content/shared/widgets/VariablesView.xul"
        ) {
            var iframe = win.frameElement;
            if (!iframe || iframe.ownerDocument.documentURI != this.url) return;

            var listener = Services.els.getListenerInfoFor(iframe)
                .find(obj => obj.type == "load").listenerObject;
            iframe.removeEventListener("load", listener, true);
            win.addEventListener("load", () => listener({target: doc}), {once: true});
        }
    },
    get loader() {
        delete this.loader;
        var id = _id + "-browser-console";
        var url = "resource://devtools/shared/Loader.jsm?" + id;
        var loader = {exports: {}}, nsvo = Cu.import(url, loader);
        addDestructor(reason => reason[5] == "e" && Cu.unload(url));

        if (id in nsvo) return this.loader = nsvo[id];

        Services.scriptloader.loadSubScript("resource://devtools/client/webconsole/hudservice.js", loader);
        var e = new CustomEvent("DOMContentLoaded", {bubbles: false}), ww = loader.Services.ww;
        loader.Services.ww = Cu.getGlobalForObject(nsvo).Object.create(ww, {
            wins: {value: []},
            openWindow: {value: function() {
                var win = this.wins.shift();
                setTimeout(() => win.dispatchEvent(e), 0);
                return win;
            }}
        });
        Services.obs.removeObserver(loader.gDevToolsBrowser, "browser-delayed-startup-finished");
        var func = nsvo.require("devtools/client/framework/browser-menus").removeMenus;
        for(var win of CustomizableUI.windows) func(win.document);
        return this.loader = nsvo[id] = loader;
    },
    element(name, attrs, parent) {
        var node = document.createElement(name);
        for(var attr in attrs) node.setAttribute(attr, attrs[attr]);
        if (parent) parent.appendChild(node);
        return node;
    },
    get inIDOMUtils() {
        delete this.inIDOMUtils;
        return this.inIDOMUtils = "inIDOMUtils" in Ci
            ? Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils)
            : InspectorUtils;
    }
    
}).init();
this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() }; 
// Подсказка у кнопки.............................................................................
this.tooltipText = "Консоль браузера" +"\n"+
                   "ЛКМ: В боковой панели" +"\n"+
                   "СКМ: В новой вкладке" +"\n"+
                   "ПКМ: В bottom панели" +"\n"+
                   "Ctrl+ПКМ: Стандартное меню ";

Button Proxy.pac пишет

var path1 = 'file:///D:/Proxy.pac' var path2 = 'file:///C:/Proxy.pac'; var s = 'network.proxy.autoconfig_url';

Шикарная кнопка...Черт бы побрал эту 58...Не работает...
Это кнопка Bunda1 - менять путь к проси -proxy.pac../ В 57-Ок!,в Seamonkey- кое-как, в 58- никак....
Можно как-то скреативить для 58? Или гиблое дело?
network.proxy.autoconfig_url строка  file:///D:/Proxy.pac
                                                            file:///C:/Proxy.pac

drage2 пишет

Это кнопка Bunda1 - менять путь к проси -proxy.pac../ В 57-Ок!,в Seamonkey- кое-как, в 58- никак....
Можно как-то скреативить для 58? Или гиблое дело?
network.proxy.autoconfig_url строка  file:///D:/Proxy.pac
                                                            file:///C:/Proxy.pac

:/

Выделить код

Код:

var path1 = 'file:///D:/Proxy.pac'
var path2 = 'file:///C:/йцукен.pac';
var s = 'network.proxy.autoconfig_url';

this._handleClick =()=> {
   var path = getPath() == path1 ? path2 : path1; 
   cbu.setPrefs(s, convertFromUnicode("UTF-8", path));
};

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();
};

function getPath() {     
   try { return gPrefService.getStringPref(s, "") } 
   catch(e) { return path1 };
};

function toggleImage() { 
   var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
   icon.src = getPath() == path1  
   ? self.image 
   : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC';
};
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage));

Скажите пожалуйста, кто может подправить

Выделить код

Код:

// Получить выделенный текст из страницы или 'false' ..............
function getSelect() {
  var el = document.commandDispatcher.focusedElement;
  try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {};
  var sel = document.commandDispatcher.focusedWindow.getSelection();
return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,"").replace(/\u000A/g, "\u000D\u000A").replace(/\u000D\u000D\u000A/g, "\u000D\u000A");
};

почему то возвращает все время 'false'

Andrey_Krropotkin пишет

почему то возвращает все время 'false'

просто со страницы, то так

Выделить код

Код:

let text = document.commandDispatcher.focusedWindow.getSelection().toString();

26-01-2018 00:38:51
А вообще, есть готовая функции, вродеб за авторством bunda1 ok.gif  , навроде универсальной:

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

Выделить код

Код:

// получаем выделенный текст
function getSelect() {

 var sel = document.commandDispatcher.focusedWindow.getSelection(); // из страницы
  if ( sel.isCollapsed ) {    
     var el = document.commandDispatcher.focusedElement;    // из текстового поля
     if ( el && el.textLength )
          sel = el.value.substring(el.selectionStart, el.selectionEnd);  
     }
  if ( sel.anchorNode && sel.anchorNode.parentNode.tagName == 'PRE' ) {  // из 'PRE'
     var sel = sel.focusNode.data.substring(sel.anchorOffset, sel.focusOffset); 
     }          
  if ( sel == '') {                                   // если выделенного текста нет
     return;
     }
return sel;
//  if (sel) gClipboard.write(sel);

  };

alert(getSelect());

mokujin на 57 работало, а на 58 не работает и этот вариант

bunda1
Круто....Не постоје речи! Заработало!
Шутку с "var path2 = 'file:///C:/йцукен.pac';" - заценил !
Хвала, брате! Еще бы " увеличить изображение" в мультипроцессе и все .... А, так пришлось кнопку лепить "browser.tabs.remote.autostart" , и перезапуск нужен, что ни есть гуд!

mokujin

mokujin пишет

А вообще, есть готовая функции, вродеб за авторством bunda1 http://www.kolobok.us/smiles/big_standart/ok.gif  , навроде универсальной:

Ошибка Javascript  , что не так? И в 57 и в 58....

drage2 пишет

Ошибка Javascript  , что не так?

ошибка в другом месте. С javascript все в порядке и в 57.3 тоже.

Andrey_Krropotkin
Просто со страницы на FF58:

Выделить код

Код:

gBrowser.contentDocument.defaultView.getSelection();

bunda1 Спасибо, действительно на 58 работает

А никто не делал кнопку, чтоб отслеживала открытие вкладки и ставила стиль у нее html, body {background-color: #AAA;} на пару секунд, а при отрисовке страницы убирала этот стиль :sick:
Обоснование: реально достал этот яркий белый фон новой вкладки, до загрузки всего. Во всех бравзерах. Оно мигает, оособо вечером, вообще ппц. Все об этом знают и все, похже смирились. Но неужели это так сложно\невозможно сделать?! Неужели (это уже в пустоту, к разрабам бравзеров) это не очевидно что пустой фон не должен быть слепящим?!

Я кагбе понимают, что нужно какой-то листенер, на какое-то событие ставить... а там таймер, а может лучше еще один листенер, на что-то типа pageshow - но соорудить такое не могу. или с чего начать подскажите :P ибо этот молочно-белый уже все, дастал.

Сейчас сделано просто, в userContent стоит правило без !important 

Выделить код

Код:

@-moz-document url-prefix("http://"), url-prefix("https://") {

html, body {
    background: #BBB;
    background-color: #BBB;
    }

}

... но оно влияет на сайты. Еслиб это отменялось когда выводится страница. Если уже есть такой код, поделитесь.

Какая это кнопка ? Полностью код можно?
gBrowser.contentDocument.defaultView.getSelection();

mokujin пишет

реально достал этот яркий белый фон новой вкладки, до загрузки всего

Меня не достаёт:
about:config

Выделить код

Код:

browser.display.background_color;#F5F5F5

Для особо чувствительных есть f.lux, Redshift

эт понятно. flux - да, как и кнопка со стилем ночным, как и расширение ScreenDimmer... всё это костыли и все это можно юзать, чтоб исправить одну , реально бесящую особенность всех бравзеров - яркий белый фон, мелькающий до загрузки страницы. А если страница еще и где нибудь в Китае или на медленном сервере где-то в США с кучей скриптов... то это белое пятно и пару сек. может висеть.
Я пытался найти , где это живёт(откуда берется этот белый фон который бравзер ставид до всего), чтоб его забить гвоздями, не нашел. рылся в omni.ja

lokiju пишет

browser.display.background

Для изменения этой настройки не обязательно лезть в about:config
Настройки -> цвет -> фон

mokujin пишет

яркий белый фон, мелькающий до загрузки страницы

Попробуйте этот код. Раньше вроде работало

Выделить код

Код:

/* Цвет пустой страницы */
@-moz-document url("about:blank") {body {background-color: #444444 !important;}}

/* Цвет при загрузке страницы */
browser {-moz-appearance: none !important; background: #444444 !important;}

Оппа, вроде есть! Ultima2m навел на мысль, пока что сделал так в userChrome.css

Выделить код

Код:

/*  Заменить слепящий белый цвет при открытии вкладки */
.tabbrowser-tabbox,
.browserStack,
.browserContainer,
#content,
#appcontent, 
browser {
    -moz-appearance: none !important;
    background: #5E5646 !important;
    background-color: #5E5646 !important;
    }

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

Есть кнопка "передать видео" ....Но т.к в Sm2.53 нет интеграции с IDM ?, пишу :
var path = "C:\\Program Files\\Download Master\\dmaster.exe";     Т.е в DM , а хочу в IDM , так командная строка не подходит...
Вообще, ком.строка прописывается в кнопке?

drage2 пишет

Есть кнопка

где? что? как?!
42, синий!

хочу кнопку сохранения страницы в формате  7zip
Мож есть уже ?

selevo пишет

Мож есть уже ?

Нет.

После обновления 58 код

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

Выделить код

Код:

// Дополнительные возможности для значка идентификации сайта в строке адреса ...............
 (function copyAddrIdentIco() {
     const identBox = document.getElementById("identity-box");

      addEventListener("click", e => {

           switch (e.button) {
                case 0:  // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
                  e.preventDefault();
                  e.stopPropagation();
                var doc = content.document;
                BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "mediaTab" : "generalTab" );
                break;   // generalTab, mediaTab, feedTab, permTab, securityTab

             case 2:  // ПКМ копирует текущий адрес ....     
                identBox.oncontextmenu = function() { return false; }
                if ( e.ctrlKey || e.shiftKey ) {
                      identBox.oncontextmenu = function() { return true; }
                     };

             gClipboard.write(decodeURIComponent( content.location ));
             
             // значок идентификации сайта мигает....
             document.getElementById("identity-box").setAttribute("style", "background: orange;");
             setTimeout(function() { document.getElementById("identity-box").removeAttribute("style") }, 500);
         }

 } , true, identBox );
 
 })();


конфликтует с функцией вызова "информации о странице" - она вызывается один раз, а потом нужна перезагрузка
И еще к теме. Как сделать, чтобы сразу открывалось старое окно "информации о странице", подробное, а не эта новая красота?

Ultima2m
яж тебе делал, зачем старую взял

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

Выделить код

Код:

// ---02------ Копир адресс ПКМ по значку идентификации сайта в строке адреса ---2018------------
 (function copyAddrIdentIco() {
     const identBox = document.getElementById("identity-box");
      addEventListener("click", e => {

           switch (e.button) {
                case 0:  // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
                         identBox.onclick = function() { return false; }
                         let doc = content.document;
                         BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "mediaTab" : "generalTab" );
                         break;   // generalTab, mediaTab, feedTab, permTab, securityTab

             case 2:  // ПКМ копирует текущий адрес ....     
                if ( e.ctrlKey || e.shiftKey ) {
                      identBox.oncontextmenu = function() { return true; }
                      break;
                     } else { identBox.oncontextmenu = function() { return false; } };
             
             gClipboard.write(decodeURIComponent( content.location ));
             // значок идентификации сайта мигает 
             identBox.setAttribute("style", "background:#0080FF;");
             setTimeout(function() { identBox.removeAttribute("style") }, 500);
         }
       } , true, identBox );
 })();


чего и эта не пашет?

mokujin пишет

чего и эта не пашет?

Кнопка работает. Не работает ЛКМ на identity-box - не открывает вкладку 'Разрешения'.
Мешает именно этот код, потому что при его удалении все снова работает.

а, дык нету у мну 58-й и я хз. что там вызываеццо теперь. возьми "Инспектор" by Infocatcher и посмотри что за панель\комманда вызываеццо по клику.

mokujin пишет

возьми "Инспектор" by Infocatcher

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

Выделить код

Код:

box [44×20]
namespaceURI: XUL
margin: 0 4px 0 0
border: 0
padding: 0 4px
id = identity-box
class = unknownIdentity mixedDisplayContent
align = center
aria-label = Просмотреть информацию о сайте
onclick = gIdentityHandler.handleIdentityButtonEvent(event);
ondragstart = gIdentityHandler.onDragStart(event);
onkeypress = gIdentityHandler.handleIdentityButtonEvent(event);
role = button

ну во-первых , это не то. это тот же значек идентиф. зачем оно? там наверно окошко вылазит, как раньше и в нем кнопка, типа "Подробнее..." или что там. Вот её и глянь, что она запускает.
+ яж грю - ну нету у мну 58-й(и скорей всего не будет) , проверить я не могу. Сам впиши, проверь.

mokujin пишет

Сам впиши, проверь.

Там только это есть
label = Подробнее
oncommand = gIdentityHandler.handleMoreInfoClick(event);

но куда это воткнуть не знаю ничего похожего в это коде нет

Выделить код

Код:

switch (e.button) {
                case 0:  // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
                         identBox.onclick = function() { return false; }
                         let doc = content.document;
                         BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "mediaTab" : "generalTab" );
                         break;   // generalTab, mediaTab, feedTab, permTab, securityTab

=====
Сделал так
switch (e.button) {
                case 0:  // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
                         identBox.onclick = gIdentityHandler.handleMoreInfoClick(event);

и оно РАБОТАЕТ
я в шоке

ну норм.  чёгоб, ему не работать, вставил пральную команду и всё :music:

Выделить код

Код:

switch (e.button) {
                case 0:  // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
                         identBox.onclick = function() { return false; }
                         gIdentityHandler.handleMoreInfoClick(event);
                         break;
              }

03-02-2018 20:24:27
... наверно так. но можешь оставить и как сам сделал

03-02-2018 20:30:02
тока break; в конце обязательно вставь.

mokujin пишет

наверно так. но можешь оставить и как сам сделал

Спасибо. Твой код лучше работает.
У меня какое-то окошко при клике мелькало, с новым кодом нормально.

Вопрос, есть аддон https://addons.mozilla.org/ru/firefox/addon/cpd/?src=api , одним кликом чистит приват. данные.Но нет "горячей клавиши" , а на панели уже кнопок,как грязи... Хочу на этот "Клик" - кнопку, ну, и назначить,типа, F1....
Удалить Историю код: PlacesUtils.history.clear(); ....А, надо удалить все....

drage2 пишет

Вопрос, есть аддон https://addons.mozilla.org/ru/firefox/addon/cpd/?src=api , одним кликом чистит приват. данные.Но нет "горячей клавиши" , а на панели уже кнопок,как грязи... Хочу на этот "Клик" - кнопку, ну, и назначить,типа, F1....
Удалить Историю код: PlacesUtils.history.clear(); ....А, надо удалить все....

У этого аддона, как я понял, есть кнопка (иконка). У неё должен быть ИД. Тогда, если знать этот ИД, то можно сымитировать и клик на ней.
Я просто приведу пример как сымитировать, а Вы попробуйте.
Условно назовём этот ИД "buttonID" (Вы его должны узнать)

Выделить код

Код:

addEventListener('keydown',(e)=> {if (!e.ctrlKey && !e.altKey && !e.shiftKey && (e.keyCode==181)) {//Это код F1
var btn = document.getElementById("buttonID");

btn.dispatchEvent(new MouseEvent("click", {//Здесь может быть вместо click -> command etc., надо пробовать
     bubbles: true,
     cancelable: true,
     view: window,
     detail: 1,
     ctrlKey:  true,
     altKey:   false,
     shiftKey: false,
     metaKey:  false,
     button:   0
}));
}
},0,window);

Попробуйте, может и получится. Главное - узнать ИД Вашей кнопки.
Кроме того, может у Вас F1 - это код 112 (зависит от модели компа)

difabor
Это трудно .Нет там ID ,это web-расширение. Есть,но не то....Сделал отдельно кнопки : ClearHistory,ClearCache.....Но,как задать Notification ?
Сделал! все,кроме "Настройка сайтов" - не могу код найти....

расширение вообще не нужно

Выделить код

Код:

document.getElementById("sanitizeItem").click();
mokujin пишет

document.getElementById("sanitizeItem").click();

Ни и на черта это? Надо без окна чистить...Типа такого: А, надо "настройки сайтов"- очистить , код???

// очистить кэш ....
Services.cache2.clear(); BrowserReload();
             var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
                      alertsService.showAlertNotification("chrome://global/skin/icons/cpd_OK.png", "PrivateData", "Кеш Очищен" );
                      setTimeout(()=> alertsService.closeAlert(), 3000);

Его воообще не надо чистить, по хорошоему. А на каждую одну операцию понаписать гор. клавиши можно, но это тупо. Есть панель где все в одном месте.
Чистить это все вообще никогда не нужно, если ты не параноик начитавшийся всякой хрени про: нанаснапале - хотят поработить и вычислить мою ИП-шечку  :lol: 
Уже месяца два ничего не чистил и не собираюсь.

mokujin
Можно все в одну кнопку прописать,только коды добавляй...Только коды не все нашел..."Настройки сайтов" = это масштаб сбросить и т.д...Черт его знает,что за код....

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

drage2 пишет

масштаб сбросить

Выделить код

Код:

FullZoom.reset();
mokujin пишет

FullZoom.reset();

Не то....Надо Site.Setting - или clear или remove или delete/////А кнопка одна - F1 ?, к примеру, в ней все коды и одна notification.....
Помогли добрые люди:
let cps = Components.classes["@mozilla.org/content-pref/service;1"]
.getService(Components.interfaces.nsIContentPrefService2);

cps.removeAllDomains(null);
                         
                      alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
                      alertsService.showAlertNotification("chrome://global/skin/icons/cpd_OK.png", "Настройки сайтов", "Скинуты" );
                      setTimeout(()=> alertsService.closeAlert(), 2000);

Как загнать вторую кнопку в адрес в SM (2.53/gecko56) Использую код, типа:
var urlbar = document.getElementById("urlbar-icons");
var button = document.getElementById("custombuttons-button3");
urlbar.insertBefore(button, urlbar.lastChild);
Вторая кнопка по тому же способу никак, т.е одна вытесняет другую...Как в FF57 не получается и Id не задашь, это ж не  ZoomBottom....

Открыть видео в PotPlayerMini
В 57-58 не работает. Чинили?  или все..

drage2 пишет

Как загнать вторую кнопку в адрес в SM (2.53/gecko56) Использую код, типа:
var urlbar = document.getElementById("urlbar-icons");
var button = document.getElementById("custombuttons-button3");
urlbar.insertBefore(button, urlbar.lastChild);
Вторая кнопка по тому же способу никак, т.е одна вытесняет другую...Как в FF57 не получается и Id не задашь, это ж не  ZoomBottom....

Пример:

Выделить код

Код:

var urlbar = document.getElementById("urlbar-icons");

var button1 = document.getElementById("custombuttons-button17");
urlbar.insertBefore(button1, urlbar.lastChild);

var button2 = document.getElementById("custombuttons-button20");
urlbar.insertBefore(button2, urlbar.lastChild);
mssign пишет

Открыть видео в PotPlayerMini
В 57-58 не работает. Чинили?  или все..

Исправил кнопку Открыть видео в PotPlayerMini для соместимости с FF57-58.

bunda1

bunda1 пишет

Исправил кнопку Открыть видео в PotPlayerMini для соместимости с FF57-58.

За SM -все ОК!.....Кнопка видео тоже,но есть один минус,плеер запускается если видео не обнаружено. У меня другая, там notification, если нет захвата, но ПКМ , как меню,и только потом в плейлист....Пытаюсь скрестить, ....но пока лажа выходит.

Подскажите с кнопкой, чтоб ставила путь к файлу proxy.pac из профиля. Я ту часть, что в настрйки пишет вродеб сделал... но хз. как c файлами работать, проверить на существование.
Типа(псевдоКод)

Выделить код

Код:

const prof = Services.dirsvc.get('ProfD', Ci.nsIFile);

 if exist ProfD\\proxy.pac {  // вот это как правильно будет?
 
      let proxypath = "file:///" + prof.path + "\\proxy.pac";
      let pp = proxypath.replace(/(\\)+/g,'/');

    cbu.setPrefs( "network.proxy.autoconfig_url", pp );

};

mokujin
Пример:

Выделить код

Код:

var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
file.initWithPath(file.path + "\\prefs.js");
if ( file.exists() ) {
     alert(file.path);
     };

Понял. Благодарю.

Кнопка  Memory бесполезна при многопроцессорном режиме...Поэтому вопрос снят...
Хотя.....Если эту фишку задать var s = "browser.tabs.remote.autostart"; и значение True  ...
Что бы значения в ручную не менять
memoryDisplay.label = memory;       
      if ( memory > 400 ) {
А, для мультипроцесс.(browser.tabs.remote.autostart"= true)
memoryDisplay.label = memory;       
      if ( memory > 200 ) {
Какая зараза подсадила браузер на мульти-пульти , как бы процесс?

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

Ultima2m пишет

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

https://github.com/Infocatcher/Custom_B … ss_Add-ons

Открыть видео в PotPlayerMini( Firefox24+ ), от 13.02.2018.
Часть открывается, часть — нет. :(
Опробовано на Pot и MPC-BE. Адрес получают верный, но пишут, что ошибка.
Возможно только у меня такое?

Пара ссылок, наугад взятых:
Открывает: https://www.youtube.com/watch?v=OQs7rJOgifQ
Не открывает: https://www.youtube.com/watch?v=QPd-ejoAgaw

У меня откривает на FF58 :/

17-02-2018 23:53:27
Проверь на чистом профиле.

Coroner ха, а там какая-то муть  :D  у мя тоже твоя ссылка передается в плеер, но не_проигрывается. И в Pot и в CherryPlayer . Кнопка другая вообще, из моего другого меню - и тоже не открывает тот ролик ни в одном плеере. фигня какая-то. Это первый случай за год!

bunda1 пишет

Проверь на чистом профиле.

Спасибо за быстрый ответ! :) Проверил.
Проблема не в кнопке, а в плеерах, которые первую ссылку открывают, вторую — никак. Оба. И ещё MPC-HC, и даже VLC.
Голову сломал. Сдаюсь... :whiteflag:
Если кто подскажет чего в личку — буду благодарен.

18-02-2018 00:50:41

mokujin пишет

Это первый случай за год!

Может чего на ютюбе изменили?

Coroner пишет

Не открывает: https://www.youtube.com/watch?v=QPd-ejoAgaw

Еще как открывается.....
Жаль нет перехвата MP3....Типа,отдельной кнопки.

drage2 пишет

Еще как открывается.....

Меня терзают смутные сомнения... :(

Открывается:
bunda1 - Откуда: Латвия
drage2 - Откуда: Донецк

Не открывается:
Coroner - Откуда: Москва

Ладно, простите за офтоп, тут не с кнопкой проблемы...

Донецк может и Ростовской области быть, но мысль правильная, "не в кнопке дело".

drage2 пишет

Да, вы продвинутый чел.

Да ну, какой я продвинутый... Хотя за комплимент спасибо, приятно.

drage2 пишет

Это, тебе, не причину смерти выяснять, но мысль правильная, "не в кнопке дело"

Спасибо за подсказку. Она бесценна.

drage2 пишет

А Донецк может и Ростовской области быть.

Он где угодно может быть, но никак не может быть моим местонахождением, о чём я и написал.

По кнопке: нельзя ли ограничить её применение лишь на сайтах с видео и на ссылках на видео?
Это, конечно, мелочь, и если требует значительных доработок — то ладно, не обязательно.

Coroner пишет

По кнопке: нельзя ли ограничить её применение лишь на сайтах с видео и на ссылках на видео?
Это, конечно, мелочь, и если требует значительных доработок — то ладно, не обязательно.

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

Coroner пишет

По кнопке: нельзя ли ограничить её применение лишь на сайтах с видео и на ссылках на видео?
Это, конечно, мелочь, и если требует значительных доработок — то ладно, не обязательно.

Не знаю как это сделать :(

Видео в PotPlayer, але в MPC-Be ...да в какой надо.....Отрихтовал меню !!!

Выделить код

Код:

/*Initialization Code*/

var path = "C:\\PotPlayer\\PotPlayer.exe";
var addToPlaylistKey = "/add";

var sysPlayerName = "PotPlayer";
var openIn = "Откыть в "+sysPlayerName;
var videoMoved = "Видео перенесено в "+sysPlayerName;
var noFound = "Не найдено видео на странице, доступное для переноса в "+sysPlayerName;

var Menu_n_TooltipTxts = [{
label: "Действие кнопки: Перенести видео со страницы в "+sysPlayerName,
radio: '',
value: 'videotoplayer',
tooltipTxt: 'Перенести видео со страницы в '+sysPlayerName
},
{
label: "Действие кнопки: Перенести видео в плейлист "+sysPlayerName+'`а',
radio: '',
value: 'videotoplaylist',
tooltipTxt: 'Перенести видео со страницы в плейлист '+sysPlayerName+'`а'
},
];

var YoutubeID = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})(?:\W|$)/;
var imgFlashMinimize = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAABu6AAAbugE6tOQgAAACXUlEQVR42o2SXUiTYRTHf8+a+YWV2jQ3moTTVmm1bmIZUVGiXnQrdFcQFN4YhHhpIIpBSFd9eNWlF0U2CsW+SfoAwUQimIZCmDCnY9srbXN7et733dZcEv1vzvOc7/M/h6lUCv9el6SgoEDOjoxIZpwuuVjtlEiFe1U1Urx21hECWQScfPsSoVuEEHiUwrurAjHrdFGoItSflKaRDaltOc+PR48xkjkcDhlfXZPDDqcUmDo6yyv1KISqazyCSl+MQK8moxr7v05TXF2Fdd7MT8yQko1olIuBZbS5OZ62XzDz5UL3ul3XIG9W2GTfHru0kgc1M/PBFb0XbE0exJeBW4i7D4w6xWY1CtWgsWAQl7baYzSpN2g4pJvcbq/hwId3zJxrw6qM+uAGfqm3XFujbdHPuMtNMp7AGspOoEsoPXoEmZI0P/fhO3UW0d3dLQcHBw2H+vp6/H4/D+saSMRiJlHp0bK4c7AREY4QSW6YDna7XS4tLWGxWEgmk7SrCfapNWXwVwa1A5F5uzuvmTxYPn2maGqaoCDrXJpHoE5BKhwmpSjYcfUKJd7j/LzRg/iYXqaOEJurleR+tHUOv5lgZ+Mhgr5nfO8bQFteRoypA8ognJcgA7ka4vSYj6rmEybf6+u8OtNCdGEBMTQ0JPv7+wkEApv23ZlI0FRuIx6J0OYbpba1hW/3h3nfdZ2iikqkddvWJOXC7XajrpnxJ6P4Ll1mbuIFhWVl5Ib8M4GOY2otjUo6dtv+KEV2EVj5D6zoBxiPbWkT6Qa27KKjo4PJyUlaIxGRb/N0deHt7eU3M38VXBCKUs0AAAAASUVORK5CYII=";
var imgFlashMaximize = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAABu6AAAbugE6tOQgAAACd0lEQVR42nVTW0iTYRh+vh2aGlZq09xoEttslVbrJsyIihLnRbdCdwVBsZsFQ7w0EGVhjK46eNWlF0U2CsXOJB1AMJEINkWhrcHcgW3/aJvb2/f9/zbnsufm+7/38Lzv+7zfj4ViEf6DFoJWq6XlqSnCkslC620mAnE8bG0n9s5kRgKgOgBnP7wBEx7GGOzc0LOvGWzZZIGOZ/A7ipKESkpH32X8evoMMpnRaKRcLE6TRhMxKDY4m1pEFhivK39Eub0eDKIapSUc/rGI+rZWaFYUfmTlk7CZTuNqJAwpEMCLgSsKXzVE1D1zJ91p1tPoAQNpUAM+M1aiG6IX6LvtYN/H74I9eCzXqVeqQccHzUajsEixYblJ0aAcUGpyl6EdRz5/xNIlBzTcKQaX8Yd/UzwOx7ofsxYbCrk8NInKBOIEdp88ASoSel/54Dt3EWxoaIg8Ho8cYLVa4ff78cTciXw2qwhVkhLBYFA23D/aBZZMIVXYVAIMBgOFQiGoVCoUCgUM8AkO8TWVITOo1WrZKcB3wMpOm/OWooPq6zfULSwiykrdimZrBBQSFJNJFLkEe27eQEPPafx2D4N9KS1TIFHSq4yG6ouUwfH3c9jbdQxR30usjo5DCofBZvgDKiNZQ1AGxRI4P+NDa+8ZRe9MBm8v9CG9tgbm9XppbGwMkUhk276d+Ty6m/TIpVJw+KbR0d+Hn48m8cl1G3XNLSCNeksk/Ac2mw1iBbPPp+G7dh2BudfQNTaiOmUbgfhbavlOcVsXP4379VtGVlkE/nmubrcbExMT22wb4gHmsjt2yUoVdxxjcHAQ8/Pz6E+lWK3P7nKhZ2QEfwESYiFcNfq6ywAAAABJRU5ErkJggg==";
var imgFlashToPlayer = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAB7CAAAewgFu0HU+AAADn0lEQVR42j2Se1CUZRTGn29v6Mq6CwQUlxX2gq4IyBhk8keQ5ow4hZrSjWGSTDA10z+a7jGNjV3QRctWF5HAJAGBsYmYcKKcidDhLlqQRGhLODuuCLIQLrtP726XM9837/e97znnPef3HDiiDTy2+W2gdvFSntKGEa+/VEWxC/BfQ3eMkcPqYA7p9TTW8Z+T14xpzH73PHOslcAfIkta+RScEVH+b8jGFQpcyJnluo8HeVURDDRYkjgxcp0Vai1zW0TSXrudR9RK5uz9isn9vcA1ccvt0DBmVE6zKu0pGs6SGw50YlSrwTW9GWiNMfBbVTA9c3Nsz1rLlqg4tipUrPmTXFPrIUpEZVNOJ7/JfpzH52v4ebSetoRULqq+x1dz3yC2Coe9CokpFW5azpB5m97i8p5urOjowIrOTtGHqGFSp2NYE2mq9UH0ihsxJvh5BPryiY2m9KcxnHcfdDdHGV9P/B4WC7dwnZbJgF5R5K8Lwzjy5jv0Xr3Mj9bupFFctaX4BwyJc6lVb6TaZELi8aNoW5YKWWQEErIfxfr0o0hcrJRQqV7IqbGxAPq6+AR+qTewfdfLvDXjY9Thu5Q/uyqjOKWoCIfkcsiDNQiauAlbjhVNNR0wB7VLmHG5WJqczpLIB3ggbgmN58g96/Yxpa8n0Kr0guAgs6zCQP5hYM4LHbqkkScfgco9IyqUIA3HmqgUIs2fdQtdkrB7dyOix69jMGYpFB6f2J+UNlwoR17zQSi9HrgW6OD3V4nXKxBJAwKkH5/c54VbEw6nKhTGwZ8QYo6BI+FBWFML8KMlC37fBTN/Ib/pQ2w6/yn8fKfVWqBNiNsRZ+aliGi2z9PyRok1QMQ7O0vHsTK2CYw9Kjm/tjzE3A8u0lw1S1M1sdJ+G3ueswLnTEtYHxrJxuAQ/nayMhDs6uzmd5lreFYXzoYoPRtj43lGDGSXwOu3MbePzzT7uLxSTFO5WkObAHVJKBkI7rvMK4dK2Sn+q4UmpyKieFqsXyiV7CvcxgYnmVhHPvxeP3cUlBEXraW843AEgvttNpaKZJ+E38/PohfRHhrCCo2a+554hYm1c0yxu7h9y0EWFr2PjJbvYRn6Gah/sZBlqx9jsQjcnpnPlSfGuX+egoWrtzLptJvJFRN8fuN+7ti8E1n1jVg2cAWp3V3/j7O0S6slJRl8Qhbl3Tv4ZVs5hjYWwNBch9i2GsmRtx6juZkIujUJ+T2PX4zA85/9Da+Q/IlOIKaJAAAAAElFTkSuQmCC";
var imgHTML5Minimize = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAB7CAAAewgFu0HU+AAACgUlEQVR42n1TXUiTYRR+vrn5ky7LLMdskLHcREcUFSViOJPCahSsRYKyLPu5yLqyIOiH0qKEBVnoTUGXUVlEF10ECY1d7SIlMjIT+dqmYmNrptvcd3rf1znNZQ988HHOec55zs8LMMiOrQSNRkM/rpwkyAdLKdS6gySaAwS41d/TTtO99whJM1kLc0i2lZLEvEBOHml1aiA2DRWnZD14i8yahjk+pxQXF1Po3DYKNptp3kaBI6X0bNf6d1KyinBkPXIj0e9Bwdp8wY72uqDGIsQ6z0PKUCNelI3s47egyF+S+RaBZ4qPfKLInUaabDJTWgDvmekHqy+ySkP1RnwOR91bCrWVyMwWRtETLzkZuia9rjJgMBzrbthbc1rtvAQKjKZEBttPQc2cGPwVHSD5G6PMgIYGkAjnigAlTpBOlKziJaqfVhr6VJadwpHPu2i8Dr9zN9DW1pYSaDQaSbZvpqmHrRTr7yO+hbQuxrxumn7TQ6EzFvLWbRyFXq8XvatUKhHQWbZajPn7/k0zRw0rm9IyMCeYE8y5MGJPbYnYx+Pt+he8ru/GWZqYmPjrW4qp7gs0fsxEYmKD4SgMKzRiHHW6vMMkD4vEifcvMfvkrvgP6zKwFMps8uYumtcIBTa91s4VyDYTjQf8yypQ4lEKtZSR7xA7SZfLRR0dHWBBqcxs37hcXYH6uj3Qu18l1zunQHvfCyUwjMhNOyJjSvo1LYbJZCKr1Urjfh8ps7GUPfrhOf10msWkpYXH82+Ul5ejmfxoqdLNPxEk2InEfxM+js14/6uAgz+/roqCEU/thq+3Leu69hXlHshTS7mpCsFg8OpyZIfDIR4kI4IRwYhpCv8AX0MOITtZcjYAAAAASUVORK5CYII=";
var imgHTML5Maximize = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAB7CAAAewgFu0HU+AAACkElEQVR42nVTXUiTYRR+vrn5ky7LLMdskLHcZI4oKkrEcCaFlRTYIkFZlv1cZIFgQdAPpUUJC7LQm4Iuo7KILrwIEhpe7SIlMjIT+XLTYWNr5n7cd3rf1zmn4gODfeec55zn/LwAg2zfSdBoNPT7xlmCfLSYAi17SKJ5QIBbPT3tNNv7iJAwky0/i+TaYpKYF8jKIa1ODURnoeKUjCd9SK+sn+dzSmFhIQUu7SJ/k5kWbOQ9UUyv9m3+KCWqCEfGMxfigwPI25gr2JFeJ9RIQbTzMqQ0NWIFmcg8fQ+K/D2RLwU8U2zsK4UeNNB0o5lWBPCemX6w+iKrNFJjxLdgxLUjX1uG9ExhFD3xktOBW9L7cgOGg9Hu+oOV59WOayDveFKkv/0c1MyJ4b+RIZJ/MkoYNDKEeDBbBCgxgnSmaB0vUfGyzNCvsu4VjlzeRcNteBz7gba2tqRAo9FIct12mnnaQtHBfuJbEF3o9fpk0KTbRbMfeihwwUru6q3j4E7eu0qlEgGdJevFmH8d3hY+aVjbKDIsOBM7AHOCORdHPFBVJPbxfLf+Da87ceci+Xy+Jb/lmOm+QlOnTCQmNhyMwLBGI8ZRrcs5TvKoSBz/9BZzLx6K/0FdGpZDmUvc3FXzBqGgVq+t4wrkWhNNeT2rKlBiEQo0l9DEMXaSTqeTOjo6wIKSmdm+cb2iFDXVB6B3vUusd16B9rEbincUobt1CE0qK68pFSaTiWw2G015JkiZiybtkc+v6Y/DLCYtLT4edlmShJRPAYvFgibyoLlct/BEEGcnEvtH+DIZdmP5Lbe2ti5RwZ9fV2ne2EDVlh/3rZu6DhVkH8lRS9nJCn6//+ZqLdjtdvEgGRGMCEZcsYn/nFgG2tp3ugwAAAAASUVORK5CYII=";
var imgHTML5ToPlayer = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAB7CAAAewgFu0HU+AAACvUlEQVR42m2TW0hUURSG/6MDGaMjRBc17SHSSTO6qJUlvkjkJcsgdBISKZV6SHwosh6MLj4VkhiCFRiGRJpodhEkL5URRVOmaE2omc59kBrTnBmds9p7z6UpWrDOPmefb6+1zr/WkfS5cQRACmIXRDa/JtwYJBrL3gAYzxcRN3DG3NNJrqHndOUN29DuXT9tulNDpjnihyGIygEitoKfgM1mE3jTJ08IGM4W0nxtGdlL42niBw+al0CLkyOU0eYleAx9/nba2kxkL99BKffYemIzHqXFwA/wuKaGalpovy6cAeI4hwVg6XtMhqoSsp9KJlmW6fuxjVTcTfTewgBNjKroa06sk6eo6Cfq/kb0IDVafAJPIXnVwKFCHZ4eBJwFaok/r+3UCSgIwQpgeSja25PQqwcazulomUowwiTDGQ0piitB5imsWBUuNveMpOOtBoJSkH4ccDlAY8NwzyoF0NlailuJOnK5GYA5O9yt9eKF7AhByNGLcDfWozQRyH7oFdtqtZL+8Baary8XOk//JMrqCFDScLqALNpXtPCkgcp6iAYMnpcCaNsd3cuhm8NEaS1ETBMUxKjgA/w6+Gy/RoeSTcDQDDDKvGonkHwhXnzRkoswbnFh17OJPwd4AOPlk6Jfge4zXi9vC+8+L60xJcqfnbtCtETvieju78BS01VxPxsRLFYV81pvspmMUdyuNlALU6c6Fdi2mmktxumAmqxm038r4CYvOsVAGvPi/Ht8OLmSCu9UQP7wElgZiaVLx/+qIKxOC9k8IcqV3Z5K7n4G6gaBI3HsYTIn1iF+nY4mf3aryUgyU8xnzoE2uv/FM7/81wrUQOpOX/cuITwkySdqVr4OXS1qhLEK+ipHcU0LpEUBFbVq6aPFgX0vpjz9/dfCFFJoZoQyt0ZL5Jt92y+izDVKhCokZSAbWMFvQdYd/GD76UUAAAAASUVORK5CYII=";

if(!(cbu.getPrefs("CB.videoout.action")) || cbu.getPrefs("CB.videoout.action").length < 9) cbu.setPrefs("CB.videoout.action", "videotoplayer");
var tmp = '',
tmpp = '',
innerA = '<div style="display:block!important;color:#00ff00!important;width:250px!important;font:bold 16px serif!important;z-index:999!important;opacity:1!important;visibility: visible!important;',
innerB = 'left:5px!important;position:absolute!important;height:auto!important;box-sizing:border-box!important;padding:5px!important;margin:5px!important;',
stopPl = "javascript:(function(){v=document.getElementById('movie_player');if(v){v.stopVideo()}else{v=document.getElementsByTagName('video');if(v){v[0].src='';try{v[0].load()}catch(e){}};}})();",
ytIMGouter = function(ytID) {return '<div width="100%"><br /><a target="_blank" href="https://www.youtube.com/watch?v=' + ytID + '"><img src="https://i.ytimg.com/vi/' + ytID + '/hqdefault.jpg"></a><br />' + innerA + 'background-color:black!important;position:relative!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div><br /></div><br />'},
handlWin = function(currentWin) {
tmp = '';
var elem = currentWin.document.getElementsByTagName('video'), currLoc = currentWin.location;
if(elem.length > 0) {
if(currLoc.hostname.indexOf('youtu') != -1 && (tmp = currLoc.toString().match(YoutubeID)) && tmp[1].length == 11) {
play(cbu.getPrefs("CB.videoout.action") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
videoMovedbox = currentWin.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';
loadURI(stopPl);
currentWin.document.getElementById('eow-title').appendChild(videoMovedbox);
return true;
};
for(i = 0; i < elem.length; i++) {
if(((tmp = getSrc(elem[i].parentNode, currLoc)) && tmp.length > 2) || (i == 0 && currentWin.document.body.innerHTML.substring(0, 7) == '<video ' && (tmp = currLoc.toString()))) {
videoMovedbox = currentWin.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:20px!important;background-color:black!important;">' + videoMoved + '</div>';
play(tmp);                
if(currLoc.hostname == 'www.youtube.com') {
elem[i].parentNode.parentNode.appendChild(videoMovedbox);
} else {
elem[i].parentNode.appendChild(videoMovedbox);
};
elem[i].src = '';
try {
elem[i].load()
} catch(e) {};
return true;
}
}
};

currentWin._elems = currentWin.document.getElementsByTagName('iframe');
if(currentWin._elems.length > 0) {
for(currentWin._iCounter = 0; currentWin._iCounter < currentWin._elems.length; currentWin._iCounter++) {
if((currentWin._elems[currentWin._iCounter].src.indexOf('youtube.com') > -1) && (tmp = currentWin._elems[currentWin._iCounter].src.match(YoutubeID)) && (tmp[1].length == 11)) {
play(cbu.getPrefs("CB.videoout.action") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
currentWin._elems[currentWin._iCounter].outerHTML = ytIMGouter(tmp[1]);
return true;
};
if(currentWin._elems[currentWin._iCounter].clientWidth > 80 && currentWin._elems[currentWin._iCounter].clientHeight > 40 && handlWin(currentWin._elems[currentWin._iCounter].contentWindow))return true;
}
};

elem = currentWin.document.getElementsByTagName('object');
currLoc = currentWin.location;
if(elem.length == 0) {
elem = currentWin.document.getElementsByTagName('embed')
};
if(elem.length > 0) {
for(i = 0; i < elem.length; i++) {
if(elem[i].innerHTML.indexOf('youtu') != -1 && (tmp = elem[i].innerHTML.match(YoutubeID)) && tmp[1].length == 11) {
play(cbu.getPrefs("CB.videoout.action") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
elem[i].outerHTML = ytIMGouter(tmp[1]);
return true;
} else {
if(elem[i].clientWidth > 80 && elem[i].clientHeight > 40) {
if(((tmp = getSrc(elem[i].parentNode, currLoc)) || (tmp = getLink(elem[i], currLoc))) && tmp.length > 2) {
play(tmp);
elem[i].outerHTML = innerA + 'background-color:black!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div>';
return true;
};
};
}
};
};
return false;
};

this.onclick = this.oncontextmenu = e => {
if(e.button == 0) {
if(cbu.getPrefs("CB.videoout.action").substring(0,6) == "videom"){
elem = content.document.getElementsByTagName('object');
if(elem.length == 0) {
elem = content.document.getElementsByTagName('embed')
};

resizeObjs(elem);
resizeObjs(content.document.getElementsByTagName('iframe'));
resizeObjs(content.document.getElementsByTagName('video'));
} else {
if(!handlWin(content))custombuttons.alertSlide1(noFound);
}
};

if(e.button == 1)
gShowPopup(self);

if(e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) {
e.preventDefault();
menu.showPopup(self, -1, -1, "popup", "bottomleft", "topleft");
}
};

custombuttons.alertSlide1 = function(sTitle) {
var as = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);
as.showAlertNotification('chrome://global/skin/icons/information-16.png', "", sTitle, false, "", null);
setTimeout(() => as.closeAlert(), 999);
};

function resizeObjs(objs) {
if(!objs) return;
LEVELS = 3;
dir = (cbu.getPrefs("CB.videoout.action") == "videomaximize") ? 1 : -1;
for(i = 0; i < objs.length; i++) {
var Width = new Array(LEVELS)
var Height = new Array(LEVELS)
Width[0] = objs[i].clientWidth;
Height[0] = objs[i].clientHeight;
if((Width[0] > (-20 * dir + 100)) && (Height[0] > (-20 * dir + 60))) {
obj = objs[i];
for(var k = 1;
((k < LEVELS) && (obj.parentNode)); k++) {
obj = obj.parentNode
Width[k] = obj.clientWidth;
Height[k] = obj.clientHeight;
};
Width[0] = Width[0] + dir * (Width[0] / 5 | 0);
Height[0] = Height[0] + dir * (Height[0] / 5 | 0);
objs[i].style.width = Width[0] + "px";
objs[i].width = Width[0];
objs[i].style.height = Height[0] + "px";
objs[i].height = Height[0];
obj = objs[i];
for(var k = 1;
((k < LEVELS) && !(objs[i].tagName == 'IFRAME') && (obj.parentNode) && (Width[k]) && (Height[k]) && (Width[k] > (-20 * dir + 100)) && (Height[k] > (-20 * dir + 60))); k++) {
obj = obj.parentNode
Width[k] = Width[k] + dir * (Width[k] / 5 | 0);
Height[k] = Height[k] + dir * (Height[k] / 5 | 0);
obj.style.width = Width[k] + "px";
obj.width = Width[k];
obj.style.height = Height[k] + "px";
obj.height = Height[k];
}
}
};
};

function restProtHost(lnkR, curLoc) {
if(lnkR.length==0)return '';
let tr = lnkR.replace(/^:\/\//, curLoc.protocol + "//");
if(!tr.match(/^https?:\/\//i)){
lnkR = tr.replace(/^\/+/, '');
if(lnkR.split('/')[0].split('?')[0].split('#')[0].toLowerCase().match(/^(?:[-a-z\d]+\.)+[a-z\d]{2,6}$/)){
tr = curLoc.protocol + '//' + lnkR;
}else{
tr = curLoc.protocol + '//' + curLoc.host + "/" + lnkR;
}
};
return tr;
};

function getSrc(vobj, currentLoc) {
var t = '',
tt = '';
if((((t = vobj.innerHTML.match(/<video.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*))/i)) && (t) && (tt = t[1] || t[2] || t[3]) && tt.indexOf('blob:') == -1 ) || ((t = vobj.innerHTML.match(/<source.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*)).*?\stype=['"]?video\//i)) && (t) && (tt = t[1] || t[2] || t[3]))) && tt.length > 2 && tt.indexOf('blob:') == -1 ) {
if(tt.indexOf(".mp4/?") == -1) {
tt = tt.replace(/&amp;/g, "&")
};
t = restProtHost(tt, currentLoc);
return t;
};
return '';
};

function getLink(obj, curLocation) {


if(!obj || !obj.tagName) return '';
var flashvars = '',
//        src = '',
q = obj.tagName.toLowerCase();

var getParam = function(e, n) {
var v = '',
r = new RegExp('^(' + n + ')$', 'i'),
param = e.getElementsByTagName('param');
for(var igp = 0, p; p = param[igp]; igp++) {
if(p.hasAttribute('name') && p.getAttribute('name').match(r)) {
v = p.getAttribute('value');
break
};
};
return v;
};


if(q == 'object') {
//        src = obj.getAttribute('data') || obj.getAttribute('src') || getParam(obj, 'movie|data|src|code|filename|url') || (obj.getElementsByTagName('embed').length > 0 ? obj.getElementsByTagName('embed')[0].getAttribute('src') : '');
flashvars = getParam(obj, 'flashvars');
} else if(q == 'embed') {
//        src = obj.getAttribute('src');
flashvars = obj.getAttribute('flashvars');
} else return '';


if(!flashvars) return '';
//   src = restProtHost(src, curLocation);

var restPath = function(f, s) {
return(f.substring(0, 4) == 'http') ? f : s.replace(/[#?].*$/, '').replace(/[^\/]*$/, f)
};

function videoLinkExtract(fl) {
//alert(fl);
var linkArr = [],
outLinks = [],
jj = 0,
lba = '',
lbb = '',
decodeURL = function(s) {
try {
return decodeURIComponent(s)
} catch(e) {
return unescape(s)
}
};

for(var ij = 0; ij < 3; ij++) {
lba = lba + String.fromCharCode(parseInt((Math.random() * 15 + 1) + '', 10));
lbb = lbb + String.fromCharCode(parseInt((Math.random() * 15 + 16) + '', 10));
};

function pushWithMerit(lnk) {

var merit = -11;
if(lnk.match(/^https?:\/\//i)) merit = merit + 40;
if(outLinks.length == 0) merit = merit + 1;
if(lnk.match(/^\//)) merit = merit + 7;
if(lnk.match(/^\/\//)) merit = merit + 30;
if(lnk.match(/240p([^a-z]|$)/i)) merit = merit + 1;
if(lnk.match(/[^a-z]240([^a-z0-9]|$)/i)) merit = merit + 1;
if(lnk.match(/360p([^a-z]|$)/i)) merit = merit + 3;
if(lnk.match(/[^a-z]360([^a-z0-9]|$)/i)) merit = merit + 3;
if(lnk.match(/480p([^a-z]|$)/i)) merit = merit + 5;
if(lnk.match(/[^a-z]480([^a-z0-9]|$)/i)) merit = merit + 5;
if(lnk.match(/720p([^a-z]|$)/i)) merit = merit + 7;
if(lnk.match(/[^a-z]720([^a-z0-9]|$)/i)) merit = merit + 7;
if(lnk.match(/\.mp4([^a-z]|$)/i)) merit = merit + 8;
if(lnk.match(/_hd([^a-z]|$)/i)) merit = merit + 6;
if(lnk.match(/\.(jpg|xml)([^a-z]|$)/i)) merit = merit - 40;
if(merit > 0) outLinks.push(merit + lba + lnk);
Services.console.logStringMessage('merit:'+merit+' lnk->'+lnk);
};

linkArr.push(fl);
while(linkArr.length > jj && jj < 30) {

var testPaths = [];
testPaths = linkArr[jj].split(/(\.(?:flv|mp4|m3u8))/i);
if(testPaths[testPaths.length - 1] == '') testPaths.pop();

for(k = 1; k < testPaths.length; k = k + 2) {

if(testPaths[k - 1].indexOf(lba) > -1) {
pref = testPaths[k - 1];
} else {
var testAboutDom = testPaths[k - 1].toLowerCase().split(/(https?:\/\/)/); 
if(testAboutDom[testAboutDom.length - 1]=='') testAboutDom.pop();
var pTest = testAboutDom[testAboutDom.length - 1].split(/(\?[^\?]*?&)/);
if(pTest.length>2){
pTest.pop();
pTest.pop();
};
testAboutDom[testAboutDom.length - 1] = pTest.join('');
pref = testPaths[k - 1].substring(testAboutDom.join('').lastIndexOf("&") + 1);
};

t2 = pref.lastIndexOf(lbb);
if(t2 > -1) {
pref = pref.substring(t2 + 3);
} else {

t2 = pref.lastIndexOf('{"');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.lastIndexOf('["');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.lastIndexOf(',"');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.toLowerCase().lastIndexOf('"http://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf('"https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(',http://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(',https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(';http');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf('*https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(' or ');
if(t2 > -1) pref = pref.substring(t2 + 4);

pref = pref.substring(pref.split('/')[0].toLowerCase().split('%2f')[0].lastIndexOf('=') + 1);

}

if(pref.length > 0) {

if(pref.split('?')[0].toLowerCase().match(/%[2-3][0-9a-f]/)) {

t2 = pref.indexOf('"')
if(t2 > -1) pref = pref.substring(t2 + 1);
suff = testPaths[k + 1] ? testPaths[k + 1].split('&')[0].split('"')[0].split(';')[0].split(/,http/i)[0] : '';
if((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
if(testPaths.length > k + 1) {
testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
};
t2 = pref.lastIndexOf(lba);
if(t2 > -1) pref = pref.substring(t2 + 3)
linkArr.push(decodeURL(pref + testPaths[k] + suff));

} else {
testPaths[k + 1] = (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
}
} else {
suff = testPaths[k + 1] ? testPaths[k + 1].split(';')[0].split('"]')[0].split('"}')[0].split('",')[0].split(/,https?:\/\//i)[0].split('*https://')[0].split(' or ')[0] : '';
t2 = suff.indexOf('&');
if((t2 > -1) && (pref != testPaths[k - 1])) {
if(t2 == 0) suff = '';
if(suff.charAt(0) != '?') suff = suff.split(/(&[^&]+=https?:\/\/)/i)[0];
};
if((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
if(testPaths.length > k + 1) {
testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
};
t2 = pref.lastIndexOf(lba);
if(t2 > -1) pref = pref.substring(t2 + 3);
pushWithMerit(pref + testPaths[k] + suff);

} else {
testPaths[k + 1] = lba + (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
}
}
}
};
jj = jj + 1;
};

if(outLinks.length == 0) return '';
function srt(a, b) {
a = parseInt(a.substr(0, a.indexOf(lba)), 10);
b = parseInt(b.substr(0, b.indexOf(lba)), 10);
if(a < b) return 1;
if(a > b) return -1;
return 0
};
outLinks.sort(srt);
outLinks[0] = outLinks[0].substr(outLinks[0].indexOf(lba) + 3)
if(outLinks[0].indexOf('_hq.mp4/?time=') > 0) outLinks[0] = outLinks[0].replace(/&/g, '&amp;');
return outLinks[0];
};
ol = videoLinkExtract(flashvars);
if(!ol) return '';
//    ol = ol.replace(/^:?\/\//, curLocation.protocol + "//");
//    return restPath(ol, src);
return restProtHost(ol, curLocation);
};

var fflag = false;
AddonManager.getAddonsByTypes(["plugin"], function (addons) {
addons.forEach(function (addon) {
if (addon.name == "Shockwave Flash") {
if (addon.userDisabled == false) {
addon.userDisabled = false;
self.image = cbu.getPrefs("CB.videoout.action").substring(0,9) == "videotopl" ? imgFlashToPlayer : (cbu.getPrefs("CB.videoout.action") == "videominimize" ? imgFlashMinimize : imgFlashMaximize );
fflag = true;
} else addon.userDisabled = true;
}
});
});
if(!fflag){
self.image = cbu.getPrefs("CB.videoout.action").substring(0,9) == "videotopl" ? imgHTML5ToPlayer : (cbu.getPrefs("CB.videoout.action") == "videominimize" ? imgHTML5Minimize : imgHTML5Maximize );
};

function toggleFlash() {
var fflag = false;
AddonManager.getAddonsByTypes(["plugin"], function(addons) {
addons.some(function(addon) {
if(addon.name == "Shockwave Flash") {
if(addon.userDisabled == false || fflag) {
addon.userDisabled = true;
if(!fflag){
self.image = cbu.getPrefs("CB.videoout.action").substring(0,9) == "videotopl" ? imgHTML5ToPlayer : (cbu.getPrefs("CB.videoout.action") == "videominimize" ? imgHTML5Minimize : imgHTML5Maximize );
setTimeout(() => self.getElementsByTagName('menuitem')[0].setAttribute('checked', false), 10);
BrowserReload();
fflag = true;
};
} else {
addon.userDisabled = false;
self.image = cbu.getPrefs("CB.videoout.action").substring(0,9) == "videotopl" ? imgFlashToPlayer : (cbu.getPrefs("CB.videoout.action") == "videominimize" ? imgFlashMinimize : imgFlashMaximize );
setTimeout(() => self.getElementsByTagName('menuitem')[0].setAttribute('checked', true), 10);
BrowserReload();
return true;
}
};
return false;
});
});
}

var menu = self.appendChild(document.createElement("menupopup"));
self.image = "moz-icon://file://" + path;
var playerName = path.split("\\").pop().replace(".exe","");
self.label = "Открыть видео в " +sysPlayerName;
setTimeout(() => {
Menu_n_TooltipTxts.forEach((m) => {
if("separator" in m) {
menu.appendChild(document.createElement("menuseparator"));
return
};
var mItem = document.createElement("menuitem");
mItem.setAttribute("label", m.label);

if("radio" in m) {
mItem.setAttribute("type", "radio");
mItem.setAttribute('checked', cbu.getPrefs("CB.videoout.action") == m.value);
if(cbu.getPrefs("CB.videoout.action") == m.value) {
self.tooltipText = m.tooltipTxt;
}
mItem.onclick = () => {
cbu.setPrefs("CB.videoout.action", m.value);
tmp = (self.image == imgFlashToPlayer || self.image == imgFlashMinimize ||  self.image == imgFlashMaximize);
if(m.value.substring(0,9)=='videotopl'){
self.image = tmp ? imgFlashToPlayer : imgHTML5ToPlayer;
} else if(m.value=='videominimize') {
self.image = tmp ? imgFlashMinimize : imgHTML5Minimize;
} else self.image = tmp ? imgFlashMaximize : imgHTML5Maximize;
self.tooltipText = m.tooltipTxt;
};
}
if("checkbox" in m) {
mItem.setAttribute('type', 'checkbox');
mItem.setAttribute('checked', (self.image == imgFlashToPlayer || self.image == imgFlashMinimize ||  self.image == imgFlashMaximize ));
mItem.onclick = function(e) {
e.stopPropagation();
e.preventDefault();
if(e.button == 0) toggleFlash();
}
}
menu.appendChild(mItem);
});
menu.onclick = function(e) {
e.stopPropagation();
if(e.button > 0) e.preventDefault();
};
}, 100);
var contextMenu = document.getElementById("contentAreaContextMenu"); 
var menuitem = contextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-sep-open"));
menuitem.setAttribute("label", "Открыть в " +sysPlayerName);      
menuitem.setAttribute("class", "menuitem-iconic");
menuitem.setAttribute("image", "moz-icon://file://" + path); 
menuitem.onclick = () => play(gContextMenu.linkURL);
addEventListener("popupshowing", ()=> menuitem.hidden = !gContextMenu.onLink, false, contextMenu);
addDestructor(()=> menuitem.remove() );
var contextMenu = document.getElementById("contentAreaContextMenu");
var mItem = contextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-copyvideourl"));
mItem.setAttribute("label", openIn);
mItem.onclick = () => {
var vurl = gContextMenu.mediaURL, videoelem = gContextMenu.target;
if(videoelem && videoelem.nodeName.toLowerCase() == 'video') {
if(content.location.hostname.indexOf('youtu') != -1 && (tmp = content.location.toString().match(YoutubeID)) && tmp[1].length == 11) {
play(vurl);
videoMovedbox = content.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';
loadURI(stopPl);
content.document.getElementById('eow-title').appendChild(videoMovedbox);
return;
};

if(content.location.hostname == 'www.youtube.com') {
videoelem.parentNode.parentNode.appendChild(videoMovedbox);
} else {
var inFrameHref = inFrameWin.location.href, found = false;
if(inFrameWin.location.hostname == 'www.youtube.com' && (tmp = inFrameHref.match(YoutubeID)) && tmp[1].length == 11){//и значит во фрейме
elem = inFrameWin.parent.document.getElementsByTagName('iframe');
if(elem.length > 0) {
for(i = 0; i < elem.length; i++) {
if(elem[i].contentWindow == inFrameWin) {
elem[i].outerHTML = ytIMGouter(tmp[1]);
found = true;
break;
};
};
};
if(!found)inFrameWin.document.body.innerHTML = ytIMGouter(tmp[1]);
return;
};
videoelem.parentNode.appendChild(videoMovedbox);
};
videoelem.src = '';
try {
videoelem.load()
} catch(e) {};
} else play(vurl);
};


addEventListener("popupshowing", () => {
mItem.hidden = !gContextMenu.onVideo || !gContextMenu.mediaURL;
mItem2.hidden = !gContextMenu.linkURL;
mItem3.hidden = framItem.hidden || gContextMenu.target.ownerDocument.location.hostname.indexOf('youtube.com') == -1;
}, false, contextMenu);
addDestructor(() => {mItem.remove();mItem2.remove();mItem3.remove()});

function play(link) {
var file = Services.dirsvc.get('CurProcD', Ci.nsIFile);
var MozExeDir = file.path.split('\\').slice(0,-1).join('\\');
file.initWithPath(path);
if(!file.exists()) {
custombuttons.alertBox("File not found!", MozExeDir + Path);
return;
};
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(file);
process.run(false, [link, cbu.getPrefs("CB.videoout.action") == "videotoplaylist" ? addToPlaylistKey : ""], 2);
};

drage2
И что это?

bunda1
Кнопка видео , плеер не запускается без ссылки на видео...Еще бы убрать из контекста культурно , место занимает....Я убираю, так кнопка бледнеет....
Да, и еще , к чертям меню через ПКМ , а просто в плейлист....

drage2 пишет

....

вообще всё сломалось :angry: я чего то накосячил в старом  коде кнопки
помню ,что в контекстном меню кнопки были функции увеличить/уменьшить видео,мне они не нужны ,но просто это запомнилось.
новый вариант  не работает (как то не правильно передаёт параметр/ссылку в плеер,поэтому он падает с ошибкой
а старый код я не сохранил. (дайте пожалуйста исходный/старый вариант ?

drage2 пишет

Видео в PotPlayer, але в MPC-Be ...

в 58 не работает. Пытается открыть везде кроме ютуба. :D

mssign
Исправлено.... Только проверял!
Кроме того , как дополнение к кнопке скрипт
https://greasyfork.org/ru/scripts/18671-inject2download
Violentmonkey и всё!!! HLS поток(ts) , сайты с МР4 в исключения. Ссылки кидаются в плеер через контекст.
До 56 версии FF можно и Greasemonkey

Я так понимаю, что в кнопке ключ нельзя прописать? Типа:
C:\PotPlayer\PotPlayer.exe /urldlg
Может батник можно?
Не надо батника
Горячая кнопка любая ....Теперь ссылка из буфера сразу запускается в плеере!!!
/*CODE*/ 
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath('C:\\PotPlayer\\PotPlayer.exe');
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
var link = gClipboard.read();
var args = [link,"/autoplay"];
process.init( file );
process.run( false, args, args.length );

А почему в Firefox 52 все кнопки перестали работать я ничего не делал

Milоrdaп пишет

А почему в Firefox 52 все кнопки перестали работать я ничего не делал

Так не бывает что ничего не делал. Может попробуй переустановить Сustom Buttons и кнопки заработают а может и нет.

Milоrdaп пишет

А почему в Firefox 52 все кнопки перестали работать я ничего не делал

52 вообще-то довольно стабильная версия. На ней ESR-ветка висит.
Да и не успели в ней СВ сильно поломать, большинство кнопок работало.
Если не секрет, с какой версии обновляли? Не с 38?

Есть таая строка oncommand = goDoCommand('downloadsCmd_clearDownloads')

Пробовал ее в кнопку засунуть. Вот так

Выделить код

Код:

this.onclick = function(e) {
    if ( e.button == 0 ) {
         goDoCommand('downloadsCmd_clearDownloads');
         }
};

По клику должно очищать список загрузок, но не очищает.
Как сделать правильно?

У меня до сих пор исправно работала кнопка Find.
Браузер обновился до 47 версии и теперь в консоли ошибка TypeError: Constructor MutationObserver requires 'new'
Ругается на этот блок кода

Выделить код

Код:

const observer = MutationObserver(onFindbar);
observer.observe(gFindBar, { attributes: true, attributesFilter: ["hidden"] });
addDestructor(function() observer.disconnect());

а конкретно на первую строчку const observer = MutationObserver(onFindbar)

Что изменилось в 47 версии и что можно сделать?

Средствами [firefox] очищать историю загрузок отдельно от истории посещений при перезапуске браузера, увы, нельзя. А можно ли такую кнопку сделать, которая будет нажимать Очистить загрузки (на скриншоте) при перезапуске? Ну или просто очищать историю загрузок при нажатии на неё (новую кнопку), всё ближе будет, если она на панели. Сотворите, пожалуйста. Спасибо ;)

20857847_s.png

Viatcheslav пишет

Средствами [firefox] очищать историю загрузок отдельно от истории посещений при перезапуске браузера, увы, нельзя. А можно ли такую кнопку сделать, которая будет нажимать Очистить загрузки (на скриншоте) при перезапуске? Ну или просто очищать историю загрузок при нажатии на неё (новую кнопку), всё ближе будет, если она на панели. Сотворите, пожалуйста. Спасибо ;)

http://images.vfl.ru/ii/1520417284/07a8 … 7847_s.png

В каком-то из сборок видел аддон, который сам очищает, вот ссылка forum.ru-board.com/topic.cgi?forum=2&to … start=1620 на сборки.
И да пока тебе реально помогут, на тебя снизойдет озарение.

Viatcheslav пишет

Средствами  очищать историю загрузок отдельно от истории посещений при перезапуске браузера, увы, нельзя. А можно ли такую кнопку сделать, которая будет нажимать Очистить загрузки (на скриншоте) при перезапуске? Ну или просто очищать историю загрузок при нажатии на неё (новую кнопку), всё ближе будет, если она на панели. Сотворите, пожалуйста. Спасибо

Download Panel Tweaker, настройка встроенной панели загрузок | Форум Mozilla Россия
В настройках есть пункт "Очищать загрузки средним кликом по панели загрузок" или в контекстном меню панели загрузок "Очистить загрузки"

Gladius333 пишет

В каком-то из сборок видел аддон, который сам очищает

Спасибо, но устанавливать ещё одно расширение из-за одной только чистки истории загрузок - не лучший вариант. Да, знаю, таких достаточно, например, Clear Browsing Data, но в нём

Clearing downloads only removes them from the current session, downloads from previous sessions can be removed by clearing the history


SendInfo пишет

Download Panel Tweaker, настройка встроенной панели загрузок

Спасибо. Про установку расширений, тем более несовместимых (устаревших), ради одной фишки - нет, не годится

В кнопке "Очистить загрузки" есть команда oncommand = goDoCommand('downloadsCmd_clearDownloads')
Ее как-то можно подвесить в СВ кнопке на клик мыши типа this.onclick = function(e)
Но как это сделать у меня идей нет, не спец я в этом.

Ultima2m пишет

В кнопке "Очистить загрузки" есть команда oncommand = goDoCommand('downloadsCmd_clearDownloads')Ее как-то можно подвесить в СВ кнопке на клик мыши типа this.onclick = function(e)Но как это сделать у меня идей нет, не спец я в этом.

В секцию "Код"

Выделить код

Код:

goDoCommand('downloadsCmd_clearDownloads')

и левой кнопкой мыши при открытых "Загрузки"
Но смысл? В "Загрузки" своя кнопка "Очистить загрузки" есть.

Viatcheslav пишет

Спасибо. Про установку расширений, тем более несовместимых (устаревших), ради одной фишки - нет, не годится

Нет. Посмотреть как сделано. И перенести подходящее в кнопку.

SendInfo пишет

Посмотреть как сделано. И перенести подходящее в кнопку

Увы, я в этом совсем не силён :blush: Если у Вас есть хоть какой-то опыт и немного желания - помогите, пожалуйста ;)

Viatcheslav
В секцию "Код"

Выделить код

Код:

var global = Components.utils.import("resource:///modules/DownloadsCommon.jsm", {});
if(global.DownloadsData && global.DownloadsData.removeFinished) {global.DownloadsData.removeFinished();}
if(global.PrivateDownloadsData && global.PrivateDownloadsData.removeFinished) {global.PrivateDownloadsData.removeFinished();}
Components.classes["@mozilla.org/browser/download-history;1"]
.getService(Components.interfaces.nsIDownloadHistory)
.removeAllDownloads();

У меня в[firefox]42 очищает загрузки

SendInfo пишет

У меня в[firefox]42 очищает загрузки

Спасибо, в 58 тоже работает.

SendInfo пишет
Выделить код

Код:

var global = Components.utils.import("resource:///modules/DownloadsCommon.jsm", {});
if(global.DownloadsData && global.DownloadsData.removeFinished) {global.DownloadsData.removeFinished();}
if(global.PrivateDownloadsData && global.PrivateDownloadsData.removeFinished) {global.PrivateDownloadsData.removeFinished();}
Components.classes["@mozilla.org/browser/download-history;1"]
.getService(Components.interfaces.nsIDownloadHistory)
.removeAllDownloads();

Отлично :beer: Большое спасибо ;)

В FF59 перестала работать кнопка Autocopy+3. Можно ли восстановить ее работоспособность?

открыть изображение в новой вкладке? Кнопка есть, не не берет canvas/

Выделить код

Код:

/*Initialization Code*/    
function open_imgnewtab() {
              var address = gContextMenu.imageURL||gContextMenu.mediaURL;
        var newTab = gBrowser.addTab(address);
        gBrowser.selectedTab = newTab;
}

 
var contextMenu = document.getElementById("contentAreaContextMenu");
 
var menuId = "imgnewtab-open";
var menuItem = document.getElementById(menuId);
if (menuItem) {
     
    contextMenu.removeChild(menuItem);
};
 
menuItem = document.createElement("menuitem");
menuItem.setAttribute("id", menuId);
menuItem.setAttribute("label", "Открыть изображение");
menuItem.setAttribute("class", "menuitem-iconic");
menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC/UlEQVR4Xp3RfUyUBRzA8e9zzz3HHd4BJ4eLF9G4CxCmuM5jatop1oSgurCYFM60NVvaen/RFWVtyZprsv5isf4gY/MllNabpajtINzZDb2GBCKSvByEetZx3HHPPU/eIucaa6vP9vvz+/v98WM2z9lIeLO8sOjtR5c++95jS1/Z5rSusaeTyG2Wv+C7J93+koV/EHZVLCo7WLf+9Hctm6cnfqlTz3a2qoeaW+UPX605udaWZAV4oG5i0ZInT3i0afZVAjPsINVsKXotvyxj17i1IDEBA3aTxA/dW/FPZrI23636WupPvb//YqVtc2uDt6153nX37i1aZmzdVrCzypVZ+ymT4pExDwWSmZJkB+cvyfSNT5GdkiisLl+9avHFwp2Do/7yG72n9kDErwF4y5XldFlT30hBFpeIGsITPfT+dg69JkaVw8MTKzxsXDeMyZIiCVnOZ670eseVa56TQFjrXIC+IlvafYffYuBnI8UrRvlx+UMoOhNaDay8a4SVhklQk+noS2YoaDTduNx+CPn6BQBt5Zr0whwbxeoHx4ikG9FtXIZIFFFQQImBIoMs80dkis+9eQz0+gLq6PFWIACgybDoHOaFoiFaZCD6oAUpSQOxeBj9a2IyKDJHO3T0+wUCgx1upsfOAiqANtlsTBWVCMqmNJIsZpD08SB+/VYcCk5x4sKdXOrpnmLk+EFgjBkadHMiqpiAqFc403Wtv+nIwMeR6emYosRQAFWN0XVeoCRHUOcG2zsID7gBhRmaoat4Q/r50XAkKp/2Xq2VQoGGSDCoHPvG19584MzeL7/wdl75PS/W5+sMhX79+gAwxO3iX/ip6eGWsLsy1tNY9Nnwfse57k+KL5cuNmQBwus73nn58GGP4nI91QbYmE2102hp+6ikafDbTYGRrzaEG5/PexcQGu9Lzai/P79/T/WGyezs3O2AxL/QPr4sIecRe+LdC0AP8P3TuS8erbEp+8oyuoBC/qu60syshuqFtdvvnVcLmPiftDOxwCz+BPiNM36XpsjoAAAAAElFTkSuQmCC"); 
menuItem.addEventListener("command", open_imgnewtab, false);
contextMenu.insertBefore(menuItem, document.getElementById("context-viewimage"));
 
contextMenu.addEventListener("popupshowing", setMenuDisplay, false);
 function setMenuDisplay(aEvent) {
                 if (gContextMenu.imageURL||gContextMenu.mediaURL)
                 {
                 document.getElementById("imgnewtab-open").hidden = false;
                 }
                 else
                 document.getElementById("imgnewtab-open").hidden = true;
                 
}

А, просто код нельзя? Для дефолтного пункта?Типа: кнопка HOME?

Выделить код

Код:

/*Initialization Code*/
try {  
    document.getElementById("home-button").setAttribute("onclick", "event.stopPropagation(); if (event.button == '0') { ( (Application.prefs.getValue('browser.startup.homepage', 0)).split('|') ).forEach(function(url) { getBrowser().selectedTab = getBrowser().addTab( url ) }) }");
}
catch(e) { };
drage2 пишет

А, просто код нельзя? Для дефолтного пункта?Типа: кнопка HOME?

Выделить код

Код:

/*Initialization Code*/

try {
  document.getElementById("context-viewimage").setAttribute("onclick", "gBrowser.selectedTab = gBrowser.addTab(checkForMiddleClick(this, event))");
}
catch(e) { };

unter_officer
Круто, без речи. Жаль в SM открывает пустую вкладку....Может, кто знает. что не так с этим браузером?
Кстати, а нечто подобное, нельзя к закладкам применить?

unter_officer пишет

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

Выделить код

Код:

/*Initialization Code*/
try {
   document.getElementById("context-viewimage").setAttribute("onclick", "gBrowser.selectedTab = gBrowser.addTab(checkForMiddleClick(this, event))");
 }
 catch(e) { };

Парни, а что должна делать сия кнопа? Пробовал устанавливать - чё-то не разобрался :blush:

Viatcheslav
открыть изображение в новой вкладке

drage2 пишет

открыть изображение в новой вкладке

Спасибо, дошло :) Если по картинке ПКМ -> Открыть изображение, то без кнопки картинка открывалась прямо в этой вкладке, а теперь - в новой, так на самом деле удобнее :cool:

Специально для этого код писать? эта как копировать ссылки, когда все это можно через ctrl или alt, мне так удобнее, нечасто пользуюсь.
Может и удобно кто часто пользуется... мне не понять.

В ff60 перестала работать кнопка Видео в плейер. Возможно ли восстановить ее работоспособность?
Без мультипроцесса слава богу заработала)

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

ARG пишет

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

Вроде нету такой кнопки.

Совсем забыл, что в самих лисьеподобных, в меню Журнала, есть функция восстановления последней сессии. Но есть один минус - такой пункт есть в меню, но нет такой кнопки. Можно как то реализовать кнопку копирующую пункт меню?

ARG пишет

Совсем забыл, что в самих лисьеподобных, в меню Журнала, есть функция восстановления последней сессии. Но есть один минус - такой пункт есть в меню, но нет такой кнопки. Можно как то реализовать кнопку копирующую пункт меню?

:/ может:

Выделить код

Код:

restoreLastSession();

или

Выделить код

Код:

goDoCommand("Browser:RestoreLastSession");
bunda1 пишет

:/ может:

Работает, спасибо! А второй нет.

Нужна кнопка типа Tabclick, т.к. Tabmix приказал долго жить. Особенно убивает дв.клик по панели вкладок...Раньше закрывал этим все вкладки, теперь окно клацает.
На Ru.board ,бесполезно спрашивать.....

drage2 пишет

окно клацает

Стиль хоть пытался регистрировать?

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

Выделить код

Код:

#TabsToolbar {
    -moz-window-dragging: no-drag !important;
}

Dumby
Респект! Еще бы кнопочку - дв.кликом по панели закрыть все вкладки ....

drage2
Не, такие вещи надо делать самому и под себя.
Я же не в курсе твоих предпочтений, и не знаю как у тебя обустроен тулбар.

Ну вот, например, чисто от балды

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

Выделить код

Код:

(selectors => addEventListener("dblclick", e => {
    if (
        e.button || e.ctrlKey || e.shiftKey || e.altKey
        || !e.originalTarget.matches(selectors)
    )
        return;
    var hbuTabs = [], param = {animate: false};
    gBrowser.selectedTab = gBrowser.tabs[0];
    for(var tab of gBrowser.visibleTabs.reverse())
        //if (tab.pinned) break; else
        gBrowser._hasBeforeUnload(tab)
            ? hbuTabs.push(tab)
            : gBrowser.removeTab(tab, param);
    for(tab of hbuTabs)
        gBrowser.removeTab(tab, param);
}, false, document.getElementById("TabsToolbar") || 1))("" + [

    "#tabbrowser-tabs [class*=scrollbox]",
    "#TabsToolbar > toolbarspring",
    "#TabsToolbar",
]);

Dumby
Вкладки убирает, но и окно сворачивает

Garalf
Значит у тебя со стилем что-то не так.

Кстати, сейчас попробовал следующим образом:
выключил стиль и разместил после строки, где return; строку e.preventDefault();
Разворачивание/нормализация — не происходит, перетаскивание окна — происходит.

Dumby
Шикарно!   Еще бы дв.клик по вкладе....Что бы она одна осталась активной. И TMP  нервно курит....

Dumby пишет

выключил стиль и разместил после строки, где return; строку e.preventDefault();

А вот так нормально. Спасибо.
Dumby
И еще вопрос. Не работают костыли в сборке FF61b4. Использовал последний config.js из твоего поста и custom_buttons-0.0.5.8.9-fixed8.
Причины у меня?

Garalf
Забудь уже за config.js, разрабы тоже не дремлют, все проще можно....

Garalf пишет

И еще вопрос. Не работают костыли в сборке FF61b4. Использовал последний config.js из твоего поста и custom_buttons-0.0.5.8.9-fixed8.
Причины у меня?

Нет, костыли, надеюсь, работают и в сборке FF61b4, и в сегодняшней Nightly.
И нет, ни в коем случае, причины не у тебя. Причины совсем в другом.

скрытый текст
Костыли всего-лишь навсего снимают некий искусственный принципиальный
запрет на установку и невыключение неподписанных и Legacy расширений.

Этот запрет существует для официальных Release и Beta сборок,
и не существует для официальных Nightly, Developer и «Unbraindead» билдов.

Шестьдесят первая версия ознаменовалась эпическим эпизодом
документального сериала «Firefox Quantum. История предательства.»
А именно: лисице вырезали сердце — поддержку оверлейных расширений.

chrome.manifest для оверлейных расширений игнорируется.
Директива overlay не исполняется.
Это заложено в тёмных глубинах С++ кода, и никакой
конфиг-неконфиг.js ничего с этим поделать не сможет.

custom_buttons-0.0.5.8.9-fixed8 является оверлейным расширением,
таким образом, на Firefox выше версии 60 работать не может в принципе.

Официальной версии Custom Buttons для Firefox 61 пока(?) нет.

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

Инструкция по установке:
1. Сохранить картинку из поста.
2. Открыть сохранённую картинку в архиваторе.
    (например, перетащить её из Проводника на ярлык 7-Zip File Manager (7zFM.exe))
3. Извлечь custom_buttons-0.0.5.9.0.0-fx.xpi
4. Со страницы about:addons установить дополнение из файла.

Важно: это фейковый bootstrap, поэтому, как и раньше,
после операций установки/удаления и включения/выключения
по-прежнему требуется рестарт.

Dumby
Да, так CB установилось и кнопки работают. Пока живем)
Ну раз пошла такая пьянка, Dumby еще одна просьба. Можно ли восстановить работоспособность кнопки Autocopy+3 в FF60+

скрытый текст
// Autocopy+3 от 05-05-2015.

// Настройка функций кликов мыши для кнопки ................................
this.onclick = this.oncontextmenu = e => {
   if ( e.button == 0 ) cbu.setPrefs("Autocopy", !cbu.getPrefs("Autocopy") );
       
   if ( e.button == 2 ) {
        e.preventDefault(); 
        menuPopup.showPopup( this, -1, -1, "popup", "bottomleft", "topleft");
        }     
};



// Проверить наличие строк в 'about:config' и создать если не существует ................................
if ( !cbu.isPref("Autocopy.saveWithDoubleClick") ) {
     ["Autocopy", "Autocopy.reset", "Autocopy.selectingTextBlink", "Autocopy.selectWithDoubleClick",
      "Autocopy.copyWithDoubleClick", "Autocopy.saveWithDoubleClick"].forEach(function(pref) { cbu.setPrefs( pref, false ) });
};



// Создать меню ................................
var array = [
    { label: 'Выключать автокопирование при выходе из браузера', value: 'Autocopy.reset' },
    { label: 'Выделенный текст мигает при автокопировании', value: 'Autocopy.selectingTextBlink' },
    { separator: ''},
    { label: 'Двойной правый клик мыши копирует выделенный текст', value: 'Autocopy.copyWithDoubleClick' },
    { label: 'Двойной левый клик мыши выделяет все в текстовых полях', value: 'Autocopy.selectWithDoubleClick' },
    { label: 'Двойной правый клик мыши сохраняет изображение без запроса', value: 'Autocopy.saveWithDoubleClick' },
    { label: 'Средним кликом вставлятъ текст с заменой выделенного текста', value: 'middlemouse.paste' }
];

var menuPopup = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m ) {
    if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
    var mItem = document.createElement("menuitem");
    mItem.setAttribute("label", m.label);
    mItem.setAttribute('type', 'checkbox');
    mItem.setAttribute('checked', custombuttons.getPrefs( m.value ) );
    mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))'); 
    menuPopup.appendChild( mItem );
});
menuPopup.setAttribute("onclick", "event.stopPropagation()");

// добавить стандартное контекстное меню ....
menuPopup.appendChild( document.createElement("menuseparator") );
menuPopup.appendChild( document.createElement("menu") ).setAttribute("label", "Меню кнопки");
var clone = menuPopup.lastChild.appendChild( document.getElementById("custombuttons-contextpopup").cloneNode(true) );
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')");



// Установить нужную иконку кнопки при старте браузера или при изменениях настроек в 'about:config' ................................
const s = "Autocopy";
function toggleImage() { 
    self.image = cbu.getPrefs(s)
    ? "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
    : "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
}; 
toggleImage();
gPrefService.addObserver( s, toggleImage, false );
addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) }); 



// Выключать кнопку при закрытии браузера если это разрешено в 'about:config' ................................
var turnOffButton = {
    observe: function(subject, topic, data) {
       if ( cbu.getPrefs("Autocopy.reset") && data == "shutdown" ) cbu.setPrefs("Autocopy", false ); 
    }
};
Services.obs.addObserver( turnOffButton, "quit-application", false);
addDestructor(function() { Services.obs.addObserver( turnOffButton, "quit-application", false ) }); 



// Функции автоматически копирует выделенный текст на странице, если это разрешено в 'about:config' ................................
({
        PREF_ROOT: "autocopy",
        init: function() {
                cbu.isPref(this.PREF_ROOT, true);
                gPrefService.addObserver(this.PREF_ROOT, this, false);
                addDestructor(()=> gPrefService.removeObserver(this.PREF_ROOT, this));
                if (!gPrefService.getBoolPref(this.PREF_ROOT)) return;
                this.setAutocopy(true);
        },
        observe: function(subj, topic, data) {
                if (data == this.PREF_ROOT)
                this.setAutocopy(gPrefService.getBoolPref(data));
        },
        setAutocopy: function(set) {
                var method = set ? addEventListener : removeEventListener;
                for(var type of ["mousedown", "mouseup"]) method(type, this, false, gBrowser);
        },
        handleEvent: function(e) {
                if (e.button || e.target instanceof Ci.nsIDOMNSEditableElement) return;
                var win = e.target.ownerDocument.defaultView;
                if (win.top != content) return;
                var sel = win.getSelection().toString();
                if (e.type == "mousedown") {this.sel = sel; return;}
                if (!sel || sel == this.sel) return;
                goDoCommand("cmd_copy");
        }
}).init();




// Cредней кнопкой мыши вставить текст из буфера обмена в текстовые поля с заменой выделенного текста ................................
function middleMousePaste(e) {
    if ( e.button == 1 && cbu.getPrefs('middlemouse.paste') ) {

         if ( /input|password|textarea|textbox|searchbar|findbar|cbeditor/.test( e.target.localName.toLowerCase() )
              && document.commandDispatcher.getControllerForCommand("cmd_paste") ) {
     
              e.preventDefault();
              e.stopPropagation();
               
              // вставить текст ....
              var cmd = "cmd_insertText";
              var commandDispatcher = ( this.document || document ).commandDispatcher;
              var controller = commandDispatcher.getControllerForCommand(cmd);
 
              if ( controller && controller.isCommandEnabled(cmd) ) {
                   controller = controller.QueryInterface(Components.interfaces.nsICommandController);
                   var params = Components.classes["@mozilla.org/embedcomp/command-params;1"]
                                          .createInstance(Components.interfaces.nsICommandParams);
                   params.setStringValue("state_data", gClipboard.read() );   
                   controller.doCommandWithParams(cmd, params);
                   }
              }             
         }
};
addEventListener("click", middleMousePaste, true, document.documentElement );




   
   
// Дополнительные возможности для двойного клика мыши, если это разрешено в 'about:config' ................................
function handleDblClick(e) {

  var node = e.target;
  var editor = node.editor;
 
  // выделить все в текстовых полях ....
  if ( e.button == 0 && custombuttons.getPrefs("Autocopy.selectWithDoubleClick") ) {   
       e.preventDefault();

       if ( /input|textbox|textarea/.test( node.localName ) ) !editor ? node.select() : editor.selectAll();
       }
           
  // сохранить изображение без запроса ....   
  if ( e.button == 2 && cbu.getPrefs("Autocopy.saveWithDoubleClick") && node.localName == 'img' ) {
       saveImageURL( gContextMenu.imageURL, 0, 0, 0, 1, null, content.document );
       setTimeout(function() { document.getElementById("contentAreaContextMenu").hidePopup() }, 20);
       }     
       
  // скопировать выделенный текст ....
  if ( e.button == 2 && cbu.getPrefs("Autocopy.copyWithDoubleClick") && !/findbar|tabbrowser/.test( node.localName ) ) {
       e.preventDefault();
       !editor ? goDoCommand("cmd_copy") : editor.copy();       
       try {       
           var box = ( node.textbox || node ).inputField.parentNode;
           var popup = box.ownerDocument.getAnonymousElementByAttribute( box, "anonid", "input-box-contextmenu");
           setTimeout(function() popup.hidePopup(), 50);
           }
       catch(e) { document.getElementById("contentAreaContextMenu").hidePopup() };
       }       
};
addEventListener("dblclick", handleDblClick, false, gBrowser );



// Наблюдатель следит за открытием окон адреса которых указанны в коде и добавляет им обработчики ................................
var observer = { 
       observe: function(subject, topic, data) {
          subject.addEventListener("load", this, false);
          },
     
       handleEvent: function(e) {
          var doc = e.target;
          var win = doc.defaultView;
          var href = doc.location.href;
          win.removeEventListener("load", this, false);
         
          // закрывать 'Информацию о странице' или 'Библиотеку' двойным кликом на ней ....           
          if ( /pageInfo.xul|places.xul/.test( href ) ) {
         
               win.addEventListener("dblclick", function close() { this.close() }, true);
                         
               win.addEventListener("unload", function(e) {
                   win.removeEventListener(e.type, arguments.callee, false);
                             
                   win.removeEventListener("dblclick", close, true);
                   }, false);                 
               };
   
          // добавлять и удалять обработчики клика для редактора Custom Buttons ....
          if ( href.substring(0, 41) == "chrome://custombuttons/content/editor.xul" ) {

               win.addEventListener("click", middleMousePaste, true );
               win.addEventListener("dblclick", handleDblClick, false );
         
               win.addEventListener("unload", function(e) {
                   win.removeEventListener(e.type, arguments.callee, false );
         
                   win.removeEventListener("click", middleMousePaste, true );
                   win.removeEventListener("dblclick", handleDblClick, false );
                   }, false);
               };
      }
};
Services.obs.addObserver(observer, "domwindowopened", false);
addDestructor(function() { Services.obs.removeObserver(observer, "domwindowopened", false) });


// Подсказка для кнопки ................................
this.tooltipText = "Autocopy \nЛ: Переключить автоматическое ко

Garalf пишет

Можно ли восстановить работоспособность кнопки Autocopy+3 в FF60+

вот да, волшебно бы было. можно даже в просто 60 без плюсика ибо ЕСР. :blush:

В FF 60 - настройка кнопки: вместо F2 - unknown_113 ? Парит реально , где поганка зарыта?

Простое переключение в about:config , типа false- true , делаю, но раньше проще было. Теперь вторую иконку прописывать надо....

PlacesUtils.history.clear(); Очистить историю , а надо "очистить историю закрытых вкладок"

Нужен дв.клик по вкладке - закрыть остальные! ...Есть креативщики?

Garalf пишет

Можно ли восстановить работоспособность кнопки Autocopy+3 в FF60+

Не, «+3», для меня слишком заморочно.
Решил попытаться просто Autocopy сделать, так не уверен,
что пригодно к использованию получилось.
Впрочем, можешь попробовать

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EAutocopy%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAgEAAcHBAAIBwQACAcEAAgHBAAIBwQACAcEAAgHBAAIBwQACAQDAQEAAAAAAAAAAAAAAAADAgADAAAAACcVAB+qXAC3vGsB4LlqAd26agHeumoB3rpqAd66agHeumoB3rhoAN26agHgs2IAxTceAC8AAAAAAAEAAAIBAAQAAAQAoFcApv2zVv/+1qn8/9Of///Uov//1KL//9Si///Uov//1KL//9en//7Vpfz9t2L/tGMAvwEAAQAAAAAAKBUAH6FXAKnPcgD12IYf/dyMJ/3biiP924sk/duLJf3biyX924sm/dqJIv3im0P9/du1/P7Xqv+7agHdCQUACAAAAQCrXgCz+69R//TFj/vxvn//8r5///K+gP/yvoD/8r6A//K+f//yvX7/9MKH/9yMKv/inkv9/960/7loAN0HAwAICQUACLxrAdz91af//+LB/f/fu///4b///+G////hv///4b///+G///7fu///58n/8cOK/9qMK/3/4Lr/umoC3gcDAAgHBAAIuWoC3f/Vpf/+4MD9/t67//7fvv/+4L///uC///7gv//+377//t26///kxv/xwYb/248t/f/kw/+6agPeBwMACAcEAAi6agLe/9qw///oz/3/5cr//+fN///nzv//587//+fO///nzf/+5cj//+zW//LFj//bkC/9/+nN/7pqA94HAwAIBwQACLpqAt7/37n//+7c/f/r1v//7dn//+3a///t2v//7dr//+3Z//7q1f//8uP/8siW/9uQMf3/7NX/umoE3gcDAAgHBAAIumoC3v/jwf//8+j9//Dh///y5P//8+X///Pl///z5f//8uT//vDg///47v/yy53/25Ey/f/w3P+6awTeBwMACAcEAAi6agLe/+bJ///48v3/9er///bt///37v//9+////fu///27f/+9On///34//LOo//bkTL9//Hf/7lqBd0HAwAIBwQACLpqAt7/6c////z6/f/48f//+vT///r1///69f//+vX///r0//738P//////8dGo/9uTNf3/9Of/vGsE3AkEAAgHBAAIuWkC3f/q0f///v79//r0///79////Pj///z4///8+P//+/f//vn0///////y06z/2Iso+/3Def+rXQCzAAACAAkFAAi7agHd/u3a//////z//v39/////f////3////9/////f////3+/fz9/////fPcvv7QbwD1oVYCqScVAB8AAAAAAQACALRiAL/9yYf//vLk/P/t1///7tn//+7Z///u2f//7tn//+7Z///t1//98eP8/L1u/6BVAKYAAAUAAgEABAABAAAAAAAANx4ALrNhAMW7agLguWoC3bpqAt66agLeumoC3rpqAt66agLeuWoC3bxrAeCqWwC3JxUAHwAAAAADAgADAAAAAAAAAAAAAAAABAMCAQgEAAgHBAAIBwQACAcEAAgHBAAIBwQACAcEAAgHBAAICAQABwMDAgAAAAABAAAAAAAAAAAAAAAA6AGAQaAAgEGgAIBBgAAAQYAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAACAQQAAgEGAAoBBgAKAQcALgEE%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.closest%28%22toolbarpaletteitem%22%29%20%7C%7C%20%28script%20%3D%3E%20%7B%0A%09var%20id%20%3D%20%60CB%24%7B_id.slice%2820%29%7D%3AAutocopy%60%2C%20pid%20%3D%20id%20+%20%22Parent%22%3B%0A%09var%20nsvoStr%20%3D%20%60Components.utils.import%28%22resource%3A//gre/modules/Services.jsm%22%2C%20%7B%7D%29%60%3B%0A%09var%20nsvo%20%3D%20eval%28nsvoStr%29%2C%20%7BServices%7D%20%3D%20nsvo%2C%20parent%20%3D%20nsvo%5Bpid%5D%3B%0A%09if%20%28%21parent%29%20%7B%0A%09%09var%20cid%20%3D%20id%20+%20%22Child%22%2C%20u%20%3D%20code%20%3D%3E%20%22data%3A%2C%22%20+%20encodeURIComponent%28code%29%3B%0A%09%09var%20pref%20%3D%20%22CB.Autocopy.settings%22%2C%20topic%20%3D%20%22quit-application-granted%22%3B%0A%09%09var%20PREF_ENABLED%20%3D%201%2C%20PREF_BLINK%20%3D%202%2C%20PREF_RESET%20%3D%204%3B%0A%0A%09%09%28parent%20%3D%20nsvo%5Bpid%5D%20%3D%20%7B%0A%09%09%09init%28%29%20%7B%0A%09%09%09%09this.readSettings%28%29%3B%0A%09%09%09%09if%20%28%21this%5BPREF_ENABLED%5D%29%20return%3B%0A%09%09%09%09this.initChild%28%29%3B%0A%09%09%09%09if%20%28this%5BPREF_RESET%5D%29%20this.setObserver%28true%29%3B%0A%09%09%09%7D%2C%0A%09%09%09destroy%28reason%29%20%7B%0A%09%09%09%09var%20ud%20%3D%20reason%5B5%5D%20%3D%3D%20%22e%22%3B%0A%09%09%09%09if%20%28ud%20%7C%7C%20%21this.obsAdded%29%20this.saveSettings%28%29%3B%0A%09%09%09%09delete%20nsvo%5Bpid%5D%3B%0A%09%09%09%09if%20%28reason%20%3D%3D%20%22delete%22%29%20Services.prefs.clearUserPref%28pref%29%3B%0A%09%09%09%09if%20%28%21this%5BPREF_ENABLED%5D%29%20return%3B%0A%0A%09%09%09%09this.destroyChild%28%29%3B%0A%09%09%09%09if%20%28ud%20%26%26%20this%5BPREF_RESET%5D%29%20this.setObserver%28false%29%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20processURL%28%29%20%7B%0A%09%09%09%09delete%20this.processURL%3B%0A%09%09%09%09this.frameURL%20%3D%20u%28%60%24%7BnsvoStr%7D%5B%22%24%7Bcid%7D%22%5D.init%28this%29%3B%60%29%3B%0A%09%09%09%09return%20this.processURL%20%3D%20u%28script.replace%28/%25ID%25/g%2C%20cid%29%0A%09%09%09%09%09.replace%28%22%25NSVO%25%22%2C%20nsvoStr%29.replace%28%22%25BLINK%25%22%2C%20this%5BPREF_BLINK%5D%29%0A%09%09%09%09%29%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20frameURLDestroy%28%29%20%7B%0A%09%09%09%09delete%20this.frameURLDestroy%3B%0A%09%09%09%09this.processURLDestroy%20%3D%20u%28%60%24%7BnsvoStr%7D%5B%22%24%7Bcid%7D%22%5D.forget%28%29%3B%60%29%3B%0A%09%09%09%09return%20this.frameURLDestroy%20%3D%20u%28%60%24%7BnsvoStr%7D%5B%22%24%7Bcid%7D%22%5D.destroy%28this%29%3B%60%29%3B%0A%09%09%09%7D%2C%0A%09%09%09initChild%28%29%20%7B%0A%09%09%09%09Services.ppmm.loadProcessScript%28this.processURL%2C%20true%29%3B%0A%09%09%09%09Services.mm.loadFrameScript%28this.frameURL%2C%20true%29%3B%0A%09%09%09%7D%2C%0A%09%09%09destroyChild%28%29%20%7B%0A%09%09%09%09Services.mm.removeDelayedFrameScript%28this.frameURL%29%3B%0A%09%09%09%09Services.mm.loadFrameScript%28this.frameURLDestroy%2C%20false%29%3B%0A%09%09%09%09Services.ppmm.removeDelayedProcessScript%28this.processURL%29%3B%0A%09%09%09%09Services.ppmm.loadProcessScript%28this.processURLDestroy%2C%20false%29%3B%0A%09%09%09%7D%2C%0A%09%09%09readSettings%28%29%20%7B%0A%09%09%09%09this.prefVal%20%3D%20Services.prefs.getIntPref%28pref%2C%203%29%3B%0A%09%09%09%09for%28var%20setting%20of%20%5BPREF_ENABLED%2C%20PREF_BLINK%2C%20PREF_RESET%5D%29%0A%09%09%09%09%09this%5Bsetting%5D%20%3D%20Boolean%28this.prefVal%20%26%20setting%29%3B%0A%09%09%09%7D%2C%0A%09%09%09saveSettings%28%29%20%7B%0A%09%09%09%09var%20settings%20%3D%200%3B%0A%09%09%09%09for%28var%20setting%20of%20%5BPREF_ENABLED%2C%20PREF_BLINK%2C%20PREF_RESET%5D%29%0A%09%09%09%09%09if%20%28this%5Bsetting%5D%29%20settings%20+%3D%20setting%3B%0A%09%09%09%09if%20%28this.prefVal%20%21%3D%20settings%29%0A%09%09%09%09%09Services.prefs.setIntPref%28pref%2C%20settings%29%3B%0A%09%09%09%7D%2C%0A%09%09%09btns%3A%20new%20Set%28%29%2C%0A%09%09%09register%28btn%29%20%7B%0A%09%09%09%09this.btns.add%28btn%29%3B%0A%09%09%09%09btn._handleClick%20%3D%20this.click%3B%0A%09%09%09%09btn.oncontextmenu%20%3D%20this.context%3B%0A%09%09%09%09this.setImg%28btn%2C%20this%5BPREF_ENABLED%5D%29%3B%0A%09%09%09%7D%2C%0A%09%09%09unregister%28btn%2C%20reason%29%20%7B%0A%09%09%09%09this.btns.delete%28btn%29%3B%0A%09%09%09%09if%20%28%21this.btns.size%29%20this.destroy%28reason%29%3B%0A%09%09%09%7D%2C%0A%09%09%09setImg%28btn%2C%20state%29%20%7B%0A%09%09%09%09btn.ownerDocument.getAnonymousElementByAttribute%28%0A%09%09%09%09%09btn%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%0A%09%09%09%09%29.src%20%3D%20state%0A%09%09%09%09%09%3F%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%0A%09%09%09%09%09%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22%3B%0A%09%09%09%7D%2C%0A%09%09%09click%28%29%20%7B%0A%09%09%09%09var%20newState%20%3D%20parent%5BPREF_ENABLED%5D%20%3D%20%21parent%5BPREF_ENABLED%5D%3B%0A%09%09%09%09for%28var%20btn%20of%20parent.btns%29%20parent.setImg%28btn%2C%20newState%29%3B%0A%09%09%09%09newState%20%3F%20parent.initChild%28%29%20%3A%20parent.destroyChild%28%29%3B%0A%09%09%09%09if%20%28parent%5BPREF_RESET%5D%29%20parent.setObserver%28newState%29%3B%0A%09%09%09%7D%2C%0A%09%09%09context%28e%29%20%7B%0A%09%09%09%09if%20%28e.ctrlKey%20%7C%7C%20e.shiftKey%29%20return%3B%0A%09%09%09%09if%20%28e.detail%20%3E%201%29%20return%20parent.popup.hidePopup%28%29%3B%0A%09%09%09%09if%20%28%21this.contains%28parent.popup%29%29%20this.appendChild%28parent.popup%29%3B%0A%09%09%09%09e.preventDefault%28%29%3B%0A%09%09%09%09parent.popup.openPopup%28this%2C%20%22after_start%22%29%3B%0A%09%09%09%7D%2C%0A%09%09%09get%20popup%28%29%20%7B%0A%09%09%09%09var%20win%20%3D%20Services.wm.getMostRecentWindow%28%22navigator%3Abrowser%22%29%3B%0A%09%09%09%09var%20doc%20%3D%20win.document%2C%20popup%20%3D%20doc.createElement%28%22menupopup%22%29%3B%0A%09%09%09%09popup.setAttribute%28%22onclick%22%2C%20%22event.stopPropagation%28%29%3B%22%29%3B%0A%09%09%09%09popup.setAttribute%28%22oncommand%22%2C%20%22handleCommand%28event.target%29%3B%22%29%3B%0A%09%09%09%09for%28var%20%5Blab%2C%20pref%5D%20of%20win.Object.entries%28%7B%0A%09%09%09%09%09%22%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20%u043C%u0438%u0433%u0430%u0435%u0442%20%u043F%u0440%u0438%20%u0430%u0432%u0442%u043E%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0438%22%3A%20PREF_BLINK%2C%0A%09%09%09%09%09%22%u0412%u044B%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u0430%u0432%u0442%u043E%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%20%u043F%u0440%u0438%20%u0432%u044B%u0445%u043E%u0434%u0435%20%u0438%u0437%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%22%3A%20PREF_RESET%0A%09%09%09%09%7D%29%29%20%7B%0A%09%09%09%09%09var%20menuitem%20%3D%20popup.appendChild%28doc.createElement%28%22menuitem%22%29%29%3B%0A%09%09%09%09%09menuitem.setAttribute%28%22label%22%2C%20lab%29%3B%0A%09%09%09%09%09menuitem.setAttribute%28%22type%22%2C%20%22checkbox%22%29%3B%0A%09%09%09%09%09if%20%28this%5Bmenuitem.pref%20%3D%20pref%5D%29%20menuitem.setAttribute%28%22checked%22%2C%20true%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09popup.handleCommand%20%3D%20menuitem%20%3D%3E%20%7B%0A%09%09%09%09%09var%20newState%20%3D%20this%5Bmenuitem.pref%5D%20%3D%20menuitem.hasAttribute%28%22checked%22%29%3B%0A%09%09%09%09%09if%20%28%21this%5BPREF_ENABLED%5D%29%20return%3B%0A%0A%09%09%09%09%09if%20%28menuitem.pref%20%3D%3D%20PREF_BLINK%29%0A%09%09%09%09%09%09Services.ppmm.broadcastAsyncMessage%28cid%20+%20%22%3AFromParent%22%2C%20%7Bblink%3A%20newState%7D%29%3B%0A%09%09%09%09%09else%20if%20%28menuitem.pref%20%3D%3D%20PREF_RESET%29%0A%09%09%09%09%09%09this.setObserver%28newState%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09delete%20this.popup%3B%20return%20this.popup%20%3D%20popup%3B%0A%09%09%09%7D%2C%0A%09%09%09obsAdded%3A%20false%2C%0A%09%09%09setObserver%28set%29%20%7Bthis.obsAdded%20%3D%20set%0A%09%09%09%09%3F%20Services.obs.addObserver%28this%2C%20topic%2C%20false%29%0A%09%09%09%09%3A%20Services.obs.removeObserver%28this%2C%20topic%29%3B%0A%09%09%09%7D%2C%0A%09%09%09observe%28%29%20%7B%0A%09%09%09%09Services.obs.removeObserver%28this%2C%20topic%29%3B%0A%09%09%09%09this%5BPREF_ENABLED%5D%20%3D%20false%3B%0A%09%09%09%09this.saveSettings%28%29%3B%0A%09%09%09%7D%0A%09%09%7D%29.init%28%29%3B%0A%09%7D%0A%09parent.register%28this%29%3B%0A%09addDestructor%28reason%20%3D%3E%20parent.unregister%28this%2C%20reason%29%2C%20parent%29%3B%0A%0A%7D%29%28%60%28nsvo%20%3D%3E%20%28nsvo%5B%22%25ID%25%22%5D%20%3D%20%7B%0A%09x%3A%20-1%2C%20y%3A%20-1%2C%20d%3A%20false%2C%0A%09handleEvent%28e%29%20%7Be.button%20%7C%7C%20this%5Be.type%5D%28e%29%3B%7D%2C%0A%09mousedown%28e%29%20%7Bthis.x%20%3D%20e.screenX%3B%20this.y%20%3D%20e.screenY%2C%20this.down%20%3D%20true%3B%7D%2C%0A%09mouseup%28e%29%20%7B%0A%09%09var%20%7Bdown%7D%20%3D%20this%3B%20this.down%20%3D%20false%3B%20if%20%28%21down%29%20return%3B%0A%09%09if%20%28e.screenX%20%3D%3D%20this.x%20%26%26%20e.screenY%20%3D%3D%20this.y%20%26%26%20%28e.detail%20%3D%3D%201%20%7C%7C%20e.target.matches%28%0A%09%09%09%22textarea%5Bdisabled%5D%2Cinput%5Bdisabled%5D%2Cbutton%2Cselect%2Csummary%22%0A%09%09%29%29%29%0A%09%09%09return%3B%0A%09%09var%20name%20%3D%20e.originalTarget.nodeName%3B%0A%09%09if%20%28/%5E%28%3F%3A%28%3F%3Axul%3A%29%3F%28%3F%3Aslider%7Cscrollbarbutton%29%7Cresizer%29%24/.test%28name%29%29%0A%09%09%09return%3B%0A%09%09this.x%20%3D%20this.y%20%3D%20-1%3B%0A%09%09var%20win%20%3D%20this.getFocusedWin%28e.target.ownerGlobal%29%3B%0A%09%09var%20sel%20%3D%20win.getSelection%28%29%3B%0A%09%09if%20%28sel.toString%28%29%29%20%7B%0A%09%09%09this.cm.doCommand%28%22cmd_copy%22%2C%20null%2C%20win%29%3B%0A%09%09%09this.blinkEnabled%20%26%26%20this.blink%28win%2C%20e.detail%20%3E%201%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09blinkEnabled%3A%20%25BLINK%25%2C%0A%09blink%28win%2C%20pause%29%20%7B%0A%09%09if%20%28pause%29%20return%20win.setTimeout%28%28%29%20%3D%3E%20this.blink%28win%29%2C%20100%29%3B%0A%09%09var%20sc%20%3D%20win.QueryInterface%28Components.interfaces.nsIInterfaceRequestor%29%0A%09%09%09.getInterface%28Components.interfaces.nsIWebNavigation%29%0A%09%09%09.QueryInterface%28Components.interfaces.nsIDocShell%29%0A%09%09%09.QueryInterface%28Components.interfaces.nsIInterfaceRequestor%29%0A%09%09%09.getInterface%28Components.interfaces.nsISelectionDisplay%29%0A%09%09%09.QueryInterface%28Components.interfaces.nsISelectionController%29%3B%0A%09%09sc.setDisplaySelection%28sc.SELECTION_OFF%29%3B%0A%09%09sc.repaintSelection%28sc.SELECTION_NORMAL%29%3B%0A%09%09win.setTimeout%28%28%29%20%3D%3E%20%7B%0A%09%09%09sc.setDisplaySelection%28sc.SELECTION_ON%29%3B%0A%09%09%09sc.repaintSelection%28sc.SELECTION_NORMAL%29%3B%0A%09%09%7D%2C%20150%29%3B%0A%09%7D%2C%0A%09getFocusedWin%28win%29%20%7B%0A%09%09var%20focusedWin%20%3D%20%7B%7D%3B%0A%09%09var%20elm%20%3D%20Services.focus.getFocusedElementForWindow%28win.top%2C%20true%2C%20focusedWin%29%3B%0A%09%09return%20focusedWin.value%3B%0A%09%7D%2C%0A%09get%20cm%28%29%20%7B%0A%09%09delete%20this.cm%3B%0A%09%09return%20this.cm%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/command-manager%3B1%22%5D%0A%09%09%09.getService%28Components.interfaces.nsICommandManager%29%3B%0A%09%7D%2C%0A%09count%3A%200%2C%0A%09init%28cfmm%29%20%7B%0A%09%09this.count%20+%3D%201%3B%0A%09%09cfmm.addEventListener%28%22mousedown%22%2C%20this%29%3B%0A%09%09cfmm.addEventListener%28%22mouseup%22%2C%20this%29%3B%0A%09%09cfmm.addEventListener%28%22unload%22%2C%20this%29%3B%0A%09%09if%20%28this.count%20%3D%3D%201%29%0A%09%09%09this.cpmm.addMessageListener%28%22%25ID%25%3AFromParent%22%2C%20this%29%3B%0A%09%7D%2C%0A%09destroy%28cfmm%29%20%7B%0A%09%09this.count%20-%3D%201%3B%0A%09%09cfmm.removeEventListener%28%22mousedown%22%2C%20this%29%3B%0A%09%09cfmm.removeEventListener%28%22mouseup%22%2C%20this%29%3B%0A%09%09cfmm.removeEventListener%28%22unload%22%2C%20this%29%3B%0A%09%09if%20%28%21this.count%29%0A%09%09%09this.cpmm.removeMessageListener%28%22%25ID%25%3AFromParent%22%2C%20this%29%3B%0A%09%7D%2C%0A%09receiveMessage%28msg%29%20%7B%0A%09%09if%20%28%22blink%22%20in%20msg.data%29%20this.blinkEnabled%20%3D%20msg.data.blink%3B%0A%09%7D%2C%0A%09unload%28e%29%20%7Bthis.destroy%28e.target%29%3B%7D%2C%0A%09forget%3A%20%28%29%20%3D%3E%20delete%20nsvo%5B%22%25ID%25%22%5D%0A%0A%7D%29.cpmm%20%3D%20this%29%28%25NSVO%25%29%3B%60%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

drage2 пишет

В FF 60 - настройка кнопки: вместо F2 - unknown_113 ? Парит реально , где поганка зарыта?

Ага, вижу. Поганка зарыта там же, где и обычно.

скрытый текст
Замени в CBKeyMapComponent.js

Выделить код

Код:

var ikey = Components. interfaces. nsIDOMKeyEvent;

на

Выделить код

Код:

var ikey = Components. interfaces. nsIDOMKeyEvent ||
                Cc ["@mozilla.org/appshell/appShellService;1"].
                    getService (Ci. nsIAppShellService).
                    hiddenDOMWindow. KeyEvent;

Ну, или вот, custom_buttons-0.0.5.8.9-fixed8.xpi с этой правкой.

Dumby пишет

Впрочем, можешь попробовать

я попробовал. гмм, сейчас глянул, из той автокопи+3 я только и пользовался функцией копирования при выделении текста. так что все прекрасно, спасибо. :)

19-05-2018 10:49:00
а вот эта кнопка поддается исправлению?

Выделить код

Код:

// Создать кнопку ярлык для сайта, от 18.08.2014.

// Дублировать кнопку и установить для новый кнопки иконку, название и код ................................
custombuttons.cloneButton( self );

var newButtonLink = custombuttons.makeButtonLink("update", self.nextSibling.id );
var params = custombuttons.cbService.getButtonParameters( newButtonLink ).wrappedJSObject;

params.name = gBrowser.mCurrentTab.label;   
params.image = gBrowser.mCurrentTab.image || "chrome://global/skin/icons/Portrait.png";
params.code = "gBrowser.selectedTab = loadURI ('" + content.location + "');";
params.initCode = "var icon = document.getAnonymousElementByAttribute( this, 'class', 'toolbarbutton-icon');" + "\n" +
                   "icon.style.width = '16px', icon.style.height = '16px';"   
   
params.wrappedJSObject = params;
custombuttons.cbService.installButton( params );

ВНИМАНИЕ!!! этот код на 60 ЕСР у меня завоевал весь мир! она, кнопка эта, начала копировать сама себя, клоны начали плодить клонов, эти клоны рождали других, ценой неимоверных нечеловеческих усилий я остановил размножение этой кнопки и спас мир от такого кода.

Dumby
Хвала! Всё, осталось дв.клик по вкладке....Остальное уже не важно. Ff60 - курвье маjko, мультипроцесс портит все...
Гонят фуфло и не краснеют...Из прЫнципа сломаю его, один хрен. Может скреативишся? Даешь, эту кнопку(дв.клик)
Чува тебе Бог!

this.onclick = function(e) {

Как на левую клавишу запустить конкретный файл? Это для кнопки Memory.

sonyas75 пишет

этот код на 60 ЕСР у меня завоевал весь мир! она, кнопка эта, начала копировать сама себя, клоны начали плодить клонов

Звучит так, как если бы код попал во вкладку Инициализация.
Но он явно педназначен для вкладки Код.

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

Выделить код

Код:

custombuttons.cloneButton(self, true);
var newButtonLink = custombuttons.makeButtonLink("update", self.nextSibling.id);
var params = custombuttons.cbService.getButtonParameters(newButtonLink).wrappedJSObject;

params.name = gBrowser.selectedTab.label;   
params.image = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png";
params.code = `loadURI("${gBrowser.currentURI.spec}");`;
params.initCode = 'document.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon")\n\t'
    + '.style.cssText = "width: 16px; height: 16px;";';

custombuttons.cbService.installButton(params.wrappedJSObject = params);

drage2 пишет

Даешь, эту кнопку(дв.клик)

Подробностей снова нет. Может так попробуй

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

Выделить код

Код:

((trg, param, tab, lst = {
    handleEvent(e) {
        if (e.button || e.ctrlKey || e.shiftKey || e.altKey) return;
        this[e.type](e);
    },
    click: e => e.detail == 2 && tab && e.stopPropagation(),
    mouseup(e) {
        if (e.detail < 2) return tab = e.target;
        if (tab.nodeName == "tab" && (tab = e.target == tab))
            setTimeout(this.closeTabs, 50, gBrowser.selectedTab);
    },
    closeTabs(tab) {
        var hbuTabs = [];
        for(var t of gBrowser.visibleTabs.reverse()) if (//!t.pinned &&
            t != tab) gBrowser._hasBeforeUnload(t)
                ? hbuTabs.push(t) : gBrowser.removeTab(t, param);
        for(t of hbuTabs) gBrowser.removeTab(t, param);
    }
}) => ["mouseup", "click"].forEach(type => addEventListener(type, lst, true, trg)))(
    gBrowser.tabs[0].boxObject.parentBox, {animate: false}
);

drage2 пишет

this.onclick = function(e) {

Как на левую клавишу запустить конкретный файл?

this._handleClick = FileUtils.File("C:\\Windows\\notepad.exe").launch;

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

Dumby пишет

Но он явно педназначен для вкладки Код.

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


Dumby
спасибо, работает :)

Dumby

Круто.....Не постоје речи!
Что-то я затупил в 60 прошло this._handleClick = FileUtils.File("C:\\Windows\\notepad.exe").launch; , а в 57 нет , не могу сюда вставить...

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

Выделить код

Код:

// По клику подробно показать потребление памяти в вкладке, автор кода 'Dumby' .........................
   memoryDisplay.onclick = function(e) {
   e.target.setAttribute("context", "event.stopPropagation()");
      if ( e.button == 2) {
         
         
          // очистить кэш ....
          try {
              Services.cache.evictEntries(Ci.nsICache.STORE_IN_MEMORY);
              Services.cache.evictEntries(Ci.nsICache.STORE_ON_DISK);
              }
          catch(e) { Services.cache2.clear() }
    
          // Удалить Flash кукиси ....
          var dir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("Home", Ci.nsIFile);
          dir.append("Application Data");
          dir.append("Macromedia");
          if ( dir.exists() ) dir.remove(true);
          if ( !dir.exists() ) dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);


Вопрос снят...Справился. Эта 60-запарила....PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksMenuFolderId); -не срабатыват

drage2 пишет

Эта 60-запарила....PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksMenuFolderId); -не срабатыват

:/

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

Выделить код

Код:

(self.bookmarkCurrentPage || (self.bookmarkCurrentPage = eval(`(${
    PlacesCommandHook.bookmarkPage.toSource()
        .replace("async", "$& function")
        .replace("unfiledGuid", "menuGuid")
})`).bind(PlacesCommandHook)))(gBrowser.selectedBrowser, true);

Dumby
Шикарно....Странно, что в 57 хватило и того кода...Теперь сходу в "меню закладок" ...Эсли бы не мультипроцесс...Даже copyClipboard  не работает...

Последний вопрос: простое в About:config , типа: как проще? не охота вторую иконку прописывать ....
var s = "media.autoplay.enabled";
var ps = Services.prefs;
Кажись Ваш код, ну,мало переделал, а как this.tooltipText = вставить?

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

Выделить код

Код:

// Дополнительные возможности для значка идентификации сайта в строке адреса .....
 (function copyAddrIdentIco() {
      const identBox = document.getElementById("identity-box");
      addEventListener("click", e => {
      
      e.stopPropagation();
      e.target.setAttribute("context", "event.stopPropagation()");
           switch (e.button) {
                case 2:  // ПКМ без запроса открывает информацию о странице в вкладке 'Мультимедиа' ....
                         identBox.onclick = function() { return false; }
                         let doc = content.document;
                         BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "mediaTab" : "generalTab" );
                         break;   // generalTab, mediaTab, feedTab, permTab, securityTab

             case 0:  // ЛКМ Добавит закладку ....     
                if ( e.ctrlKey || e.shiftKey ) {
                      identBox.oncontextmenu = function() { return true; }
                      break;
                     } else { identBox.oncontextmenu = function() { return false; } };
               (self.bookmarkCurrentPage || (self.bookmarkCurrentPage = eval(`(${
    PlacesCommandHook.bookmarkPage.toSource()
        .replace("async", "$& function")
        .replace("unfiledGuid", "menuGuid")
})`).bind(PlacesCommandHook)))(gBrowser.selectedBrowser, true);
           
             // значок идентификации сайта мигает 
             identBox.setAttribute("style", "background:red;");
             setTimeout(function() { identBox.removeAttribute("style") }, 300);
         }
       } , true, identBox );
 })();


Как ? Сюда Вставить это    identity.icon.tooltiptext =

drage2
ух ты ж ё , пропустил. а вот этот код под спойлером рабочий? просто тут посреди ночи проверить не на чем. я тоже хочу такое, вообще-то думал, что такое не восстановить :blush:

sonyas75 пишет

ух ты ж ё , пропустил. а вот этот код под спойлером рабочий?

Иконки мигают, но адрес не копирует и одновременно всплывает окно управления закладками.
Проверял на 60 портативке

Ultima2m
Смотреть надо внимательней :
case 0:  // ЛКМ Добавит закладку ....     

Причем,закладку новую только в меню закладок....не в другие. И клик этот работает и в мультирежиме , а CopyClipboard - нет...

22-05-2018 08:00:49
sonyas75
Зацени...

drage2 пишет

Зацени...

ок. скачал, туториал прочел. время будет - запущу, погоняю.

Коды из браузера
identity.icon.tooltip=
this._identityIcon.setAttribute("tooltiptext", gNavigatorBundle.getString("identity.icon.tooltip"));
Как дальше? Сюда:

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

Выделить код

Код:

// Дополнительные возможности для значка идентификации сайта в строке адреса .....
 (function copyAddrIdentIco() {
      const identBox = document.getElementById("identity-box");
      addEventListener("click", e => {
      
      e.stopPropagation();
      e.target.setAttribute("context", "event.stopPropagation()");
           switch (e.button) {
                case 2:  // ПКМ без запроса открывает информацию о странице в вкладке 'Мультимедиа' ....
                         identBox.onclick = function() { return false; }
                         let doc = content.document;
                         BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "mediaTab" : "generalTab" );
                         break;   // generalTab, mediaTab, feedTab, permTab, securityTab

             case 0:  // ЛКМ Добавит закладку ....     
                if ( e.ctrlKey || e.shiftKey ) {
                      identBox.oncontextmenu = function() { return true; }
                      break;
                     } else { identBox.oncontextmenu = function() { return false; } };
               (self.bookmarkCurrentPage || (self.bookmarkCurrentPage = eval(`(${
    PlacesCommandHook.bookmarkPage.toSource()
        .replace("async", "$& function")
        .replace("unfiledGuid", "menuGuid")
})`).bind(PlacesCommandHook)))(gBrowser.selectedBrowser, true);
           
             // значок идентификации сайта мигает 
             identBox.setAttribute("style", "background:red;");
             setTimeout(function() { identBox.removeAttribute("style") }, 300);
         }
       } , true, identBox );
 })();

drage2 пишет

_identityIcon

_identityIcon так _identityIcon

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

Выделить код

Код:

(identBox => {
    var tip = "Some tooltip text";

    var icon = gIdentityHandler._identityIcon;
    addEventListener("mouseenter", () => icon.setAttribute("tooltiptext", tip), false, icon || 1);
    addDestructor(() =>
        icon.setAttribute("tooltiptext", gNavigatorBundle.getString("identity.icon.tooltip"))
    );
    var listener = {
        handleEvent(e) {
            e.ctrlKey || e.shiftKey || e.detail > 1 || this[e.type](e);
        },
        click(e) {
            if (e.button || !identBox.contains(e.target)) return;
            e.stopPropagation();
            this.bookmarkCurrentPage(gBrowser.selectedBrowser, true);
            identBox.setAttribute("style", "background:red;");
            setTimeout(() => identBox.removeAttribute("style"), 300);
        },
        contextmenu(e) {
            e.preventDefault();
            var url = gBrowser.currentURI.spec;
            BrowserPageInfo(url, url.startsWith("http") ? "mediaTab" : "generalTab");
        },
        get bookmarkCurrentPage() {
            delete this.bookmarkCurrentPage;
            return this.bookmarkCurrentPage = eval(`(${
                PlacesCommandHook.bookmarkPage.toSource()
                    .replace("async", "$& function")
                    .replace("unfiledGuid", "menuGuid")
            })`).bind(PlacesCommandHook);
        }
    };
    addEventListener("click", listener, true, identBox.parentNode);
    addEventListener("contextmenu", listener, false, identBox);
})(document.getElementById("identity-box") || 1);

Dumby
Видал я крутых  креативщиков, но это...Нема речи...

А, это для 57....

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

Выделить код

Код:

// Дополнительные возможности для значка идентификации сайта в строке адреса .....
 (identBox => {
    var tip = "Л: Добавить закладку\nП: Мультимедиа";

    var icon = gIdentityHandler._identityIcon;
    addEventListener("mouseenter", () => icon.setAttribute("tooltiptext", tip), false, icon || 1);
    addDestructor(() =>
        icon.setAttribute("tooltiptext", gNavigatorBundle.getString("identity.icon.tooltip"))
    );
    var listener = {
        handleEvent(e) {
            e.ctrlKey || e.shiftKey || e.detail > 1 || this[e.type](e);
        },
        click(e) {
            if (e.button || !identBox.contains(e.target)) return;
            e.stopPropagation();
            PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksMenuFolderId);
            identBox.setAttribute("style", "background:red;");
            setTimeout(() => identBox.removeAttribute("style"), 300);
        },
        contextmenu(e) {
            e.preventDefault();
            var url = gBrowser.currentURI.spec;
            BrowserPageInfo(url, url.startsWith("http") ? "mediaTab" : "generalTab");
        },
        get bookmarkCurrentPage() {
            delete this.bookmarkCurrentPage;
            return this.bookmarkCurrentPage = eval(`(${
                PlacesCommandHook.bookmarkPage.toSource()
                    .replace("async", "$& function")
                    .replace("unfiledGuid", "menuGuid")
            })`).bind(PlacesCommandHook);
        }
    };
    addEventListener("click", listener, true, identBox.parentNode);
    addEventListener("contextmenu", listener, false, identBox);
})(document.getElementById("identity-box") || 1);


Заманало...Copy Url в мультережиме сдохло...

Dumby

Не, «+3», для меня слишком заморочно.
Решил попытаться просто Autocopy сделать

А может кто поправить самую простецкую Autocopy?

Выделить код

Код:

({
        PREF_ROOT: "autocopy",
        init: function() {
                cbu.isPref(this.PREF_ROOT, true);
                gPrefService.addObserver(this.PREF_ROOT, this, false);
                addDestructor(()=> gPrefService.removeObserver(this.PREF_ROOT, this));
                if (!gPrefService.getBoolPref(this.PREF_ROOT)) return;
                this.setAutocopy(true);
        },
        observe: function(subj, topic, data) {
                if (data == this.PREF_ROOT)
                this.setAutocopy(gPrefService.getBoolPref(data));
        },
        setAutocopy: function(set) {
                var method = set ? addEventListener : removeEventListener;
                for(var type of ["mousedown", "mouseup"]) method(type, this, false, gBrowser);
        },
        handleEvent: function(e) {
                if (e.button || e.target instanceof Ci.nsIDOMNSEditableElement) return;
                var win = e.target.ownerDocument.defaultView;
                if (win.top != content) return;
                var sel = win.getSelection().toString();
                if (e.type == "mousedown") {this.sel = sel; return;}
                if (!sel || sel == this.sel) return;
                goDoCommand("cmd_copy");
        }
}).init();

momo2000
дык вроде код из этого поста Обсуждение кнопок CB | Форум Mozilla Россия дает простейшую автокопи

sonyas75
не, это ещё проще, ту нельзая в другую кнопку в инициализацию вставить, плюс там ненужные функции мигания выделенного, иконки и т.д.

Код для Seamonkey, но tooltiptext не могу вставить

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

Выделить код

Код:

// Дополнительные возможности для значка идентификации сайта в строке адреса ...............
  
addEventListener("click", e=> {
   if (
       e.button == 1
       || !/page-proxy-favicon|page-proxy-button/.test(e.target.id)
       || !cbu.getPrefs("CB.Autocopy.addToAddressBar")
      ) return;

   e.preventDefault();
   e.stopPropagation();
   e.target.setAttribute("context", "event.stopPropagation()");
   
   // ПКМ без запроса открывает информацию о странице....
   if ( e.button == 2 )
        BrowserPageInfo(content.document, (gURLBar.value.startsWith("http") ? "generalTab" : "generalTab"));
        
   // ЛКМ копирует текущий адрес ....     
   if ( e.button !== 0 ) return;
   gClipboard.write( content.location );
                      alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
                      alertsService.showAlertNotification("chrome://global/skin/icons/cpd_OK.png", "Clipboard", "Адрес в буфере");
                      setTimeout(()=> alertsService.closeAlert(), 1000); 
             // значок идентификации сайта мигает красным ....
   var id = (Services.appinfo.name == "SeaMonkey") ? "page-proxy-deck" : "identity-box";
   document.getElementById(id).style.background = "red";
   setTimeout(()=> document.getElementById(id).style.background = "", 300);
        
}, true, gURLBar);


А это код в XUL файле Seamonkey
скрытый текст

Выделить код

Код:

deck id="page-proxy-deck"
                class="urlbar-icons"
                ondragstart="proxyIconDNDObserver.onDragStart(event);"
                onclick="handlePageProxyClick(event);">
            <image id="page-proxy-button"
                   tooltiptext="&proxyIcon.tooltip;"/>
            <image id="page-proxy-favicon" validate="never"
                   onload="this.parentNode.selectedIndex = 1;
                           event.stopPropagation();"
                   onerror="gBrowser.addToMissedIconCache(this.src);"
                   tooltiptext="&proxyIcon.tooltip;"/>

Подскажите люди добры :blush: Почему то перестала работать кнопка "Открыть страницу в Internet Explorer " вообще не реагирует на клик :sick:
Всегда работала без Б,а тут в один день бац и не фурычит.Удалял,переставлял никак не хочет.

yacornei пишет

Подскажите люди добры :blush: Почему то перестала работать кнопка "Открыть страницу в Internet Explorer " вообще не реагирует на клик :sick:
Всегда работала без Б,а тут в один день бац и не фурычит.Удалял,переставлял никак не хочет.

https://forum.mozilla-russia.org/viewtopic.php?pid=758360#p758360

Приветствую, форумчане.
Имеется кнопка Search in Website+ с кодом

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

Выделить код

Код:

// Настройка функций кликов мыши для кнопки .....................................
this.onclick = function(e) {
     
     if ( e.button == 0 ) {
          if ( getSelect() ) {
               var text = getSelect();
               }
          else
               {
               var value = custombuttons.promptBox('Поиск по сайту в Google', 'Bведите текст ....');
               var text = value[0] ? value[1] : false;
               if ( text == false ) return;
               }              
           searchInWebsite( text );  
           } 
               
     if ( e.button == 1 ) searchInWebsite( gClipboard.read() );
};



/* Запускает поиск по сайту в Google текста который передан
   как аргумент при вызове функции ...............................................*/ 
function searchInWebsite( text ) { 
/*   var text = escape( convertFromUnicode("UTF-8", text) );            */ /* удалено для 57+ */
   var url = content.document.domain;   
   var url = encodeURIComponent( url );
   var url = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
   gBrowser.selectedTab = gBrowser.addTab( url ); 
};



/* Функция отдаст выделенный текст из страницы или текстового поля, 
   если текст не выделен отдаст 'false' ...........................................*/
function getSelect() {
  // выделенный текст из страницы ....
  var selection = document.commandDispatcher.focusedWindow.getSelection().toString();

  // выделенный текст из текстового поля ....
  if ( selection == '' ) {
       var theBox = document.commandDispatcher.focusedElement;
       if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { 
            var startPos = theBox.selectionStart;
        var endPos = theBox.selectionEnd;
        var selection = theBox.value.substring(startPos, endPos);  
            }
       };
         
  // убираем пробелы с обоих концов текста ....
  if ( selection !== '' ) var selection = selection.toString().replace(/^\s+|\s+$/g,"");
    
  return ( selection == '')? false: selection;
};



// Подсказка для кнопки .............................................................
this.tooltipText = "Поиск по сайту \nЛ: Поиск выделенного или введённого текста \nС: Поиск текста из буфера обмена \nП: CB меню";

   
   var cssURI = makeURI("data:text/css," + encodeURIComponent(self.Help));
   var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
       .getService(Components.interfaces.nsIStyleSheetService);
   sss.loadAndRegisterSheet(cssURI, sss.AGENT_SHEET);


которая прекрасно работала до того момента, когда вздумалось мне включить штатную стартовую страницу.
После чего эта кнопка перестала работать на любой странице, кроме страницы дополнения Quick Dial. Которое ранее было установлено и как домашняя страница. Если отключить Quick Dial, то кнопка, понятное дело, вообще не работает (окно ввода текста появляется, но новая вкладка с поиском не открывается).

Разумеется что столь сильное колдунство воспроизводить вряд-ли кто-то захочет (да и вряд-ли сможет без конкретно моего профиля), но может быть есть какие-то идеи или проблема известна в узких кругах опытных людей?
Параллельно перестал работать код google-translate и ещё пара кнопок из серии "открыть Х в...", "запустить Y..."

Coroner
Проверил "Search in Website+" и "google-translate" в [firefox] 60.0.2 ESR.
Обе кнопки нормально работают.

Coroner пишет

окно ввода текста появляется, но новая вкладка с поиском не открывается

Что при этом пишет Консоль браузера (Ctrl+Shift+J) ?

На странице about:support
    - открывается ли новая вкладка с поиском?
    - что написано в графе «Многопроцессные окна»?

Каково значение настройки extensions.webextensions.remote ?

Dumby пишет

Что при этом пишет Консоль браузера (Ctrl+Shift+J) ?

На странице about:support
    - открывается ли новая вкладка с поиском?
    - что написано в графе «Многопроцессные окна»?

Каково значение настройки extensions.webextensions.remote ?

Прошу прощения за долгий ответ. Нечаянно весь профиль удалился (он сам, я ничего не трогал ©). Вся папка на "Д", вместе с профилями TheBat и Sylpheed. :(
Посему решил из бэкапа не воссоздавать, а создать новый, с нуля, постепенно перенося настройки из бэкапа.

В общем выяснил что extensions.webextensions.remote был в false, layers.gpu-process.enabled, browser.tabs.remote.autostart, browser.tabs.remote.autostart.2 — тоже false, dom.ipc.processCount =1.
В графе «Многопроцессные окна» — «отключены». Новая вкладка не открывалась.

Так же не работала кнопка перевода выделенного текста по ПКМ.

Эти кнопки работали лишь на новой вкладке дополнения Quick Dial. На любой другой новая вкладка не открывалась (в случае поиска по сайту после ввода текста в окошко), или не появлялось окошко с переводом текста (в случае кнопки  google-translate).

При воссоздании профиля с нуля выяснилось, что часть настроек из user.js не применяются совсем. Очистил настройки. Кнопки заработали при сбросе по умолчанию extensions.e10sBlocksEnabling , browser.tabs.remote.force-enable и extensions.e10sBlockedByAddons=false.

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

Благодарю за помощь. И, если не трудно, напомните пожалуйста за что эти настройки отвечают. Поиск по форуму выводит лишь результаты о включении/выключении этих параметров. А они в user.js давно уже были. Уже из башки выветрилось зачем они нужны.

:offtopic:

скрытый текст
Dumby, а чем вы кавычки-ёлочки ставите? Кнопками вроде «Insert special symbol» или может дополнением, вроде Clippings?
И то и другое, конечно, здорово, но на некоторых сайтах часто их ставить приходится и проще бывает через Ctrl-C Ctrl-V размножать, но и это надоедает...

Подскажите ПЛЗ.
Как сделать при нажатии на CTRL+T новая вкладка открывалась после текущей.
Сейчас открывается после последней. :(

muxtair
https://forum.mozilla-russia.org/viewto … 47#p700447

Я не специалист, что  и куда это того. Вы не подскажите что и куда вставлять(код) на который дали ссылку.

В браузере Basilisk (основан на Firefox 52) не могу установить кнопочку Cookies Permissions )-: По клику на кнопку выпадает только менюшка самого Custom Buttons: https://www.radikal.kz/Lhh.jpg

Не подскажете, люди добрые, как починить?

Три рубля
В Базилике такая проблема есть. Некоторые расширения правильно не устанавливаются. У меня, например, в расширении куки экстрименатор кнопка расширения не повляется на панели. Пришлось от него отказаться.

Garalf пишет

У меня, например, в расширении куки экстрименатор кнопка расширения не повляется на панели. Пришлось от него отказаться.

Как раз Куки Экстерминатор у меня замечательно встал и работает 139.gif?m=1515150564

Перестало на Fx61 вот это работать
https://forum.mozilla-russia.org/viewtopic.php?pid=590420#p590420

И вот это
https://forum.mozilla-russia.org/viewtopic.php?pid=658275#p658275

И вот это
http://forum.mozilla-russia.org/viewtopic.php?pid=590488#p590488

В общем как будто отвалилось то, что создавало меню с помощью кнопки.
Есть способ вернуть это?
Спасибо.

Сделал Три кнопки, выполняют множество функций, прошу оценить:

«3акладки» - кнопка-комбайн, более 30 функций: http://victor-dobrov.narod.ru/Share/Fir … ttons.html (т.к. код слишком объёмный, разместил отдельно)

скрытый текст
Если имя профиля содержит "admin" или "root", кнопка переключается в экспертный режим.
GreaseMonkey: UserScriptLoader.uc.js
GESTURES жесты мыши; CB drag and go перетаскивание
Context Search, zoomButton, RSS feed-button
URL-панель кнопок в панели адреса, Подчеркивание домена
Выпадающий URL-список по ширине строки адреса
Контекстное меню к выпадающему URL-списку
Выделение вкладки, добавленой в закладки
Расширение downloads-button, PanelUI, bookmarks-menu, urlbar-button…
Обработка кликов, горячих клавиш, долгих нажатий
Подсказки к ссылкам, Остановить загрузку всех вкладок
Открыть закладку средним кликом, не закрывая меню
Адрес закладки в подсказке вкладки
Восстановить иконки закладок в меню папок закладок
Закладки в контекстном меню страницы
Закладки: контекстное меню на клавише/клике мыши
Save snapshot to html
Поиск похожих изображений в Google
Скрыть Findbar после клика мыши
Редактировать сохранённые логины и пароли
Раскрыть пароли в полях ввода ***
Полоса загрузки в адресной строке
Добавить закладку двойным кликом на папке закладок
Автоскрытие панели вкладок
Стили некоторых кнопок, tooltip и scrollbar
…и многое другое

Reader mode - переключение в режим чтения, поиск из буфера, замена стиля страниц, запрет загрузки графики, подсветка ссылок…

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EReader%20mode%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsSAAALEgHS3X78AAAAFnpUWHRBdXRob3IAAAiZS8lPKsovAwAIuwKNGwWQuAAABEBJREFUSMfdVm1MW1UYPufefn9DoS0tg96ChAURxgB/GL4CsYyEQLLFuBhHokyDKSHMZAY/lxh/GeN+6A9jJsSP6I8p2yjwS7eIIh/bCLhBtmQhRmb2g7SglLK29xzf97Zdurpm6s/d5Kbn3PM8z/tx3vecEvLIPb29va6ioqIZk8kke73eM2NjY5pc2JmZGaG4uPjDwsLCmNvtvtjT0+N6qAGn03kGfji+lFLu8/lGcmElSRpCTBoPjo0+zPsinU4XFkVxt7S09BskGwyGze7ubnc21u/3F+r1+tsoDJGOq1SqqFarDaNGJk7InKyurj69t7dnM5vNS+vr631Wq3WWc27f3t62ZhsQBKEAHHAD5urExMRRSOnlWCxmW1tb8+eMoKCgIJjy6CTO29rafC0tLf6NjQ2ajV1eXqaNjY2d7e3t+1PpehW5drt98oHisEH7IMQ/1Wr1Xpr0Xx5wpgK5oPEXaJX8A1BeXt6PHthstkv/twKB+z1qlJWVvXTfHkCeSSgUOoJjKLsf+vr6KgcGBlz/VjgQCLiQA9yLOA+Hw0dQM7MiJEwP2jIaDCG9TnfXaDRsejyes7BWmUu4q6sLRc8ajcZN5EDFhVAD09TZ2em7B4SQApn1rFKr742hom43NzfXZYu3trbWwdrGgzioBZseIKn00Pz8fAyNu6QyduLTz9lHCyvsnW8nWdVTTSy1L/PQ0eaamppGeJ8cHR214DdcQwxikTMMXJfkUzh5eXmXUJt0dHRUqlWqiDnfzk/PLrFglLPx7QS/EOHsy982mVRdw6BGmcPhWIZmYvByGP8KIrBWq2AQixzkogZqAW4XIt8vQnMc2traeqbt2ef5of7jJLoTpUyWiRxPUJPNQiBcsjAdpJFIxElxAs/Ozo4Dfuhzb54ijzc1kbu7UcqBE48lqLN0H7lz6xa5eXVRDdpXBNjEV5D02IGDhMnJ/KIOvom4TKUnDhBBFNGjWFVV1YvV1dX9KlGM4zeIQMEodpO2FY3yuoPpo+eEClpehZNEPAagjF1UyoxCJHHCGaM2u31uZWXlM1yCbj0GZd0sJ+JcISE2ZQCnciKhDGVZjgrT09OncXJ99idFH73BGkZ5tVYgNxbnKM6h9JbStmF8Gb/dWJyniOGpXkpGntTCZ2pq6gMBSvRHjUazNRc8T+eDF4jepONavZ7ozXr++9pNPvnJx3iw4Tl1Pm0AjuWgKAoE1xCDWA1ygLswGSS/TIxT6ItwbW1t0pLHU/wuOmEwW/jh4dfYG19/x154733m9EosdYCNw4kpZl40cMmcwzXEIPZ14BwePskMFosSUElJyVuZra4Fwlc01Si4V+mmgXqfbWhocGY3Wn19vQPWfiZZHNSAS+uLkZER9X0EyKEIVfIyHHrXoeW55PXegfSdGhwctOY6KoaGhiyAfxtuvT+gq3lFRcU10DiOWo/On4i/AftH0ze2wWtnAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041F%u0440%u0435%u043E%u0431%u0440%u0430%u0437%u043E%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u0441%u0441%u044B%u043B%u043A%u0438%0Afunction%20runLinkification%28%29%20%7B%0Avar%20domains%20%3D%20%5B%20%22ac%22%2C%20%22ad%22%2C%20%22ae%22%2C%20%22aero%22%2C%20%22af%22%2C%20%22ag%22%2C%20%22ai%22%2C%20%22al%22%2C%20%22am%22%2C%20%22an%22%2C%20%22ao%22%2C%20%22aq%22%2C%20%22ar%22%2C%20%22arpa%22%2C%20%22as%22%2C%20%22asia%22%2C%20%22at%22%2C%20%22au%22%2C%20%22aw%22%2C%20%22ax%22%2C%20%22az%22%2C%20%22ba%22%2C%20%22bb%22%2C%20%22bd%22%2C%20%22be%22%2C%20%22bf%22%2C%20%22bg%22%2C%20%22bh%22%2C%20%22bi%22%2C%20%22biz%22%2C%20%22bj%22%2C%20%22bm%22%2C%20%22bn%22%2C%20%22bo%22%2C%20%22br%22%2C%20%22bs%22%2C%20%22bt%22%2C%20%22bv%22%2C%20%22bw%22%2C%20%22by%22%2C%20%22bz%22%2C%20%22ca%22%2C%20%22cat%22%2C%20%22cc%22%2C%20%22cd%22%2C%20%22cf%22%2C%20%22cg%22%2C%20%22ch%22%2C%20%22ci%22%2C%20%22ck%22%2C%20%22cl%22%2C%20%22cm%22%2C%20%22cn%22%2C%20%22co%22%2C%20%22com%22%2C%20%22coop%22%2C%20%22cr%22%2C%20%22cu%22%2C%20%22cv%22%2C%20%22cx%22%2C%20%22cy%22%2C%20%22cz%22%2C%20%22de%22%2C%20%22dj%22%2C%20%22dk%22%2C%20%22dm%22%2C%20%22do%22%2C%20%22dz%22%2C%20%22ec%22%2C%20%22edu%22%2C%20%22ee%22%2C%20%22eg%22%2C%20%22er%22%2C%20%22es%22%2C%20%22et%22%2C%20%22eu%22%2C%20%22fi%22%2C%20%22fj%22%2C%20%22fk%22%2C%20%22fm%22%2C%20%22fo%22%2C%20%22fr%22%2C%20%22ga%22%2C%20%22gb%22%2C%20%22gd%22%2C%20%22ge%22%2C%20%22gf%22%2C%20%22gg%22%2C%20%22gh%22%2C%20%22gi%22%2C%20%22gl%22%2C%20%22gm%22%2C%20%22gn%22%2C%20%22gov%22%2C%20%22gp%22%2C%20%22gq%22%2C%20%22gr%22%2C%20%22gs%22%2C%20%22gt%22%2C%20%22gu%22%2C%20%22gw%22%2C%20%22gy%22%2C%20%22hk%22%2C%20%22hm%22%2C%20%22hn%22%2C%20%22hr%22%2C%20%22ht%22%2C%20%22hu%22%2C%20%22id%22%2C%20%22ie%22%2C%20%22il%22%2C%20%22im%22%2C%20%22in%22%2C%20%22info%22%2C%20%22int%22%2C%20%22io%22%2C%20%22iq%22%2C%20%22ir%22%2C%20%22is%22%2C%20%22it%22%2C%20%22je%22%2C%20%22jm%22%2C%20%22jo%22%2C%20%22jobs%22%2C%20%22jp%22%2C%20%22ke%22%2C%20%22kg%22%2C%20%22kh%22%2C%20%22ki%22%2C%20%22km%22%2C%20%22kn%22%2C%20%22kp%22%2C%20%22kr%22%2C%20%22kw%22%2C%20%22ky%22%2C%20%22kz%22%2C%20%22la%22%2C%20%22lb%22%2C%20%22lc%22%2C%20%22li%22%2C%20%22lk%22%2C%20%22lr%22%2C%20%22ls%22%2C%20%22lt%22%2C%20%22lu%22%2C%20%22lv%22%2C%20%22ly%22%2C%20%22ma%22%2C%20%22mc%22%2C%20%22md%22%2C%20%22me%22%2C%20%22mg%22%2C%20%22mh%22%2C%20%22mil%22%2C%20%22mk%22%2C%20%22ml%22%2C%20%22mm%22%2C%20%22mn%22%2C%20%22mo%22%2C%20%22mobi%22%2C%20%22mp%22%2C%20%22mq%22%2C%20%22mr%22%2C%20%22ms%22%2C%20%22mt%22%2C%20%22mu%22%2C%20%22museum%22%2C%20%22mv%22%2C%20%22mw%22%2C%20%22mx%22%2C%20%22my%22%2C%20%22mz%22%2C%20%22na%22%2C%20%22name%22%2C%20%22nc%22%2C%20%22ne%22%2C%20%22net%22%2C%20%22nf%22%2C%20%22ng%22%2C%20%22ni%22%2C%20%22nl%22%2C%20%22no%22%2C%20%22np%22%2C%20%22nr%22%2C%20%22nu%22%2C%20%22nz%22%2C%20%22om%22%2C%20%22org%22%2C%20%22pa%22%2C%20%22pe%22%2C%20%22pf%22%2C%20%22pg%22%2C%20%22ph%22%2C%20%22pk%22%2C%20%22pl%22%2C%20%22pm%22%2C%20%22pn%22%2C%20%22pr%22%2C%20%22pro%22%2C%20%22ps%22%2C%20%22pt%22%2C%20%22pw%22%2C%20%22py%22%2C%20%22qa%22%2C%20%22re%22%2C%20%22ro%22%2C%20%22rs%22%2C%20%22ru%22%2C%20%22rw%22%2C%20%22sa%22%2C%20%22sb%22%2C%20%22sc%22%2C%20%22sd%22%2C%20%22se%22%2C%20%22sg%22%2C%20%22sh%22%2C%20%22si%22%2C%20%22sj%22%2C%20%22sk%22%2C%20%22sl%22%2C%20%22sm%22%2C%20%22sn%22%2C%20%22so%22%2C%20%22sr%22%2C%20%22st%22%2C%20%22su%22%2C%20%22sv%22%2C%20%22sy%22%2C%20%22sz%22%2C%20%22tc%22%2C%20%22td%22%2C%20%22tel%22%2C%20%22tf%22%2C%20%22tg%22%2C%20%22th%22%2C%20%22tj%22%2C%20%22tk%22%2C%20%22tl%22%2C%20%22tm%22%2C%20%22tn%22%2C%20%22to%22%2C%20%22tp%22%2C%20%22tr%22%2C%20%22travel%22%2C%20%22tt%22%2C%20%22tv%22%2C%20%22tw%22%2C%20%22tz%22%2C%20%22ua%22%2C%20%22ug%22%2C%20%22uk%22%2C%20%22us%22%2C%20%22uy%22%2C%20%22uz%22%2C%20%22va%22%2C%20%22vc%22%2C%20%22ve%22%2C%20%22vg%22%2C%20%22vi%22%2C%20%22vn%22%2C%20%22vu%22%2C%20%22wf%22%2C%20%22ws%22%2C%20%22ye%22%2C%20%22yt%22%2C%20%22yu%22%2C%20%22za%22%2C%20%22zm%22%2C%20%22zw%22%20%5D%3B%0A%0A//%20%28c%29%20http%3A//yellow5.us/firefox/linkification/%0Avar%20tagsForSkip%20%3D%20%5B%20%22a%22%2C%20%22applet%22%2C%20%22area%22%2C%20%22embed%22%2C%20%22frame%22%2C%20%22frameset%22%2C%20%22head%22%2C%20%22iframe%22%2C%20%22img%22%2C%20%22map%22%2C%20%22meta%22%2C%20%22noscript%22%2C%20%22object%22%2C%20%22option%22%2C%20%22param%22%2C%20%22script%22%2C%20%22select%22%2C%20%22style%22%2C%20%22textarea%22%2C%20%22title%22%20%5D%3B%0A%0Avar%20inArray%20%3D%20function%28value%2C%20items%29%20%7B%0A%09for%20%28var%20i%20%3D%200%3B%20items%5Bi%5D%20%26%26%20value%20%21%3D%20items%5Bi%5D%3B%20i++%29%3B%0A%09return%20value%20%3D%3D%20items%5Bi%5D%3B%0A%7D%0A%0Avar%20urlsRegExp%20%3D%20/%28%5E%7C%5B%5Cs%28%29%5C%5B%5C%5D_%3A%7E+@*%22%27%3E%5D%29%28%28%3F%3Ahttps%3F%7Cftp%7Circ%29%3A%5C/%5C/%29%3F%28%5B-a-z%5Cd%3B%3A%26%3D+%24%2C%25_.%21%7E*%27%28%29%5D+@%29%3F%28%28%3F%3A%28%3F%3A25%5B0-5%5D%7C2%5B0-4%5D%5Cd%7C%5B01%5D%3F%5Cd%5Cd%3F%29%5C.%29%7B3%7D%28%3F%3A25%5B0-5%5D%7C2%5B0-4%5D%5Cd%7C%5B01%5D%3F%5Cd%5Cd%3F%29%7C%28%3F%3A%28www%7Circ%7Cftp%29%5C.%29%3F%28%3F%3A%28%3F%3A%5Ba-z%5Cd%5D%7C%5Ba-z%5Cd%5D%5Ba-z%5Cd-%5D*%5Ba-z%5Cd%5D%29%5C.%29+%28%5Ba-z%5D%7B2%2C6%7D%29%29%28%3A%5Cd+%29%3F%28%5C/%28%3F%3A%5B-%5Cw.%21%7E*%27%28%29%25%3A@%26%3D+%24%2C%3B%5C/%5D*%5B%5Cw%7E*%25@%26%3D+%24%5C/%5D%29%3F%28%3F%3A%5C%3F%28%3F%3A%5B-%5Cw%3B%5C/%3F%3A@%26%3D+%24%2C.%21%7E*%27%28%29%25%5C%5B%5C%5D%7C%5D*%5B%5Cw%5C/@%26%3D+%24%7E*%25%5D%29%3F%29%3F%28%3F%3A%23%28%3F%3A%5B-%5Cw%3B%5C/%3F%3A@%26%3D+%24%2C.%21%7E*%27%28%29%25%5D*%5B%5Cw%5C/@%26%3D+%24%7E*%25%5D%29%3F%29%3F%7C%5Cb%29/i%0A%0Avar%20linksCounter%20%3D%200%3B%0Avar%20current%20%3D%20content.document.body%3B%0Awhile%20%28current%29%20%7B%0A%09if%20%28current.nodeName%20%3D%3D%20%22%23text%22%20%26%26%20%28match%20%3D%20current.nodeValue.match%28urlsRegExp%29%29%20%26%26%20inArray%28match%5B6%5D%2C%20domains%29%29%20%7B%0A%09%09var%20url%3B%0A%09%09if%20%28match%5B3%5D%20%26%26%20%21%20match%5B2%5D%20%26%26%20%21%20match%5B5%5D%20%26%26%20%21%20match%5B8%5D%20%26%26%20%28match%5B3%5D.indexOf%28%22%3A%22%29%20%3D%3D%20-1%20%7C%7C%20match%5B3%5D.indexOf%28%22mailto%3A%22%29%20%3D%3D%200%29%29%20%7B%0A%09%09url%20%3D%20%28match%5B3%5D.indexOf%28%22mailto%3A%22%29%20%3D%3D%20-1%20%3F%20%22mailto%3A%22%20%3A%20%22%22%29%0A%09%09%09+%20match%5B3%5D%0A%09%09%09+%20match%5B4%5D%3B%0A%09%09%7D%0A%09%09else%20%7B%0A%09%09url%20%3D%20%28match%5B2%5D%20%3F%20match%5B2%5D%20%3A%20%28%21%20match%5B5%5D%20%7C%7C%20match%5B5%5D%20%3D%3D%20%22www%22%20%3F%20%22http%22%20%3A%20match%5B5%5D%29%20+%20%22%3A//%22%29%0A%09%09%09+%20%28match%5B3%5D%20%3F%20match%5B3%5D%20%3A%20%22%22%29%0A%09%09%09+%20match%5B4%5D%0A%09%09%09+%20%28match%5B7%5D%20%3F%20match%5B7%5D%20%3A%20%22%22%29%0A%09%09%09+%20%28match%5B8%5D%20%3F%20match%5B8%5D%20%3A%20%22%22%29%3B%0A%09%09%7D%0A%09%09if%20%28url%29%20%7B%0A%09%09var%20range%20%3D%20content.document.createRange%28%29%3B%0A%09%09range.setStart%28current%2C%20match.index%20+%20match%5B1%5D.length%29%3B%0A%09%09range.setEnd%28current%2C%20match.index%20+%20match%5B0%5D.length%29%3B%0A%09%09var%20a%20%3D%20content.document.createElement%28%22a%22%29%3B%0A%09%09a.setAttribute%28%22href%22%2C%20url%29%3B%0A%09%09a.setAttribute%28%22target%22%2C%20%22_blank%22%29%3B%0A%09%09a.setAttribute%28%22class%22%2C%20%22linkified%22%29%3B%0A%09%09a.appendChild%28range.extractContents%28%29%29%3B%0A%09%09range.insertNode%28a%29%3B%0A%09%09range.detach%28%29%3B%0A%09%09linksCounter++%3B%0A%09%09%7D%0A%09%7D%0A%09if%20%28current.tagName%20%26%26%20%21inArray%28current.tagName.toLowerCase%28%29%2C%20tagsForSkip%29%20%26%26%20current.firstChild%29%20%7B%0A%09%09current%20%3D%20current.firstChild%3B%0A%09%7D%0A%09else%20if%20%28current.nextSibling%29%20%7B%0A%09%09current%20%3D%20current.nextSibling%3B%0A%09%7D%0A%09else%20%7B%0A%09%09do%20%7B%0A%09%09current%20%3D%20current.parentNode%3B%0A%09%09%7D%20while%20%28%21current.nextSibling%20%26%26%20current.parentNode%29%3B%0A%09%09current%20%3D%20current.nextSibling%3B%0A%09%7D%0A%7D%7D%3B%0A%0A%0A%0A%0A//%20%u041A%u043D%u043E%u043F%u043A%u0430%3A%20%u0440%u0435%u0436%u0438%u043C%20%u0447%u0442%u0435%u043D%u0438%u044F%0A%0Avar%20tooltipSimple%20%3D%0A%27%20%u0412%u0438%u0434%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%uD83D%uDD0D%20%22%u0414%u043B%u044F%20%u0447%u0442%u0435%u043D%u0438%u044F%22%5Cn%27%20+%0A%27%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0442%u0435%u043A%u0441%u0442%20%u0441%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0430%u043C%u0438%20%uD83D%uDDB9%5Cn%27%20+%0A%27%20%u0443%u0431%u0438%u0440%u0430%u0435%u0442%u0441%u044F%20%u0440%u0435%u043A%u043B%u0430%u043C%u0430%2C%20%u0437%u0430%u0433%u043E%u043B%u043E%u0432%u043A%u0438%5Cn%5Cn%27%20+%0A%0A%27%20%u041F%u0440%u0430%u0432%u0430%u044F%20%u043A%u043D%u043E%u043F%u043A%u0430%3A%20%u0437%u0435%u043B%u0451%u043D%u044B%u0439%20%u0441%u0442%u0438%u043B%u044C%20%5Cn%27%20+%0A%27%20%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%3A%20%u043E%u0442%u043A%u043B%20%7C%20%u0432%u043A%u043B%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0438%27%3B%0A%0Avar%20tooltipExpert%20%3D%0A%27%20%u0412%u0438%u0434%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%uD83D%uDD0D%20%22%u0414%u043B%u044F%20%u0447%u0442%u0435%u043D%u0438%u044F%22%5Cn%27%20+%0A%27%20%20%u2026%20+%u205FCtrl%3A%20%u043F%u0435%u0440%u0435%u0432%u043E%u0434%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%5Cn%5Cn%27%20+%0A%27%20%u041F%u0440%u0430%u0432%u0430%u044F%20%u043A%u043D%u043E%u043F%u043A%u0430%3A%20%u0437%u0435%u043B%u0451%u043D%u044B%u0439%20%u0441%u0442%u0438%u043B%u044C%20%5Cn%27%20+%0A%27%20%20%u2026%20+%u205FCtrl%3A%20%u043E%u0442%u043A%u043B%20%7C%20%u0432%u043A%u043B%20%u0441%u0442%u0438%u043B%u044C%5Cn%27%20+%0A%27%20%20%u2026%20+%u200AShift%3A%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%5Cn%27%20+%0A%27%20%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%3A%20%u043E%u0442%u043A%u043B%20%7C%20%u0432%u043A%u043B%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0438%5Cn%27%20+%0A%27%20%20+%20Ctrl%3A%20%u043F%u043E%u0438%u0441%u043A%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%uD83D%uDCCB%5Cn%27%20+%0A%27%20%20+%20Shift%3A%20%u043F%u043E%u0438%u0441%u043A%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043E%u0433%u043E%u205F%uD83D%uDDB0%27%3B%0A%0A//%20%u0440%u0435%u0436%u0438%u043C%20%u0440%u0430%u0431%u043E%u0442%u044B%20%u043A%u043D%u043E%u043F%u043A%u0438%20-%20%u041F%u0440%u043E%u0441%u0442%u043E%u0439%20%u0438%u043B%u0438%20%u042D%u043A%u0441%u043F%u0435%u0440%u0442%0Avar%20catprofile%20%3D%20Services.dirsvc.get%28%27ProfD%27%2C%20Ci.nsIFile%29.path.replace%28/.*%5C//%2C%20%22%22%29%3B%20//%20%u0438%u043C%u044F%20%u043F%u0440%u043E%u0444%u0438%u043B%u044F%0Aif%20%28%20/dobrov%7Cvictor%7Cadmin/.test%28catprofile%29%20%29%20SIMPLE%20%3D%200%3B%20else%20SIMPLE%20%3D%201%3B%09//%20%u043F%u0440%u043E%u0441%u0442%u043E%u0439%20%u0440%u0435%u0436%u0438%u043C%0A%0Avar%20HINT%3B%20if%20%28%20SIMPLE%20%29%20HINT%20%3D%20tooltipSimple%3B%20else%20HINT%20%3D%20tooltipExpert%3B%0A%0Aconst%20CUT%20%3D%2025%3B%20const%20IN_NEW_TAB%20%3D%20true%3B%20const%20IN_BACKGROUND%20%3D%20false%3B%0Avar%20clipboard%3B%20var%20xclip%3B%0A%0Athis.onmouseover%20%3D%20function%28e%29%20%7B%0A%09setTimeout%28%28%29%3D%3E%20%7B%0A%09%09xclip%20%3D%20readFromClipboard%28%29.replace%28/%5Cs+/g%2C%27%20%27%29%3B%09//%20%u0443%u0431%u0440%u0430%u0442%u044C%20%u0441%u043B%u0443%u0436.%20%u0441%u0438%u043C%u0432%u043E%u043B%u044B.%20%u0411%u0443%u0444%u0435%u0440%20%u043C%u044B%u0448%u0438%0A%09%09clipboard%20%3D%20custombuttons.cbService.readFromClipboard%28%29.replace%28/%5Cs+/g%2C%27%20%27%29%3B%09//%20%u0411%u0443%u0444%u0435%u0440%u044B%20%uD83D%uDCCB%u200AClipboard%2C%20%uD83D%uDDB0%u200APrimary%0A%09%09this.tooltipText%20%3D%20HINT%3B%0A%09%09if%20%28%20SIMPLE%20%29%20return%3B%0A%09%09this.tooltipText%20%3D%20clipboard%20%3F%20HINT%20+%20%22%5Cn%5Cn%uD83D%uDCCB%u200A%u200A%22%20+%20clipboard.substr%280%2C%20CUT%29%20+%20%22%5Cn%u200A%u200A%u200A%uD83D%uDDB0%20%22%20+%20xclip.substr%280%2C%20CUT%29%20%3A%20HINT%3B%20//%20%u043E%u0433%u0440%u0430%u043D%u0438%u0447%u0438%u0442%u044C%20%u0434%u043B%u0438%u043D%u0443%20%u0441%u0442%u0440%u043E%u043A%u0438%0A%09%7D%2C%20300%29%3B%0A%7D%3B%0A%0Afunction%20searchclip%28text%29%20%7B%09//%20%u043F%u043E%u0438%u0441%u043A%20%u0444%u0440%u0430%u0437%u044B%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u044B%u043C%20%u0434%u0432%u0438%u0436%u043A%u043E%u043C%20%u043F%u043E-%u0443%u043C%u043E%u043B%u0447%u0430%u043D%u0438%u044E%0A%09var%20ss%20%3D%20Cc%5B%22@mozilla.org/browser/search-service%3B1%22%5D.getService%28Ci.nsIBrowserSearchService%29%3B%0A%09var%20submission%20%3D%20ss.currentEngine.getSubmission%28text%2C%20null%29%3B%0A%09getBrowser%28%29.selectedTab%20%3D%20getBrowser%28%29.addTab%28submission.uri.spec%2C%20null%2C%20null%2C%20submission.postData%2C%20IN_BACKGROUND%2C%20false%29%3B%0A%7D%3B%0A%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20if%28e.button%20%3D%3D%200%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%29%20%7B%0A%09%09if%28e.ctrlKey%29%20%7B%20//%20+%20Ctrl%0A%09%09var%20currentURI%20%3D%20window.gBrowser.selectedBrowser.contentWindow.location%3B%0A%09%09getBrowser%28%29.selectedTab%20%3D%20getBrowser%28%29.addTab%28%22http%3A//translate.google.com/translate%3Fu%3D%22%20+%20currentURI%20+%20%22%26hl%3Dru%22%29%3B%0A%09%09%7D%20else%20%7B%20//%20%u043A%u043B%u0438%u043A%0A%09%09%09this.setAttribute%28%27oncommand%27%2C%20%27getBrowser%28%29.mCurrentTab%28ReaderParent.toggleReaderMode%28event%29%29%27%29%3B%0A%09%09%09icon_change%28%20iconbutton%2C%20self.image%2C%203%2C%20%27%27%20%29%3B%0A%09%09//%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u0438%u0437%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0438%0A%09%09%09var%20but%20%3D%20document.getElementById%28%27reader-mode-button%27%29%3B%0A%09%09%09if%20%28but%29%20but.style.display%20%3D%20%22none%22%3B%0A%09%09%7D%0A%09%7D%20//%20%u041F%u041A%u041C%20%u043A%u043B%u0438%u043A%20%28%u0431%u0435%u0437%20Alt%2C%20Win%29%0A%20%20%20%20else%20if%28e.button%20%3D%3D%202%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%29%20%7B%0A%09%09if%28e.shiftKey%29%20%7B%20//%20+%20Shift%0A%09%09%09runLinkification%28%29%3B%0A%09%09%7D%20else%20if%28e.ctrlKey%29%20%7B%20%09//%20+%20Ctrl%0A%09%09%09getMarkupDocumentViewer%28%29.authorStyleDisabled%20%3F%20gPageStyleMenu.switchStyleSheet%28%27%27%29%20%3A%20gPageStyleMenu.disableStyle%28%29%3B%0A%09%09%7D%20else%20%7B%20//%20%u043A%u043B%u0438%u043A%0A//%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0441%u0442%u0438%u043B%u044C%20%u0438%u0437%20%u0441%u043F%u0440%u0430%u0432%u043A%u0438%0A%09%09%09setStyleForPages%28%29%3B%0A%09%09%7D%0A%09%7D%09else%20if%28e.button%20%3D%3D%201%29%20%7B%20//%20%u0421%u041A%u041C%20%u043A%u043B%u0438%u043A%0A%09%09if%28e.shiftKey%29%0A%09%09%09searchclip%28xclip%29%0A%09%09else%20if%28e.ctrlKey%29%09//%20+%20Ctrl%0A%09%09%09searchclip%28clipboard%29%0A%09%09else%20%7B%20//%20%u043A%u043B%u0438%u043A%0A//%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043F%u043E%u043A%u0430%u0437%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0439%0A%09%09show_tooltip%28self.image%2C%20%27%u0417%u0430%u0433%u0440%u0443%u0437%u043A%u0430%20%u043A%u0430%u0440%u0442%u0438%u043D%u043E%u043A%3A%27%2C%20%27%u0432%u043A%u043B%u044E%u0447%u0435%u043D%u0430%2C%20%u0435%u0441%u043B%u0438%20%22%u041E%u0447%u043A%u0438%22%20%u0446%u0432%u0435%u0442%u043D%u044B%u0435%27%2C%207000%29%3B%0A%09%09BrowserReload%28%20custombuttons.setPrefs%28s%2C%20custombuttons.getPrefs%28s%29%20%3D%3D%201%20%3F%202%20%3A%201%29%20%29%3B%0A%09%09%7D%0A%20%20%20%20%7D%0A%7D%3B%0A%0A//%20%u0411%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041F%u041A%u041C%2C%20+Ctrl%2C%20+Shift%0Athis.oncontextmenu%20%3D%20function%28e%29%20%7B%20if%28e.button%20%3D%3D%202%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%29%20%7B%20e.preventDefault%28%29%3B%20e.stopPropagation%28%29%3B%20%7D%20%7D%3B%0A%0Avar%20iconbutton%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0Aconst%20greenbg%20%3D%20%22background-image%3A%20-moz-linear-gradient%28%23cfdbca%2C%20%23cfdbca%2C%20%23cfdbca%29%3B%22%0Aicon_change%28%20iconbutton%2C%20self.image%2C%201%2C%20%27%27%20%29%3B%0A%0Afunction%20icon_change%28%20icon%2C%20image%2C%20num%2C%20bg%20%29%20%7B%0A%09icon.src%20%3D%20image%3B%09//%20%u0437%u0435%u043B%u0451%u043D%u0430%u044F%20%u0438%u043A%u043E%u043D%u043A%u0430%0A%09if%20%28num%20%3D%3D%200%29%20%7B%0A%09%09icon.style.cssText%20%3D%20%22filter%3A%20grayscale%28100%25%29%20invert%2840%25%29%20contrast%28300%25%29%20%3B%22%3B%0A%09%7D%20else%20if%20%28num%20%3D%3D%201%29%20%7B%09//%20%u043A%u0440%u0430%u0441%u043D%u044B%u0439%0A%09%09icon.style.cssText%20%3D%20%22background-image%3A%20none%3B%20filter%3A%20unset%3B%22%3B%0A%09%09icon.style.cssText%20%3D%20%22filter%3A%20hue-rotate%2890deg%29%3B%22%20+%20bg%3B%0A%09%09iconbutton.setAttribute%28%27color%27%2C%20num%29%3B%0A%09%7D%20else%20if%20%28num%20%3D%3D%202%29%09%7B%20//%20%u0437%u0435%u043B%u0451%u043D%u044B%u0439%0A%09%09icon.style.cssText%20%3D%20%22background-image%3A%20none%3B%20filter%3A%20unset%3B%22%20+%20bg%3B%0A%09%09iconbutton.setAttribute%28%27color%27%2C%20num%29%3B%0A%09%7D%20else%20if%20%28num%20%3D%3D%203%29%20%7B%09//%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0446%u0432%u0435%u0442%0A%09%09if%20%28%20iconbutton.getAttribute%28%27color%27%29%20%3D%3D%202%20%29%0A%09%09%09icon_change%28%20iconbutton%2C%20self.image%2C%201%2C%20bg%20%29%09%09//%20return%3B%0A%09%09else%0A%09%09%09icon_change%28%20iconbutton%2C%20self.image%2C%202%2C%20bg%20%29%3B%09//%20return%3B%0A%09%7D%20else%0A%09%09icon.style.cssText%20%3D%20%22background-image%3A%20none%3B%20filter%3A%20unset%3B%22%3B%0A%7D%3B%0A%0Avar%20s%20%3D%20%27permissions.default.image%27%3B%0Afunction%20toggleImage%28%29%20%7B%0A%09if%20%28%20custombuttons.getPrefs%28s%29%20%3D%3D%201%29%20%7B%0A%09%09icon_change%28%20iconbutton%2C%20self.image%2C%201%2C%20%27%27%20%29%3B%0A%09%7D%20else%20%7B%0A%09%09icon_change%28%20iconbutton%2C%20self.image%2C%200%2C%20%27%27%20%29%3B%0A%09%7D%0A%7D%3B%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%20%29%3B%0A%0A//%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0435%20css-%u0441%u0442%u0438%u043B%u044F%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%20%u043D%u0430%20%u0443%u043A%u0430%u0437%u0430%u043D%u043D%u044B%u0439%20%u0432%20%u0421%u043F%u0440%u0430%u0432%u043A%u0435%20%u043A%u043D%u043E%u043F%u043A%u0438%0Aif%20%28%20this.hasAttribute%28%22initialized%22%29%20%29%20return%3B%0A%0Avar%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28%20self.Help%20%29%29%3B%0Avar%20sss%20%3D%20Components.classes%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Components.interfaces.nsIStyleSheetService%29%3B%0A%0Afunction%20setStyleForPages%28%20reason%20%29%20%7B%0A%09var%20style%20%3D%20sss.sheetRegistered%28uri%2C%20sss.AGENT_SHEET%29%3B%0Aif%20%28%20style%20%29%20%7B%0A%09sss.unregisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0A%09icon_change%28%20iconbutton%2C%20self.image%2C%201%2C%20%27%27%20%29%3B%0A%09%7D%0Aif%20%28%20%28%21style%20%26%26%20reason%20%21%3D%3D%20%27update%27%29%20%7C%7C%20%28style%20%26%26%20reason%20%3D%3D%20%27update%27%29%20%29%20%7B%0A%09sss.loadAndRegisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0A%09icon_change%28%20iconbutton%2C%20self.image%2C%202%2C%20greenbg%20%29%3B%0A%09%7D%0A%7D%3B%0AaddDestructor%28function%28reason%29%20%7B%20if%20%28/update%7Cdelete/.test%28%20reason%20%29%20%29%20setStyleForPages%28reason%29%20%7D%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B//%20if%28%21event.target%20%26%26%20%21this.disabled%29%20//%20Button%27s%20hotkey%20pressed%0A//%09this.open%20%3D%20true%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B/*AGENT_SHEET*/%0A%0A@-moz-document%20url-prefix%28%22http%22%29%2C%20url-prefix%28%22https%22%29%2C%20url-prefix%28%22ftp%22%29%2C%20url-prefix%28%22file%22%29%20%7B%0Ahtml%20*%2C%20html%20%7B%0Abackground%3A%20%23cfdbca%20%21important%3B%20text-shadow%3A%20none%20%21important%3B%0Acolor%3A%20%23000000%20%21important%3B%0A-moz-border-top-colors%3A%20%238FBC8F%20%21important%3B%20-moz-border-bottom-colors%3A%20%238FBC8F%21important%3B%20-moz-border-left-colors%3A%20%238FBC8F%20%21important%3B%20-moz-border-right-colors%3A%20%238FBC8F%20%21important%3B%0A%7D%0Acode%2C%20pre%2C%20input%2C%20samp%2C%20kbd%2C%20var%2C%20dfn%2C.postright%20%7B%0A-moz-appearance%3A%20none%20%21important%3B%0Abackground-color%3A%20%23BADBAD%20%21important%3B%0A%7D%0Ainput%2C%20select%2C%20textarea%2C%20button%20%7B%0A-moz-appearance%3A%20none%20%21important%3B%0Aborder%3A%201px%20solid%20%23BADBAD%20%21important%3B%0Abackground-color%3A%20%23BADBAD%20%21important%3B%0A%7D%0A.codebox%2C%20BLOCKQUOTE%2C%20TEXTAREA%2C%20.spoiler%20%7B%20-moz-border-top-colors%3A%20%23444%20%20%21important%3B%20-moz-border-bottom-colors%3A%20%23444%20%21important%3B%0A-moz-border-left-colors%3A%20%23444%20%21important%3B%20-moz-border-right-colors%3A%20%23444%20%21important%3B%20%7D%0Aa%3Alink%20%7B%20color%3A%20%23300090%20%21important%3B%0A%7D%0Aa%3Avisited%20%7B%20color%3A%20%23489412%20%21important%3B%20%7D%0Aa%3Aactive%20%7B%20color%3A%20%23d81e1e%20%21important%3B%20%7D%0Aa%3Ahover%20%7B%20color%3A%20%23d81e1e%20%21important%3B%20%7D%0A%7D%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Compact Menu - обычное меню + PanelUI…

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECompact%20Menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20Compact%20Menu%20mod%0Avar%20tooltipText%20%3D%0A%22%20%u043D%u0430%u0436%u0430%u0442%u044C%3A%20%u0413%u043B%u0430%u0432%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%u0411%u0440%u0430%u0443%u0437%u0435%u0440%u0430%5Cn%22%20+%0A%22%20%u043D%u0430%u0436%u0430%u0442%u044C%20+Ctrl%3A%20%u0416%u0443%u0440%u043D%u0430%u043B%20%28%u0418%u0441%u0442%u043E%u0440%u0438%u044F%29%5Cn%5Cn%22%20+%0A%22%20%u041F%u0440%u0430%u0432%u0430%u044F%20%u043A%u043D%u043E%u043F%u043A%u0430%3A%20%u2630%20%u0411%u044B%u0441%u0442%u0440%u043E%u0435%20%u043C%u0435%u043D%u044E%5Cn%22%20+%0A%22%20%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%3A%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%5Cn%5Cn%22%20+%0A%0A%22%20%u0416%u0435%u0441%u0442%u044B%20%u043F%u0440%u0430%u0432%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u043E%u0439%20%u043C%u044B%u0448%u0438%3A%5Cn%22%20+%0A%22%20%u2026%20%u043D%u0430%u0436%u0430%u0442%u044C%2C%20%u0441%u0434%u0435%u043B%u0430%u0442%u044C%20%u0436%u0435%u0441%u0442%2C%20%u043E%u0442%u043F%u0443%u0441%u0442%u0438%u0442%u044C%20%5Cn%22%20+%0A%22%5Cn%22+%0A%22%20%u2022%20%u041B%u0435%u0432%u043E%3A%20%u043F%u0435%u0440%u0435%u0445%u043E%u0434%20%u041D%u0430%u0437%u0430%u0434%20%28%3D%3E%3A%20%u0412%u043F%u0435%u0440%u0451%u0434%29%20%5Cn%22%20+%0A%22%20%u2022%20R+%u21C5%20%u0420%u043E%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%3A%20%u041C%u0430%u0441%u0448%u0442%u0430%u0431%20%28+-%29%5Cn%22%20+%0A%22%20%u2022%20M+%u21C5%20%u0420%u043E%u043B%u0438%u043A%20%u043C%u044B%u0448%u0438%3A%20%u0412%u043A%u043B%u0430%u0434%u043A%u0438%20%u21C4%5Cn%22%20+%0A%22%20%u2022%20L%3ER%20%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0443%20%28U%3A%20%u0421%u0442%u043E%u043F%29%5Cn%22%20+%0A%22%20%u2022%20UDU%20%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%5Cn%22%20+%0A%22%20%u2022%20DR%3A%20%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u043A%u044D%u0448%5Cn%22%20+%0A%22%5Cn%22%20+%0A%0A%22%20%u041F%u0435%u0440%u0435%u0442%u0430%u0441%u043A%u0438%u0432%u0430%u043D%u0438%u0435%20%u043E%u0431%u044A%u0435%u043A%u0442%u043E%u0432%20%u043C%u044B%u0448%u044C%u044E%3A%5Cn%22%20+%0A%22%20%u2026%20%u0432%u0437%u044F%u0442%u044C%20%u0438%20%u0442%u0430%u0449%u0438%u0442%u044C%20%28%u0442%u0435%u043A%u0441%u0442%2C%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0443%29%22%20+%0A%22%5Cn%22%3B%0A%0Avar%20tooltipSimple%20%3D%0A%22%20%u041C%u0435%u043D%u044E%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20Firefox%5Cn%5Cn%22%20+%0A%0A%22%20%u0427%u0442%u043E%u0431%u044B%20%u0438%u0437%u043C%u0435%u043D%u0438%u0442%u044C%20%u041C%u0430%u0441%u0448%u0442%u0430%u0431%2C%20%u0432%u0440%u0430%u0449%u0430%u0439%u0442%u0435%5Cn%22%20+%0A%22%20%u043A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%20%u043C%u044B%u0448%u0438%2C%20%u0437%u0430%u0436%u0430%u0432%20%u043F%u0440%u0430%u0432%u0443%u044E%20%u043A%u043D%u043E%u043F%u043A%u0443%5Cn%5Cn%22%20+%0A%0A%22%20%u0416%u0435%u0441%u0442%u044B%20%u043C%u044B%u0448%u0438%3A%20%u043F%u0435%u0440%u0435%u0442%u0430%u0449%u0438%u0442%u044C%20%u0438%20%u0431%u0440%u043E%u0441%u0438%u0442%u044C%5Cn%22%20+%0A%22%20%u2026%u0442%u0435%u043A%u0441%u0442%2C%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0438%20%28L%20%u043B%u0435%u0432%u043E%2C%20U%20%u0432%u0432%u0435%u0440%u0445%u2026%29%22%3B%0A%0A//%20%u0440%u0435%u0436%u0438%u043C%20%u0440%u0430%u0431%u043E%u0442%u044B%20%u043A%u043D%u043E%u043F%u043A%u0438%20-%20%u041F%u0440%u043E%u0441%u0442%u043E%u0439%20%u0438%u043B%u0438%20%u042D%u043A%u0441%u043F%u0435%u0440%u0442%0Aconst%20SIMPLE%20%3D%20false%3B%0A%0Aif%20%28%20SIMPLE%20%29%0A%09tooltipText%20%3D%20tooltipSimple%3B%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u043A%u043D%u043E%u043F%u043A%u0438%0Athis.onmouseover%20%3D%28%29%3D%3E%20%7B%20this.tooltipText%20%3D%20tooltipText%20%7D%3B%0A%0Athis.style.cssText%20%3D%20%22margin-left%3A%20-2px%3B%22%3B%0A%0Avar%20CreateMenu%20%3D%20event%20%3D%3E%20%7B%09//%20%u0413%u043B%u0430%u0432%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%0A%09var%20mmb%20%3D%20document.getElementById%28%22main-menubar%22%29%3B%0A%09mmb.collapsed%20%3D%20true%3B%0A%09%09addDestructor%28%28%29%20%3D%3E%20mmb.collapsed%20%3D%20false%29%3B%0A%09if%20%28event.target%20%26%26%20event.target%20%21%3D%20this%29%20return%3B%0A%09if%20%28%21event.target%20%26%26%20this.lastChild%20%26%26%20this.lastChild.state%20%3D%3D%20%22open%22%29%20%7B%0A%09%09this.lastChild.hidePopup%28%29%3B%20return%3B%0A%09%7D%09var%20ids%20%3D%20%5B%0A%09%09%22history-menu%22%2C%0A%09%09%22bookmarksMenu%22%2C%0A%09%09%22file-menu%22%2C%0A%09%09%22edit-menu%22%2C%0A%09%09%22view-menu%22%2C%0A%09%09%22tools-menu%22%2C%0A%09%09%22helpMenu%22%20%5D%3B%0A%09var%20menus%20%3D%20ids.map%28id%20%3D%3E%20document.getElementById%28id%29%29.filter%28id%3D%3E%20%7Breturn%20%28id%20%21%3D%3D%20null%29%7D%29%3B%0A%09var%20menubar%20%3D%20menus%5B0%5D.parentNode%3B%0A%09var%20order%20%3D%20Array.slice%28menubar.childNodes%29%3B%0A%09function%20appendMenus%28parent%29%20%7B%0A%09%09var%20nodes%20%3D%20parent%20%3D%3D%20menubar%20%3F%20order%20%3A%20menus%3B%0A%09%09for%28var%20node%20of%20nodes%29%20parent.appendChild%28node%29%3B%0A%09%09if%20%28ids.indexOf%28%22bookmarksMenu%22%29%20%3D%3D%20-1%29%20return%3B%0A%09%7D%0A%09var%20popup%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%09popup.position%20%3D%20%22after_start%22%3B%0A%09popup.id%20%3D%20%22cb-compact-menu-menupopup%22%3B%0A%09popup.setAttribute%28%22context%22%2C%20%22toolbar-context-menu%22%29%3B%0A%09popup.__defineGetter__%28%22parentNode%22%2C%20%28%29%20%3D%3E%20null%29%3B%0A%09popup.addEventListener%28%22popuphidden%22%2C%20function%20onPH%28e%29%20%7B%0A%09%09if%20%28e.originalTarget%20%21%3D%20this%29%20return%3B%0A%09%09popup.removeEventListener%28%22popuphidden%22%2C%20onPH%2C%20false%29%3B%0A%09%09appendMenus%28menubar%29%3B%0A%09%7D%2C%20false%29%3B%0A%09appendMenus%28popup%29%3B%0A%09popup.openPopup%28this%29%3B%0A%7D%3B%0A%0Athis.onclick%20%3D%20function%28event%29%20%7B%0A%09if%28event.button%20%3D%3D%200%29%20%7B%20//%20%u041B%u041A%u041C%0A%09%09if%28event.shiftKey%29%20//%20+Shift%0A%09%09%090%0A%09%09else%20if%28event.ctrlKey%29%20//%20+Ctrl%0A%09%09%09SidebarUI.toggle%28%22viewHistorySidebar%22%29%0A%09%09else%20//%20%u043A%u043B%u0438%u043A%0A%09%09%09CreateMenu%28event%29%09//%20%u0413%u043B%u0430%u0432%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%0A%09%7D%20else%20if%28event.button%20%3D%3D%201%29%20//%20%u0421%u041A%u041C%20%u043A%u043B%u0438%u043A%0A%20%09%09document.getElementById%28%27History%3AUndoCloseTab%27%29.doCommand%28%29%09%09//%20%u0412%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u0437%u0430%u043A%u0440%u044B%u0442%u0443%u044E%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%0A%7D%3B%0A%0A//%20%u041F%u041A%u041C-%u043A%u043B%u0438%u043A%2C%20+%20%u0431%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%0AaddEventListener%28%22contextmenu%22%2C%20event%20%3D%3E%20%7B%0A%09if%28%20%21event.metaKey%20%26%26%20%21event.altKey%20%29%20%7B%0A%09%09event.tooltipText%20%3D%20%27%27%3B%0A%09%09PanelUI.show%28event%29%3B%0A%09%09event.preventDefault%28%29%3B%0A%09%7D%0A%7D%2C%20false%2C%20this%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Проверял работу на Firefox 56, Basilisk 52.9.

Dumby пишет

Каково значение настройки extensions.webextensions.remote ?

Нашёл такое объяснение:

Значение true позволяет исключить WebExtensions из процесса в Firefox. Вы можете отменить изменение в любое время, установив предпочтение false.

Это возможность запуска дополнений в отдельном процессе.

Dobrov
Вы могли б подтянуть чтоб работало в 60.3 esr.

Кнопка Save snapshot to html, которая вот здесь:
https://forum.mozilla-russia.org/viewtopic.php?pid=588588#p588588
перестала работать в 63.
Есть ли исправленная версия этой кнопки для 63 ?

Кнопка "Изменить масштаб" тоже не работает в 63.
Блин, да там теперь практически все нужные мне кнопки не работают.
Всё нужно переделывать.

Нужна кнопка для перезапуска файлов userChrome.css и userContent.css для Firefox 55.
Пробовал отсюда иотсюда, ни одна не работают. Помогите, пожалуйста. Для Firefox 57+ нашел.

Есть кнопка Google translate

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGoogle%20translate%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUKM9VkSFOhFEQg799/CjEihWAwKDgIFwAyWHgLDjuAGfZgMCQDQkG8abtQ/z8u9A0k4rOTCez2u0GB0gCsLELbCuxLduJy0zAZgOQBBqQALEbtOQoyRgjSZLt9nOaJyf5K2zPjr01SWst8ermZtzd5euLhCQ2Y9iOHXssIvZYr1f39x/T87Ourtr7O3ZUyK6KlN5HVRaOqlxcNGACJKRItigdHFXpFdXoPVWRGmSac0suRYWUWhz7zt5/BXh65Pi6Hr7rI/IopZyqpSqldLsq9onPX3iabuHYr6o3pCVHP2Sa11nIzZdnMAmOSpyejiocVEhtjrwc15L5l4HVDgReCGTR+V9n/AAByma0J+vVwwAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0Avar%20btn%20%3D%20this%3B%0A%0Abtn.lastClick%20%3D%20%7B%0A%20%20%20%20X%3A%200%2C%0A%20%20%20%20Y%3A%200%0A%7D%3B%0AaddEventListener%28%22mouseup%22%2C%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e%20%26%26%20e.button%20%3D%3D%200%20%26%26%20e.view.top%20%3D%3D%20content%29%20%7B%0A%20%20%20%20%20%20%20%20var%20lc%20%3D%20btn.lastClick%3B%0A%20%20%20%20%20%20%20%20lc.X%20%3D%20e.clientX%3B%0A%20%20%20%20%20%20%20%20lc.Y%20%3D%20e.clientY%3B%0A%20%20%20%20%7D%0A%7D%2C%20false%29%3B%0A%0Avar%20createWindow%20%3D%20function%28text%2C%20status%2C%20title%2C%20id%2C%20pos%2C%20size%29%7B%0A%20%20%20%20var%20win%20%3D%20document.commandDispatcher.focusedWindow.top%20%3D%3D%20content%20%3F%20document.commandDispatcher.focusedWindow%20%3A%20content%3B%0A%20%20%20%20var%20doc%20%3D%20win.document%2C%20wId%20%3D%20%27ujs_window%27+%28id%20%7C%7C%20%27%27%29%2C%20w%20%3D%20doc.getElementById%28wId%29%3B%0A%20%20%20%20var%20keyDown%20%3D%20function%28e%29%7Bif%28%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%20%26%26%20e.keyCode%20%3D%3D%2027%29doc.getElementById%28wId%29.closeWin%28%29%7D%3B%0A%20%20%20%20if%28w%29w.closeWin%28%29%3B%0A%20%20%20%20w%20%3D%20doc.createElement%28%27div%27%29%3B%0A%20%20%20%20w.setAttribute%28%27style%27%2C%20%27position%3Afixed%3Bdisplay%3Ablock%3Bvisibility%3Ahidden%3Bleft%3A0%3Btop%3A0%3Bwidth%3Aauto%3Bheight%3Aauto%3Bborder%3A1px%20solid%20gray%3Bpadding%3A3px%3Bmargin%3A0%3Bz-index%3A99999%3Boverflow%3Ahidden%3Bcursor%3Amove%3B%27+%28typeof%20w.style.borderRadius%20%3D%3D%3D%20%27string%27%20%3F%20%27background-color%3A%23f3f5f7%3Bpadding-top%3A4px%3Bborder-radius%3A4px%3Bbox-shadow%3A0%200%2012px%20rgba%280%2C0%2C0%2C.4%29%3B%27%20%3A%20%27background%3A-o-skin%28%22Window%20Skin%22%29%3B%27%29%29%3B%0A%20%20%20%20w.id%20%3D%20wId%3B%0A%20%20%20%20w.closeWin%20%3D%20function%28%29%7B%0A%20%20%20%20%20%20%20%20doc.removeEventListener%28%27keydown%27%2C%20keyDown%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20this.parentNode.removeChild%28this%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20w.addEle%20%3D%20function%28str%2C%20style%29%7B%0A%20%20%20%20%20%20%20%20var%20ele%20%3D%20doc.createElement%28%27div%27%29%3B%0A%20%20%20%20%20%20%20%20ele.setAttribute%28%27style%27%2C%20style%29%3B%0A%20%20%20%20%20%20%20%20if%28str%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20ele.innerHTML%20%3D%20str%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%28var%20el%2C%20all%20%3D%20ele.getElementsByTagName%28%27*%27%29%2C%20i%20%3D%20all.length%3B%20i--%3B%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20el%20%3D%20all%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%28/%5E%28script%7Cframe%7Ciframe%7Capplet%7Cembed%7Cobject%29%24/i.test%28el.nodeName%29%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20el.parentNode.removeChild%28el%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7Delse%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%28var%20att%20%3D%20el.attributes%2C%20j%20%3D%20att.length%3B%20j--%3B%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%28/%5Eon%5Ba-z%5D+%24/i.test%28att%5Bj%5D.name%29%29att%5Bj%5D.value%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20return%20this.appendChild%28ele%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20var%20img%20%3D%20doc.createElement%28%27div%27%29%3B%0A%20%20%20%20img.setAttribute%28%27style%27%2C%20%27display%3Ablock%3Bfloat%3Aright%3Bwidth%3A18px%3Bheight%3A18px%3Bpadding%3A0%3Bmargin%3A0%3Bborder%3Anone%3Bcursor%3Apointer%3Bbackground-image%3Aurl%28%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAZElEQVR42mNgGNyAGQixsVGU/AdCXjCbHczmxKaMFywlAlWiw6DAwIZNmQhYGqJEDWoqFiAGVmKKTwk73CRJ/Ep0GIyhbsPpO4hbIG4TwKaMk0EZ7hYBBk1cvmNDEmbDrmSwAADE8h10+qICXwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII%3D%22%29%3Bbackground%3A-o-skin%28%22Caption%20Close%20Button%20Skin%22%29%3B%27%29%3B%0A%20%20%20%20img.title%20%3D%20%28win.navigator.language.indexOf%28%27ru%27%29%20%3D%3D%200%29%20%3F%20%27%5Cu0417%5Cu0430%5Cu043A%5Cu0440%5Cu044B%5Cu0442%5Cu044C%27%20%3A%20%27Close%27%3B%0A%20%20%20%20img.addEventListener%28%27click%27%2C%20function%28%29%7Bthis.parentNode.closeWin%28%29%7D%2C%20false%29%3B%0A%20%20%20%20w.appendChild%28img%29%3B%0A%20%20%20%20w.addEle%28title%2C%20%27display%3Atable%3Bcolor%3A%23000%3Bfont%3A16px%20Times%20New%20Roman%3Bwidth%3Aauto%3Bheight%3Aauto%3Bpadding%3A0%3Bmargin%3A0%202px%3Bcursor%3Atext%3B%27%29%3B%0A%20%20%20%20var%20cnt%20%3D%20w.addEle%28text%2C%20%27display%3Ablock%3Bborder%3A1px%20solid%20%23aaa%3Bmargin%3A2px%200%201px%200%3Bpadding%3A4px%3Bbackground-color%3A%23fafcfe%3Bcolor%3A%23000%3Bfont%3A14px%20Times%20New%20Roman%3Bwidth%3A240px%3Bheight%3A120px%3Boverflow%3Aauto%3Bcursor%3Atext%3B%27%29%3B%0A%20%20%20%20w.addEle%28status%2C%20%27display%3Atable%3Bcolor%3A%23555%3Bfont%3A10px%20Times%20New%20Roman%3Bwidth%3Aauto%3Bheight%3Aauto%3Bpadding%3A0%3Bmargin%3A0%202px%3Bcursor%3Atext%3B%27%29%3B%0A%20%20%20%20w.addEventListener%28%27mousedown%27%2C%20function%28e%29%7B%0A%20%20%20%20%20%20%20%20if%28e.target%20%3D%3D%20w%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20grabX%20%3D%20e.clientX%2C%20grabY%20%3D%20e.clientY%2C%20origX%20%3D%20parseInt%28w.style.left%29%2C%20origY%20%3D%20parseInt%28w.style.top%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20mouseMove%20%3D%20function%28ev%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20w.style.left%20%3D%20origX+ev.clientX-grabX+%27px%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20w.style.top%20%3D%20origY+ev.clientY-grabY+%27px%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20doc.addEventListener%28%27mousemove%27%2C%20mouseMove%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20doc.addEventListener%28%27mouseup%27%2C%20function%28%29%7Bdoc.removeEventListener%28%27mousemove%27%2C%20mouseMove%2C%20false%29%7D%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%20false%29%3B%0A%20%20%20%20doc.documentElement.appendChild%28w%29%3B%0A%0A%20%20%20%20if%28size%29%7B%0A%20%20%20%20%20%20%20%20cnt.style.height%20%3D%20size.height%3B%0A%20%20%20%20%20%20%20%20cnt.style.width%20%3D%20size.width%3B%0A%20%20%20%20%7Delse%7B%0A%20%20%20%20%20%20%20%20for%28var%20i%20%3D%203%3B%20i%20%3C%2010%3B%20i++%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%28cnt.scrollHeight%20%3E%20cnt.offsetHeight%20%7C%7C%20cnt.scrollWidth%20%3E%20cnt.offsetWidth%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cnt.style.height%20%3D%2050*i+%27px%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cnt.style.width%20%3D%20100*i+%27px%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7Delse%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%20%20var%20docEle%20%3D%20doc.compatMode%20%3D%3D%20%27CSS1Compat%27%20%3F%20doc.documentElement%20%3A%20doc.body%3B%0A%20%20%20%20var%20mX%20%3D%20docEle.clientWidth-w.offsetWidth%2C%20mY%20%3D%20docEle.clientHeight-w.offsetHeight%3B%0A%20%20%20%20if%28mX%20%3C%200%29%7Bcnt.style.width%20%3D%20parseInt%28cnt.style.width%29+mX+%27px%27%3B%20mX%20%3D%200%7D%3B%0A%20%20%20%20if%28mY%20%3C%200%29%7Bcnt.style.height%20%3D%20parseInt%28cnt.style.height%29+mY+%27px%27%3B%20mY%20%3D0%7D%3B%0A%20%20%20%20var%20hW%20%3D%20parseInt%28w.offsetWidth/2%29%3B%0A%20%20%20%20w.style.left%20%3D%20%28pos%20%26%26%20pos.X%20%3C%20mX+hW%20%3F%20%28pos.X%20%3E%20hW%20%3F%20pos.X-hW%20%3A%200%29%20%3A%20mX%29+%27px%27%3B%0A%20%20%20%20w.style.top%20%3D%20%28pos%20%26%26%20pos.Y+10%20%3C%20mY%20%3F%20pos.Y+10%20%3A%20mY%29+%27px%27%3B%0A%20%20%20%20w.style.visibility%20%3D%20%27visible%27%3B%0A%20%20%20%20doc.addEventListener%28%27keydown%27%2C%20keyDown%2C%20false%29%3B%0A%7D%3B%0A%0Avar%20getSel%20%3D%20function%20%28w%29%20%7B%0A%20%20%20%20var%20s%2C%20d%20%3D%20w.document%3B%0A%20%20%20%20if%20%28d.selection%29%20%7B%0A%20%20%20%20%20%20%20%20var%20r%20%3D%20d.selection.createRange%28%29%3B%0A%20%20%20%20%20%20%20%20s%20%3D%20r%20%3F%20r.text%20%3A%20%27%27%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20s%20%3D%20d.getSelection%28%29.toString%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21s%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20e%2C%20t%20%3D%20d.getElementsByTagName%28%27textarea%27%29%2C%20u%20%3D%20d.getElementsByTagName%28%27input%27%29%2C%20i%20%3D%20t.length%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20while%28e%20%3D%20%28i%20%3E%200%29%20%3F%20t%5B--i%5D%20%3A%20u%5B-i--%5D%29try%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28e.offsetHeight%20%3E%200%20%26%26%20%28s%20%3D%20e.value.substring%28e.selectionStart%2C%20e.selectionEnd%29%29%29%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%7Dcatch%28x%29%7B%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%20%20if%20%28%21s%29%20for%20%28var%20j%20%3D%200%2C%20f%3B%20f%20%3D%20w.frames%5Bj%5D%3B%20j++%29%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28s%20%3D%20getSel%28f%29%29%20break%0A%20%20%20%20%20%20%20%20%7D%20catch%28x%29%20%7B%7D%0A%20%20%20%20%7D%3B%0A%20%20%20%20return%20s%0A%7D%3B%0A%0Avar%20getHash%20%3D%20function%20%28txt%29%20%7B%0A%20%20%20%20TKK%3Deval%28%27%28%28function%28%29%7Bvar%20a%5Cx3d817046147%3Bvar%20b%5Cx3d-335196159%3Breturn%20410049+%5Cx27.%5Cx27+%28a+b%29%7D%29%28%29%29%27%29%3B%0A%20%20%20%20function%20sM%28a%29%20%7B%0A%20%20%20%20%20%20%20%20var%20b%3B%0A%20%20%20%20%20%20%20%20if%20%28null%20%21%3D%3D%20yr%29%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20yr%3B%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20wr%28String.fromCharCode%2884%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20c%20%3D%20wr%28String.fromCharCode%2875%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20%5Bb%28%29%2C%20b%28%29%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20b%5B1%5D%20%3D%20c%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20%28yr%20%3D%20window%5Bb.join%28c%28%29%29%5D%20%7C%7C%20%22%22%29%20%7C%7C%20%22%22%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20var%20d%20%3D%20wr%28String.fromCharCode%28116%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2C%20c%20%3D%20wr%28String.fromCharCode%28107%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2C%20d%20%3D%20%5Bd%28%29%2C%20d%28%29%5D%3B%0A%20%20%20%20%20%20%20%20d%5B1%5D%20%3D%20c%28%29%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20%22%26%22%20+%20d.join%28%22%22%29%20+%20%22%3D%22%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20b.split%28%22.%22%29%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20Number%28d%5B0%5D%29%20%7C%7C%200%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20e%20%3D%20%5B%5D%2C%20f%20%3D%200%2C%20g%20%3D%200%3B%20g%20%3C%20a.length%3B%20g++%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20l%20%3D%20a.charCodeAt%28g%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20128%20%3E%20l%20%3F%20e%5Bf++%5D%20%3D%20l%20%3A%20%282048%20%3E%20l%20%3F%20e%5Bf++%5D%20%3D%20l%20%3E%3E%206%20%7C%20192%20%3A%20%2855296%20%3D%3D%20%28l%20%26%2064512%29%20%26%26%20g%20+%201%20%3C%20a.length%20%26%26%2056320%20%3D%3D%20%28a.charCodeAt%28g%20+%201%29%20%26%2064512%29%20%3F%20%28l%20%3D%2065536%20+%20%28%28l%20%26%201023%29%20%3C%3C%2010%29%20+%20%28a.charCodeAt%28++g%29%20%26%201023%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e%5Bf++%5D%20%3D%20l%20%3E%3E%2018%20%7C%20240%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e%5Bf++%5D%20%3D%20l%20%3E%3E%2012%20%26%2063%20%7C%20128%29%20%3A%20e%5Bf++%5D%20%3D%20l%20%3E%3E%2012%20%7C%20224%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e%5Bf++%5D%20%3D%20l%20%3E%3E%206%20%26%2063%20%7C%20128%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e%5Bf++%5D%20%3D%20l%20%26%2063%20%7C%20128%29%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20a%20%3D%20b%3B%0A%20%20%20%20%20%20%20%20for%20%28f%20%3D%200%3B%20f%20%3C%20e.length%3B%20f++%29%0A%20%20%20%20%20%20%20%20%20%20%20%20a%20+%3D%20e%5Bf%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20a%20%3D%20xr%28a%2C%20%22+-a%5E+6%22%29%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20xr%28a%2C%20%22+-3%5E+b+-f%22%29%3B%0A%20%20%20%20%20%20%20%20a%20%5E%3D%20Number%28d%5B1%5D%29%20%7C%7C%200%3B%0A%20%20%20%20%20%20%20%200%20%3E%20a%20%26%26%20%28a%20%3D%20%28a%20%26%202147483647%29%20+%202147483648%29%3B%0A%20%20%20%20%20%20%20%20a%20%25%3D%201E6%3B%0A%20%20%20%20%20%20%20%20return%20c%20+%20%28a.toString%28%29%20+%20%22.%22%20+%20%28a%20%5E%20b%29%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20yr%20%3D%20null%3B%0A%20%20%20%20var%20wr%20%3D%20function%28a%29%20%7B%0A%20%20%20%20%20%20%20%20return%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20a%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2C%20xr%20%3D%20function%28a%2C%20b%29%20%7B%0A%20%20%20%20%20%20%20%20for%20%28var%20c%20%3D%200%3B%20c%20%3C%20b.length%20-%202%3B%20c%20+%3D%203%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20d%20%3D%20b.charAt%28c%20+%202%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2C%20d%20%3D%20%22a%22%20%3C%3D%20d%20%3F%20d.charCodeAt%280%29%20-%2087%20%3A%20Number%28d%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2C%20d%20%3D%20%22+%22%20%3D%3D%20b.charAt%28c%20+%201%29%20%3F%20a%20%3E%3E%3E%20d%20%3A%20a%20%3C%3C%20d%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20a%20%3D%20%22+%22%20%3D%3D%20b.charAt%28c%29%20%3F%20a%20+%20d%20%26%204294967295%20%3A%20a%20%5E%20d%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20a%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20return%20sM%28txt%29%3B%0A%7D%3B%0A%0Avar%20ujs_google_translate%20%3D%20function%20%28dir%29%7B%0A%20%20%20%20var%20win%20%3D%20content%2C%20lng%20%3D%20win.navigator.language.slice%280%2C%202%29%2C%20txt%20%3D%20getSel%28win%29%2C%20l%20%3D%20dir.split%28%27%7C%27%29%3B%0A%20%20%20%20if%20%28txt%29%20%7B%0A%20%20%20%20%20%20%20%20var%20xhr%20%3D%20new%20XMLHttpRequest%28%29%3B%0A%20%20%20%20%20%20%20%20var%20url%20%3D%20%27https%3A//translate.google.com/translate_a/single%3Fclient%3Dt%26sl%3D%27%20+%20l%5B0%5D%20+%20%27%26tl%3D%27%20+%20l%5B1%5D%20+%20%27%26hl%3D%27%20+%20lng%20+%20%27%26eotf%3D0%26dt%3Dat%26dt%3Dbd%26dt%3Dex%26dt%3Dld%26dt%3Dmd%26dt%3Dqca%26dt%3Drw%26dt%3Drm%26dt%3Dss%26dt%3Dt%27%20+%20getHash%28txt%29%3B%0A%0A%20%20%20%20%20%20%20%20xhr.open%28%27POST%27%2C%20url%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20xhr.setRequestHeader%28%27Content-Type%27%2C%20%27application/x-www-form-urlencoded%3Bcharset%3Dutf-8%27%29%3B%0A%20%20%20%20%20%20%20%20xhr.onreadystatechange%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28xhr.readyState%20%3D%3D%204%20%26%26%20xhr.status%20%3D%3D%20200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20result%20%3D%20%27%27%2C%20status%20%3D%20%27%27%2C%20tmp%20%3D%20JSON.parse%28xhr.responseText.replace%28/%5C%5B%28%3F%3D%2C%29/g%2C%20%27%5B0%27%29.replace%28/%2C%28%3F%3D%2C%7C%5C%5D%29/g%2C%20%27%2C0%27%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%28var%20i%20%3D%200%2C%20n%3B%20n%20%3D%20tmp%5B0%5D%5Bi%5D%3B%20i++%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%28n%5B0%5D%29result%20+%3D%20n%5B0%5D.toString%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20%27%3Cspan%20style%3D%22background-color%3Ainherit%3Bcolor%3Ainherit%3Bfont-size%3Ainherit%3Bfont-family%3ATimes%2Cserif%3B%22%3E%27%20+%20result%20+%20%27%3C/span%3E%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20status%20%3D%20tmp%5B8%5D%5B0%5D%5B0%5D.toUpperCase%28%29%20+%20%27%20-%5Cu203A%20%27%20+%20l%5B1%5D.toUpperCase%28%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createWindow%28result%2C%20status%2C%20%27%3Ca%20href%3D%22%27+url.replace%28/%26/g%2C%27%26amp%3B%27%29+%27%22%20target%3D%22_blank%22%20style%3D%22display%3Ainline%3Bpadding%3A0%3Bmargin%3A0%3Btext-decoration%3Anone%3Bborder%3Anone%3Bcolor%3A%23009%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%2C%20%27_gt%27%2C%20btn.lastClick%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%28x%29%7BLOG%28x%29%7D%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20xhr.send%28%27q%3D%27%20+%20encodeURIComponent%28txt%29%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20win.open%28%27http%3A//translate.google.com/translate%3Fu%3D%27+escape%28win.location.href%29+%27%26hl%3D%27+lng+%27%26langpair%3D%27+dir+%27%26tbb%3D1%27%29%3B%0A%20%20%20%20%7D%3B%0A%7D%3B%0A%0A%0Abtn.onclick%20%3D%20function%28e%29%7Bif%28e.button%20%3D%3D%200%29ujs_google_translate%28%27auto%7Cru%27%29%7D%3B%0A%0Avar%20contextMenu%20%3D%20document.getElementById%28%22contentAreaContextMenu%22%29%3B%0Avar%20nextEleMenu%20%3D%20document.getElementById%28%22context-inspect%22%29%3B%0A%0Avar%20menuId%20%3D%20%22context-ext-google-translate%22%3B%0Avar%20menuItem%20%3D%20document.getElementById%28menuId%29%3B%0Aif%20%28menuItem%29%20%7B%0A%20%20%20%20contextMenu.removeChild%28menuItem.nextElementSibling%29%3B%0A%20%20%20%20contextMenu.removeChild%28menuItem.nextElementSibling%29%3B%0A%20%20%20%20contextMenu.removeChild%28menuItem%29%3B%0A%7D%3B%0A%0AmenuItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0AmenuItem.setAttribute%28%22id%22%2C%20menuId%29%3B%0AmenuItem.setAttribute%28%22label%22%2C%20%22%u041F%u0435%u0440%u0435%u0432%u0435%u0441%u0442%u0438%20%u043D%u0430%20%u0440%u0443%u0441%u0441%u043A%u0438%u0439%22%29%3B%0AmenuItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0AmenuItem.setAttribute%28%22image%22%2C%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABBUlEQVR4Ac2RMU4DMRREB2MqihQpAkUaqnAduuQw4Sx03CGcJYIiDYqQ0lCsZ77535ZFcgAkRuPvV7zd/dLiz3N1PFb8hmRckrfELZrF9ONQ1B6Yz0MyM7S0O6zGkVprh/3+Kw/JzkHSpRpJKZkpr9fYbOx0cjVsCbWG31oHBM9mtt0q73ZcrdLhAMlYQKkUI22aqsNo8HKZAMQhvVaKSHWj2Q2aPU3mJQFY7nuHyvYFduP83WF3AJRfcPNYnr/Lp1G1uK4m9sno1LaUbnX/htf8BNzoneUD5NhjvLCMhURQSQ93QCZwXYjFwg3I0NZKrvoknQPMIHkt/jRAQKMeG2yX89/mB4EJbKbZxIhFAAAAAElFTkSuQmCC%22%29%3B%0AmenuItem.addEventListener%28%22command%22%2C%20function%28%29%7Bujs_google_translate%28%27auto%7Cru%27%29%7D%2C%20false%29%3B%0AcontextMenu.insertBefore%28menuItem%2C%20nextEleMenu%29%3B%0A%0AmenuItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0AmenuItem.setAttribute%28%22label%22%2C%20%22%u041F%u0435%u0440%u0435%u0432%u0435%u0441%u0442%u0438%20%u043D%u0430%20%u0430%u043D%u0433%u043B%u0438%u0439%u0441%u043A%u0438%u0439%22%29%3B%0AmenuItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0AmenuItem.setAttribute%28%22image%22%2C%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAAB5UlEQVR4AWOgPZg0c9+Oq2+qpx9LaQaiw4mNB27efbs2uXFNQh2Q4Zm9zSNth23MhqjGnXMC86vnHmUS4udxv7OvOd2yPE7PTlfCTk9GVVEoyJA7WI8dyPA0k3U1l+jJMV7CeThpTZeoKDdDUsvBPSff/V+6/P/Bvf///2+bdvU/EKRm/k9IBNIlfZe+LFrzvbsbyJ636pKkyQyQhoUb7tZNvPpw3/0/TfX/ISAm5n94BIiRm/n/xYsLd946ei4vajoiqDuRAejQf//+o4PQ0P9+fmhiQGVnrr1kXJNYG2zEzXDxDsPv3wy/fkFJoOTPn39+/fr/69e/37//AUX+/mXRkO458wWHDba2f8wswCyQ3N+/f//8/fP7z5+TV18w2Mdt6plzPiptx5Wr7/+/ffMzOR6kysjkt74hWMPfp06O+2dulZCeFZKwnkE4m8E8bN3i9aCQ+dxY96GrK6bkGJD9R1v3l6Y20NVW9kt+/v//ZdbcFwkxTVPPMQimM8XEqkb7a/zoqLxkH9v4zVyI5+///wyMmtKMmhJAnbLqQjHxaw5r2orOmZN5uj470Zahat6BKS7JzpmLBHXm8GhM5lCdcP7ai1ZpixZxk9NXXjKIFzOIFjAI54oY1vXuue5qmscw+AAAW0tKxtPoicEAAAAASUVORK5CYII%3D%22%29%3B%0AmenuItem.addEventListener%28%22command%22%2C%20function%28%29%7Bujs_google_translate%28%27auto%7Cen%27%29%7D%2C%20false%29%3B%0AcontextMenu.insertBefore%28menuItem%2C%20nextEleMenu%29%3B%0A%0AcontextMenu.insertBefore%28document.createElement%28%22menuseparator%22%29%2C%20nextEleMenu%29%3B%0A%0AaddEventListener%28%27keydown%27%2C%20function%20%28e%29%7B%0A%20if%28e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20e.altKey%20%26%26%20e.keyCode%20%3D%3D%2084%29ujs_google_translate%28%27auto%7Cru%27%29%3B%0A%7D%2C%20false%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Можно научить работать с ESR 60?
И ещё вопрос, нет ничего чтоб всё открывалось в новой вкладке? Желательно в фоне. ТОже для ESR 60

добавил кнопку (Открыть папки и файлы Firefox)по инструкции, но она не работает в FF64 - в чем причина не подскажете?

ALEX_45_ORP замени в первой строчке menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
на  menuPopup.openPopup(this, "after_start");

Andrey_Krropotkin всё заработало:D

скрытый текст
100pokorneyshe_blagodaryu.png

подскажите плз, какая кнопка (плагин, либо что-то еще) дает такое меню, один раз выскочило, а больше повторить не могу в данной сборке?
O_o___.jpg

rubel пишет

Нужна кнопка для перезапуска файлов userChrome.css и userContent.css для Firefox

Не знал что их нужно обновлять?

Подскажите пожалуйста, код кнопки Google Translate для перевода вэб страниц.

kokoss

kokoss пишет

Подскажите пожалуйста, код кнопки Google Translate для перевода вэб страниц

Google Translate

Rag
В [firefox] esr 60.4.0 не работает.

kokoss,

букмарклет

Выделить код

Код:

javascript:document.location = 'http://translate.google.ru/translate?js=n&prev=_t&hl=ru&ie=UTF-8&layout=2&eotf=1&sl=auto&tl=ru&u=' + top.location.href + '&act=url'

Посмотрите пожалуйста, что не так в этом коде кнопки Google Translate. А то у меня в [firefox] esr 60.4.0 не работает:

Код

Выделить код

Код:

/*Initialization Code*/

var btn = this;

btn.lastClick = {
    X: 0,
    Y: 0
};
addEventListener("mouseup", function(e) {
    if (e && e.button == 0 && e.view.top == content) {
        var lc = btn.lastClick;
        lc.X = e.clientX;
        lc.Y = e.clientY;
    }
}, false);

var createWindow = function(text, status, title, id, pos, size){
    var win = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content;
    var doc = win.document, wId = 'ujs_window'+(id || ''), w = doc.getElementById(wId);
    var keyDown = function(e){if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 27)doc.getElementById(wId).closeWin()};
    if(w)w.closeWin();
    w = doc.createElement('div');
    w.setAttribute('style', 'position:fixed;display:block;visibility:hidden;left:0;top:0;width:auto;height:auto;border:1px solid gray;padding:3px;margin:0;z-index:99999;overflow:hidden;cursor:move;'+(typeof w.style.borderRadius === 'string' ? 'background-color:#f3f5f7;padding-top:4px;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);' : 'background:-o-skin("Window Skin");'));
    w.id = wId;
    w.closeWin = function(){
        doc.removeEventListener('keydown', keyDown, false);
        this.parentNode.removeChild(this);
    };
    w.addEle = function(str, style){
        var ele = doc.createElement('div');
        ele.setAttribute('style', style);
        if(str){
            ele.innerHTML = str;
            for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
                el = all[i];
                if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
                    el.parentNode.removeChild(el);
                }else{
                    for(var att = el.attributes, j = att.length; j--;){
                        if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
                    }
                }
            }
        };
        return this.appendChild(ele);
    };
    var img = doc.createElement('div');
    img.setAttribute('style', 'display:block;float:right;width:18px;height:18px;padding:0;margin:0;border:none;cursor:pointer;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAZElEQVR42mNgGNyAGQixsVGU/AdCXjCbHczmxKaMFywlAlWiw6DAwIZNmQhYGqJEDWoqFiAGVmKKTwk73CRJ/Ep0GIyhbsPpO4hbIG4TwKaMk0EZ7hYBBk1cvmNDEmbDrmSwAADE8h10+qICXwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=");background:-o-skin("Caption Close Button Skin");');
    img.title = (win.navigator.language.indexOf('ru') == 0) ? '\u0417\u0430\u043A\u0440\u044B\u0442\u044C' : 'Close';
    img.addEventListener('click', function(){this.parentNode.closeWin()}, false);
    w.appendChild(img);
    w.addEle(title, 'display:table;color:#000;font:17px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
    var cnt = w.addEle(text, 'display:block;border:1px solid #aaa;margin:2px 0 1px 0;padding:4px;background-color:#fafcfe;color:#000;font:17px Times New Roman;width:320px;height:160px;overflow:auto;cursor:text;');
    w.addEle(status, 'display:table;color:#555;font:13px Times New Roman;width:auto;height:auto;padding:0;margin:0 3px;cursor:text;');
    w.addEventListener('mousedown', function(e){
        if(e.target == w){
            e.preventDefault();
            var grabX = e.clientX, grabY = e.clientY, origX = parseInt(w.style.left), origY = parseInt(w.style.top);
            var mouseMove = function(ev){
                w.style.left = origX+ev.clientX-grabX+'px';
                w.style.top = origY+ev.clientY-grabY+'px';
            };
            doc.addEventListener('mousemove', mouseMove, false);
            doc.addEventListener('mouseup', function(){doc.removeEventListener('mousemove', mouseMove, false)}, false);
        }
    }, false);
    doc.documentElement.appendChild(w);

    if(size){
        cnt.style.height = size.height;
        cnt.style.width = size.width;
    }else{
        for(var i = 3; i < 10; i++){
            if(cnt.scrollHeight > cnt.offsetHeight || cnt.scrollWidth > cnt.offsetWidth){
                cnt.style.height = 80*i+'px';
                cnt.style.width = 180*i+'px';
            }else break;
        }
    };
    var docEle = doc.compatMode == 'CSS1Compat' ? doc.documentElement : doc.body;
    var mX = docEle.clientWidth-w.offsetWidth, mY = docEle.clientHeight-w.offsetHeight;
    if(mX < 0){cnt.style.width = parseInt(cnt.style.width)+mX+'px'; mX = 0};
    if(mY < 0){cnt.style.height = parseInt(cnt.style.height)+mY+'px'; mY =0};
    var hW = parseInt(w.offsetWidth/2);
    w.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px';
    w.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px';
    w.style.visibility = 'visible';
    doc.addEventListener('keydown', keyDown, false);
};

var getSel = function (w) {
    var s, d = w.document;
    if (d.selection) {
        var r = d.selection.createRange();
        s = r ? r.text : ''
    } else {
        s = d.getSelection().toString();
        if (!s) {
            var e, t = d.getElementsByTagName('textarea'), u = d.getElementsByTagName('input'), i = t.length;
            while(e = (i > 0) ? t[--i] : u[-i--])try{
                if (e.offsetHeight > 0 && (s = e.value.substring(e.selectionStart, e.selectionEnd))) break
            }catch(x){}
        }
    };
    if (!s) for (var j = 0, f; f = w.frames[j]; j++) {
        try {
            if (s = getSel(f)) break
        } catch(x) {}
    };
    return s
};

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

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

    return sM(txt);
};

var ujs_google_translate = function (dir){
    var win = content, lng = win.navigator.language.slice(0, 2), txt = getSel(win), l = dir.split('|');
    if (txt) {
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);

        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0'));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                    result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();

                    createWindow(result, status, '<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:17px Times New Roman;">Google Translate</a>', '_gt', btn.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
    } else {
        win.open('http://translate.google.com/translate?u='+escape(win.location.href)+'&hl='+lng+'&langpair='+dir+'&tbb=1');
    };
};


btn.onclick = function(e){if(e.button == 0)ujs_google_translate('auto|ru')};

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

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

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

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

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

addEventListener('keydown', function (e){
 if(e.shiftKey && !e.ctrlKey && e.altKey && e.keyCode == 84)ujs_google_translate('auto|ru');
}, false);

14-01-2019 21:03:43
vitalii201
Эта кнопка у меня в [firefox] esr 60 работает странно, при нажатии на кнопку, происходит вот это:

Изображение
49b4e4ad265b.png

При чём окно разворачивается во весь экран.

kokoss,

это не кнопка, это закладка
fKsTOiu.pngrHTWIow.png

Если вам не принципиально: "только кнопка", конечно. У меня лучше(удобней) всего работает перевод из Flagfox(ни разу не отказал) или S3.Translator(не на всех сайтах срабатывает).

vitalii201 пишет

У меня лучше(удобней) всего работает перевод из Flagfox(ни разу не отказал) или S3.Translator(не на всех сайтах срабатывает).

Самому приходится пользоваться расширением Country Flags & IP WHOIS в основном из за Google Translate. Просто с кнопкой было бы удобнее. Что касается S3 Переводчика, то у него к сожалению в [firefox] esr 60 не работает перевод страниц. Я им пользуюсь только в [firefox] 56 и esr 52.

Dumby  Вы  не могли бы мне подсказать, раньше у меня работал вот такой код для перевода текста (заменял на странице выделенный текст с другого языка на русский. Выдает ошибку - TypeError: tempResz[1] is undefined и ссылается на строку - var kimenet = tempResz[1].split('</span></div>'); )

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

Выделить код

Код:

//----------Заменить текст переводом------------ 
function ujs_TexReplace_translate() {
        var win = content, txt = getSel(win);  
        if (txt) {
        var httpRequest = null;
        //var baseUrl = "http://translate.google.com/translate_t";
        var urlParams = "text=" + encodeURIComponent(txt) + "&hl==ru&langpair=auto|ru&tbb=1";
var baseUrl="http://translate.google.com/translate_t?"+ urlParams;
   
        function removeHTMLTags(mitkell) {
        var strTagStrippedText = mitkell.replace(/this.style.backgroundColor='#fff'/ig, "").replace(/this.style.backgroundColor='#ebeff9'/ig, "");
                return strTagStrippedText;
            }

        function infoReceived() { 
           var output = httpRequest.responseText;
           if (txt[0] == " ") {
                    var kezdospace = " ";
                } else {
                    var kezdospace = "";
                }
                if (txt[txt.length - 1] == " ") {
                    var vegespace = " ";
                } else {
                    var vegespace = "";
                }
           if (output.length) {
             output = output.replace(/&quot;/gi,'"');
             output = output.replace(/&lt;/gi,'<');
             output = output.replace(/&gt;/gi,'>');
             output = output.replace(/&amp;/gi,'&');
             output = output.replace(/'/gi,"'");
             var fieldArray = output.split('</head>');
             if (fieldArray[1].search('class="short_text"')!=-1) {
                var tempResz = fieldArray[1].split('<span id=result_box class="short_text">');
             }
            else if (fieldArray[1].search('class="medium_text"')!=-1) {
               var tempResz = fieldArray[1].split('<span id=result_box class="medium_text">');
            }
            else {
                var tempResz = fieldArray[1].split('<span id=result_box class="long_text">');
             }

             var kimenet = tempResz[1].split('</span></div>');
             var range = content.getSelection().getRangeAt(0);
             
             range.deleteContents();
          
             range.insertNode(range. createContextualFragment(kezdospace + removeHTMLTags(kimenet[0])+ vegespace));
           }
        }

            httpRequest = new XMLHttpRequest();
            httpRequest.open("GET", baseUrl, true);
            httpRequest.onload = infoReceived;
            httpRequest.send(null);
    }
};

Насчет перевода
1. kokoss Google Translate у меня работает и на 64 без проблем (кроме некоторых сайтов, например - https://addons.mozilla.org и еще наподобие
2. Есть скрипт, который работает на всех версиях Google Translator Tooltip Expanded Fork

Andrey_Krropotkin пишет

3. У меня на 64 работает вот такая кнопка недоделанная до конца, нет времени - Перевод

Кнопка работает прекрасно, а нельзя ли к ней приделать функцию перевода из буфера обмена, довольно часто это нужно.

Andrey_Krropotkin пишет

Есть скрипт, который работает на всех версиях Google Translator Tooltip Expanded Fork

В [firefox] esr 60 не работает...

Andrey_Krropotkin пишет

У меня на 64 работает вот такая кнопка недоделанная до конца, нет времени - Перевод

В [firefox] esr 60 не устанавливается.

rubel это можно, но куда впихнуть не знаю, вот пример:

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

Выделить код

Код:

/*Initialization Code*/
//Варианты выбора языка переводчика для перевода текста в окне. Нужное разкоментировать. Остальное закоментировать.
//Google,
var langFrom_google_text = "auto";//авто
var langTo_google_text = "ru"; 


var mainicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUKM9VkSFOhFEQg799/CjEihWAwKDgIFwAyWHgLDjuAGfZgMCQDQkG8abtQ/z8u9A0k4rOTCez2u0GB0gCsLELbCuxLduJy0zAZgOQBBqQALEbtOQoyRgjSZLt9nOaJyf5K2zPjr01SWst8ermZtzd5euLhCQ2Y9iOHXssIvZYr1f39x/T87Ourtr7O3ZUyK6KlN5HVRaOqlxcNGACJKRItigdHFXpFdXoPVWRGmSac0suRYWUWhz7zt5/BXh65Pi6Hr7rI/IopZyqpSqldLsq9onPX3iabuHYr6o3pCVHP2Sa11nIzZdnMAmOSpyejiocVEhtjrwc15L5l4HVDgReCGTR+V9n/AAByma0J+vVwwAAAABJRU5ErkJggg==";

function readFromClipboard() {
  var string;
  try {
      var clipboard = Cc["@mozilla.org/widget/clipboard;1"].
                      getService(Ci.nsIClipboard);
      var trans = Cc["@mozilla.org/widget/transferable;1"].
                  createInstance(Ci.nsITransferable);
      trans.addDataFlavor("text/unicode");
      if (clipboard.supportsSelectionClipboard()) {
        clipboard.getData(trans, clipboard.kSelectionClipboard);
      } else {
        clipboard.getData(trans, clipboard.kGlobalClipboard);
      }
      var data = {};
      var dataLen = {};
      trans.getTransferData("text/unicode", data, dataLen);
      if (data) {
        data = data.value.QueryInterface(Ci.nsISupportsString);
        string = data.data.substring(0, dataLen.value / 2);
      }
  } catch (ex) {
  }
  return string;
}

 
//--------Перевести текст в Google в новой вкладке--------------
function ujs_GoogleTextPageNewa_translate() { 
//var win = content, txt = getSel(win);
txt = readFromClipboard();
var encTxt = encodeURIComponent(txt);
var ctabpos = gBrowser.selectedTab._tPos +1;
var url="http://translate.google.com/translate_t?text="+encTxt+"&sl=auto&tl=ru&hl=ru&eotf=0&ujs=gtt";
gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};




 //Контекстное меню для перевода текста-------------------------------------------  
(function () {
 if ( document.getElementById("TranslateBufer") ) return; 
 var contextMenu = document.getElementById("contentAreaContextMenu");  
 var Item = document.createElement("menuitem");
       Item.setAttribute("Id", "TranslateBufer");
       Item.setAttribute("label", "Перевод из буфера");
       Item.setAttribute("class", "menuitem-iconic");
       Item.setAttribute("image", mainicon);
       Item.addEventListener("command", function(){ujs_GoogleTextPageNewa_translate()}, false);

  contextMenu.insertBefore(Item, document.getElementById("context-viewpartialsource-selection") ); 
 
   
  
    
     
 })();


17-01-2019 10:24:20
kokoss Скачайте заново, перезалил.

Andrey_Krropotkin пишет

rubel это можно, но куда впихнуть не знаю, вот пример:

Вставил этот код в ваш основной после кода первой строки. Переводит из буфера в новой вкладке, а хочется чтоб было в окне Google.
Можно это поправить?

rubel

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

Выделить код

Код:

/*Initialization Code*/
//--------------------------------Перевод---------------------------------------- 

//Варианты выбора языка переводчика для перевода текста в окне. Нужное разкоментировать. Остальное закоментировать.
//Google,
var langFrom_google_text = "auto";//авто
var langTo_google_text = "ru"; 
//Microsoft 
var langFrom_Microsoft_text = "";//авто 
var langTo_Microsoft_text = "ru"; 
//Promt 
var langFrom_PROMT_text = "a";//авто
var langTo_PROMT_text = "r"; 
//Яндекс 
var langFrom_yandex_text = ""; //авто
//var langFrom_yandex_text = "en-"; //английский и так же другие языки, тире обязательно
var langTo_yandex_text = "ru";


 
var safeHTMLParser = function(code) {
    var gUnescapeHTML = Cc["@mozilla.org/feed-unescapehtml;1"].getService(Ci.nsIScriptableUnescapeHTML);
    var doc = document.implementation.createDocument(xhtmlns, "html", null);
    var body = document.createElementNS(xhtmlns, "body");
    doc.documentElement.appendChild(body);
    body.appendChild(gUnescapeHTML.parseFragment(code, false, null, body));
    return doc;
};
          
//Назначаем иконки
var mainicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUKM9VkSFOhFEQg799/CjEihWAwKDgIFwAyWHgLDjuAGfZgMCQDQkG8abtQ/z8u9A0k4rOTCez2u0GB0gCsLELbCuxLduJy0zAZgOQBBqQALEbtOQoyRgjSZLt9nOaJyf5K2zPjr01SWst8ermZtzd5euLhCQ2Y9iOHXssIvZYr1f39x/T87Ourtr7O3ZUyK6KlN5HVRaOqlxcNGACJKRItigdHFXpFdXoPVWRGmSac0suRYWUWhz7zt5/BXh65Pi6Hr7rI/IopZyqpSqldLsq9onPX3iabuHYr6o3pCVHP2Sa11nIzZdnMAmOSpyejiocVEhtjrwc15L5l4HVDgReCGTR+V9n/AAByma0J+vVwwAAAABJRU5ErkJggg==";
var gticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADPElEQVR4nGWTTWhjZRSG3/uTNr39mTqTn1KacagTqyKIlYJ2ExQCUhiprgpduRVFpLvZjOCsXEgWFqRk0RZcWLopmOnCQcPUsVBiTEZbalrGTJOZJm2aNGm++92b737fcdGZTfvAuznwnMV7OBouEI/HdSHEyNzcXCwajb7r8/n6T09P99bW1u4PDw8/SiQSbHd396IGBINBJJPJQDqdvssYK0kpO0SkiIiUUlII0SqVSr8lk8n3JycnjUsLZmdnb5bL5T+klPK5RNzp0BlzyHEFKXU+cxynubKy8tXExIQJABoAzM/PB6amptYikch70DRtv3iMh5kClPQglcKzozMMXhnAh7E3EL0RhCcEX19f/6xSqSxhdHRUT6VS39i2LYUQtJ7epm9/uEdHtSZJKUkpRa0zm75fvE+f3/mRmM3JcRyqVqulmZmZl7G6uhopl8sHtm3TduEpffH1T1Srn9FFavUmnTRaJKUkx3Go0WiojY2N22aj0Yj5fL6wJyVS6R289koYVwd7L3V07aUBAICUEkopSCk1v99/Sw+Hw5NSyi7OXZQrTQwFBy6f6DlKKSil4HkeOp0ODMO4btq23S+EgFQaAAKzO1BKQdd1AICmaSAiEBGUlBBCwHVduK4LzrlpHh4e7nHOVW+vofdbPmxkHuPWB6/D6vFD13UoRfj38TPsP6mBOxJjN64gdNUC5xz1er2l5/P5XxqNBvNEByPBLmS2n+LXzQK4zcH5ebp9GkAeEksPwJgNxhhs20axWMzo7Xb7US6Xyx7Xanh7LIhXRywklh7i9z/30Wy1YNsMfT0mrG4DGoCO64Ixhlqt5uTz+UVjZ2dHDA0NFYPB4Cd9fVb3W2MhnDZb+DldwD+FCk5OWvivVEX27ycY7APevHkNouNSNpu9l8vlvtMAIBQKGfF4/Mvp6em7oVCoxzAMOB0PjAsQEfxdPvi7DBgG4Dgu5fP5vxYWFj4uFAoHBgAwxmhvby8jpTywLOsdy7IGfKah9XSb56IOeJ7A0dGxs7m5mVpeXv60Xq8fcM7Pf+EFsVhMq1Qq18fHx2ej0ehHgUAgYpqm2W63W6VSKVMsFhe3trYeVKtV/sL5HwhICaDODiyAAAAAAElFTkSuQmCC";
var promticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADQ0lEQVQ4jX2TX2xTdRTHT7O4GWL0gSwKmphoi3SsdFXHZiRjDExGSIxGHoTgwzDAUoM4skgEE6ckmiiEB2D8GYqbo2LLrmxZ51rWlob+W1e2ua2z2tp1ZVzrunZr161r7/3drw9TCLr4Sc7b+Zycc3IO0QNkY4M333LrD19zGbSc64aWc/VoOZepnnOZD3KuHi3nNB9rCQQcW2kl7CPjH3tPF7OUjpAxEbKDhNwEQUgSxBRBiD8GYWY/UlONzHO76YJery+4LwcmJmrHZtL5tlOVmGsjzPcQFgcIuRBBmCaIaYKYJIip18HyHiylv2Ae5wUtERGFef5ZZzQWS4sSmjgO060yzBsJi/2E3G8E4Y/lDpajDJIwDEkMwW2rHvf5fI/QlZHQFc+CBO8CQ9efOVw8s225gIewFCDkeRnEuSKwzGqw7PuQWAySlMFcrJ4NeIyv0SFv+N5nvIjdgSx2+NLYZ/Sio7nW4uTqdE7jIZ3TfFzntH6u03ON9g/aq9DQvgkftlfg5A+1aGk50EG77MHEK3cyKLHPQm6aRrkljqYu+/V/L/mNjroual0HuqwAnVeAzsix9og6Rg23xjmlLQm5OQ65OQ7FzRlstUyJtoHB7f/Ivf6+2kdNKpFMSlC3EvTjepDhBexo3tNLY+Ep9YaeyaX1tiSU9llscKSw0TOPPTecQ8FgsCgYDBZtt789Sv6NoGEVaKAU5C5F4fWSrHPIW05ERMetQxfV/fPQ+Bbw8nAWFaM5vDq6iK9tt9+77Pnu8NOz20AJDSimAd0tA4XVOGhovHR/vkgksqbqVjC5+VcBVSGGLb8zbAkxVHe642+OvpuQiSqQoAblNaClF1Hs2jQdjUbXPrSks1bHR5UjWZQPZqDxpKFyzEJ17VNckr5HIZOD2HMgUQHKrsOpn84e+c8p8zy/6qVzvZFnDJN46moYxedM+HKyGUPSCOpZI9awUjzBFCjr2+zneX7Viv/Q2tm3t+CEixWccKC68ygmhCj8wi8wCr04JnyCkruqfHd/984V5b+RnbxqbNj11VHLzrZ9kRr9O9ka614orTXseUPZvW8s39b9n/wQfr+/MBwOP+n+2V3huOOoTCQSj6+U9xeWlBixn0UlkAAAAABJRU5ErkJggg==";
var yndicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC8UlEQVQ4jY2TTWgcZQCGv1OLgkX0UlChaC8iEUo1kNJV0UiTNl1SFasYk2pELeohVkOgWkILDSTR2tWGjRILhigVoxIbf1oaWkJtIokmYWOa3253t2T/Z2dnZmfnm5nv8RZIhdIXnst7eE7vK+oH5JvPfSe5HfZ963SImxPsL9E45PD6r/KWvDYsCfaXnN2nzYp1gt2nDZqGbJqGbJrP2ixrPpZU+AoMR5GxFCNRj6Yhmxe/t6j9uji6TvDsV3kaBk1az5XQy4q0pbia8WgYNMmVFA2DJhdWXCypaPrJJPhNgere/ME1wZM9aQ78oOMrGItJlIJIyiVf8rFdxWLW4+UzBfSyImv5vDCg8URPKlf1afw+IYQQO07eIGv5jMcc+v+2OPhjnqThkbV89g9kee9njZzlM5Fw+GXOpueKwa4vU1R9dmNACCHEY91RMqbH5Ws2ZVcR01ySRY/OCwXq+5LU9yWJaS5ayeeV/hQ5y6e+L8nOkzG2dy3vEYETK8Q0l7pwgpThURdOUBdOkLc89vYmiGkug9MGe3sTRHMSWyrqwgme+fw6FccXF0XFsTl026cmFGUx7VATilITihK+lKfsKjr/yKx1CymHklTUhKIEupd4uH32H/HQRzMYZZ94XlJ2FasFyWpBcmneIFN0CYZWqO5e4vlT15CeQrM8qruXeKQ9woOHp3aKB1onieccaj9ZIKW7PNVxdY1dXfOkiy77Ty2TNVzmV21az8R59MgM93842SuEEGJzyxjVx/9Fs1xe+mKB85ECgaMRAkcj1HbOYTk+17Nl9nTNkdIljx+ZZnPLldym5j/vEUIIce+7o1R9PEWwaxbD9nA9RVqXzMRMpqImTx+bwSx7pHVJoH2aLe+Pcfc7o6+uDWnT2yNUtk1Q2TbBjsOTXJzVsKVPseRxcVYjrUtOnI1T2TbB1pbL3PXWyPop3/nGebYdGmf7B3/dkm2Hxrmj+Zyzsfn3resEGxqHOzYc+I3bonH4f3f+Dz63ssfSaOz4AAAAAElFTkSuQmCC";
var bingicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABMUlEQVQ4jY2SsU7DMBCG/TJYYqpEPDojcbq0NGM7sXdnggnigYFOyVDqLLBAkRJLTIwJSwdYw8gj8AQ/Q0kaO6HNSZbPp/P332+ZkJ7hSo2uvNdFV2rwMEOVGw28UVjl5bZZaqi8hA3aqzB/KOBKDVWUrcZ6ir/dgLlSY/HxAx5mmD++d15u7jzMjDNxpcbZyzeE+mz563o4bteaY9nj2bktwP97F7upS72yUgdLfNDIA428g9SD/6APZG84SoDGwoDQeFurly3CEh+OEmBKIFgPcWwBCCHkKPJwt7nA+dvIFBg/C9wUV3VhsbnF4L4NmKYT0Fjg9HVoApgSSL/WBuBkZQKm6QQ08jDLgraF8ZPAdX6JJnCw3AFo5IHGArMs2NVsi44SYIkPlviozraFrvgFK3TyTsPvtF8AAAAASUVORK5CYII=";

function readFromClipboard() {
  var string;
  try {
      var clipboard = Cc["@mozilla.org/widget/clipboard;1"].
                      getService(Ci.nsIClipboard);
      var trans = Cc["@mozilla.org/widget/transferable;1"].
                  createInstance(Ci.nsITransferable);
      trans.addDataFlavor("text/unicode");
      if (clipboard.supportsSelectionClipboard()) {
        clipboard.getData(trans, clipboard.kSelectionClipboard);
      } else {
        clipboard.getData(trans, clipboard.kGlobalClipboard);
      }
      var data = {};
      var dataLen = {};
      trans.getTransferData("text/unicode", data, dataLen);
      if (data) {
        data = data.value.QueryInterface(Ci.nsISupportsString);
        string = data.data.substring(0, dataLen.value / 2);
      }
  } catch (ex) {
  }
  return string;
};



function GetXmlHttpObject(){
         if (window.XMLHttpRequest){ return new XMLHttpRequest();}
         if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP");}
        return null;
        };

var btn = this;

btn.lastClick = {
    X: 0,
    Y: 0
};
addEventListener("mouseup", function(e) {
    if (e && e.button == 0 && e.view.top == content) {
        var lc = btn.lastClick;
        lc.X = e.clientX;
        lc.Y = e.clientY;
    }
}, false);

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

    if(size){
        cnt.style.height = size.height;
        cnt.style.width = size.width;
    }else{
        for(var i = 3; i < 10; i++){
            if(cnt.scrollHeight > cnt.offsetHeight || cnt.scrollWidth > cnt.offsetWidth){
                cnt.style.height = 50*i+'px';
                cnt.style.width = 100*i+'px';
            }else break;
        }
    };
    var docEle = doc.compatMode == 'CSS1Compat' ? doc.documentElement : doc.body;
    var mX = docEle.clientWidth-w.offsetWidth, mY = docEle.clientHeight-w.offsetHeight;
    if(mX < 0){cnt.style.width = parseInt(cnt.style.width)+mX+'px'; mX = 0};
    if(mY < 0){cnt.style.height = parseInt(cnt.style.height)+mY+'px'; mY =0};
    var hW = parseInt(w.offsetWidth/2);
    w.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px';
    w.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px';
    w.style.visibility = 'visible';
    doc.addEventListener('keydown', keyDown, false);
};

var getSel = function (w) {
    var s, d = w.document;
    if (d.selection) {
        var r = d.selection.createRange();
        s = r ? r.text : ''
    } else {
        s = d.getSelection().toString();
        if (!s) {
            var e, t = d.getElementsByTagName('textarea'), u = d.getElementsByTagName('input'), i = t.length;
            while(e = (i > 0) ? t[--i] : u[-i--])try{
                if (e.offsetHeight > 0 && (s = e.value.substring(e.selectionStart, e.selectionEnd))) break
            }catch(x){}
        }
    };
    if (!s) for (var j = 0, f; f = w.frames[j]; j++) {
        try {
            if (s = getSel(f)) break
        } catch(x) {}
    };
    return s
};

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

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

    return sM(txt);
};

//----------Перевести  текст  из буфера в окне Google------------


var ujs_google_translat = function (dir){
    var win = content, lng = win.navigator.language.slice(0, 2), txt = readFromClipboard(), l = dir.split('|');
    if (txt) {
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);

        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0'));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                    result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();

                    createWindow(result, status, '<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', btn.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
    } else {
        win.open('http://translate.google.com/translate?u='+escape(win.location.href)+'&hl='+lng+'&langpair='+dir+'&tbb=1');
    };
};


//----------Перевести выделенный текст в окне Google------------


var ujs_google_translate = function (dir){
    var win = content, lng = win.navigator.language.slice(0, 2), txt = getSel(win), l = dir.split('|');
    if (txt) {
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);

        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0'));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                    result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();

                    createWindow(result, status, '<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', btn.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
    } else {
        win.open('http://translate.google.com/translate?u='+escape(win.location.href)+'&hl='+lng+'&langpair='+dir+'&tbb=1');
    };
};
 
//----------Перевести выделенный текст в окне Microsoft------------
function ujs_Microsoft_translate (){
      var win = content, txt = getSel(win);
    var encTxt = encodeURIComponent(txt);
    if (txt) { 
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt), post = encTxt.length > 1024;
        var urlt = 'http://www.bing.com/translator/?from='+langFrom_Microsoft_text+'&to='+langTo_Microsoft_text+'&SourceText=' + encTxt;       
       var keyus = "366EA718B7846D2CBD6E0129E55F518D31E741BE"; 
        var uridetect = "http://api.microsofttranslator.com/V2/Ajax.svc/Detect?appId="+keyus+"&text="+ encTxt;
        var url="http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId="+keyus+"&from="+langFrom_Microsoft_text+"&to="+langTo_Microsoft_text+"&text="+ encTxt;
 
        if (txt && location. hostname != 'http://api.microsofttranslator.com/')
         { var result="Подождите идет перевод", status="";
            createWindow(result, status,'<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Bing</a>', '_gt', btn.lastClick);
         }
        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open(post ? 'POST' : 'GET', url, true);
           if(post)xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           xmlhttp.send(post ? encTxt : null);
           xmlhttp1=GetXmlHttpObject();
           xmlhttp1.onreadystatechange=stateChanged;
           xmlhttp1.open('GET', uridetect, true);
           xmlhttp1.send(null);
        }
       function stateChanged(){
         if (xmlhttp.readyState==4 && xmlhttp1.readyState==4)
         {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\"/g, '').replace(/\\u000d/g, " ").replace(/\\u000a/g, "<br />").replace(/\//g, '');
           var tryain1=xmlhttp1.responseText;
           tryain1=tryain1.replace(/\"/g, '');
           var result = tryain;
           var status =(tryain1 +' -\u203A '+ "ru").toUpperCase();
           createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Bing</a>', '_gt', btn.lastClick);
         }
       }  
      gettransdata();
   } 
};

//----------Перевести текст в окне Яндекс------------
function ujs_yandex_translate() {
       var win = content, txt = getSel(win);
       var encTxt = encodeURIComponent(txt);
     if (txt) { 
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt);
        var keyuser = "региструемся на сайте яндекс и беспалатно получаем ключ и вставляем вместо этого соощения";
        var url ="https://translate.yandex.net/api/v1.5/tr.json/translate?key="+keyuser+"&lang="+langFrom_yandex_text+langTo_yandex_text+"&text=" + encTxt;

        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open('GET', url, true);
           xmlhttp.send(null);
        }
        function stateChanged(){
          if (xmlhttp.readyState==4)
           {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\\n/g, "<br />");
           var data = JSON.parse( tryain );
           var result,status;
           if (data.code == "401") {result = "Неправильный ключ API"; status = "";} 
           if (data.code == "402") {result = "Ключ API заблокирован"; status = "";} 
           if (data.code == "403") {result = "Превышено суточное ограничение на количество запросов"; status = "";} 
           if (data.code == "404") {result = "Превышено суточное ограничение на объем переведенного текста"; status = "";} 
           if (data.code == "413") {result = "Превышен максимально допустимый размер текста"; status = "";} 
           if (data.code == "422") {result = "Текст не может быть переведен"; status = "";} 
           if (data.code == "501") {result = "Заданное направление перевода не поддерживается"; status = "";} 
           if (data.code == "200") {result = data.text; var status1 = data.lang; status =(status1.replace(/\-/g, "-\u203A")).toUpperCase();}
           var urlt = 'http://translate.yandex.ru/?text=' + encTxt + '&lang=' + status1;
           createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Яндекс</a>', '_gt', btn.lastClick);
           }
        }  
        gettransdata();
    } 
};



//--------Перевести страницу с Google--------------
function ujs_googlePage_translate() {
   var urlt = content.document.location.href;  
   var url = "http://translate.google.com/translate?hl=ru&sl=auto&tl=ru&u="+ encodeURIComponent(urlt) + "&sandbox=1";
 //loadURI(url);
 getBrowser (). loadURI(url, {
    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};

//---------Перевести страницу с Promt---------------
function ujs_PromtPage_translate() {
var urlt = content.document.location.href;
var url = "http://www.translate.ru/siteTranslation/autolink/?direction=ar&template=General&sourceURL="+encodeURIComponent(urlt);
//loadURI(url);
getBrowser (). loadURI(url, {
    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};

//---------Перевести страницу с Microsoft---------------
function ujs_MicrosoftPage_translate() {
var urlt = content.document.location.href;
var url = "http://www.microsofttranslator.com/bv.aspx?from=&to=ru&a="+encodeURIComponent(urlt);
//loadURI(url);
getBrowser (). loadURI(url, {
    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};


//---------Перевести страницу с Microsoft в новой вкладке ---------------
function ujs_MicrosoftPageNew_translate() {   
        var urlt = content.document.location.href;  
    var url = "http://www.microsofttranslator.com/bv.aspx?from=&to=ru&a="+encodeURIComponent(urlt);
    var ctabpos = gBrowser.selectedTab._tPos +1;
    gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//---------Перевести страницу с Promt в новой вкладке ---------------
function ujs_PromtPageNew_translate() {                 
      var urlt = content.document.location.href;  
    var url = "http://www.translate.ru/site/General/au-ru/?url="+ encodeURIComponent(urlt) + "";
    var ctabpos = gBrowser.selectedTab._tPos +1;
    gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//--------Перевести страницу с Google в новой вкладке --------------
  
function ujs_GooglePageNew_translate() {
   var urlt = content.document.location.href;  
   var url = "http://translate.google.com/translate?hl=ru&sl=auto&tl=ru&u="+ encodeURIComponent(urlt) + "&sandbox=1";
    var ctabpos = gBrowser.selectedTab._tPos +1;
     
   var css = '@-moz-document domain("translate.google.com") {\
   #gb, #gt-c:not([class="g-section"]) { display: none !important; }\
   #contentframe { top: 0 !important; }\
   }';
   var uri = makeURI("data:text/css," + encodeURIComponent(css));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"]. getService(Ci.nsIStyleSheetService);
   try { sss.unregisterSheet(uri, sss.AGENT_SHEET) }
   catch(e) { sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET) } 

   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
 };
 
//--------Перевести текст в Google в новой вкладке--------------
function ujs_GoogleTextPageNew_translate() { 
var win = content, txt = getSel(win);
var encTxt = encodeURIComponent(txt);
var ctabpos = gBrowser.selectedTab._tPos +1;
var url="http://translate.google.com/translate_t?text="+encTxt+"&sl=auto&tl=ru&hl=ru&eotf=0&ujs=gtt";
gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};

//--------Перевести текст в Яндексе в новой вкладке--------------
function ujs_yandexTextPageNew_translate() { 
       var win = content, txt = getSel(win);
        var encTxt = encodeURIComponent(txt);
       var ctabpos = gBrowser.selectedTab._tPos +1;
           var urlt="http://translate.yandex.ru/?text=" + encTxt + "&lang=" + "-ru";
           gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(urlt), ctabpos);
      
};

//---------Перевести текст в PROMT в новой вкладке---------------
function ujs_PROMTTextPageNew_translate(){ 
var win = content, txt = getSel(win);
var encTxt = encodeURIComponent(txt); 
var ctabpos = gBrowser.selectedTab._tPos +1;
var url="http://www.translate.ru/?External=IE8Accelerator&formEncoding=utf-8&direction=ar&prmtlang=ru&status=translate&template=General&source="+encTxt;
gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};

//---------Перевести текст в Microsoft в новой вкладке---------------
function ujs_MicrosoftTextPageNew_translate(){
  var ctabpos = gBrowser.selectedTab._tPos +1;
  var win = content, txt = getSel(win);
  var encTxt = encodeURIComponent(txt);
  var url="http://www.bing.com/translator/?to=ru&Text="+encTxt;
  gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};


//Контекстное меню для перевода из буфера-------------------------------------------  

(function () {
 if ( document.getElementById("TranslateBufer") ) return; 
 var contextMenu = document.getElementById("contentAreaContextMenu");  
 var Item = document.createElement("menuitem");
       Item.setAttribute("Id", "TranslateBufer");
       Item.setAttribute("label", "Перевод из буфера");
       Item.setAttribute("class", "menuitem-iconic");
       Item.setAttribute("image", mainicon);
       Item.addEventListener("command", function(){ujs_google_translat('auto|ru')}, false);

  contextMenu.insertBefore(Item, document.getElementById("context-viewpartialsource-selection") ); 

 })();

//Контекстное меню для перевода страниц-------------------------------------------  
(function () {
 if ( document.getElementById("TranslatePage") ) return; 
  
  var menu = document.createElement("menu");  
  var menuPopup = document.createElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu");  
  
    menu.id = "TranslatePage";
    menu.setAttribute("label", "Перевести страницу");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", mainicon);
   
  contextMenu.insertBefore(menu, document.getElementById("context-viewsource") ); 
  menu.appendChild( menuPopup );
  addDestructor(function() { contextMenu.removeChild( menu ) }); 
    var array = [
        {label:"Google", func: ujs_googlePage_translate, image:gticon},
        {label:"Promt ", func: ujs_PromtPageNew_translate, image:promticon},
        {label:"Microsoft", func: ujs_MicrosoftPage_translate, image:bingicon},
        { separator: '' },
        {label:"Google в новой вкладке", func: ujs_GooglePageNew_translate, image:gticon},
        {label:"Promt в новой вкладке", func: ujs_PromtPageNew_translate, image:promticon},
        {label:"Microsoft в новой вкладке", func: ujs_MicrosoftPageNew_translate, image:bingicon}
        ];
        
   array.forEach(function( m ) {  
       if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.image);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );

       });
   
     addEventListener("popupshowing", function() {
     menu.hidden = gContextMenu.isTextSelected || gContextMenu.onImage || gContextMenu.onTextInput ; 
  }, true, contextMenu );
})();



 //Контекстное меню для перевода текста-------------------------------------------  
(function () {
 if ( document.getElementById("TranslateSelected") ) return; 
  
  var menu = document.createElement("menu");  
  var menuPopup = document.createElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu");  
      
    menu.id = "TranslateSelected";
    menu.setAttribute("label", "Перевести выделенный текст");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", mainicon);

  contextMenu.insertBefore(menu, document.getElementById("context-viewpartialsource-selection") ); 
  menu.appendChild( menuPopup );
  addDestructor(function() { contextMenu.removeChild( menu ) });
   
  var Item = document.createElement("menuitem");
       Item.setAttribute("label", "В окне Google");
       Item.setAttribute("class", "menuitem-iconic");
       Item.setAttribute("image", gticon);
       Item.addEventListener("command", function(){ujs_google_translate('auto|ru')}, false);
       menuPopup.appendChild( Item );
     
  var array = [
        {label:"В окне Яндекс", func: ujs_yandex_translate, image:yndicon},
        {label:"В окне Microsoft", func: ujs_Microsoft_translate, image:bingicon},
        { separator: ''},
        {label:"В Google в новой вкладке", func: ujs_GoogleTextPageNew_translate, image:gticon},
        {label:"В Яндексе в новой вкладке", func: ujs_yandexTextPageNew_translate, image:yndicon},
        {label:"В PROMT в новой вкладке", func: ujs_PROMTTextPageNew_translate, image:promticon},
        {label:"В Microsoft в новой вкладке", func: ujs_MicrosoftTextPageNew_translate, image:bingicon}
              ];
  array.forEach(function( m ) {  
        if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.image);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );
       });
 
     addEventListener("popupshowing", function() {
     menu.hidden = !gContextMenu.isTextSelected; 
  }, false, contextMenu ); 
 })();

Andrey_Krropotkin
Огромное спасибо за прекрасную кнопку перевода! Попробовал переводить один текст во всех 4 переводчиках. Лучше всех переводит Google, IMHO. А вот Перевести выделенный текст в окне Яндекс у меня не работает. Вот такое показывает:

скрытый текст
b61a31d2cd7fdd02a09d7958c1c162cf.jpg

rubel там же в коде написано  var keyuser = "региструемся на сайте яндекс и беспалатно получаем ключ и вставляем вместо этого сообщения";
иначе если все будут пользоваться, то быстро слетит

Andrey_Krropotkin пишет

вставляем вместо этого сообщения

Спасибо, понял.

Есть кнопка https://forum.mozilla-russia.org/viewto … 60#p458560.  Это кнопка № 23- Autocopy. Работает хорошо. Нельзя ли сделать, чтобы значок (иконка) кнопки мигала при выделении текста, а не сам текст.

Что то никто не отвечает! Наверно задача не выполнимая.....:)
Задам другой вопрос, более важный для меня. Есть портабельный ФФ 56.02. Установлены несколько кнопок. Работает нормально, но при переходе на другую ось, или при запуске в другом компьютере,  Сustom Buttons как бы отключает свою работу....Т.е. сама она есть, в дополениях - установлена, а кнопок - нет, пропали из панелей....Приходится Сustom Buttons переустановить, ну, а кнопки сразу все появляются и функционируют. Можно это как-то решить, исправить? 
P.S. Сustom Buttons хоть подписанная, хоть нет, одинаковая трабла..Все так мучаются?

nbuh
Портабельная? и профиль очищается?
А так редко кто тут отвечает да и вообще форум тихо умирает), пик был пару лет назад...
Кстати вроде кидали какие-та версий Autocopy тута, посмотри... или через пойск.
https://forum.mozilla-russia.org/viewtopic.php?pid=766152#p766152

nbuh
extensions.json надо удалить из папки профиля, тогда без переустановки расширения должно пройти

momo2000, Спасибо!

extensions.json надо удалить из папки профиля

Да! Мне об этом уже сказал, в личку, один хороший человек! И это работает! Это в несколько раз лучше, чем переустанавливать Сustom Buttons. Может есть спецы, которые могут сделать такую фичу, чтобы при закрытии этого портабла, файл extensions.json, удалялся...Может скрипт, или батник, или ещё что.....?!

func4ptch4 Спасибо за ответ!
Правда, я не такой продвинутый юзер, больше - пользователь...
Если, я правильно понял, то надо:
1. Создать кнопку с выложенным кодом, вытащить её на панель...
2. Файлы: user_chrome_files и SQL.vbs положить в папку chrome.
На остальное моих мозгов не хватит, если будет время и желание, ответить, подробнее, поправить, буду рад.:beer:

func4ptch4, Привет! Спасибо!
1.Кнопку, с выложенным кодом, создал.
2.Файлы user_chrome_files и SQL.vbs положил в папку профиля, в них ничего не менял.
Но, при закрытии браузера,просто сам открывается, блокнотом, файл SQL.vbs. Видимо, что-то с ним надо сделать.
Пока файл extensions.json не удаляется....

func4ptch4, Привет!

Проверь просто закрыв браузер если в папке профиля удаляются файлы

Какие, конкретно, не весь же профиль?

но удаление extensions.json надо добавить в sqlite[Fix].bat.

Да, там "китайская грамота", для меня! Что, в выложенном (рекомендованном вами) батнике, это не прописано?
А в SQL.vbs, надо прописывать, какие-то пути? Если надо, то как? Например......
Неужели эти вопросы нигде не обсуждались, у всех хорошо портаблы работают, или ими пользуются только программисты!? :)

nbuh
https://anonfile.com/o1Dft8s2b6/profile_rar
Перезалил, теперь все кидай в профиль... добавил в список extensions.json+всякий хлам.
В общем, ты заметишь удаление и сжатие.
Ах да для открытия батника и т.д. лучше использовать notepad++, а блокнотом там каракули)

Код CB в /*Initialization Code*/

Выделить код

Код:

//=======================================================================================
//[+?] AutoDelSql+trash
try{document.getElementById("context-viewimage").setAttribute("onclick","gBrowser.selectedTab=gBrowser.addTab(checkForMiddleClick(this,event))");}
catch(e){};var closer={observe:function(subject,topic,data){if(data=="shutdown"){
var file=Services.dirsvc.get("ProfD",Ci.nsIFile); //file.append("g.vbs");
file.append("SQL.vbs");if(file.exists())file.launch();}}};
Services.obs.addObserver(closer,"quit-application",false); /**/

//= = = = = = = = = = = =
/* //Drage - forum.ru-board.com/topic.cgi?forum=2&topic=4283&start=2100#21
var closer={observe:function(subject,topic,data){if(data=="shutdown"){
            var profile=Services.dirsvc.get('ProfD',Ci.nsIFile);
            var file=Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
file.initWithPath(profile.path+"\\..\\nir\\m.vbs");file.launch();
file.initWithPath(profile.path+"\\sqlite.vbs");file.launch();}}};
Services.obs.addObserver(closer,"quit-application",false); */
//= = =
/* //Vitaliy V. работает на всех плат.Windows+Lin...
var closer={observe: function(subject,topic,data){if(data=="shutdown"){
   var profile=Services.dirsvc.get('ProfD',Ci.nsIFile);
   var dirs=profile.parent;
dirs.append("memreduct");dirs.append("h.vbs");if(dirs.exists())dirs.launch();
profile.append("SQLite.vbs");if(profile.exists())profile.launch();}}};
Services.obs.addObserver(closer,"quit-application",false); */
//= = =
/* //Dumby - forum.mozilla-russia.org/viewtopic.php?pid=765700#p765700||765705#p765705
var closer={observe:function(subject,topic,data){if(data=="shutdown"){
            var file=Services.dirsvc.get('ProfD',Ci.nsIFile);  
            ["custombuttons","backup","buttonsoverlay.xul.bak"].forEach(file.append);file.reveal();
file.initWithPath(profile.path+"\\SQLite.vbs");file.launch();}}};
Services.obs.addObserver(closer,"quit-application",false); */

func4ptch4, спасибо за желание помочь!
Но есть вопросы!
1.

для открытия батника и т.д. лучше использовать notepad+

Да установил. Есть, батнике строка под №137. Там надо менять пути?
Ну, если только добавить так: REM %appdata%\Mozilla\Firefox\Profiles\700whmgz.default
Или не так надо?
Вообще-то путь, такой же и у стационарно установленного ФФ, только конечная папка другая.
2.

Код CB в /*Initialization Code*/

Зачем нужна эта кнопка?

nbuh
1. Нет только то что светится, если не подсвечен то не работает... это называется закомментировать(то есть тот код не пашет, пока не уберешь :: )
    Код на удаление папок начинается с 31 строки и там он берет прямо с профиля, никакие пути не нужны.
       Я писал про код на 137 строке, это код который я не перебрал его можно вообще убрать...
       Хотел разобраться в нем чтобы применить к себе, это автобекап профиля.
2. Этот код следит за закрытием браузера и запускает SQL.vbs с профиля, без него все смысла нет во всем остальном.
    SQL.vbs запускает sqlite[Fix].bat>sqlite3.exe идет стирание лишних файлов и сжатие .sqlite ...
      Ах да вам надо выбрать один из них, можете оставить первый.
      Можете все скопировать все равно остальные закомментил.

Есть кнопка_Add-on's, вроде работает в [firefox] 52, но эта кнопка_Extension List показывает: Add-on's "ошибка инициализации". Что нужно изменить???

kokoss попробуй спросить тута, там Dumby чаще появляется https://forum.mozilla-russia.org/viewto … 10#p768810

Приветствую,
Пользуюсь этой кнопкой, все отлично работает, но хотелось бы улучшить.

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

Выделить код

Код:

// Настройка функций кликов мыши для кнопки .............
this.onclick =e=> {
   
   if ( e.button == 0 ) {        // ЛКМ
         deleteCookiesFromHost();
        reloadAllTabsFromHost();
   
   

        }
      
   if ( e.button == 1 ) {        // СКМ 
   
           deleteCookiesFromHost();
        //BrowserReload();
   
  
        }
        
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) {       // ПКМ
        e.preventDefault();  
        
        try { Services.wm.getMostRecentWindow("Browser:Cookies").close() } catch(e) {};
        var win = openDialog ("chrome://browser/content/preferences/cookies.xul", "_blank", "resizable,dialog=yes,centerscreen", null);
        addEventListener("load", ()=> {
           var host = content.location.host, arr = host.split('.');
           if ( arr.length > 2 ) host = arr[1] + "." + arr[2];
           var filter = win.document.getElementById("filter");
           filter.value = host; setTimeout(()=> filter.doCommand(), 0);
        }, false, win);
        }        
};


// Удалить куки базового домена .............
function deleteCookiesFromHost() {
   var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);

   // удалить обычные куки домена
   for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {
         var cookie = en.getNext().QueryInterface(Ci.nsICookie);
         ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false); 
         }
   
   // удалить куки домена из истории     
   var reversedDomain = host.split("").reverse().join("") + ".";
   Cu.import("resource://gre/modules/FileUtils.jsm");
   var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
   var dbConn = Services.storage.openDatabase(file);
   dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");
   dbConn.close();
   
   // удалить все Flash куки
   var dir = Services.dirsvc.get('Home', Ci.nsIFile);
   dir.append("Application Data");
   dir.append("Macromedia");
   dir.remove(true);
   dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
};


// Перезагрузить все вкладки текущего сайта .............
function reloadAllTabsFromHost() {
   var host = content.document.domain;
   
   for( var tab of gBrowser.tabs ) {  
        var tabHost = tab.linkedBrowser.contentDocument.location.host;
        if ( host == tabHost ) gBrowser.reloadTab(tab);
        }
};


this.tooltipText = "Л: Удалить куки текущего сайта\
                  \nС: Удалить куки текущего сайта + обновить все вкладки текущего сайта\
                  \nП: Управление куками для текущего сайта\
                  \nCtrl+П: CB Меню";


В папке storage\temporary и storage\default

есть папки https+++domen.ru
можно сделать, чтобы и папка домена удалялась при нажатии на кнопку.

Спасибо!

Ultima2m пишет

Попробуйте этот код. Раньше вроде работало

А потом вы пересели на супер-пупер браузер без белых вспышек?

22-01-2022 16:22:57

firepox пишет

можно сделать, чтобы и папка домена удалялась при нажатии на кнопку.

Спасибо!

Это утверждение?

Добрый день . Исправите пожалуйста кнопку Autocopy+31 для FF105

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

Выделить код

Код:

/*Initialization Code*/

/*Initialization Code*/
this.closest("toolbarpaletteitem") || (script => {
    var id = `CB${_id.slice(20)}:Autocopy`, pid = id + "Parent";
    var nsvoStr = `Components.utils.import("resource://gre/modules/Services.jsm", {})`;
    var nsvo = eval(nsvoStr), {Services} = nsvo, parent = nsvo[pid];
    if (!parent) {
        var cid = id + "Child", u = code => "data:," + encodeURIComponent(code);
        var pref = "CB.Autocopy.settings", topic = "quit-application-granted";
        var PREF_ENABLED = 1, PREF_BLINK = 2, PREF_RESET = 4;

        (parent = nsvo[pid] = {
            init() {
                this.readSettings();
                if (!this[PREF_ENABLED]) return;
                this.initChild();
                if (this[PREF_RESET]) this.setObserver(true);
            },
            destroy(reason) {
                var ud = reason[5] == "e";
                if (ud || !this.obsAdded) this.saveSettings();
                delete nsvo[pid];
                if (reason == "delete") Services.prefs.clearUserPref(pref);
                if (!this[PREF_ENABLED]) return;

                this.destroyChild();
                if (ud && this[PREF_RESET]) this.setObserver(false);
            },
            get processURL() {
                delete this.processURL;
                this.frameURL = u(`${nsvoStr}["${cid}"].init(this);`);
                return this.processURL = u(script.replace(/%ID%/g, cid)
                    .replace("%NSVO%", nsvoStr)
                    .replace("%PREF%", pref)
                    .replace("%PREF_BLINK%", PREF_BLINK)
                );
            },
            get frameURLDestroy() {
                delete this.frameURLDestroy;
                this.processURLDestroy = u(`${nsvoStr}["${cid}"].forget();`);
                return this.frameURLDestroy = u(`${nsvoStr}["${cid}"].destroy(this);`);
            },
            initChild() {
                Services.ppmm.loadProcessScript(this.processURL, true);
                Services.mm.loadFrameScript(this.frameURL, true);
            },
            destroyChild() {
                Services.mm.removeDelayedFrameScript(this.frameURL);
                Services.mm.loadFrameScript(this.frameURLDestroy, false);
                Services.ppmm.removeDelayedProcessScript(this.processURL);
                Services.ppmm.loadProcessScript(this.processURLDestroy, false);
            },
            readSettings() {
                var val = Services.prefs.getIntPref(pref, 3);
                for(var setting of [PREF_ENABLED, PREF_BLINK, PREF_RESET])
                    this[setting] = Boolean(val & setting);
            },
            saveSettings() {
                var settings = 0;
                for(var setting of [PREF_ENABLED, PREF_BLINK, PREF_RESET])
                    if (this[setting]) settings += setting;
                Services.prefs.setIntPref(pref, settings);
            },
            btns: new Set(),
            register(btn) {
                this.btns.add(btn);
                btn._handleClick = this.click;
                btn.oncontextmenu = this.context;
                this.setImg(btn, this[PREF_ENABLED]);
            },
            unregister(btn, reason) {
                this.btns.delete(btn);
                if (!this.btns.size) this.destroy(reason);
            },
            setImg(btn, state) {
                (btn.icon || btn.ownerDocument.getAnonymousElementByAttribute(
                    btn, "class", "toolbarbutton-icon"
                )).src = state
             ? "data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH1gUCFysoMPbyDwAABE5JREFUOI2NlV1sFFUUx39z73S/6C67s6UsQisWAgZBKRTUhBhDJAhEoyQ2QqMlhjcSP158MMYHoo+YGF5MjNCHqkmJKJpgaYAEFYhalWio2EWXpZgIS3G3uzu783Hn+tAPW2zRk5zcySTnd//nf+fMNfr6+qK1Wq1Fa50BWoCMlLJNSrkUWBIEwUKlVFJKWRZCDPu+3+O67sd79+69xR3C6Onp0alUyrYsSyeTSdHY2BiKxWIyEokQCoVoaGhgdHSUQqGAEALXdf1sNuvX6/WD4XB4f2dnZ2VWcG9vb6mrqyvheR5aa4IgmFonn33fx/O8qfR9H9u2g6Ghoeu2ba+eTb1pGEZJKZWwbRut9axtpVIpgiCY2sBxHJLJpIhGo5nBwcGXgTdurxGGYYz6vo9hGHP6FQQBUkrK5TK5XI5qtUosFiOdThuGYSyfrcYECq7r3hHsOA6u6zI2NkZLSwsAWmtM06Rx9MLKi7sj+UCqpBf1ztg+XZsOURZa6/8Eu64LgGVZU++01ri/n+NRZbWveun71tVbjiWWRNq3zWvgHQAhhFBBEMwJnSuql04j3RrRrdsN74lXKR88QqRpp6k8dgEIpZQ316HNFfalUxh/ZZm/PIrHm1x/aw038yPYbhEhGAUQeoJ6JytmKB0aQJav0LR+FfLas0Sv96GXVTBe6OBG8aijFPsmwbbv+/8LWvn5OGZ1hKZ1K5HXdkFxDOoWSQlF2e84tdyeDYc5BmBKKRuFEHN+wzB+UJWfPiPs3yK9fiXyaheUxsBJ44a2MXL881pQyO/ZcIi+yRpTax2fC6y1Hode+JQIZdLty5FXd0OpDE4TrrmVX0+cw72Z7+44xJHptUJKmbjd3+mjXfnxCFEqpNe2IfO7oVgGZwGu+TiXT33Dbwu2qY73Z0IBBDBPSjmlbnqODX5EVDhYa5eOQ0sV8Jpxza1kT54ntX0/lYUP1WezTwRBkJi0YvrPZ+zbXuaFNNYDrdOgC8ehA2eJbH6N2OrtBEHgAPJ2sAlEDcNAKfVP+4MfMj+VInnvAkTuGShVwc3gNGwhe+IrQptfRy99hGKxiO/79QmOBqYmTWito4ZhzLDAufgJ1sZORHwVXvg58BbhmI+R/eJL3I2vUEyuoVqtUq/XUUrVJiwV/1IshCAUCqGUwisXiLdtBKOOU7xJPbaTsKwx3H+a0v37MJrXIZVCa02tVgMoTKidMQym7/tWf3+/a1mWE4/HzUhuILJi01OGcmoEQRhcn+H+M5TbX0S0PsykiHg8ju/7BEEwCqQBeyIdALO7u1scOHCgNZ/PrwiFQm0dv7y9/4e7Hmy+r3SeP08e5sbwd2Sbn/ak16wW1+sik8mEEokEsViMfD5PoVAoAhngyiQUxm8QDeSBq4A8+7zxbum9Jy8fvVX74MRlBr6uLCns2KEXtYiRxcVisSWXyy0Lh8MrDMO4Wyl1j23bfwCXgOp0K/4GqDBYgeGFbWEAAAAASUVORK5CYII="
             : "data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAEj0lEQVR42n2Vf0xbVRTHv49HSwsFSvmxmtLBmMOZ6TYYcyNbYoQAMUAIRFEoyJxEidOYLP6jC8ZgImpCTGb8wwiMAS0bxD8WI4FGDIOamYBi9odaysY6wIGlBVqgfa+/PO+5kraAN7npu/f2fu4533Puuczg4KDc7XZrg8GgGoCWuppl2Rzq2fSdGQgEDvj9fiWNXTExMbM+n6+H5/nvmpubHfifxvT09ARTUlK2VSpVUKlUxigUCml8fDwrk8kglUohkUhgt9ths9lAYBDUZ7FYfB6P56u4uLi22trazT3B/f39G7qGhqTQhMftBlkPslTswjdZCa/Xu9OF8ZHcXPH/XZ2dqXtZz+j1+of1Op02NLG+trbr9OTkZPGQ0AGKxMSdNYNe/4lOp/toF9hgMMzU1NScjCPX94MnEog0xurqKtLS03fm7TQ2Go0D9dT2AhsrKipKEpOSotd2DhC0Jm2hTEmJWN9YX8dE36e/Hb5zNS3A+pVeuff2tg+6891wCVLoy8rK6ikQES5GWx4NdTmd8MyZIJu4G0wsrGRgtsI2fcW3xM305X2Di8zAwEBvcXFxo1wuFzWMhgjw6LEYZMttSAN+JCUfQfD5D+DJygAqczD7oNVT0A25kBVdJSUlFynF9gTv5cH2X2NgnfNIO3UMvK0HdlMOvFemEf/mCfy93LGU34lMpq+vr7O0tPSNhIQEMeL7uR6Cbv1hROzWAtLynwa7WEcLTiwE3oHfqIBr8ybHbc2/cvoabjG9vb1XSYp3hZQKgfezeHFCD4nnEUGfIqhOhMKjgktej3tGE+db/v3C6S7cCOVxd1FR0et040Qp9oOGmt/+PdiHBN0gKJcKXvIi5kYn3R6b9cKpbgzupBtpPEQavyQELzrl1hwO8eapUlMj6ePUuTTwsWUwG++AX71fW9CFoYg8pqwYJSlK0zMyIvY6qD4IbXNmiELMIb34vYh1fqwBc2O/YFZV5q9+/+vYXReEwKZX6+rORUMFS12/3kCCxA/ViWywVnI/P7LePDIZMDbv32psbFTsApPGd6lWPBuaEK6pCJ3SQyFnoTqeSdAG0nQL8B4ASlciAL3XrzuampoEd/3RYAuBnxQGq1QaBejmtAHJFETl0XTEzL/8H5RXg5OUwDI6iWc+fxBpHSAUGiGlAuHBW6ysrNQIqRYqk47eWhy9PAIEV+A1fwbJ0i1wbDEsI5Pgz16GL/MsnjtzJhwc/xjsCwfbq6qqVAKQXgp4XTbwU99CU/0huLV78DgdiLuvx+zIT9g4fglM9jmx0glZdDIvLwSW048nwgvhBaFbx9MLwlF5jJXNG2W5519gYlWHwG/awTsWYO18G668S8DBQvEVEaodvTZi3o+Pj//Q0tLyFrG2H3dOBJOlTEdHx0H6zqUNOQV/ftyG+psZx1KdWP7xGv6ZnYIlo9rLZhX6NRpNjFqtliZRvgu1xWq1Ynh4WN/a2vol7ReEt4fJEy4V2J9fY7wbkM2tONz60TkYTZuZtvLy8ie0Wq2GPNIS8DCV2FyGYbJIukNms/mL9vb2Ntq7FS7Fv/ChKzVwIHr3AAAAAElFTkSuQmCC";
            },
            click() {
                var newState = parent[PREF_ENABLED] = !parent[PREF_ENABLED];
                for(var btn of parent.btns) parent.setImg(btn, newState);
                newState ? parent.initChild() : parent.destroyChild();
                if (parent[PREF_RESET]) parent.setObserver(newState);
            },
            context(e) {
                if (e.ctrlKey || e.shiftKey) return;
                var btn = e.target;
                if (btn.btnPopup && e.detail > 1) return btn.btnPopup.hidePopup();
                e.preventDefault();
                (btn.btnPopup || parent.getPopup(btn)).openPopup(btn, "after_start");
            },
            getPopup(btn) {
                var win = btn.ownerGlobal, doc = win.document;
                var popup = doc.createElementNS(xulns, "menupopup");
                popup.setAttribute("onclick", "event.stopPropagation();");
                popup.setAttribute("oncommand", "handleCommand(event.target);");
                popup.setAttribute("onpopupshowing", "handlePopupshowing();");
                popup.menuitems = [];
                for(var [lab, pref] of win.Object.entries({
                    "Выделенный текст мигает при автокопировании": PREF_BLINK,
                    "Выключать автокопирование при выходе из браузера": PREF_RESET
                })) {
                    var menuitem = popup.appendChild(doc.createElementNS(xulns, "menuitem"));
                    menuitem.setAttribute("label", lab);
                    menuitem.setAttribute("type", "checkbox");
                    menuitem.pref = pref;
                    popup.menuitems.push(menuitem);
                }
                popup.handleCommand = menuitem => {
                    var newState = this[menuitem.pref] = menuitem.hasAttribute("checked");
                    if (!this[PREF_ENABLED]) return;

                    if (menuitem.pref == PREF_BLINK)
                        this.saveSettings(),
                        Services.ppmm.broadcastAsyncMessage(cid + ":FromParent", {blink: newState});
                    else if (menuitem.pref == PREF_RESET)
                        this.setObserver(newState);
                }
                popup.handlePopupshowing = () => {
                    for(var menuitem of popup.menuitems) this[menuitem.pref]
                        ? menuitem.setAttribute("checked", true)
                        : menuitem.removeAttribute("checked");
                }
                return btn.appendChild(btn.btnPopup = popup);
            },
            obsAdded: false,
            setObserver(set) {this.obsAdded = set
                ? Services.obs.addObserver(this, topic, false)
                : Services.obs.removeObserver(this, topic);
            },
            observe() {
                Services.obs.removeObserver(this, topic);
                this[PREF_ENABLED] = false;
                this.saveSettings();
            }
        }).init();
    }
    parent.register(this);
    addDestructor(reason => parent.unregister(this, reason), parent);

})(`(nsvo => (nsvo["%ID%"] = {
    x: -1, y: -1, down: false,
    handleEvent(e) {e.button || this[e.type](e);},
    mousedown(e) {this.x = e.screenX; this.y = e.screenY, this.down = true;},
    mouseup(e) {
        var {down} = this; this.down = false; if (!down) return;
        if (e.screenX == this.x && e.screenY == this.y && (e.detail == 1 || e.target.matches(
            "textarea[disabled],input[disabled],button,select,summary"
        )))
            return;
        var name = e.originalTarget.nodeName;
        if (/^(?:(?:xul:)?(?:slider|scrollbarbutton)|resizer)$/.test(name))
            return;
        this.x = this.y = -1;
        var win = this.getFocusedWin(e.target.ownerGlobal);
        var sel = win.getSelection();
        if (sel.toString()) {
            (win.docShell || win.document.docShell).doCommand("cmd_copy", null, win);
            this.blinkEnabled && this.blink(win, e.detail > 1);
        }
    },
    blinkEnabled: Boolean(
        Components.classes["@mozilla.org/preferences-service;1"]
            .getService(Components.interfaces.nsIPrefService)
            .getIntPref("%PREF%", 3) & %PREF_BLINK%
    ),
    blink(win, pause) {
        if (pause) return win.setTimeout(() => this.blink(win), 100);
        var sc = (win.docShell || win.document.docShell)
            .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
            .getInterface(Components.interfaces.nsISelectionDisplay)
            .QueryInterface(Components.interfaces.nsISelectionController);
        sc.setDisplaySelection(sc.SELECTION_OFF);
        sc.repaintSelection(sc.SELECTION_NORMAL);
        win.setTimeout(() => {
            sc.setDisplaySelection(sc.SELECTION_ON);
            sc.repaintSelection(sc.SELECTION_NORMAL);
        }, 150);
    },
    getFocusedWin(win) {
        var focusedWin = {};
        var elm = this.fm.getFocusedElementForWindow(win.top, true, focusedWin);
        return focusedWin.value;
    },
    get fm() {
        delete this.fm;
        return this.fm = Components.classes["@mozilla.org/focus-manager;1"]
            .getService(Components.interfaces.nsIFocusManager);
    },
    count: 0,
    init(cfmm) {
        this.count += 1;
        cfmm.addEventListener("mousedown", this);
        cfmm.addEventListener("mouseup", this);
        cfmm.addEventListener("unload", this);
        if (this.count == 1)
            this.cpmm.addMessageListener("%ID%:FromParent", this);
    },
    destroy(cfmm) {
        this.count -= 1;
        cfmm.removeEventListener("mousedown", this);
        cfmm.removeEventListener("mouseup", this);
        cfmm.removeEventListener("unload", this);
        if (!this.count)
            this.cpmm.removeMessageListener("%ID%:FromParent", this);
    },
    receiveMessage(msg) {
        if ("blink" in msg.data) this.blinkEnabled = msg.data.blink;
    },
    unload(e) {this.destroy(e.target);},
    forget: () => delete nsvo["%ID%"]

}).cpmm = this)(%NSVO%);`);

Некоторые кнопки не работают в многопроцессорном режиме, можно их сделать работоспособными?