Подобная тема, как мне кажется, будет актуальна. По аналогии с "Ищу расширение"

Для начала, мой список расширений
Aaapptabs
About startup
Adblock Plus
Add Bookmark Here ²
Add to Search Bar
Addon Update Checker
Addons Manager Hilite
BBCopy
bug582139(Allow bookmarks button in the nav bar)
ColorResults
Context Search RG
Copy HTML
Copy Link Name
Customizations for Adblock Plus
Customize about:newtab
Element Hiding Helper для Adblock Plus
Enjoy Reading
Expire history by days
Extension Options Menu
FindBar Tweak
Flash Video Downloader Youtube Downloader
Go Parent Folder
Google Search by Image
Google/Yandex search link fix
Grab and Drag
GReader Panel
ImageFit
InlineDisposition
InstantFox
KillSpinners
Location Bar Enhancer
More In Content UI
Movable Firefox Button
Mozilla Archive Format
New Tab Tools
NoSquint
Open about:permissons
Organize Search Engines
PDF Viewer
Peek
Personal Menu
Places Maintenance
Pretty Install
ProfileSwitcher
Progress Bar on Tab
Puzzle
Quick Translator
Recognize It
Reload Tab On Double-Click
Restartless App Button Quit
Save File to
Saved Password Editor
Searchbar Autosizer
Secure Login
Send Tab to Device
Set As Bookmarks Toolbar Folder
Show my Password
SmartVideo For YouTube
SortPlaces
Stay-Open Menu
Suspend background tabs
Tab Auto Reload
Tab Scope
tabcopy
TabGroups Menu
Table2Clipboard
Tabs Open Relative (Modified)
TabSubmit
url-addon-bar
Менеджер сессий
absolute load control
App Button Remove
CacheViewer Fx6
Clearly
F6
Flagfox
Foobar
FVD Speed Dial with Online Sync
Google Instant Integration
History Search Sorted
HyperTranslate
Informational Tab (Информативные вкладки)
Java Quick Starter
Lazarus: Form Recovery
MailCatch: Temporary Emails
Mozilla Labs App Runtime
Mozilla Labs: Prospector - AwesomeBar HD
Mozilla Labs: Prospector - Instant Preview
Reload Plus
SelectionSK
Springpad Extension
Super Tab Mode
Tab Mix Lite
Tab Utilities
Tamper Data
Thumbnail Expander
Transmaker
URL Tooltip
User Agent RG
Vaka: Inline Translator (16.06.2012)
WideSearchBar
Yahoo! Axis for Firefox

Очень полезная тема (без иронии).:) Может Tab Mix plus, Tab Utilities выделить в отдельную тему, в виде заявки на создание кнопок для их замены? В связи с особой глючностью или отсутствием поддержки, это наиболее актуально. ИМХО.

Tiger.711

:angel:
Adblock Plus
         
Add-on Compatibility Reporter
       
Clearly
       
CoLT
       
Custom Buttons
       
Edit Bookmark Plus
       
Element Hiding Helper для Adblock Plus
       
Flat Bookmarks
       
Google Reader Watcher
       
leftsidedBookMarkStar
       
Menu Icons Plus
       
Pearl Crescent Page Saver Basic
       
Personal Menu
     
Quick Translator
       
Russian spellchecking dictionary
       
Scriptish
       
Search By Image (by Google)
       
Status-4-Evar

Stylish
       
Text2Link
       
TinyURL Generator
       
Vertical Toolbar
       
Web Search Pro
       
WebMail Notifier

кто-нибудь, расскажите, пожалуйста: а зачем дополнения заменять кнопками CB?
Создателей CB-кнопок не так много (они есть только на этом форуме и наиболее активных из них не более 5-ти человек, насколько я знаю).
Создателей расширений - много больше, а значит и "производственных мощностей" - у расширений больше.
По-моему, заменять расширения кнопки имеет смысл только в 2-ух случаях:
1. расширение заброшено, но само по себе полезное и имеет feature requests/bug reports.
2. расширение-комбайн, предлагает сразу группу функций, а кому-то может хватило бы и только части из них, и такую часть функций не выполняет ни одно другое расширение.

И помните, что КБ-кнопки не обладают теми же возможностями, какими обладают расширения, в силу того, что кнопки загружаются не сразу.

okkamas_knife ,Quick Translator - с учётом  фишек  которые его отличают от других или просто как переводчик?
А у Search By Image (by Google) теперь тоже кнопочка всплывающая появилась - лишний клик не надо делать :)
Bezymyannyj.1341046631.png

По-моему, заменять расширения кнопки имеет смысл только в 2-ух случаях:
1. расширение заброшено, но само по себе полезное и имеет feature requests/bug reports.
2. расширение-комбайн, предлагает сразу группу функций, а кому-то может хватило бы и только части из них, и такую часть функций не выполняет ни одно другое расширение.

iDev.Pi, Можно третий пункт добавить или второй разделить на а) и  б) Функция интересная, полезная, но жаба душит целое расширение ставить когда реализация возможна посредством  кнопки , скрипта, стиля ... :angel:

30-06-2012 13:15:48

все эти фишки возможно реализовать кнопками или скриптами. поэтому и отметил.

okkamas_knife, Ну так подозревал , видя какие чудеса творят кнопки :)

Замена расширений с помощью Custom Buttons,GraseMonkey/Scriptish,стилей и настроек ФФ

А ещё FireGestures/..., жестами ну очень много расширений и CB заменить.

okkamas_knife пишет

Buttons,GraseMonkey\Scriptish,стилей и настроек ФФ

Вообще бы запилить показательную сборочку нафаршированную исключительно  этим всем :angel::angel::angel:

30-06-2012 13:26:15

iDev.Pi пишет

И помните, что КБ-кнопки не обладают теми же возможностями, какими обладают расширения, в силу того, что кнопки загружаются не сразу

Как не сразу :rolleyes: ....:cry:

iDev.Pi пишет

в силу того, что кнопки загружаются не сразу.

Если бы только в силу этого.

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

voqabuhe пишет

А ещё FireGestures/..., жестами ну очень много расширений и CB заменить.

Эсть кнопки которые заменяют FireGestures.

iDev.Pi пишет

кто-нибудь, расскажите, пожалуйста: а зачем дополнения заменять кнопками CB?
Создателей CB-кнопок не так много (они есть только на этом форуме и наиболее активных из них не более 5-ти человек, насколько я знаю).
Создателей расширений - много больше, а значит и "производственных мощностей" - у расширений больше.

А зачем использовать стили для Stylish, userChrome.css и userContent.css если все то что они могут можно сделать дополнениями и если есть особые пожелания то можно попросить создателей чтобы дополнили свои расширения. :) ;)

iDev.Pi пишет

И помните, что КБ-кнопки не обладают теми же возможностями, какими обладают расширения, в силу того, что кнопки загружаются не сразу.

Ни кто при запуске браузера не будет нажимать кнопки, я использую много CB кнопок и у меня с этой задержкой в 0.5-1 секунду проблемы никогда не было.
Вот насчитал 56 кнопок + 4 раширения на портативном Firefox 3.6 и запускаетса он 7-8 секунд, но это не проблема так как я его вклучаю один раз в день после того как приду домой с работы и выклучаю перед сном, куда спешить?
Конечно CB кнопки не все могут но зато у них эсть ряд неоспарымых преимушеств.

ну так кто мешает?

okkamas_knife ,Исключительная дремучесть :blush: .....:dumb: :angel:

okkamas_knife, Так далеко не все желаемые кнопки существуют в природе :angel:

Странно, что тема заглохла. Ведь вопрос по разгрузке [firefox] от ненужных (нужных, но тяжёлых/иногда глючных) расширений актуален и по сей день. Буквально вчера прошёлся по теме готовых кнопок и повыкидывал не менее 10-ти расширений, а заодно и обновил (жаль нет автообновления) некоторые кнопки.

мой список. омг!
[*]Adblock Plus 2.3.2

[*]Add to Search Bar 2.0

[*]Add-on Tools in App Button 1.0.1

[*]Addon Update Checker 2.2

[*]Addon Upgrade Helper 0.1.1

[*]Automatic Save Folder 1.0.4

  • http://asf.mangaheart.org
  • Автоматически выбирает папку для сохранения загружаемого файла по имени или домену.

[*]AutoPager 0.8.0.8

  • http://www.teesoft.info/
  • AutoPager — это расширение для Firefox и Mozilla, автоматически подгружающее страницы в фоновом режиме. А еще его можно использовать как генератор XPath.

[*]AutoProxy 0.4b2.2013051811

[*]BitTorrent WebUI+ 0.2.3.0

[*]Brief 1.6.4

[*]BugMeNot 2.2

  • http://bugmenot.com
  • Bypass compulsory web registration with the context menu via www.bugmenot.com.

[*]Check for Updates in Help Menu 1.1

[*]ColorfulTabs 19.3

[*]Custom Buttons 0.0.5.6

[*]Download Manager Tweak 0.9.8

  • http://dmextension.mozdev.org/
  • Позволяет открывать менеджер загрузок во вкладке или боковой панели и немного изменяет его внешний вид.

[*]Download status 1.7.3

[*]Download Statusbar 0.9.10

  • http://downloadstatusbarapp.com
  • Просмотр и управление загрузкой файлов при помощи компактной панели над строкой состояния

[*]DownThemAll! 2.0.16

[*]Element Hiding Helper для Adblock Plus 1.2.3

  • http://adblockplus.org/ru/elemhidehelper
  • Помогает при создании правил скрытия для Adblock Plus, эффективное средство борьбы с текстовой рекламой.

[*]Extended Statusbar 1.5.8

[*]Extension List Dumper 1.15.2

[*]Fast Dial 4.6

[*]FaviconizeTab 1.0.6

[*]File Title 1.4

[*]FindBar Tweak 1.3

[*]Flashblock 1.5.17

  • http://flashblock.mozdev.org/
  • Заменяет Flash-объекты на кнопку, нажав которую вы сможете просмотреть их.

[*]FlashGot 1.5.5.5

  • http://flashgot.net
  • Позволяет закачивать все или только выбранные файлы при помощи наиболее популярных менеджеров закачки для Windows, Mac OS X, Linux и FreeBSD (см. полный список на домашней странице расширения). FlashGot также может собирать галереи мультимедиа на одной странице для быстрой и удобной закачки.

[*]Form History Control 1.3.1.0

  • http://www.formhistory.blogspot.com
  • Управление записями истории форм (просмотр, редактирование, удаление, экспорт/импорт)

[*]forum.ru-board bookmarks checker 0.1

[*]Gismeteo 5.0.0.6

[*]Go Parent Folder 2.7

[*]Greasemonkey 1.10

[*]How Many Times Can I Back? 0.2.2011012001

[*]HP Detect 1.0.24.1

[*]HTTPS-Everywhere 3.4.1

[*]JSONView 0.7

  • http://jsonview.com/
  • Просмотр документов в формате JSON прямо в браузере.

[*]KeeFox 1.2.3

  • http://keefox.org
  • Простое и защищённое управление паролями. Автоматическая авторизация, никогда не забывает ни один из паролей, не теряет контроля над ними и увеличивает их защищённость. Использует всемирно известный KeePass Password Safe.

[*]keyconfig 20110522

[*]KOLOBOK Smiles 1.12

[*]Link Alert 1.0.2

[*]Link Properties Plus 1.5.2

[*]Listen Trackers 2.1

  • http://litr.cc/
  • Быстрая подписка на обновления для Listen Trackers (litr.cc). Работает с rutracker.org, free-torrents.org, tapochek.net и другие. Полный список поддерживаемых трекров можно посомтреть на litr.cc

[*]lmnpop 20120518

[*]Load Tabs Progressively 1.6.1

[*]Locationbar² 1.0.6

[*]LogMeIn, Inc. Remote Access Plugin 1.0.0.1024
[*]lolifox - Fierr MOD 1.0.7.0

[*]MinimizeToTray revived (MinTrayR) 1.1.2

[*]MouseZoom 0.4.9

[*]Mozilla Labs: Prospector - Find Suggest 5

[*]MozRepl 1.1.2

[*]Muter 1.0.3

[*]NoScript 2.6.7.1

  • http://noscript.net
  • Экстра защита для Firefox: С помощью NoScript вы сможете разрешать исполнение JavaScript, Java (и других плагинов) только для доменов, установленных вами (например, ваш веб-сайт). Белый список, базирующийся на принципе упреждающего блокирования, позволяет предотвратить использование уязвимостей (известных и ещё не известных!) без потери функциональности… Эксперты соглашаются: Firefox действительно безопаснее с NoScript :-)

[*]NoSquint 2.1.6

[*]oldbar 1.2

[*]OpenDownload² 3.4.2

[*]Organize Search Engines 1.7

[*]Organize Status Bar 0.6.5

[*]Page Hacker 1.2

[*]PassIFox 1.1.5

[*]Personal Titlebar 1.0.20111112

[*]Preferences Cleaner 0.3.2

[*]Preserve Download Modification Timestamp 2011.03.21.22

[*]ProfileSwitcher 1.5.0.4

[*]Reload Plus 4.1.5

[*]Ru-Board Navigation 2011.11.15u

[*]Russian/English spell dictionary 1.0.0.1

  • Russian/English (ru-en) spellchecking dictionary

[*]Rutracker.Org Addons 3.1

[*]ScrapBook 1.5.5

[*]Scroll Highlight 0.4

[*]Scroll Search Engines 1.0.3

[*]Scroll Up Folder 4.2.6

[*]Search on Engine Change 1.2

[*]SearchWP 2.6.2

[*]Session Manager Export Tool 0.2

[*]Status-4-Evar 2012.11.11.16b

[*]Stylish 1.3.2

  • http://userstyles.org/
  • Преобрази интернет вместе со Stylish - менеджером пользовательских стилей.

[*]Tab Scope 1.1.7

  • http://www.xuldev.org/tabscope/
  • Предварительный просмотр вкладок и навигация по веб-страницам с помощью всплывающих окон.

[*]Tab Utilities 1.2

[*]TabGroups Menu 0.9.1

[*]UnMHT 6.2.11

  • http://www.unmht.org/unmht/en_index.html
  • UnMHT умеет открывать веб-архивы формата MHT (MHTML), а также сохранять веб-страницы полностью в один-единственный MHT-файл.

[*]Update Scanner 3.1.12

[*]Vacuum Places Improved 1.2

[*]VkOpt 2.2.0.130813

  • http://vkopt.net/
  • Добавление множества функций для сайта ВКонтакте.ру

[*]XHTML Mobile Profile 0.5.4

[*]µTorrent Status 1.0

[*]Менеджер сессий 0.8.0.8

  • http://sessionmanager.mozdev.org/
  • Функциональный менеджер сессий. Сохраняет и восстанавливает состояние всех окон.

[*]Яндекс.Бар 6.9.1

  • http://bar.yandex.ru
  • Быстрый доступ ко всем возможностям Яндекса


По причине нестабильности некоторых старых расширений на новом [firefox] или новых, но конфликтующих между собой, всё ещё сижу на [firefox] 16.0.2:(

>ORG@niZM<
По мне например FaviconizeTab 1.0.6 можно просто заменить на

.tabbrowser-tab {-moz-appearance: none !important;
max-width: 200px !important;
min-width: 10px !important;
}

ширина вкладок будет уменьшаться в зависимости от их количества.

villa7
спасибо, взял в коллекцию, но это не совсем то действие, которое выполняет указанное расширение, а именно уменьшение иконки всегда для определенного сайта/домена. Можно, конечно, ручками подогнать вышеуказанный стиль (я его в Stylish упихал) под нужный домен, но это немного муторно. Расширение даёт возможность это сделать буквально в два клика.

>ORG@niZM< пишет

Странно, что тема заглохла.
мой список

И что дальше? Хотел то чего? Заменить адблок кнопкой?

Есть тема мои расширения.

Pony_Smile_Pack пишет

Хотел то чего?

Того же, что и другие в этой теме. Не понятно?! Читаем название темы. А список приведён общий.

22-08-2013 14:05:57
Беда, поиск врёт или Вы?

>ORG@niZM< пишет

Беда, поиск врёт или Вы?

Список ваших расширений | Форум Mozilla Россия

>ORG@niZM< пишет

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

как вам сказать список что надо =) ни у кого терпения не хватит, тем более что там и тут вам нужно немного другое.
К примеру Stylish так не нужен вообще, он для отладки стилей хорош. Все можно распихать в Userchrome и Usercontent вообще без расширений.
Уже 2 бара вижу яндекс контакт, так смотрю, может там у вас вообще полэкрана на страницу =) А ведь они состоят из кнопок-ссылок, закладок ну и более полезных расширений как Xnotifer.
ну парочка бросившихся мне в глаза.
[CB]Context Search
Simple Session Manager(Простой менеджер сессий)
Потому просто советую самому просмотреть кнопки, каждую будет быстрее чем ваш список шуровать.
Сustom Buttons
Готовые кнопки для Custom Buttons

feas
спасибо, что откликнулись, но я как бы уже

>ORG@niZM< пишет

Буквально вчера прошёлся по теме готовых кнопок и повыкидывал не менее 10-ти расширений, а заодно и обновил (жаль нет автообновления) некоторые кнопки

22-08-2013 14:28:56

feas пишет

Xnotifer

у меня не завёлся нормально. Именно его хотел на замену кучи кнопок от Я.Б
А Context Search X отключено и заменено кнопкой, точнее код её положен в одну из кнопок.

Да, уберу из списка отключенные расширения.

А выглядит FF у меня так
6w8l.png

>ORG@niZM< пишет

Xnotifer
у меня не завёлся нормально. Именно его хотел на замену кучи кнопок от Я.Б

Там надо прописать адреса.
А лучше перенаправить все почты на одну.

Блокировщик Google Analytics 0.9.6 - подписки в адблоке на приватность и антисчетчик.
Кстати зачем вам статус торрентов аж 2-х в браузере?
Vacuum Places Improved 1.2 №21
Toggle Find Bar 0.1.1 [CB]Toggle Find+3
Tab Utilities 1.2 - стили и about config
RSS иконка в строке адреса 1.3 [CB]Feed-button в адресной стоке
NoSquint 2.1.6 [CB]Изменить масштаб + №57
MouseZoom 0.4.9 зажать CTRL и крути
Load Control 0.3 [CB]Остановить загрузку всех вкладок [CB]Автоматически перезагружать вкладку
Linkification 1.3.9 №154
Gismeteo 5.0.0.6 очень стремный погодник, вот нормальный http://rp5.ru/5483/ru
Flashgot и Vidеo Downloadhelper - делают одно и тоже
Flashblock 1.5.17 встроено
248ab1b633cf.png
feedly 16.0.528 и Brief не одно и тоже
Extension List Dumper 1.15.2 №84
Extended Statusbar 1.5.8 и Statua4ever ????
у вас целый набор расширений на загрузку, мне даже не ясно что там за чудоюдо.
Ну остальные не знаю.

22-08-2013 14:55:03

Pony_Smile_Pack пишет

Там надо прописать адреса.
А лучше перенаправить все почты на одну.

не адреса а скрипты поставить ну тут их ок 160 чтоли. Там не только почты =) да и их можно отдельно иконки ставить -  в таком ящике столько в таком столько итд...

Pony_Smile_Pack
лично для меня это не вариант со сбором всего в одно.
А Xnotifier - т.е. все? Нафига мне йаху и прочее, если я мне нужны несколько. Удалил лишние серверы/сервисы, оставил нужный (для проверки работоспособности заполнил gmail) - народная индейская изба ввиде явно некорректного поведения (ну, не думал, что понадобится скрины делать, поэтому ничего не покажу:P). Да и это пока не важно - надо будет, разберусь.
Вот правильная позиция:

okkamas_knife пишет

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

К ней и стремлюсь.

>ORG@niZM< пишет

Нафига мне йаху и прочее, если я мне нужны несколько.

Именно под йаху он и затачивается.

feas пишет

Кстати зачем вам статус торрентов аж 2-х в браузере?

один под utorrent, второй под transmission, да и функции они разные немного выполняют (в чём-то сходятся, а в чём-то и дополняют друг-друга)

>ORG@niZM< пишет

оставил нужный (для проверки работоспособности заполнил gmail)

там яндекс, там контакт, смотрите, ищите =)  скрипты поставить ну тут их ок 160 чтоли

22-08-2013 15:08:21
А яндекс бар зачем, левый тулбар контакта, бредовый гисметео и гисметеобюро, где решить не могут что завтра снег или жара?

feas
на текущий момент от Я.Б остались часики )), кнопки соц.сетей (VK, ОК, FB, Twitter) и три кнопки почты и кнопка для слежения за файлами на Народе (не предлагать перезалить на Я.Д!)

22-08-2013 15:18:23

feas пишет

бредовый гисметео и гисметеобюро, где решить не могут что завтра снег или жара?

хм, для своего города не замечал

>ORG@niZM< пишет

для своего города не замечал

http://rp5.ru/%D0%9F%D0%BE%D0%B3%D0%BE% … 0%B8%D0%B8

>ORG@niZM< пишет

от Я.Б остались часики ))

справа снизу =))))))))

>ORG@niZM< пишет

кнопки соц.сетей (VK, ОК, FB, Twitter) три кнопки почты

закладки,xnotifer все?

>ORG@niZM< пишет

и кнопка для слежения за файлами на Народе

а он ещё существует, вроде бы им... каюк не? теперь яндекс предлагает скачать либо через клиент диска либо на скорости 10Кб - куча ора мата уже что никто скачать не может, лучше перезалейте на дропбокс или rghost.

>ORG@niZM< пишет

кнопка для слежения за файлами на Народе

Должно сообщать на почту и так. Галочку поставить только.

feas пишет

Vacuum Places Improved 1.2 №21

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

feas пишет

Toggle Find Bar 0.1.1 [CB]Toggle Find+3

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

feas пишет

Tab Utilities 1.2 - стили и about config

склоняюсь таки к https://forum.mozilla-russia.org/viewtopic.php?id=52227

feas пишет

[CB]Изменить масштаб + №57

с натяжкой, но принимается

feas пишет

MouseZoom 0.4.9 зажать CTRL и крути

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

feas пишет

[CB]Остановить загрузку всех вкладок [CB]Автоматически перезагружать вкладку

принято, спасибо.

feas пишет

Flashblock 1.5.17 встроено

но такой способ не поддерживает белые списки. или ...?

feas пишет

feedly 16.0.528 и Brief не одно и тоже

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

feas пишет

Extension List Dumper 1.15.2 и №84

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

feas пишет

Extended Statusbar 1.5.8 и Statua4ever

дополняют друг друга

feas пишет

RSS иконка в строке адреса 1.3 [CB]Feed-button в адресной стоке

вообще-то было отключено, можно было не обращать внимание ))

feas пишет

Linkification 1.3.9 №154

расширение было отключено, а кнопка по мне так через раз работает, однако взял её ещё до обращения в эту тему


feas пишет

закладки,xnotifer все?

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

feas пишет

http://rp5.ru/%D0%9F%D0%BE%D0%B3%D0%BE% … 0%B8%D0%B8

имел ввиду, что не замечал корявости прогнозов для своего города
к тому же поиском не обнаружил готовой кнопки для rp5

22-08-2013 21:56:08

feas пишет

подписки в адблоке на приватность

немного не понял, какая это подписка. у меня используются Ruadlist+Easylist, BitBlock (иногда отключаю) и Counters - других на сайте не обнаружил

>ORG@niZM< пишет

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

все просто №3 и любая закладка становится кнопкой (в новой вкладке тут)
аналогично кнопка меню закладок №6
и с подкаталогами №24

>ORG@niZM<
Add Bookmark Here ² 17.0.20121128

Выделить код

Код:

// Двойным левым кликом на папке закладок добавлять закладку в папку закладок ...................................
addEventListener("dblclick", function(e) {      
   var target = e.originalTarget;
              
   if ( e.button !== 0 || !target._placesNode || !PlacesUtils.nodeIsFolder( target._placesNode ) ) return;          
        var docTitle = ( content.document.title || gBrowser.mCurrentTab.label).substr(0, 50);
        var folderId = PlacesUtils.getConcreteItemId( target._placesNode );
        var currentURI = Services.io.newURI( content.location, null, null );
        PlacesUtils.bookmarks.insertBookmark( folderId, currentURI, 0, docTitle );  

        // всплывающая подсказка ....
        var folderTitle = PlacesUtils.bookmarks.getItemTitle( folderId );
        var favicon = ( !!gBrowser.mCurrentTab.image ) ? gBrowser.mCurrentTab.image : "chrome://global/skin/icons/Portrait.png";
        var alertsService = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);
        alertsService.showAlertNotification( favicon, "Добавил в папку " + folderTitle + ":", docTitle, false, "", null, ""); 
}, false, window );
>ORG@niZM< пишет

немного не понял, какая это подписка. у меня используются Ruadlist+Easylist, BitBlock (иногда отключаю) и Counters (как раз антисчетчик, мое прим.) - других на сайте не обнаружил

настройки фильтров, добавить подписку - добавить другие подписки

feas пишет

все просто №3 и любая закладка становится кнопкой (в новой вкладке тут)

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

>ORG@niZM<
Addon Update Checker 2.2
[CB]Check for Addons Updates

>ORG@niZM< пишет

без отображения

№91 с помощью её вытащите иконку и отредактируйте кнопку. :)

22-08-2013 22:27:18

>ORG@niZM< пишет

без отображения хотя бы температуры

№146

>ORG@niZM<
Tab View: number of groups 1.2
Расширение функций кнопки "Группы вкладок"(Firefox)

bunda1 пишет

Add Bookmark Here

забрал, спасибо. Минус 1.

bunda1 пишет

[CB]Check for Addons Updates

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

feas пишет

№146

так мы же про rp5 говорили;)

22-08-2013 22:43:33

bunda1 пишет

Расширение функций кнопки "Группы вкладок"(Firefox)

да, оказывается код с позавчера лежит в кнопке, а расширение удалить забыл. Минус одно!

22-08-2013 22:53:44

feas пишет

№91

кстати в коллекции с недавних пор, но редко пользовался. пересмотрел её функции и выкинул abduction

>ORG@niZM< пишет

так мы же про rp5 говорили;)

Хочешь знать почему я не люблю гисметео яндеска майловые погодники.
1) иконка с текущей погодкой считаю бредом ибо окно или коллеги как правило рядом.
2) В подобных службах например указана иконка дождя и говорят дождь, на деле вероятность в 10% и в 95% у них абсолютно одинакова. Для тебя одинакова вероятность когда 2-3 минуты покапает, даже не поморосит и когда реки на улицах к примеру?
3) потратив 10-20 сек я знаю погоду на неделю (довольно точную), сколько у вас уйдет времени?

feas
не буду спорить ;)

VT + почему-то не дружит с моим советом хотя расширение работает без проблем Vertical Toolbar
:::: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:26.0) Gecko/20100101 Firefox/26.0
Столбик просто упорно не видит панель закладок особенно после перезапуска.

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

>ORG@niZM< пишет

кстати, может в курсе, как разместить VT справа, а не слева?

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

>ORG@niZM<
Можно и справа и слева и обе вместе.
http://forum.mozilla-russia.org/viewtopic.php?pid=611514#p611514

villa7
спасибо, ведь хотел проштудировать эту тему, да времени пока не нашлось.

Замена расширения  Add-ons Manager Context Menu с некоторыми изменениями (положить в инициализацию)
Источники:
1. Add-ons Manager Context Menu
2. AddonsPage  от ywzhaiqi
3. Добавить в контекстное меню расширений "Открыть папку расширения"  от bunda1

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

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

Выделить код

Код:

//Добавление в меню расширений дополнительных пунктов
(function(){
    var iconURL = null;  
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    Cu.import("resource://gre/modules/Services.jsm");
    Cu.import("resource://gre/modules/AddonManager.jsm");
    Cu.import("resource://gre/modules/XPIProvider.jsm");

    const usoRegx = /^https?:\/\/userscripts.org\/scripts\/source\/\d+.\w+.js$/;

    window.AMD_Helper = {
        init: function(){
            document.addEventListener("DOMContentLoaded", this, false);
            this.addHomePageForScriptish();
        },

        handleEvent: function(event){
            switch(event.type){
                case "DOMContentLoaded":
                   var doc = event.target;
                    var win = doc.defaultView;
                    if (["about:addons","chrome://mozapps/content/extensions/extensions.xul"].indexOf(doc.URL) == -1)
                        return;
                    this.addPopupMenu(doc);

                    win.AMD_Helper = AMD_Helper;
                    this.win = win;

                    var observer = new MutationObserver(function(e) {
                        e = e[e.length-1];
                        if(e.attributeName == "loading") {
                            var doc = e.target.ownerDocument;
                        }
                    });
                    observer.observe(doc.getElementById("detail-view"), {attributes: true});
                    break;
                    case "popupshowing":
                    this.getAddon(this.win.document.popupNode.value,
                                  this.setItemsAttributes,
                                  event);
                    break;
            }
        },
        addHomePageForScriptish: function(){
            if(!window.Scriptish_config) return;
            Scriptish_config.scripts.forEach(function(script){
                if(!script.homepageURL && script.updateURL){
                    if(usoRegx.test(script.updateURL)){
                        script.homepageURL = script.updateURL.replace(/source/, "show").replace(/.\w+.js$/, "");
                    }
                }
            });
        },
   
       //Создаем меню
       addPopupMenu: function(doc){

         var mainicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAB3RJTUUH1wcREBAg9OD7NAAAAAlwSFlzAAAewQAAHsEBw2lUUwAAAARnQU1BAACxjwv8YQUAAAH6SURBVHjaxVNBaxNBFP4mGRNp06bSaGu9qXhRLOSQX6Dg0d48SMWC4Mmbv8AfYA7Sgp6UgteCF29CKahBsKKWglgam4rRxGxiks3u7Mz6zZIlSVHRk7N8vLcz7/vemzczwP8eorSCgtLJJeXpUGtMBQHgK5RptxbuYJUx5o8CL5bx+OzCkyuZ2cLIwtPihbVW9a1GiCyFQyusFD4S2zfv4x5DtI2TAphOZk8zbXFE4NKt5ctInDmY8OLd6zNrtI+IlhURG0Xs55dezZXXF9Gq7CA9NQvNbAH19W/wo+6gWXeaN1aQkybEXLv2Bb36Z+SvfUAynYLgB9Y+GLEv6Sl4HTdcvX0yy4kZqdkit1nFWC4Pme4ydvMXxNiOwwTfIVP5OCBlK0Cv8Y4C5xnXYM+bB0ixTwjWHwpUdzbh+ijZSWlYQefrcxwrLJJcIZxRAWM33qP1KTCOwJ9ErbyLno8trvqRgOrsITV5ik6pT2IXvbZdINmjVr8CmYMx09h7/8wKMBtUtIWgu4/DE8e5lxob4pLsDkhhvxJrjYfE2Am065/Et1ZUQRAJTBxJIDQJZrgKZDiRwYA03AlxCF1Ho92oYGM7ElCS5/qmVjXzLx+cg71tMex5D/8Pw+ng4etd2GYpER0ucJRI26v9l2/Ivg82CI2YIP+BPCyifwI91AzKs/qQkQAAAABJRU5ErkJggg==";
         var mainicon1="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/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=";
         var mainicon2="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAAwAAAP8AAAD/AAAA/wAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAAAAAAD/AAAA/wAAAP8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPAAAAAAAAAA/wAAAP8AAAD/AAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAAAAAAP8AAAD/AAAA/wAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAAAAAAD/AAAA/wAAAP8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPAAAAAAAAAA8wAAAP8AAAD/AAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAAAAAAPAAAAD/AAAA/wAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPAAAAAAAAAAAAAAAHsAAAD/AAAAkAAAAAAAAADwAAAA/wAAAP8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAAAAAAIQAAAD/AAAAjQAAAAAAAAB1AAAA/wAAAP8AAAD/AAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAIoAAAD/AAAAigAAAAAAAABpAAAAAAAAAAAAAAB7AAAA/wAAAIcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAigAAAAAAAAB7AAAA8AAAAAAAAACEAAAA/wAAAIcAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAACBAAAA/wAAAPAAAACKAAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIQAAAAAAAAAAAAAAAAAAAAAAB8AAAAfAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAxAAAAIgAAAAWAAAAJEAAAEDAAD+BwAA+A8AAA==";
            
            var ins = doc.getElementById("menuitem_uninstallItem");
            if(!ins) return;
             ins = ins.nextSibling;
            var popup = ins.parentNode;
            var menuitem = $C("menuseparator", {
                id: "AMD-separator-1"
            });
            popup.insertBefore(menuitem, ins);

            menuitem = $C("menuitem", {
                id: "AMD-browse-dir",
                class: "menu-iconic",
                image: mainicon,
                label: "Место установки",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.browseDir);"
            });
            popup.insertBefore(menuitem, ins);
           
            menuitem = $C("menuitem", {
                id: "AMD-browse-Folder",
                class: "menu-iconic",
                image: mainicon1,
                label: "Папка установки",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.Folder);"
            });
            popup.insertBefore(menuitem, ins);
           
            menuitem = $C("menuitem", {
                id: "AMD-browse-goHome",
                label: "Домашняя страница",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.goHome);"
            });
           popup.insertBefore(menuitem, ins); 
             
           menuitem = $C("menuitem", {
                id: "AMD-browse-goAMO",
                label: "Страница на AMO",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.goAMO);"
            });
           popup.insertBefore(menuitem, ins); 
          
           menuitem = $C("menuitem", {
                id: "AMD-browse-support",
                label: "Страница поддержки",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.support);"
            });    
           popup.insertBefore(menuitem, ins);
         
            var menu = $C("menu", {
                id: "AMD-menu",
                class: "menu-iconic",
                image: mainicon2,
                label: "Копировать",
            });
            popup.insertBefore(menu, ins);
            var menuPopup = $C("menupopup", {
                id: "AMD-menupopup",
            });
            menu.appendChild(menuPopup);
            
            menuitem = $C("menuitem", {
                id: "AMD-copy-name",
                label: "Копировать имя",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.copyName);"
            });
            menuPopup.appendChild(menuitem);

             menuitem = $C("menuitem", {
                id: "AMD-copy-version",
                label: "Копировать версию",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.copyVersion);"
            });
            menuPopup.appendChild(menuitem);
            
            menuitem = $C("menuitem", {
                id: "AMD-copy-NameVersion",
                label: "Копировать имя и версию",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.copyNameVersion);"
            });
            menuPopup.appendChild(menuitem);
           
            menuitem = $C("menuitem", {
                id: "AMD-copy-id",
                label: "Копировать id",
                oncommand: "AMD_Helper.getAddon(AMD_Helper.getPopupNode(this).value, AMD_Helper.copyID);"
            });
            menuPopup.appendChild(menuitem);
            
            menuitem = $C("menuitem", {
                id: "AMD-go-uso",
                class: "greasemonkey",
                hidden: true,
                label: "Страница на Userscripts.org",
                oncommand: "openURL(this.tooltipText);"
            });
            popup.appendChild(menuitem);

            menuitem = $C("menuitem", {
                id: "AMD-find-uso",
                class: "greasemonkey",
                hidden: true,
                label: "Поиск по Userscripts.org",
                oncommand: "openURL(this.getAttribute('find-on-uso'));"
            });
            popup.appendChild(menuitem);
            
            popup.addEventListener("popupshowing", this, true);
        },

        //Указываем где и когда показывать элементы меню
            setItemsAttributes: function(aAddon, event){
            var popup = event.target;
            var doc = popup.ownerDocument;

            var isExtension = (aAddon.type == "extension");
            var isTheme = (aAddon.type == "theme");
            var isPlugin = (aAddon.type == "plugin");
            var isUserStyle = (aAddon.type == "userstyle");
            var isScriptish = (aAddon.type == "userscript");
            var isUserScript = (aAddon.type == "user-script") || // Greasemonkey
                               (aAddon.type == "userscript") ||  // Scriptish
                               (aAddon.type == "greasemonkey-user-script"); // Greasemonkey 1.7+
            var isCustomButton = (aAddon.type == "custombuttons");
            var isService = (aAddon.type == "service");
            
            var browseDirItem = doc.getElementById("AMD-browse-dir");
            browseDirItem.hidden = isUserStyle || isUserScript || isCustomButton || isService;

            var browseFolderItem = doc.getElementById("AMD-browse-Folder");
            browseFolderItem.hidden = isUserStyle || isUserScript || isCustomButton || isPlugin || isService;
            
            var copyNameItem = doc.getElementById("AMD-copy-name");
            copyNameItem.tooltipText = aAddon.name;
            copyNameItem.className = isUserScript
                                    ? isScriptish
                                      ? ""
                                      : "greasemonkey"
                                    : "";
                                    
            var copyNameVersionItem = doc.getElementById("AMD-copy-NameVersion");
            copyNameVersionItem.hidden = isUserStyle || isCustomButton || isService;
            copyNameVersionItem.tooltipText = aAddon.name + " " + aAddon.version;
            copyNameVersionItem.className = isUserScript
                                    ? isScriptish
                                      ? ""
                                      : "greasemonkey"
                                    : "";
                                    
            var copyIDItem = doc.getElementById("AMD-copy-id");
            copyIDItem.tooltipText = "ID: " + aAddon.id;
            copyIDItem.className = isUserScript
                                    ? isScriptish
                                      ? ""
                                      : "greasemonkey"
                                    : "";
            
             var copyVersionItem = doc.getElementById("AMD-copy-version");
             copyVersionItem.tooltipText = aAddon.version;
             copyVersionItem.hidden = isUserStyle || isCustomButton || isService;
             copyVersionItem.className = isUserScript
                                    ? isScriptish
                                      ? ""
                                      : "greasemonkey"
                                    : "";
                                    
            var opengoAMOItem = doc.getElementById("AMD-browse-goAMO");
            opengoAMOItem.hidden = isUserStyle || isUserScript || isCustomButton || isPlugin || isService;
            var amoURL = aAddon.reviewURL
                 ? aAddon.reviewURL.replace(/\/reviews\//, "/")
                 : null;
            opengoAMOItem.tooltipText = amoURL;
            opengoAMOItem.hidden = !amoURL || /addons.mozilla.org/.test(aAddon.homepageURL);
            
            var opengoHomeItem = doc.getElementById("AMD-browse-goHome");
            opengoHomeItem.hidden = isUserScript || isCustomButton || isPlugin;
               if (aAddon.homepageURL) {
                   opengoHomeItem.tooltipText = aAddon.homepageURL;
                   } else if (aAddon.reviewURL) {
                    opengoHomeItem.tooltipText = amoURL;
                   }
           opengoHomeItem.hidden = !(aAddon.homepageURL || aAddon.reviewURL);

           var opensupportItem = doc.getElementById("AMD-browse-support");
           opensupportItem.hidden = isUserStyle || isUserScript || isCustomButton || isPlugin || isService;
           opensupportItem.tooltipText = aAddon.supportURL;
           opensupportItem.hidden = !aAddon.supportURL;

            if(isUserScript && !isScriptish){
                var usoURL = "";
                if (aAddon._script) {
                    var usDownloadURL = aAddon._script._downloadURL;
                    var usUpdateURL = aAddon._script._updateURL;
                    if (usoRegx.test(usDownloadURL)) {
                        usoURL = usDownloadURL;
                    } else if (usoRegx.test(usUpdateURL)) {
                        usoURL = usUpdateURL;
                    }
                }

                var usoItem = doc.getElementById("AMD-go-uso");
                usoItem.disabled = !usoRegx.test(usoURL);
                usoItem.className = isUserScript ? usoItem.disabled ? "" : "greasemonkey" : "";
                usoItem.tooltipText = usoURL.replace(/source/, "show")
                    .replace(/.\w+.js$/, "");

                var fusoItem = doc.getElementById("AMD-find-uso");
                fusoItem.disabled = usoRegx.test(usoURL);
                fusoItem.className = isUserScript ? fusoItem.disabled ? "" : "greasemonkey" : "";
                fusoItem.setAttribute("find-on-uso",
                    "http://userscripts.org/scripts/search?q=" +
                    encodeURIComponent(aAddon.name));
            }
        },

        getPopupNode: function (aNode) {
            var doc = aNode.ownerDocument;
            return "triggerNode" in aNode.parentNode ? aNode.parentNode.triggerNode : doc.popupNode;
        },
        getAddon: function (aId, aCallback, aEvent) {
            var self = this;

            if (this.win.gDetailView._addon) {
                aCallback.apply(this, [this.win.gDetailView._addon, aEvent]);
                return;
            }

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

    //Домашняя страница
     goHome: function (aAddon) {
        var url = aAddon.homepageURL;
        if (!url) {
        if (aAddon.reviewURL) {
        url = aAddon.reviewURL.replace(/\/reviews\/.*$/, "/");
        } else {
        url = "https://addons.mozilla.org/search/?q="
            + encodeURIComponent(aAddon.name);
         }
        }
       openURL(url);
       },
   //Страница на АМО
   
   goAMO: function (aAddon) {
        var sourceTracker = "/?src=external-Add-ons_Manager_Context_Menu-extension";
    if (aAddon.reviewURL) {
      var amoURL = aAddon.reviewURL.replace(/\/reviews\//, "/")
                             .replace(/\/(firefox|seamonkey|thunderbird|android)/, "")
                             .replace(/\/\?src\=api/, sourceTracker);
    }
    if (/personas.mozilla.org$/.test(aAddon.id)) {
      amoURL = "https://addons.mozilla.org/addon/" + aAddon.id.match(/\d+/) + sourceTracker;
      }
       openURL(amoURL);
       },
       
   //Страница поддержки
    support: function (aAddon) {
       openURL(aAddon.supportURL);
       },
     
    //Открыть место установки   
    browseDir: function (aAddon) {
            switch(aAddon.type){
                case "plugin":
                    var pathes = aAddon.pluginFullpath;
                    for (var i = 0; i < pathes.length; i++) {
                        this.revealPath(pathes[i]);
                    }
                    return;
                 }
            var gecko = parseInt(Services.appinfo.platformVersion);
            var nsLocalFile = Components.Constructor("@mozilla.org/file/local;1", (gecko >= 14) ? "nsIFile" : "nsILocalFile",
                "initWithPath");
            var dir = Services.dirsvc.get("ProfD", Ci.nsIFile);
            dir.append("extensions");
            dir.append(aAddon.id);
            var fileOrDir = dir.path + (dir.exists() ? "" : ".xpi");
            try {
                (new nsLocalFile(fileOrDir)).reveal();
            } catch (ex) {
                var addonDir = /.xpi$/.test(fileOrDir) ? dir.parent : dir;
                try {
                    if (addonDir.exists()) {
                        addonDir.launch();
                      }
                } catch (ex) {
                    var uri = Services.io.newFileURI(addonDir);
                    var protSvc = Cc["@mozilla.org/uriloader/external-protocol-service;1"].
                    getService(Ci.nsIExternalProtocolService);
                    protSvc.loadUrl(uri);
                }
            }
        },
    //Открыть папку установки    
    Folder: function (aAddon) {
            var gecko = parseInt(Services.appinfo.platformVersion);
            var nsLocalFile = Components.Constructor("@mozilla.org/file/local;1", (gecko >= 14) ? "nsIFile" : "nsILocalFile",
                "initWithPath");
            var dir = Services.dirsvc.get("ProfD", Ci.nsIFile); 
                        dir.append('extensions');
                        dir.append(aAddon.id);
                            if ( dir.exists() ) dir.launch();
 
                            var file = Components.classes['@mozilla.org/file/directory_service;1']
                                      .getService(Components.interfaces.nsIProperties)
                                     .get('ProfD', Components.interfaces.nsILocalFile);       
                            file.append('extensions');
                            file.append( aAddon.id + '.xpi' )             
                            if ( file.exists() ) file.launch(); 
                            return;
          },
    //Копировать имя     
    copyName: function (aAddon) {
            this.copyToClipboard(aAddon.name);
        },
    //Копировать ID 
    copyID: function (aAddon) {
            this.copyToClipboard("ID: " + aAddon.id);
        },
    //Копировать версию 
    copyVersion: function (aAddon) {
            this.copyToClipboard(aAddon.version);
        },
    //Копировать имя и версию
    copyNameVersion: function (aAddon) {
           this.copyToClipboard(aAddon.name + " " + aAddon.version);
        },
 
     //Вспомогательные функции
       revealPath: function(path){
            var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
            file.initWithPath(path);
            if(file.exists())
                file.reveal();
        },
        copyToClipboard: function (aString) {
            Cc["@mozilla.org/widget/clipboardhelper;1"].
                getService(Ci.nsIClipboardHelper).copyString(aString);
        }
    };

     AMD_Helper.init();
     function $C(name, attr) {
        var el = document.createElement(name);
       if (attr) Object.keys(attr).forEach(function(n) el.setAttribute(n, attr[n]));
        return el;
    }
   
})();

Andrey_Krropotkin
что-то не хотит работать. Клал и в спец.кнопку для подобного, и в другую - не появляются пункты меню. Код от bunda1 прекрасно пашет в отдельности.

>ORG@niZM< пишет

что-то не хотит работать. Клал и в спец.кнопку для подобного, и в другую - не появляются пункты меню.

Всё работает, отличная кнопка.  Може ты просто мало на"клал"? :)

voqabuhe
ну, уж точно не "ложил"

>ORG@niZM<
Вроде всё работает, на вкладке дополнений.
91cb61fda5bbt.jpg

А нет такой кнопки, которая заменяет расширение Add To Search Bar? :angel:

Northtech пишет

А нет такой кнопки, которая заменяет расширение Add To Search Bar?

Оно и так restartless, зачем его заменять.

Pony_Smile_Pack пишет

Оно и так restartless, зачем его заменять.

А зачем заменять кнопками другие расширения? Вот для того же самого.
Если бы я поставил столько расширений, сколько кнопок, то браузер бы шевелился не сильно весело.
Да и потребляют кнопки явно меньше ресурсов, чем расширения.
Для себя же я стараюсь заменить некоторые расширения (в основном небольшие и не блещущие функциональностью) на кнопки или скрипты для стайлиша.
Мне так удобно. Вот и всё.

villa7 пишет

Вроде всё работает, на вкладке дополнений.

Работает только на 24.*/25.* (ESR). На моём 17.0.10 ESR не пашет. Проверено на свежем профиле.
Вообще у меня много кода для инициализации, который отвалился в крайних версиях. Пока штудирую тему обсуждения CB на наличие исправлений (не весь код доступен в готовых кнопках). Как дочитаю все 300+ страниц (сейчас где-то на 200+), буду разбираться с нерабочим кодом.

12-11-2013 07:17:51
Pony_Smile_Pack
может таки уйдёте из темы, раз она для Вас не понятна? Читайте название топика до просветления.

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

"Это же всё же, всё, шо нажито непосильным трудом, — всё погибло! Магнитофон импортный, пиджак замшевый…" «Иван Васильевич меняет профессию»

Andrey_Krropotkin №51

Замена расширения  Add-ons Manager Context Menu с некоторыми изменениями (положить в инициализацию)
Источники:
1. Add-ons Manager Context Menu
2. AddonsPage  от ywzhaiqi
3. Добавить в контекстное меню расширений "Открыть папку расширения"  от bunda1

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

Если в [nightly] заняться перетаскиванием кнопок по панелям, то после этого все пункты меню начинают дублироваться.

Есть ли кнопа, которая показывает в полях ввода пароля сам пароль, а не точки, как это делает дополнение Show My Password ?

1fesFFFF пишет

Есть ли кнопа, которая показывает в полях ввода пароля сам пароль, а не точки, как это делает дополнение Show My Password ?

04-12-2012 15:28:37

Или так:

Выделить код

Код:

// Показать или спрятать пароль в окошке вода пароля двойным кликом мыши на странице ................................
function handleDblClick(e) {

  var node = e.target;
      
  if ( node.hasAttribute("typechanged") ) {
       node.type = "password";
       node.removeAttribute("typechanged");
       return; 
       }
  if ( node.hasAttribute("type") && node.getAttribute("type").toLowerCase() == "password" ) {
       node.type = "text";
       node.setAttribute("typechanged", true);              
       }
      
};
addEventListener("dblclick", handleDblClick, false, gBrowser );

1fesFFFF
Не кнопка,а скрипт,но всё же.
Show Password on Click

Есть расширение MouseZoom, зажимаешь ПКМ и колесиком мышки управляешь масштабом. А кнопкой его нельзя заменить?

Mishania
Zoom

VORON
Пробовал. Дело в том, что в расширение можно использовать пкм+колесо в любой точке браузера. Очень удобно когда мышь без провода, а монитор далеко. А zoom работает только когда наводишь мышку на кнопку, но метров с трёх-четырёх мне уже сложно попасть в саму кнопку. :)

Mishania пишет

Пробовал. Дело в том, что в расширение можно использовать пкм+колесо в любой точке браузера. Очень удобно когда мышь без провода, а монитор далеко. А zoom работает только когда наводишь мышку на кнопку, но метров с трёх-четырёх мне уже сложно попасть в саму кнопку. :)

Так это к жестам - FireGestures

Kamui
Спасибо, но я надеялся что можно реализовать кнопкой и убрать ещё одно расширение.

Mishania пишет

Есть расширение MouseZoom, зажимаешь ПКМ и колесиком мышки управляешь масштабом. А кнопкой его нельзя заменить?

Выделить код

Код:

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//%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%20_this%20%3D%20this%3B%0Avar%20alertsService%20%3D%20Components.classes%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Components.interfaces.nsIAlertsService%29%3B%0Avar%20bmsvc%20%3D%20Components.classes%5B%22@mozilla.org/browser/nav-bookmarks-service%3B1%22%5D.getService%28Components.interfaces.nsINavBookmarksService%29%3B%0A%0A%0Avar%20ucjsMouseGestures%20%3D%20%7B%0A%0A%20%20%20//%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20....%0A%20%20%20enableWheelGestures%3A%20true%2C%0A%20%20%20enableRockerGestures%3A%20true%2C%0A%20%20%20enablePopupGestures%3A%20true%2C%0A%0A%20%20%20_lastX%3A%200%2C%0A%20%20%20_lastY%3A%200%2C%0A%20%20%20_directionChain%3A%20%27%27%2C%0A%20%20%20_isMouseDownL%3A%20false%2C%0A%20%20%20_isMouseDownR%3A%20false%2C%0A%20%20%20_hideFireContext%3A%20false%2C%20%20%20%20//for%20windows%0A%20%20%20_shouldFireContext%3A%20false%2C%20//for%20linux%0A%20%20%20POPUP_ID%3A%20%27GesturePopup%27%2C%0A%20%20%20%0A%20%20%20//%20%u0416%u0435%u0441%u0442%u044B%20....%0A%20%20%20GESTURES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%0A//%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%7D%2C%0A%0Ainit%3Afunction%28%29%20%7B%0A%20%20%20%20var%20self%20%3D%20this%3B%0A%20%20%20%20var%20events%20%3D%20%5B%22mousedown%22%2C%20%22mousemove%22%2C%20%22mouseup%22%2C%20%22contextmenu%22%5D%3B%0A%20%20%20%20if%20%28%20this.enableRockerGestures%20%29%20events.push%28%22draggesture%22%29%3B%0A%20%20%20%20if%20%28%20this.enableWheelGestures%20%29%20events.push%28%22DOMMouseScroll%22%29%3B%0A%20%20%20%20function%20registerEvents%28%20aAction%2C%20eventArray%20%29%20%7B%0A%20%20%20%20%20%20%20eventArray.forEach%28function%28aType%29%20%7B%20gBrowser.mPanelContainer%5BaAction%20+%20%22EventListener%22%5D%28%20aType%2C%20self%2C%20true%20%29%20%7D%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20registerEvents%28%22add%22%2C%20events%29%3B%0A%0A%20%20%20%20window.addEventListener%28%22unload%22%2C%20function%28%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20registerEvents%28%22remove%22%2Cevents%29%3B%0A%20%20%20%20%7D%2C%20false%20%29%3B%0A%20%20%20%20addDestructor%28function%28%29%20%7B%20registerEvents%28%22remove%22%2C%20events%29%20%7D%29%3B%20%0A%7D%2C%0A%0AhandleEvent%3Afunction%28%20event%20%29%20%7B%0A%20%20%20%20switch%28%20event.type%20%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%3D2%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%20this.enableRockerGestures%20%29%20%7B%0A%20%20%20%20%20%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%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._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._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._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%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%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%20%20%20%20%20%7D%0A%20%20%20%20%20%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%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%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%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%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%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%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%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%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%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%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%28%22http%3A//www.w3.org/1999/xhtml%22%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%20this.enableRockerGestures%20%26%26%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%20this.enablePopupGestures%20%26%26%20%28%20event.button%20%3D%3D%200%20%7C%7C%20event.button%20%3D%3D%201%20%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%20this.POPUP_ID%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%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%20this.POPUP_ID%20%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.enableWheelGestures%26%26this._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%20%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%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%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%0A_buildPopup%3Afunction%28%20event%2CgestureCmd%20%29%20%7B%0A%20%20%20%20if%20%28%20%21this.enablePopupGestures%20%29%20return%3B%0A%20%20%20%20var%20popup%20%3D%20document.getElementById%28%20this.POPUP_ID%20%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%20this.POPUP_ID%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%20searchSvc%20%3D%20Cc%5B%22@mozilla.org/browser/search-service%3B1%22%5D.getService%28Ci.nsIBrowserSearchService%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20engines%20%3D%20searchSvc.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.getService%28Ci.nsIFaviconService%29.getFaviconForPage%28%20entry.URI%20%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%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%2C%0A%20%20%7D%3B%0AucjsMouseGestures.init%28%29%3B%20%20%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
etoins srldu пишет
Mishania пишет

Есть расширение MouseZoom, зажимаешь ПКМ и колесиком мышки управляешь масштабом. А кнопкой его нельзя заменить?

Выделить код

Код:

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//%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%20_this%20%3D%20this%3B%0Avar%20alertsService%20%3D%20Components.classes%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Components.interfaces.nsIAlertsService%29%3B%0Avar%20bmsvc%20%3D%20Components.classes%5B%22@mozilla.org/browser/nav-bookmarks-service%3B1%22%5D.getService%28Components.interfaces.nsINavBookmarksService%29%3B%0A%0A%0Avar%20ucjsMouseGestures%20%3D%20%7B%0A%0A%20%20%20//%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20....%0A%20%20%20enableWheelGestures%3A%20true%2C%0A%20%20%20enableRockerGestures%3A%20true%2C%0A%20%20%20enablePopupGestures%3A%20true%2C%0A%0A%20%20%20_lastX%3A%200%2C%0A%20%20%20_lastY%3A%200%2C%0A%20%20%20_directionChain%3A%20%27%27%2C%0A%20%20%20_isMouseDownL%3A%20false%2C%0A%20%20%20_isMouseDownR%3A%20false%2C%0A%20%20%20_hideFireContext%3A%20false%2C%20%20%20%20//for%20windows%0A%20%20%20_shouldFireContext%3A%20false%2C%20//for%20linux%0A%20%20%20POPUP_ID%3A%20%27GesturePopup%27%2C%0A%20%20%20%0A%20%20%20//%20%u0416%u0435%u0441%u0442%u044B%20....%0A%20%20%20GESTURES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%0A//%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%7D%2C%0A%0Ainit%3Afunction%28%29%20%7B%0A%20%20%20%20var%20self%20%3D%20this%3B%0A%20%20%20%20var%20events%20%3D%20%5B%22mousedown%22%2C%20%22mousemove%22%2C%20%22mouseup%22%2C%20%22contextmenu%22%5D%3B%0A%20%20%20%20if%20%28%20this.enableRockerGestures%20%29%20events.push%28%22draggesture%22%29%3B%0A%20%20%20%20if%20%28%20this.enableWheelGestures%20%29%20events.push%28%22DOMMouseScroll%22%29%3B%0A%20%20%20%20function%20registerEvents%28%20aAction%2C%20eventArray%20%29%20%7B%0A%20%20%20%20%20%20%20eventArray.forEach%28function%28aType%29%20%7B%20gBrowser.mPanelContainer%5BaAction%20+%20%22EventListener%22%5D%28%20aType%2C%20self%2C%20true%20%29%20%7D%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20registerEvents%28%22add%22%2C%20events%29%3B%0A%0A%20%20%20%20window.addEventListener%28%22unload%22%2C%20function%28%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20registerEvents%28%22remove%22%2Cevents%29%3B%0A%20%20%20%20%7D%2C%20false%20%29%3B%0A%20%20%20%20addDestructor%28function%28%29%20%7B%20registerEvents%28%22remove%22%2C%20events%29%20%7D%29%3B%20%0A%7D%2C%0A%0AhandleEvent%3Afunction%28%20event%20%29%20%7B%0A%20%20%20%20switch%28%20event.type%20%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%3D2%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%20this.enableRockerGestures%20%29%20%7B%0A%20%20%20%20%20%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%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._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._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._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%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%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%20%20%20%20%20%7D%0A%20%20%20%20%20%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%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%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%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%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%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%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%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%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%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%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%28%22http%3A//www.w3.org/1999/xhtml%22%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%20this.enableRockerGestures%20%26%26%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%20this.enablePopupGestures%20%26%26%20%28%20event.button%20%3D%3D%200%20%7C%7C%20event.button%20%3D%3D%201%20%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%20this.POPUP_ID%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%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%20this.POPUP_ID%20%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.enableWheelGestures%26%26this._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%20%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%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%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%0A_buildPopup%3Afunction%28%20event%2CgestureCmd%20%29%20%7B%0A%20%20%20%20if%20%28%20%21this.enablePopupGestures%20%29%20return%3B%0A%20%20%20%20var%20popup%20%3D%20document.getElementById%28%20this.POPUP_ID%20%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%20this.POPUP_ID%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%20searchSvc%20%3D%20Cc%5B%22@mozilla.org/browser/search-service%3B1%22%5D.getService%28Ci.nsIBrowserSearchService%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20engines%20%3D%20searchSvc.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.getService%28Ci.nsIFaviconService%29.getFaviconForPage%28%20entry.URI%20%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%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%2C%0A%20%20%7D%3B%0AucjsMouseGestures.init%28%29%3B%20%20%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

Не знаю почему, но у меня меняется зум, когда кручу колёсико и без правого клика :(
Пришлось удалить...
Видимо этот код с чем-то конфликтует...
P.S. Сначала (первый раз) - работает как надо - с правым кликом. Но после первого раза - начинает работать уже и без правого клика

etoins srldu
Спасибо, работает!

Как перевести на кнопку аддон MileWideBack?
Это - маленькое (3Кб) расширение создаёт очень тонкую боковую панельку слева - где-то 1-2 пикселя - практически невидимую.
И когда подводишь курсор к левой грани экрана, то ЛКМ - Назад, ПКМ - Вперёд, СКМ - закрыть вкладку, а колёсиком - перескакивать с вкладки на вкладку.
Хотелось бы иметь такую функциональность, реализованную СВ.
При этом было бы хорошо её усовершенствовать - длинный ЛКМ - даёт меню с историей (аналогично стрелочке Back), длинный ПКМ - меню с перечнем вкладок
Ещё вопрос: можно ли организовать две такие панельки - для верхней и нижней половины экрана.
Тогда можно реализовать ещё дополнительные функции по ЛКМ, СКМ, ПКМ и колёсику - например, рестарт, переход на уровень выше, переход в корень и т.д.
Это очень удобная и нужная "быстрая" функциональность - не надо "идти" к определённой кнопке, а просто к левому краю..

Что-то в 31.0esr перестало работать Add-ons Manager Context Menu с третьей страницы.

Не знаю в правильную ли тему пишу, но: имею такой код инициализации кнопки:

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

Выделить код

Код:

(function() {
    if (gBrowser.currentURI.spec == "about:customizing") return;
    var bot = BrowserOpenTab;
    BrowserOpenTab = function BrowserOpenTab() openUILinkIn(BROWSER_NEW_TAB_URL, "tab", {
        relatedToCurrent: true,
        inBackground: false
    });
    addDestructor(function() BrowserOpenTab = bot);
})();


Он открывает новую вкладку рядом с текущей. Можно ли его как-то изменить (не потеряв текущий функционал), чтобы рядом с текущей открывались и ссылки из внешних приложений и закладки из библиотеки по СКМ? В обоих случаях владки открываются в крайней правой позиции. Спасибо

okkamas_knife пишет

KOT040188в готовых кнопках есть relative tab

Обсалютно не годится. Мне не надо убить фишку лисы, когда она открывает вкладки по СКМ сначало рядом с текущей,  а потом правее. Это поведение мне не надо менять.

KOT040188 пишет

Он открывает новую вкладку рядом с текущей. Можно ли его как-то изменить (не потеряв текущий функционал), чтобы рядом с текущей открывались и ссылки из внешних приложений и закладки из библиотеки по СКМ? В обоих случаях владки открываются в крайней правой позиции. Спасибо

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 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
Спасибо вам. Ссылки из внешних приложений и новая вкладка открываются рядом с текущей. Фишка лисы, про которую я говорил, не убита. Но: закладки из библиотеки по СКМ и ссылки "из управления дополнениями" (забыл упомянуть в прошлый раз) всё равно открываются в самом конце справа. Можно ли и это исправить? Кстати когда-то требуемое мне поведение можно было настроить в tabmixplus, но уже давно эту вещь в нём поломали (это про ссылки из внешних приложений и закладки библиотеки по СКМ и тд). Видимо дело в самой лисе.

KOT040188 пишет

Но: закладки из библиотеки по СКМ и ссылки "из управления дополнениями" (забыл упомянуть в прошлый раз) всё равно открываются в самом конце справа.

Я проверил свой код на FF31 и [nightly] и закладки из библиотеки по СКМ и ссылки "из управления дополнениями" открываются рядом с текущей :/
Может у тебя какое то расширение или Сustom Buttons кнопка или код конфликтует с моим кодом.

bunda1 пишет

Может у тебя какое то расширение или Сustom Buttons кнопка или код конфликтует с моим кодом.

Проверяю на виртуалке на голой 31 лисе. Поставил только custom buttons, custom tab width, no close tab buttons и super tab mode. Всё кроме custom buttons отключил, но поведение прежнее. Что делать? :(

KOT040188 пишет

Проверяю на виртуалке на голой 31 лисе. Поставил только custom buttons, custom tab width, no close tab buttons и super tab mode. Всё кроме custom buttons отключил, но поведение прежнее. Что делать? :(

Мистика однако, может попробуй чистый профиль Localization | PortableApps.com - Portable software for USB, portable and cloud drives

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

В общем удалил на виртуалке профиль и ваша кнопка заработала как надо, но на этот раз убило фишку лисы (при открытии СКМ ссылок с одной страницы каждая новая вкладка открывается правее предыдущей) :(  Можно ли это как-то поправить?????????????????? Дополнительно решил выяснить в чём было дело раньше. Установил те расширения список которых я приводил. Последним установил Super Tab Mode. Он то и оказался подозрительным. Поведение вашей кнопки на этот раз не нарушилось, но после установки Super Tab Mode, возник другой глюк: ссылки из "управления дополнениями" открываются по две вкладки сразу. Видимо Super Tab Mode в прошлый раз даже в выключенном состоянии влиял на поведение вкладок. Странное какое-то влияние, нестабильное. В связи с этим просьба, можно ли заменить Super Tab Mode всё той же кнопкой (добавить в ту же), а именно следующий его функционал: при закрытии вкладки фокус переходит на предыдущую использованную вкладку, а не как по умолчанию в лисе на соседнюю? Вопрос как раз по теме

Можно ли заменить Super Tab Mode кнопкой, а именно следующий его функционал: при закрытии вкладки фокус переходит на предыдущую использованную вкладку, а не как по умолчанию в лисе на соседнюю? Теперь это расширение не совместимо с последней лисой, да и глючное оно…

KOT040188 пишет

Можно ли заменить Super Tab Mode кнопкой, а именно следующий его функционал: при закрытии вкладки фокус переходит на предыдущую использованную вкладку, а не как по умолчанию в лисе на соседнюю? Теперь это расширение не совместимо с последней лисой, да и глючное оно…

Выделить код

Код:

const st = gBrowser.selectedTab;
const tc = gBrowser.tabContainer;
var pTab = st, cTab = st;

function onTabSelect(e) {
    pTab = cTab;
    cTab = e.target;
}
function onTabClose(e) {
    if (e.target == cTab) gBrowser.selectedTab = pTab;
}
addEventListener("TabSelect", onTabSelect, false, tc);
addEventListener("TabClose", onTabClose, false, tc);

bunda1
Спасибо, но срабатывает почему-то один раз. Тоесть закрыл владку - перешёл на предыдущую использованную, закрыл эту - перешёл на соседнюю

KOT040188

Выделить код

Код:

const tc = gBrowser.tabContainer;
var tabs = [];
function onTabSelect(e) {
    for (let i = 0; i < tabs.length; i++) {
        if (e.target != tabs[i])
            continue;
        tabs.splice(i, 1);
        break;
    }
    tabs.push(e.target);
}
function onTabClose(e) {
    if (tabs.length > 1)
        gBrowser.selectedTab = tabs[tabs.length - 2];
    tabs.splice(tabs.length - 1, 1);
}
addEventListener("TabSelect", onTabSelect, false, tc);
addEventListener("TabClose", onTabClose, false, tc);

2k1dmg
Уже лучше, но срабатывает чётко через раз. Извините за назойливость :blush:

KOT040188
ещё лучше я уже не сделаю

Выделить код

Код:

const tc = gBrowser.tabContainer;
let tabs = [];
function onTabSelect(e) {
    for (let i = 0; i < tabs.length; i++) {
        if (e.target.linkedPanel != tabs[i])
            continue;
        tabs.splice(i, 1);
        break;
    }
    tabs.push(e.target.linkedPanel);
}
function onTabClose(e) {
    let allTabs = Array.slice(tc.childNodes);
    let allTabsLP = allTabs.map(function(tab) {
        return tab.linkedPanel;
    });
    if (e.target == gBrowser.selectedTab &&
            tabs.length >= 1) {
        let tab;
        let lp = tabs[tabs.length - (tabs.length == 1 ? 1 : 2)];
        for (let i = 0; i < allTabsLP.length; i++) {
            if (lp != allTabsLP[i])
                continue;
            tab = allTabs[i];
            break;
        }
        if (tab)
            gBrowser.selectedTab = tab;
    }
    if (tabs.length != 0) {
        tabs = tabs.filter(function(tab) {
            return allTabsLP.indexOf(tab) != -1 ? true : false;
        });
        tabs.splice(tabs.length - (tabs.length == 1 ? 1 : 2), 1);
    }
}
addEventListener("TabSelect", onTabSelect, false, tc);
addEventListener("TabClose", onTabClose, false, tc);

2k1dmg
Большое спасибо! Почти идеально :) Первый раз после создания кнопки перескакивает на соседнюю и потом бывает изредка перескакивает…

Софорумчане,

А не встречал ли кто кнопку - аналог вот этого расширения: https://addons.mozilla.org/ru/firefox/a … -dl-rating?

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

Осталось как-то поправить этот код:

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 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 );

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

KOT040188 пишет

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

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 27.09.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;   // если открыть всё во вкладках из папки закладок  
   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 );

bunda1
Вкладки теперь вроде вкладки восстанавливает нормально, но если открывать ссылки СКМ - ничего не поменялось. Хотелось бы во втором случае получить поведение по умолчанию в лисе

KOT040188 пишет

Вкладки теперь вроде вкладки восстанавливает нормально, но если открывать ссылки СКМ - ничего не поменялось. Хотелось бы во втором случае получить поведение по умолчанию в лисе

Я проверил и у меня работает, но может я тебя не правильно понял, объясни подробней где должны открываться ссылки по СКМ.

bunda1 пишет

Я проверил и у меня работает, но может я тебя не правильно понял, объясни подробней где должны открываться ссылки по СКМ.

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

KOT040188
Ну тогда всё хорошо?

bunda1
Ну так я ж написал, что почти хорошо. Но всегда хочется идеального :) Ну если лучше нельзя…

но вот из библиотеки открытой во вкладке (не люблю окна) не работает

Вот это бы ещё поправить. Ну и редкие переключения на соседнюю вкладку при закрытии. Но если нельзя, то нельзя…

KOT040188 пишет

bunda1
Ну так я ж написал, что почти хорошо. Но всегда хочется идеального :) Ну если лучше нельзя…

но вот из библиотеки открытой во вкладке (не люблю окна) не работает

Вот это бы ещё поправить. Ну и редкие переключения на соседнюю вкладку при закрытии. Но если нельзя, то нельзя…

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 27.09.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;      // если открыть всё во вкладках из папки закладок  
   if ( /handleLinkClick|CT_onClick/.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 );

bunda1
Теперь из библиотеки открывает в крайней правой позиции :( Откатился на предыдущий код

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

bunda1 пишет

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

Ну вообще-то да. Извиняюсь за неточное поставленную задачу. Просто уже сам путаюсь. Но в данной ситуации я хотел бы такое же поведение как и со страницами. Тоесть первая закладка открывается справа от библиотеки, вторая справа от уже открытой и т.д.
bunda1
Ну так можно такое осуществить или нет? АУ!

bunda1 откликнитесь! Прошу помощи. Долго не мог понять почему лиса восстанавливая вкладки при запуске зеркалирует их, то есть разворачивает их задом на перёд. Оказалось виноват этот код:

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 27.09.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;   // если открыть всё во вкладках из папки закладок  
   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 );

Можно это как-то поправить? И заодно открытие закладок из библиотеки (открытой во вкладке), чтобы они открывались так же как ссылки со страницы в лисе по умолчанию (ну вы в курсе про последовательность: сначала справа от текущей вкладки, затем справа от толькоо что открытой…)

Завтра посмотрю.

Жду с нетерпением :)

Долго не мог понять почему лиса восстанавливая вкладки при запуске зеркалирует их, то есть разворачивает их задом на перёд. Оказалось виноват этот код:

Я проверил на FF33 и код вкладки при запуске не зеркалирует, может я что не понял или опять конфликт с расширениями.

Блин!!!!!!!!!!! Ну сейчас попробую в виртуалке…

действительно в виртуалке этот код не зеркалирует вкладки. Я в отчаянии :cry: Практически все мои расширения далеки от вкладок. Вы не знаете как сохранить список расширений, чтобы я вылажил сюда, а вы смогли посмотреть опытным глазом? Но повторюсь, если вышеприведённый код убрать вкладки востанавливаются нормально.
Продолжаю копать. Установил в виртуалке все свои расширения. Глюка пока нет.  Завтра постараюсь постепенно допилить лису в виртуалке (добавить остальные кнопки, настроить расширения), и если всё будет в порядке перенести профиль в хост. А старый похоже испорченный. У меня есть немного отключённых расширений возможно дело в них...

KOT040188

"CB "Список расширений""

Выделить код

Код:

try { Cu.import("resource://custombuttons-modules/addons4.js", {}); } catch(ex) {}

function gatherInfo(type) {

    var tmp = [], map = {}, sort = [];
    items.forEach(function(item) {
        if (item.type != type) return;

        var name = item.name ? item.name.toUpperCase() : "UNNAMED";
        name += item.id

        tmp.push(name);
        map[name] = item;
    });
    tmp.sort();
    tmp.forEach(function(name) { sort.push(map[name]) });
    
    var list = "", enabled = 0, disabled = 0;
    sort.forEach(function(item) {
    
        list += (item.name || "unnamed") + " " + (item.version || "");

        if (item.type != "custombuttons" && (item.userDisabled || item.appDisabled)) {
            list += " [ выключен ]\n"; disabled++; return;
        }

        else if (item.type == "custombuttons") {

            var str = item.id;
            var id = str.substring(str.lastIndexOf("custombuttons-button"), str.length);
            var button = document.getElementById(id);

            if (!button) {
                list += " [ НЕ ВЫТАЩЕНА ]\n"; disabled++; return;
            }
            if (button.hasAttribute("initializeerror")) {
                list += " [ ОШИБКА ИНИЦИАЛИЗАЦИИ ]\n"; disabled++; return;
            }
        }

        enabled++; list += "\n";
    });
    return [enabled + disabled, enabled, disabled, list];
}
var items = [];
function extensionsCallback(extensions) {
    var list = "";
    items = extensions;
    
    var info = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
    
    list += info.vendor + " " + info.name + " " + info.version + " (build " + info.appBuildID + ")\n";
    list += "User Agent: " + navigator.userAgent + "\n\n";

    for(var type in AddonManager.addonTypes) {
        
        var name;
        var addonType = AddonManager.addonTypes[type];
        if (addonType.name) name = addonType.name;        
        else if (addonType.id == "custombuttons") name = "Кнопки";

        list += "*** " + name;
        var ext = gatherInfo(addonType.id);
        list += " ( Включено: " + ext[1] + ", Отключено: " + ext[2] + ", Всего: " + ext[0] + " )\n" + ext[3] + "\n";
    }

    var dialog = '\
        <?xml-stylesheet href="chrome://global/skin/"?>\n\
        <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"\n\
            xmlns:html="http://www.w3.org/1999/xhtml"\n\
            id="cbbExtensionsLister"\n\
            persist="width height screenX screenY"\n\
            title="Список расширений"\n\
            width="640" height="480"\n\
            buttons="accept,extra1"\n\
            buttonlabelextra1="Копировать все…"\n\
            onload="init()"\n\
            ondialogextra1="copy()">\n\
            <script type="application/x-javascript">\n\
                <![CDATA[\n\
                    function init () {}\n\
                    function copy () {\n\
                        var tb = document.getElementById("addonslist");\n\
                        window.arguments[0].write((opener.navigator.platform.indexOf("Win") != -1) ? tb.value.replace(/\\n/g, "\\r\\n") : tb.value);\n\
                        tb.focus ();\n\
                    }\n\
                ]]>\n\
            </script>\n\
            <textbox id="addonslist" flex="1" multiline="true" />\n\
    </dialog>';
    dialog = "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(dialog);
//    var win = window.openDialog (dialog, "", "chrome,dependent,dialog=no,minimizable", custombuttonsUtils.gClipboard);
    var win = window.openDialog (dialog, "", "chrome,dependent,dialog=no", custombuttonsUtils.gClipboard);

    addEventListener("load", function() {
        var doc = win.document;
        var textbox = doc.querySelector("textbox");
        textbox.value = list;
        textbox.inputField.selectionStart =
        textbox.inputField.selectionEnd = 0;
    }, true, win);
}
AddonManager.getAllAddons(extensionsCallback);


Положить в в "код".

KOT040188 пишет

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

about:support

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

Вот она. А вместе - глюк.

Не могу открыть :/

А нет там http://. Я просто не в курсе как выкладывать кнопки, положил как ссылку. Как выкладывать?

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

Выделить код

Код:

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%3E%u041F%u043E%u0438%u0441%u043A%20%u043D%u0430%20%u0441%u0430%u0439%u0442%u0435%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAFhYAAAEAIAAQCAAAFgAAACgAAAAWAAAALAAAAAEAIAAAAAAA6AcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQMAAgAAAAALOAMeHIEKYR19C2USUwYsAAAAAAABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQQAAwMLAAsAAAAAF2MIXi/wDewv+gvxKKsPmAILAAABBAAHAgcABQACAAEAAAAAAAAAAAAAAAABAQEDAQEBBQAAAAQAAAADAAAAAAAAAAAAAAAAAAEAAAAAAAABBgAHAAAAABVXCWMp7wr+Jv8F/yWmDqUAAAAAAAEAAgAAAAAAAAAAAAAAAAEBAQACAgIEAAAAAwcHBwAODg4AAQEBAAAAAAAAAAAAAAEAAAAAAAAFFQMNDzcHKQ0rBhQcbg1yI9cK9x7jBf0mohCoDzcGGQ81BygNMwYdAgoCAwAAAAACAgIHAAAAABQUFBErKyt5GxsbmQwMDCYAAAAAAAAAAwACAAMAAAAAFmgKYhunCLMXoAWuGqsFyxXGAv0SyAD/G7gF4hiiB68YowW2IKUOpQ0vCBkDAQIAAAAAARUVFQ8qKip9HBwc9icnJ/IzMzN4AAAAAAEBAQYAAQAEAAcAADGqH7FH6jb/Q941/jzPLv40wCf/M74m/znHLP8/1jD+Qt4y/0fiNf8WRg80AAAAABQUEwYwMTB8FRUV8BkZGf9FRUXDJiYmQAAAAAABAQEDAQEBAgAEAAAwgiV3W7tQylivUcZbtlLcb8Zo/3LIbf5jwVnlWLRPulitUb5OqUSuDCkHIAgFCQAuLi5wFxkX6RsbG/9KSkrDMTExQwAAAAACAgICAQEBAAAAAAEAAAAADCkHEBZBECkLMAYSK28hdnbHcPuCxoD7RJQ4vx5TFmQeRBllGTsUOgMMAQA8PDtIOjo63ikpKf9JSUi8MDAwPgAAAAADAwMIAQEBAQAAAAAAAAAAAAAAAAAAAAIDBQQHAAAAACVRH2GG0YL6k8uV/TptM/ABAAHiGxkc5R0bHskaGxphW1xarYOCgvFkZGSuHR0dLAAAAAADAwMIAQEBAQAAAAAAAAAAAAAAAAAAAAABBAEFBgYGBAAAAAArWSSCltCU/6naqfxHij63AA4ALw8TD1AYGhiuICAg/GVlZdtZWVk8ExMTAAAAAAUCAgICAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYJBgAEBgVSFC0Q2U+KSNlruGSeNHIsYQABAAAAAQAEAAEAAxcXF3grKyv1FRUVVgAAAAAAAAAEAQEBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAUDBAMAAQEBrhAUEcgSGhEmAQkACggNBwwFBAUCBAQEAwQEBAIFBQUAICAgzCcnJ68LCwsaAAAAAAEBAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABwcHEAAAAM9jY2SjrKutAD46PgMGAwcBAQEBAAAAAAEAAAAEAAAAAB0dHZEkJCTTCQkJPwAAAAACAgIHAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEEAAAAAA0ODRsUFBTQlpaWpv///xLa3Nsotra1GJSUlA+YmJgMj4+PFbGxsQB+fn6GNzc31gkJCUUAAAAAAgICCAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAwAAAAMUFBQBLy8vvYWFhc3o6OhD////SP39/Uz///9A////Pf7+/jj///8TjIyMvE9PT8UaGhotAAAAAAMDAwcAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAHCAgIAFBQUH1ra2v0n5+fo////1b9/f1n/v7+Zf///1z///9JqqqqdW1tbf5aWlqDHBwcAgAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAwMDBQAAAABCQkIcfHx8toODg/+qqqqz0dHRkdbW1ojU1NSMuLi4pnh4ePqAgIDOPT09KgICAgAAAAAEAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwABAQEFAwMDAF1dXTKSkpK1cXFx9oaGhueRkZHajY2N6nl5efuVlZXNXFxcOw0NDQAAAAACAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAAAAAUHBwcARUVFFYaGhm+Li4u3jY2Nx46OjruRkZGAXFxcFgsLCwAAAAACAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAwMDAwAAAAMFBQUALS0tAFJSUgA6OjoACAgIAAAAAAMEBAQDAgICAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgADAwMDAQEBBQAAAAIAAAABAAAAAgEBAQUEBAQDAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%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---------------------------------------------------------------------------%0A%20%20%20%20%20%u0443%u0431%u0440%u0430%u0442%u044C%20%u0444%u043E%u043A%u0443%u0441%20%u0432%20%u043F%u0430%u043D%u0435%u043B%u0438%20%u0430%u0434%u0440%u0435%u0441%u0430%20%u043D%u043E%u0432%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%0A%20%20%20---------------------------------------------------------------------------%20*/%0Avar%20focusAndSelectUrlBar%20%3D%20window.focusAndSelectUrlBar%3B%0Awindow.focusAndSelectUrlBar%20%3D%20function%28%29%20%7B%0A%20%20%20%20new%20Error%28%29.stack.indexOf%28%22%5CnopenLinkIn@chrome%3A//browser/content/utilityOverlay.js%3A%22%29%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20return%20focusAndSelectUrlBar.apply%28this%2C%20arguments%29%3B%0A%7D%3B%0A/*%20---------------------------------------------------------------------------%0A%20%20%20%20%20%u041E%u0442%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%u043B%u044E%u0431%u0443%u044E%20%u043D%u043E%u0432%u0443%u044E%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%20%u0441%u043F%u0440%u0430%u0432%u0430%20%u043E%u0442%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%0A%20%20%20---------------------------------------------------------------------------%20*/%20%0AaddEventListener%28%22TabOpen%22%2C%20function%28e%29%20%7B%0A%20%20%20var%20newTab%20%3D%20e.target%3B%0A%20%20%20var%20lab%20%3D%20newTab.label%3B%20%0A%20%20%20var%20tabpos%20%3D%20gBrowser.selectedTab._tPos%3B%0A%20%20%20var%20newTabLab%20%3D%20gBrowser.mStringBundle.getString%28%22tabs.emptyTabTitle%22%29%3B%20%20%0A%0A%20%20%20if%20%28%20tabpos%20%3D%3D%200%20%26%26%20lab%20%3D%3D%20newTabLab%20%29%20return%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u0441%u0435%u0441%u0441%u0438%u0438%0A%20%20%20if%20%28%20new%20Error%28%29.stack.indexOf%28%22openContainer%22%29%20%21%3D%3D%20-1%20%29%20return%3B%20%20%20//%20%u0435%u0441%u043B%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%u0441%u0451%20%u0432%u043E%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%20%u0438%u0437%20%u043F%u0430%u043F%u043A%u0438%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%20%0A%20%20%20if%20%28%20/handleLinkClick/.test%28new%20Error%28%29.stack%29%20%29%20return%3B%20%20%20%20%20%20%20%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u043F%u043E%20%u0421%u041A%u041C%20%0A%0A%20%20%20gBrowser.moveTabTo%28%20e.target%2C%20tabpos%20+%201%20%29%3B%0A%20%20%20%0A%20%20%20//%20%u0430%u0432%u0442%u043E%u043C%u0430%u0442%u0438%u0447%u0435%u0441%u043A%u0438%20%u0437%u0430%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%22custombutton%22%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%0A%20%20%20if%20%28%20lab.startsWith%28%22custombutton%3A//%25%22%29%20%29%20setTimeout%28function%28%29%20gBrowser.removeTab%28%20newTab%20%29%2C%200%29%3B%0A%0A%7D%2C%20false%2C%20gBrowser.tabContainer%20%29%3B%0A/*%20---------------------------------------------------------------------------%0A%20%20%20%20%20%u0432%u043E%u0437%u0432%u0440%u0430%u0442%20%u043D%u0430%20%u043F%u0440%u0435%u0434%u044B%u0434%u0443%u0449%u0443%u044E%20%u0430%u043A%u0442%u0438%u0432%u043D%u0443%u044E%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%0A%20%20%20---------------------------------------------------------------------------%20*/%0Aconst%20tc%20%3D%20gBrowser.tabContainer%3B%0Alet%20tabs%20%3D%20%5B%5D%3B%0Afunction%20onTabSelect%28e%29%20%7B%0A%20%20%20%20for%20%28let%20i%20%3D%200%3B%20i%20%3C%20tabs.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28e.target.linkedPanel%20%21%3D%20tabs%5Bi%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20tabs.splice%28i%2C%201%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%20%20tabs.push%28e.target.linkedPanel%29%3B%0A%7D%0Afunction%20onTabClose%28e%29%20%7B%0A%20%20%20%20let%20allTabs%20%3D%20Array.slice%28tc.childNodes%29%3B%0A%20%20%20%20let%20allTabsLP%20%3D%20allTabs.map%28function%28tab%29%20%7B%0A%20%20%20%20%20%20%20%20return%20tab.linkedPanel%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20if%20%28e.target%20%3D%3D%20gBrowser.selectedTab%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20tabs.length%20%3E%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20let%20tab%3B%0A%20%20%20%20%20%20%20%20let%20lp%20%3D%20tabs%5Btabs.length%20-%20%28tabs.length%20%3D%3D%201%20%3F%201%20%3A%202%29%5D%3B%0A%20%20%20%20%20%20%20%20for%20%28let%20i%20%3D%200%3B%20i%20%3C%20allTabsLP.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28lp%20%21%3D%20allTabsLP%5Bi%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20tab%20%3D%20allTabs%5Bi%5D%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%20%20%20%20%20%20%20%20if%20%28tab%29%0A%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20tab%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28tabs.length%20%21%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20tabs%20%3D%20tabs.filter%28function%28tab%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20allTabsLP.indexOf%28tab%29%20%21%3D%20-1%20%3F%20true%20%3A%20false%3B%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20tabs.splice%28tabs.length%20-%20%28tabs.length%20%3D%3D%201%20%3F%201%20%3A%202%29%2C%201%29%3B%0A%20%20%20%20%7D%0A%7D%0AaddEventListener%28%22TabSelect%22%2C%20onTabSelect%2C%20false%2C%20tc%29%3B%0AaddEventListener%28%22TabClose%22%2C%20onTabClose%2C%20false%2C%20tc%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BloadURI%28%22javascript%3Aopen%28%27http%3A//yandex.by/yandsearch%3Ftext%3Dsite%3A%27+location.host%29%28%29%3B%22%29%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 пишет

А нет там http://. Я просто не в курсе как выкладывать кнопки, положил как ссылку. Как выкладывать?

АУ!

Скорее всего Вы имеете в виду Search in Website+( Firefox )
Если у Вас стоит эта кнопка, Вы должны найти постинг, где эта кнопка описана и приводится её код.
Сделать это несложно: найдите в коде подходящее ключевое слово, например из кода кнопки (где-то в середине): 2CAAABAAEAFhYAAAEAIAAQCAAAFgAAACgAAAAWAAAALAAAAAEAIAAAAAAA6Ac
и сделайте поиск по этому "слову" :) в Custom Buttons (в верху каждой страницы есть кнопка "Поиск") и Вы быстро найдёте :)

Я ж написал код кнопки!!!!!!!!!!!!!!!!!! bunda1 отзовитесь

KOT040188 пишет

Я ж написал код кнопки!!!!!!!!!!!!!!!!!! bunda1 отзовитесь

То, что Вы дали, мягко выражаясь, "несъедобно".
Вы что, хотите, чтобы разработчик, чтобы прочесть код, установил себе эту кнопку?:rolleyes:
Или он должен сделать за Вас всю работу по поиску?

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

Выделить код

Код:

loadURI("javascript:open('http://yandex.by/yandsearch?text=site:'+location.host)();")

Инициализация:

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

Выделить код

Код:

/* ---------------------------------------------------------------------------
     убрать фокус в панели адреса новой вкладки
   --------------------------------------------------------------------------- */
var focusAndSelectUrlBar = window.focusAndSelectUrlBar;
window.focusAndSelectUrlBar = function() {
    new Error().stack.indexOf("\nopenLinkIn@chrome://browser/content/utilityOverlay.js:")
        return true;
    return focusAndSelectUrlBar.apply(this, arguments);
};
/* ---------------------------------------------------------------------------
     Открывать любую новую вкладку справа от текущей
   --------------------------------------------------------------------------- */ 
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;   // если открыть всё во вкладках из папки закладок  
   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 );
/* ---------------------------------------------------------------------------
     возврат на предыдущую активную вкладку
   --------------------------------------------------------------------------- */
const tc = gBrowser.tabContainer;
let tabs = [];
function onTabSelect(e) {
    for (let i = 0; i < tabs.length; i++) {
        if (e.target.linkedPanel != tabs[i])
            continue;
        tabs.splice(i, 1);
        break;
    }
    tabs.push(e.target.linkedPanel);
}
function onTabClose(e) {
    let allTabs = Array.slice(tc.childNodes);
    let allTabsLP = allTabs.map(function(tab) {
        return tab.linkedPanel;
    });
    if (e.target == gBrowser.selectedTab &&
            tabs.length >= 1) {
        let tab;
        let lp = tabs[tabs.length - (tabs.length == 1 ? 1 : 2)];
        for (let i = 0; i < allTabsLP.length; i++) {
            if (lp != allTabsLP[i])
                continue;
            tab = allTabs[i];
            break;
        }
        if (tab)
            gBrowser.selectedTab = tab;
    }
    if (tabs.length != 0) {
        tabs = tabs.filter(function(tab) {
            return allTabsLP.indexOf(tab) != -1 ? true : false;
        });
        tabs.splice(tabs.length - (tabs.length == 1 ? 1 : 2), 1);
    }
}
addEventListener("TabSelect", onTabSelect, false, tc);
addEventListener("TabClose", onTabClose, false, tc);


Так пойдёт? Не знаю как по другому напечатать… С нетерпением жду ответа bunda1 =)

KOT040188
Я проверял твою кнопку на FF33 и восстановление сессии без проблем, даже на [nightly]
Не знаю где проблема, коды из кнопки вроде не должны взаимодействовать.
Попробуй кнопку без:

Выделить код

Код:

/* ---------------------------------------------------------------------------
     убрать фокус в панели адреса новой вкладки
   --------------------------------------------------------------------------- */
var focusAndSelectUrlBar = window.focusAndSelectUrlBar;
window.focusAndSelectUrlBar = function() {
    new Error().stack.indexOf("\nopenLinkIn@chrome://browser/content/utilityOverlay.js:")
        return true;
    return focusAndSelectUrlBar.apply(this, arguments);
};

bunda1, огромное вам спасибо за терпение. Вы были правы, в создании глюка участвуют также и расширение! Для стопроцентного воспроизведения глюка нужно это расширение и этот код:

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 27.09.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;   // если открыть всё во вкладках из папки закладок  
   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 );

Не знаю что за конфликт между ними но это приводит к разворачиванию вкладок при восстановление. Если у кого-нибудь будет желание проверьте у себя. bunda1, может что-нибудь посоветуете? Как быть? Расширение очень нужное… И код тоже…

KOT040188 пишет

может что-нибудь посоветуете? Как быть? Расширение очень нужное

Ну я у себя просто открываю закладки в вкладке с адресом chrome://browser/content/bookmarks/bookmarksPanel.xul.

Ну я у себя просто открываю закладки в вкладке с адресом chrome://browser/content/bookmarks/bookmarksPanel.xul.

Я тоже иногда пользуюсь этим (в Bookmarks Tab не отображаются мобильные закладки), но: при перезагрузке лисы сбрасывается папка открытая в закладках, а у меня их много (и ззакладок и папок). Ещё расширение позволяет увеличить масштаб. Так что не вариант… Может можно как-то изменить код, чтобы не было конфликта? Может кто знает аналогичное расширение? Его автор похоже забросил, а у меня есть пару предложений по его изменению.

Я тоже иногда пользуюсь этим (в Bookmarks Tab не отображаются мобильные закладки), но: при перезагрузке лисы сбрасывается папка открытая в закладках

У меня при перезагрузке лисы не сбрасывается. Опять наверно какое расширение чудит. Я посмотрю в чем там проблема с Bookmarks Tab

bunda1 пишет

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

Я извиняюсь, имел в виду chrome://browser/content/places/places.xul (невнимательно прочитал ваше сообщение), он сбрасывает папку если перезагрузить страницу. А chrome://browser/content/bookmarks/bookmarksPanel.xul мне не удобен, ибо папок много и получается их постоянно надо будет сворачивать после разворачивания, чтобы не закопаться… А ещё в Bookmarks Tab можно назначить папку закладок которая будет открываться при создании новой вкладки…

Я извиняюсь, имел в виду chrome://browser/content/places/places.xul

Попробуй: Открывать библиотеку в вкладке и последнюю активную папку библиотеки и не будет папка сбрасываться.

А chrome://browser/content/bookmarks/bookmarksPanel.xul мне не удобен,

Ну вот ....

А ещё в Bookmarks Tab можно назначить папку закладок которая будет открываться при создании новой вкладки

:)
В about:config > browser.newtab.url
Настраиваем страницу новой вкладки в Mozilla Firefox | КОМПЬЮТЕРНЫЕ ВЕСТИ

bunda1 пишет

Попробуй: Открывать библиотеку в вкладке и последнюю активную папку библиотеки и не будет папка сбрасываться

Спасибо, добавил для удобства, но Bookmarks Tab чуточку удобнее: при перезагрузках не сбрасывается папка, а в новой вкладке показывается заранее заданная папка закладок. Разница не большая, но она есть…

bunda1 пишет

В about:config > browser.newtab.url

Про это я знаю, но не понял к чему это сейчас. Bookmarks Tab работает и без этой настройки.

KOT040188

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 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 || lab == 'chrome://bookmarks/content/bookmarks.html') ) return;                     
   
   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 пишет

А изменения какие? Не будет глюка с разворачиванием вкладок?

Не будет глюка с разворачиванием вкладок.

Неа, всё равно разворачивает!

KOT040188 пишет

Неа, всё равно разворачивает!

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 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 );

Спасибо! Вот теперь не разворачивает! :) И кстати по моему лиса стала меньше тупить при старте! Можно ли теперь сделать следующее (чтобы довести до идеального): чтобы открытие закладок из chrome://browser/content/places/places.xul происходило так же как и ссылки со страницы в лисе по умолчанию (ну вы в курсе про последовательность: сначала справа от текущей вкладки, затем справа от только что открытой и тд…)

Наверно в понедельник посмотрю что можно сделать.

Я вас не тороплю :)

Помогите найти кнопку, которая при нажатии на неё скрывает/показывает добавленную мной через настройки панельку (там где яндекс бары, панель меню и прочее, только с названием своим)

bunda1, снова типа багрепорт. Использую группы вкладок, в некоторых из них если находится на первой слева вкладке новая вкладка открывается в конце справа, на остальных вкладках рядом. Закрыл такую группу, в другой группе где не было такого глюка он появился…

Уважаемые знатоки, не мог бы кто модифицировать код из 135-го поста на этой странице "Открывать любую новую вкладку справа от текущей, от 24.10.2014" так, чтобы при долгом клике СКМ по ссылке она открывалась справа от текущей?

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

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 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 );


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

Чтобы не делать лишней работы, достаточно, чтобы это поведение реализовывалось только на обычных ссылках (интернет-страничек). Но если так будет и из "Журнала" и "Закладок", то пусть, тоже хорошо. Просто для них у меня уже работает нижеприведённый код и я не знаю, не будет ли конфликтов каких-то...

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

Выделить код

Код:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// https://forum.mozilla-russia.org/viewtopic.php?pid=626886#p626886
// Kод даёт возможность открывать закладки средним кликом на закладке не закрывая меню закладок. Код не работает в боковой панели закладок. 
// Открывать закладки средним кликом в новой вкладке не закрывая меню закладок, от 16.09.2013. ................................
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(function() {
    const str = 'p"', rep = 'p" && !aEvent.button', obj = BookmarksEventHandler, func = obj.onClick;
    eval("BookmarksEventHandler.onClick = " + String.replace(func, str, rep));
    addDestructor(function() obj.onClick = func);
})();
;



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// https://forum.mozilla-russia.org/viewtopic.php?pid=667273#p667273
// Открывать средним кликом вкладки из Журнала (кроме "Показать весь журнал") в новой вкладке, не закрывая меню Журнал, от 6.11.2014.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(popup => {
    popup.checkForMiddleClick = (node, e) => {
        var trg = e.target;
        if (trg.getAttribute("disabled") == "true" || e.button != 1) return;
        popup.parentNode._placesView._onCommand(e);
        if (trg.mozMatchesSelector('#historyUndoPopup > [oncommand*="undoCloseTab"]')) {
            trg.classList.contains("restoreallitem") && trg.doCommand();
            popup.parentNode._placesView.populateUndoSubmenu();
            var menupopup = popup.querySelector('.recentlyClosedTabsMenu[disabled="true"] > menupopup');
            menupopup && menupopup.hidePopup();
        }
        else if (!trg.mozMatchesSelector("#goPopup > .bookmark-item"))
            closeMenus(trg);
    }
    addDestructor(() => delete popup.checkForMiddleClick);
})(document.getElementById("goPopup"));





////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//https://forum.mozilla-russia.org/viewtopic.php?pid=607274#p607274
//Автор: Dumby, bunda1 Версия: от 05-11-2014 19:47:41
//Описание: Kод открывает библиотеку как активную вкладку рядом с текущей вкладкой и открывает в в библиотеке:
//1. папку закладок которая была открыта перед закрытием библиотеки если в главном меню или в меню кнопки меню вы нажали Показать все закладки
//2. Загрузки или Неподшитые закладки если в главном меню или в меню кнопки меню вы нажали эти пункты,
//3. первую папку истории( Сегодня ) отсортированную по адресу если в главном меню или в меню кнопки меню вы нажали Показать весь журнал, в коде можно
// отключить сортировку по адресу и указать другую папку истории для открытия. 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Открывать библиотеку во вкладке и последнюю активную папку библиотеки, от 05.11.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 ( /showPlacesOrganizer|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 );
})();


В начале кнопки идёт код "mergeInitialization":
скрытый текст

Выделить код

Код:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/mergeInitialization.js
// Example for safely use only one button for initialization of many "buttons" without UI (Для любителей засовывать кучу разных кодов в инициализацию одной кнопки).
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var _destructors = [];
function destructor() {
    var args = arguments;
    _destructors.forEach(function(destructor) {
        try {
            destructor.apply(this, args);
        }
        catch(e) {
            Components.utils.reportError(e);
        }
    }, this);
}
if("defineProperty" in Object) { // Firefox 4+
    Object.defineProperty(this, "onDestroy", {
        get: function() {
            return _destructors.length ? destructor : undefined;
        },
        set: function(f) {
            _destructors.push(f);
        },
        enumerable: true,
        configurable: true
    });
}
else {
    this.__defineGetter__("onDestroy", function() {
        return _destructors.length ? destructor : undefined;
    });
    this.__defineSetter__("onDestroy", function(f) {
        _destructors.push(f);
    });
}

Александр Колесников
:/

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

Выделить код

Код:

(() => {
    const delay = 500;

    var longMiddleClick = false, mousedownTime = 0;
    var handler = {
        handleEvent: e => e.button == 1 && handler[e.type](),
        mousedown: () => mousedownTime = Date.now(),
        mouseup: () => setTimeout(() => longMiddleClick = false, 50,
            longMiddleClick = Date.now() - mousedownTime > delay
        )
    };
    for(var type of ["down", "up"]) addEventListener("mouse" + type, handler);
    addEventListener("TabOpen", e =>
        longMiddleClick && gBrowser.moveTabTo(e.target, gBrowser.selectedTab._tPos + 1)
    , false, gBrowser.tabContainer);
})();

Dumby Спасибо, работает из на ссылках, и из Закладок\Журнала! Захотелось JS выучить, хоть я и самоучка в том, что связано с компами :-)

Никак не получается отключить стандартное меню по ПКМ. Кусок кода:

скрытый текст
bClick: function(e)
    {
        if (e.button !== 0 && e.button !== 2) {
            return false;
        }

        if (inspector4pda.user.id) {
            inspector4pda.vars.getPrefs();

            switch (e.button) {
                case 0:
                    //LMB
                    inspector4pda.toolbar.bClickEvent(inspector4pda.vars.click_action, e);
                    break;
                case 2:
                    //MMB
                    inspector4pda.toolbar.bClickEvent(inspector4pda.vars.MMB_click_action, e);
                    break;
            }

        } else {
            inspector4pda.cScript.getData(function(){
                if (!inspector4pda.cScript.successLastRequest) {
                    inspector4pda.cScript.siteUnavailableNotification();
                } else if (!inspector4pda.user.id) {
                    inspector4pda.utils.openPage(inspector4pda.toolbar.urls.login);
                }
            });
        }
    },


Пытался вставить
скрытый текст
if(e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ // ПКМ
        e.preventDefault();

Всем привет. Есть такое расширение Double click close tab. Можно его как то заменить с помощью сабжа. Конкретно из функционала интересует закрытие текущей вкладки по двойному нажатию правой кнопкой мыши внутри страницы. И еще расширение Scrollbar anywhere, позволяющее листать страницу при зажатой правой клавиши мыши. Заранее благодарю за помощь.

zoomlin пишет

Всем привет. Есть такое расширение Double click close tab. Можно его как то заменить с помощью сабжа. Конкретно из функционала интересует закрытие текущей вкладки по двойному нажатию правой кнопкой мыши внутри страницы.

Выделить код

Код:

// Закрыть вкладку двойным правым кликом, от 05.02.2015. ................................
addEventListener("dblclick", (e)=>{
  if ( e.button == 2 ) { 
       e.preventDefault();
       gBrowser.removeCurrentTab();       
       document.getElementById("contentAreaContextMenu").hidePopup(); 
       }        
}, false, gBrowser );

05-02-2015 20:16:12

zoomlin пишет

И еще расширение Scrollbar anywhere, позволяющее листать страницу при зажатой правой клавиши мыши.

А вот это так просто не сделать, разве только переделать для Сustom Buttons этот код: https://github.com/ardiman/userChrome.j … grabscroll

Благодарю, Закрыть вкладку двойным правым кликом работает. Еще у меня установлено расширение dblclicker(открытие ссылок в новом табе по двойному левому клику) и auto context(автоматическое открытие контекстного меню при выделении текста). Наверно их тоже можно заменить?

Приветствую.
Есть расширение шикарное и хотелось бы знать можно ли его сделать чисто кнопкой, ибо:
1. расширение требует пеерзагрузки бравзера, а постоянно работающее оно не нужно.
2. расширение состоит из одного скрипта внутри.
Называется HTTP Request Logger и делает только одно - пишет все запросы в файл.txt на рабочем столе.
Скрипт который внутри (и это единственное из чего состоит расширение, ну еще манифест) вот:

HTTP Request Logger.js code

Выделить код

Код:

Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
function HttpRequestLogger() {
  var httpRequestLogger =
  {
    observe: function(subject, topic, data) 
    {
      if (topic == "http-on-modify-request") {
        var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
        var ref = httpChannel.referrer ? httpChannel.referrer.spec : "(none)";
        var buffer = ref + " " + httpChannel.requestMethod + " " + httpChannel.URI.spec + "\n";
        fos.write(buffer, buffer.length);
      }
    }
  };
  
  var file = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("Desk", Components.interfaces.nsIFile);
  file.append("http-request-log.txt");
  var fos = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  // PR_WRONLY | PR_CREATE_FILE | PR_APPEND
  fos.init(file, 0x02 | 0x08 | 0x10, -1, 0);
  
  var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  observerService.addObserver(httpRequestLogger, "http-on-modify-request", false);
}

HttpRequestLogger.prototype.classID = Components.ID('{c4a9bb50-b9b2-11e0-a4dd-0800200c9a66}');
HttpRequestLogger.prototype.classDescription = 'Http Request Logger XPCOM Component';
HttpRequestLogger.prototype.contractID = '@prekageo/HttpRequestLogger;1';
var NSGetFactory = XPCOMUtils.generateNSGetFactory([HttpRequestLogger]);


кусок лога из файла

Выделить код

Код:

(none) GET http://s3.dotua.org/fsua_items/cover/00/18/73/9/00187342.jpg
(none) GET http://s1.dotua.org/fsua_items/cover/00/37/41/9/00374195.jpg
http://fs.to/video/serials/fl_our/?page=2 GET http://fs.to/video/serials/i4ELKIr7MQTKe8iPEROuVgI-chastnyj-zakaz.html
http://fs.to/video/serials/fl_our/?page=2 GET http://fs.to/video/serials/fl_our/?page=4
(none) GET http://fsua.dotua.org/cssmin/v957992426/default.aimg.min.css
(none) GET http://fsua.dotua.org/cssmin/v245054101/theme-video.aimg.min.css
(none) POST http://q77.queuev4.vk.com/im357
(none) POST http://q77.queuev4.vk.com/im357
(none) GET http://myowndesign.com.ua/mod/vk/DarkSide/upload.gif


Можно ли это сделать как кнопку шобы по нажатии было ВКЛ/ВЫКЛ запись в файл? Оч. удобно при создании фильтров рекламы, изучении сайтов, скачивания видео и прочего. :blush:

Приятным будет даже просто вердикт от гуру со словами:
- ДА можно это сделать в CB. Но мне лень/нихачу/нимагу/нежелаю - но знаю что МОЖНО!  Дерзай одэпт/глупец/соискатель - это возможно в CB 100% искай , мудри, пробуй, учись !
- НЕТ, это низзя сделать средствами CB ибо ... ! [памамушта-патаму] ита  дело доступно только из расширений и именно является Restartless фишкой !
...  :|

HaGEN пишет

мне лень/нихачу/нимагу/нежелаю

Уговорил. Сам поправь, если что не так.

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

Выделить код

Код:

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/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/AwMD/AAAA/wAAAP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBH/isQR/4rEEf+KxBH/isQR/4rEEf+KxBH/isQR/4rEEf+KxBH/isQQAArEEAAKxBAACsQQ%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%29%20%3D%3E%20%7B%0A%09var%20fileName%20%3D%20%22http-request-log.txt%22%3B%0A%09var%20file%20%3D%20Services.dirsvc.get%28%22Desk%22%2C%20Ci.nsIFile%29%3B%0A%09file.append%28fileName%29%3B%0A%0A%09var%20obsId%20%3D%20%22httpRequestLogger%22%3B%0A%09var%20pn%20%3D%20%22CB.%22%20+%20obsId%20+%20%22.on%22%3B%0A%09cbu.isPref%28pn%2C%20false%29%3B%0A%09var%20pref%20%3D%20Application.prefs.get%28pn%29%3B%0A%0A%09function%20obsConstructor%28%29%20%7B%0A%09%09var%20obs%20%3D%20Application.storage.get%28obsId%2C%20null%29%3B%0A%09%09if%20%28%21obs%29%20%7B%0A%09%09%09obs%20%3D%20%7B%0A%09%09%09%09topic%3A%20%22http-on-modify-request%22%2C%0A%09%09%09%09init%3A%20function%28%29%20Services.obs.addObserver%28this%2C%20this.topic%2C%20false%29%2C%0A%09%09%09%09destroy%3A%20function%28%29%20%7B%0A%09%09%09%09%09try%20%7BServices.obs.removeObserver%28this%2C%20this.topic%29%3B%7D%0A%09%09%09%09%09catch%28ex%29%20%7BCu.reportError%28ex%29%3B%7D%0A%09%09%09%09%7D%2C%0A%09%09%09%09observe%3A%20function%28subj%29%20%7B%0A%09%09%09%09%09var%20channel%20%3D%20subj.QueryInterface%28Ci.nsIHttpChannel%29%3B%0A%09%09%09%09%09var%20ref%20%3D%20channel.referrer%20%3F%20channel.referrer.spec%20%3A%20%22%28none%29%22%3B%0A%09%09%09%09%09var%20str%3D%20ref%20+%20%22%20%22%20+%20channel.requestMethod%20+%20%22%20%22%20+%20channel.URI.spec%20+%20%22%5Cr%5Cn%22%3B%0A%09%09%09%09%09str%20%3D%20this.suc.ConvertFromUnicode%28str%29%3B%0A%09%09%09%09%09this.fos.write%28str%2C%20str.length%29%3B%0A%09%09%09%09%7D%2C%0A%09%09%09%09get%20fos%28%29%20%7B%0A%09%09%09%09%09delete%20this.fos%3B%0A%09%09%09%09%09var%20fos%20%3D%20Cc%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.createInstance%28Ci.nsIFileOutputStream%29%3B%0A%09%09%09%09%09//%20PR_WRONLY%20%7C%20PR_CREATE_FILE%20%7C%20PR_APPEND%0A%09%09%09%09%09fos.init%28file%2C%20parseInt%28%220x02%22%29%20%7C%20parseInt%28%220x08%22%29%20%7C%20parseInt%28%220x10%22%29%2C%20-1%2C%200%29%3B%0A%09%09%09%09%09return%20this.fos%20%3D%20fos%3B%0A%09%09%09%09%7D%2C%0A%09%09%09%09get%20suc%28%29%20%7B%0A%09%09%09%09%09delete%20this.suc%3B%0A%09%09%09%09%09var%20suc%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%09%09%09%09%09suc.charset%20%3D%20%22utf-8%22%3B%0A%09%09%09%09%09return%20this.suc%20%3D%20suc%3B%0A%09%09%09%09%7D%0A%09%09%09%09%0A%09%09%09%7D%3B%0A%09%09%09Application.storage.set%28obsId%2C%20obs%29%3B%0A%09%09%09obs.init%28%29%3B%0A%09%09%7D%0A%09%7D%0A%09function%20obsDestructor%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%09reason%20%3D%3D%20%22delete%22%20%26%26%20pref.reset%28%29%3B%0A%09%7D%0A%09addDestructor%28reason%20%3D%3E%20%7B%0A%09%09obsDestructor%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%20obsDestructor%28%22delete%22%29%3B%0A%09%09%7D%2C%20500%29%3B%0A%09%7D%29%3B%0A%0A%09var%20imgON%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/AwMD/AAAA/wAAAP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%09function%20setState%28on%29%20%7B%0A%09%09on%20%3F%20obsConstructor%28%29%20%3A%20obsDestructor%28%22delete%22%29%3B%0A%09%09pref.value%20%3D%20on%3B%0A%09%09var%20src%20%3D%20on%20%3F%20imgON%20%3A%20self.image%3B%0A%09%09var%20en%20%3D%20Services.wm.getEnumerator%28%22navigator%3Abrowser%22%29%3B%0A%09%09while%28en.hasMoreElements%28%29%29%20%7B%0A%09%09%09var%20doc%20%3D%20en.getNext%28%29.document%3B%0A%09%09%09var%20btn%20%3D%20doc.getElementById%28_id%29%3B%0A%09%09%09var%20%5Bimg%5D%20%3D%20doc.getAnonymousNodes%28btn%29%3B%0A%09%09%09if%20%28img%29%20img.src%20%3D%20src%3B%0A%09%09%7D%0A%09%7D%0A%09setState%28pref.value%29%3B%0A%09self.onclick%20%3D%20e%20%3D%3E%20%7B%0A%09%09if%20%28%21e.button%29%20setState%28%21pref.value%29%3B%0A%09%09else%20if%20%28e.button%20%3D%3D%201%29%20file.exists%28%29%20%26%26%20file.launch%28%29%3B%0A%09%7D%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%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

:D Как жеж это прекрасно. Балагодарю Dumby !
Это даже больше чем я надеялся 5a1c754060f577e4f024204bddc81920.gif
... научился только файлы запускать из CB , а тут еще и готовое дали, фантастика! Работает и в PaleMoon эта шикарная кнопка.

HaGEN
:offtopic: Твои предыдущие посты никого не оставили равнодушными. Проникновенные! :D Dumby сдался первый.
Надо взять на вооружение.:)

Перешел с PM24.7 на Cyberfox 37 и обнаружил, что не работает кнопка Add-ons Manager Context Menu. Кто-нибуть сможет помочь?

Можно ли заменить Muter CB-кнопкой

http://yxl.github.io/Firefox-Muter/

foxboy

Почему бы не обойтись вообще без кнопок и расширений?
screenshot%2525202015-06-06%252520001.png

Можно ли сделать кнопку для https://addons.mozilla.org/ru/firefox/addon/export-cookies/?src=api
и если можно в кнопке указать папку сохранения. Или еще лучше сохранять в папку профиля как кнопка "HTTP Request Logger"

turbot пишет

foxboyПочему бы не обойтись вообще без кнопок и расширений?

Потому как портабле, а на ХР этого нет.

foxboy пишет

на ХР этого нет

Сто лет не пользовался, но на 99.999% процентов уверен, что микшер громкости в нем есть.

Про кнопку из muter'а можете забыть - он с бинарниками. Да и он сам скоро отвалится.

:offtopic:
В последних ночнушках можно отключать звук кнопкой на табах (и для html5 и для 19-ой беты флеш-плеера).

11-08-2015 04:27:56

turbot пишет

но на 99.999% процентов уверен

Гугл подтверждает.

turbot пишет

Гугл подтверждает.

Ничего он не подтверждает. Кто-то сказал, что нет микшера, я не говорил. Он есть, но он не умеет регулировать громкость приложений, всего навсего такая мелочь. В 7 есть, это да. Можно вообще подсунуть фальшивый msacm32.dll и звука не будет. Речь об отключении/включении звука с панели браузера.

foxboy
Зачем вообще на браузер навешивать подобный функционал, если можно удобно откл/вкл звук кликом по панели задач. Глобально, функционально, и не захламлять браузер всякой ерундой.
https://irzyxa.wordpress.com/tag/volume2/
или
http://www.nirsoft.net/utils/volumouse.html

foxboy пишет

Он есть, но он не умеет регулировать громкость приложений

А, вот как. Был неправ, извиняюсь. :)

Возникла безумная идея заменить два расширения. Сомневаюсь, что такое возможно, но вдруг. Расширения Gmail Notifier и GKeep Panel. Первое проверяет почту, загружает заголовки, по клику открывает почту во вкладке. Второе по сути просто загружает страницу в дочернем окне. А вдруг возможно?

KOT040188 пишет

заменить два расширения.

Меняются на одно Simple Mail 2.86.7.1-signed.1-let-fixed , в результате при тех-же потребляемых ресурсах имеем почти полноценный почтовый клиент с уведомлением и фильтрами.

Coroner
Неее, google keep этим не заменишь:) К тому же оно не restarless. И мне не нужен полноценный клиент. И не забывайте, что тема о замене расширений кнопками

0281962001455482628.png

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

Browser View Plus (PlayLink)  ? :angel:

Крошка Ру пишет

? :angel:

Открыть страницу в другом браузере из контекстного меню( Firefox 24 + )

mssign, Спасибо - не заметил что обновление было :angel:

Хотя с выпадающим контекстнвм меню не так удобно,но хоть что-то :sick:

Крошка Ру
http://forum.mozilla-russia.org/viewtop … 68#p564168

villa7,Спасибо - снова попробую :) Не вспомню почему отказался :sick:

Есть ли такая кнопка заменяющая Extended Statusbar? Очень хотелось как в Опера сем лет сидел пока хромоподобние не пошли:mad:

Может ли кто-нить сделать кнопку, заменяющую расширения "load tab on select" и "open link in silent tab"? Первое расширение - если включено, то открываемые в фоне вкладки не загружают свое содержимое, пока не переключишься на нее, второе добавляет пункт в контекстное меню ссылок с тем же функционалом.

Здравствуйте. Нуждаюсь в кнопке, которая бы полностью заменяла дополнение TabGroups Menu, включая внешний вид (если внешний вид будет навороченне то ещё лучше)). Можно добавить кончено и многие новые возможности, например вход в группу вкладок, как было в более старых версиях и тд. У кого есть такая кнопка или коды для нее? СПасибо

bugmenot
Артик
Не стоит здесь просить переделать сложные, с большим кол-вом кода и функций, расширения в кнопки. Никто за это не возьмется. Почти наверняка.
Тут стоит просить переделать простенькие аддоны, которое не стоят того, чтобы из него делать отдельный аддон. Либо, допустим, если нужна одна маленькая функция из какого-нибудь комбайна.

turbot пишет

bugmenotАртикНе стоит здесь просить переделать сложные, с большим кол-вом кода и функций, расширения в кнопки. Никто за это не возьмется. Почти наверняка.Тут стоит просить переделать простенькие аддоны, которое не стоят того, чтобы из него делать отдельный аддон. Либо, допустим, если нужна одна маленькая функция из какого-нибудь комбайна.

Тогда помогите приобрести кнопку:

Скрывает/показывает панель дополнений, с учётом того что перезагрузке браузера показывается последнее положение панели дополнения;

15-03-2016 04:22:35

turbot пишет

е стоит здесь просить переделать сложные, с большим кол-вом кода и функций, расширения в кнопки. Никто за это не возьмется. Почти наверняка.
Тут стоит просить переделать простенькие аддоны, которое не стоят того, чтобы из него делать отдельный аддон. Либо, допустим, если нужна одна маленькая функция из какого-нибудь комбайна.

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

Артик пишет

Скрывает/показывает панель дополнений, с учётом того что перезагрузке браузера показывается последнее положение панели дополнения;

Для начала, в фф уже давно нет панели дополнений. И для того, чтобы что-то сделать, надо написать, от какого она дополнения. И подобная кнопка уже есть: Спрятать панель дополнений. Но в ней вам придется править селекторы на свои, поскольку #addon-bar уже нет.

например, у меня так, под панель от CTR:

Выделить код

Код:

// Спрятать панель дополнений

this._handleClick =()=> cbu.setPrefs(s, !cbu.getPrefs(s));
var right = 4; // отступ справа в px  

var s = 'CB.hideAddonBar';

function toggleButton() {   
   var val = cbu.getPrefs(s);   
   document.getElementById("ctraddon_addon-bar").setAttribute('hideElements', val );     
    
   var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon");
   icon.style.transform = val ? "rotate(180deg)" : "";   // перевернуть иконку
   
   self.tooltipText = val ? 'Показать панель дополнений' : 'Спрятать панель дополнений';     
};
toggleButton();
gPrefService.addObserver( s, toggleButton, false );
addDestructor(function() { gPrefService.removeObserver( s, toggleButton, false ) });


// Стиль для панели дополнений  ................................
var uri = makeURI('data:text/css,'+ encodeURIComponent('\
/* минимальный и прозрачный */\
#ctraddon_addon-bar {\
bottom: 0;\
margin: 0;\
border-color: transparent!important;\
width: auto;\
height: 24px!important;\
max-height: 24px!important;\
min-height: 24px!important;\
position: fixed!important;\
padding-right: 4px;\
right: ' + right + 'px;\
background: transparent !important;\
z-index: 2147483647 !important;\
}\
#ctraddon_addon-bar toolbarbutton {\
-moz-appearance:toolbarbutton!important;\
vertical-align: middle !important;\
height: 24px!important;\
max-height: 24px!important;\
min-height: 24px!important;\
max-width: 22px!important;\
}\
#ctraddon_addon-bar toolbarbutton > .toolbarbutton-icon{\
max-width: 18px!important;\
}\
#ctraddon_addon-bar dropmarker {\
width: 15px!important;\
max-width: 15px!important;\
min-width: 15px!important;\
}\
/* если открыть настройку инструментов */\
#ctraddon_addon-bar[customizing] {\
background: -moz-Dialog;\
border-radius: 7px 0 0 0;\
visibility: visible !important;\
}\
/* убираем лишние элементы, убираем кнопки при добавлении атрибута hideElements */\
#ctraddon_addon-bar-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-icon,\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] statusbarpanel,\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] toolbaritem,\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] toolbarbutton:not([id="' + _id + '"]):not([id=custombuttons-button30]),\
#ctraddon_addon-bar:not([customizing])[hideElements="true"] #UserScriptLoader-icon {\
display: none !important;\
}\
\
#ctraddon_statusbar > statusbar > statusbarpanel:not([customizing]) {\
position: relative;\
margin-right:-4px;\
margin: 0 !important;\
padding: 0 !important;\
width: auto;\
height: 24px!important;\
max-height: 24px!important;\
min-height: 24px!important;\
}\
'));
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
setTimeout(()=> sss.loadAndRegisterSheet(uri, sss.USER_SHEET), 300);
addDestructor(function() { sss.unregisterSheet(uri, sss.USER_SHEET) });


В поиске селекторов поможет DOM Inspector + [CB] Attributes Inspector (для разработчиков)

Артик пишет

Вот к тем я и обращаюсь.

Да ради бога. Я просто пытался вам сэкономить время и силы. :)

turbot пишет

bugmenot
Артик
Не стоит здесь просить переделать сложные, с большим кол-вом кода и функций, расширения в кнопки. Никто за это не возьмется. Почти наверняка.
Тут стоит просить переделать простенькие аддоны, которое не стоят того, чтобы из него делать отдельный аддон. Либо, допустим, если нужна одна маленькая функция из какого-нибудь комбайна.

Эти расширения мелкие, функция у каждого ровно одна, даже настроек нет. Поскольку функционал похож, но не пересекается, в одной кнопке две этих функции (по одной из каждого расширения) вполне уживутся.

turbot пишет

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

+1

del

Помогите пожалуйста если можно достать из набора для ютуба YouTube Center
Функцию остановки автовоспроизведения. В разделе "плеер" - вкладка "автоплей" - функция "отключить автоплей видео".

Stakhovsky
media.autoplay.enabled;false

turbot:)
да я плюнул на HTML5 Video Everywhere!, решил пользоваться стандартным ютубовским плеером.
Иначе встроеные видео невозможно смотреть, названия нет, перейти на ютуб нельзя.
Для стандартного перепробовал все дополнения которые останавливают автоплей. Толковое только FlashStopper(оно работает и на html5)
Но обратно убирает название со встроеных видео.
Остался только YouTube Center только весь этот комбайн ставить ради остановки автоплея как то печально.

Magic actions for youtube корректно останавливает воспроизведение для любых плееров youtube.

KOT040188
Дайте ссылку пожалуйста.

К сожалению на AMO они расширение не держат. Не знаю почему. Ищите их сайт. Поиск рулит.

KOT040188
Я нашел, но нигде не могу скачать.
https://forum.mozilla-russia.org/viewtopic.php?id=53300
Все ссылки ведут на http://www.chromeactions.com/ который не работает.
Если у вас есть, не могли бы загрузить куда нибудь пожалуйста?

Это и есть их сайт. Но что-то вместо сайта с настройками во фрейме меня перебрасывает на resource://magicactions/opt6888.html?s=68827 и показывает настройки во весь экран. Что-то у них поломалось. Но расширение пока работает корректно. Раньше они часто обновляли расширение в связи с изменениями на youtube. Теперь не знаю… Расширение у меня сто лет стоит.

KOT040188
А вы бы не могли пожалуйста загрузить файл который у вас стоит?
Установленные расширения находятся по этому адресу:
C:\Users\Имя пользователя\AppData\Roaming\Mozilla\Firefox\Profiles\Папка профиля(eeyhp1hn.default)\extensions

27-05-2016 14:40:10
Только там в папке extensions не все подписаны, неподписанные определить можно если перетащить в окно браузера, он предложит окно установки с названием, можно прочитать название и нажать отмена.

27-05-2016 14:44:04
KOT040188
Все, нашел, спасибо.
http://www.computerbild.de/?dl=1

27-05-2016 14:45:32
KOT040188
А у вас версия 6.8.8.8?

Я знаю где это находится, но там сего несколько штук с осмысленными названиями, остальные с набором цифр…

KOT040188
Сегодня 15:37:09

Stakhovsky пишет

Только там в папке extensions не все подписаны, неподписанные определить можно если перетащить в окно браузера, он предложит окно установки с названием, можно прочитать название и нажать отмена.

Вы уж извините, но я этим заниматься не хочу;)

Stakhovsky пишет

KOT040188А у вас версия 6.8.8.8?

Да.

Stakhovsky
https://rgho.st/7L5YsHjsC

KOT040188
rgdru
Поставил. Проверил. Спасибо!! То что нужно.

Можно ли заменить эти расширения кнопками CB?
https://addons.mozilla.org/ru/firefox/a … r-youtube/
https://addons.mozilla.org/en-US/firefo … nd-resume/

За кнопки не знаю,а для greasemonkey есть что то подобное
https://greasyfork.org/ru/scripts/4870-maximize-video
http://userscripts-mirror.org/scripts/show/58720

Rag, хотелось бы для CB, greasemonkey не установлен...

becool пишет:
хотелось бы для CB, greasemonkey не установлен...

Этим в полне можно заменить greasemonkey.Пусть не на все 100% но всё же.

Пора этой теме снова воскресать, так как, связи с переходом на FF57 много расширений отвалилось, а Custom Buttons стараниями  наших уважаемых форумчан продолжает жить.
Многие скрипты в новой версии Greasemonkey  для FF57 работают не коректно, а в Custom Buttons эти скрипты в основном идут без проблем
Вот пример - скрипты которые работают в Custom Buttons (нарыл на просторах интернета для FF57 на замену некоторых функций в устаревших расширениях Status -4-Evar и LocationBar)

1. Цветная полоса загрузки в адресной строке при загрузке страниц

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

Выделить код

Код:

//Полоса загрузки в адресной строке, цвет меняется в стиле от звездочки до звездочки
(function(){
    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, rgba(255,255,255,0) 0%, rgba(17,238,238,.7) 100%);
                background-size:0 0;
                background-repeat:repeat-x, no-repeat;
                transition: background-size 350ms ease 0s !important;
            }
            #urlbar:not([style="background-size: 0% 100%;"]) {
                animation: progress-bar-stripes 2s linear infinite;
            }
            @-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,
      };
    }

})();


2.Подчеркивание различных частей адреса в адресной строке и переход по ним
скрытый текст

Выделить код

Код:

//Подчеркивание домена

(function () {
        if (location != "chrome://browser/content/browser.xul") return;
        var URLBarInput = gURLBar.mInputField;
        var locationBar = URLBarInput.parentNode.appendChild(document.createElement("hbox"));
        locationBar.style.display = "none";
        URLBarInput.parentNode.addEventListener("click", function () {
            if (URLBarInput.style.display === "none") {
                URLBarInput.style.display = "";
                locationBar.style.display = "none";
                gURLBar.select();
            }
        }, false);
        URLBarInput.parentNode.addEventListener("mouseout", function () {
            if (document.activeElement !== gURLBar.inputField) {
                locationBar.style.display = "none";
                URLBarInput.style.display = "";
                gURLBar._urlTooltip && gURLBar._hideURLTooltip();
            }
        }, false);
        URLBarInput.addEventListener("mouseover", function (event) {
            if (event.ctrlKey || document.activeElement === gURLBar.inputField) {
                return;
            }
            locationBar.parentNode.removeChild(locationBar);
            locationBar = URLBarInput.parentNode.appendChild(document.createElement("hbox"));
            locationBar.style.overflow = "hidden";
            locationBar.style.width = URLBarInput.clientWidth + "px";
            gURLBar.value.split("?")[0].split("/").map(function (value, index, arr) {
                return index + 1 === arr.length ? (gURLBar.value.split("?")[1] ? (value + "?" + gURLBar.value.split("?")[1]) : value) : value;
            }).map(function (value, index, arr) {
                var sec = locationBar.appendChild(document.createElement("label"));
                sec.style.margin = 0;
                sec.value = value;
                if (index < arr.length - 1) sec.value = value.replace(/[^\/]$/, "$&/");
                index === 0 && (sec.style.marginLeft = "1px");
                if (index === 0 && /:\/$/.test(sec.value)) {
                    sec.value += "/";
                } else {
                    sec.onmouseover = function () {
                        this.style.textDecoration = "underline";
                        this.style.cursor = "pointer";
                    }
                    sec.onmouseout = function () {
                        this.style.textDecoration = "";
                    }
                    sec.onclick = function (event) {
                        if (event.button === 0) {
                            loadURI(URLBarInput.value.split(this.value)[0] + this.value);
                            while (this.nextSibling) {
                                this.nextSibling.parentNode.removeChild(this.nextSibling);
                            }
                            event.stopPropagation();
                        }
                    }
                    URLBarInput.style.display = "none";
                    locationBar.style.display = "";
                }
            })
        }, false);
    })();


3. Осталось найти, может кто поможет, средствами кнопок или стилями
-  выделение домена другим цветом в адресной строке
- создание адонбара
- переноса кнопки Reload в адресную строку

Andrey_Krropotkin пишет

Подчеркивание различных частей адреса в адресной строке и переход по ним

вау! сенькью

Andrey_Krropotkin пишет

3. Осталось найти, может кто поможет, средствами кнопок или стилями
- создание адонбара

'Classic' CSS tweaks for Firefox 57+ - внутри архива есть файл userChrome.css. Начиная со строки 355 (версия 1.5.2) описывается создание аддон-бара. Если раскомментировать строку 361, в нижней части главного окна появляется эта самая панель, сам пользоваться ей не пробовал

Andrey_Krropotkin пишет

- переноса кнопки Reload в адресную строку

Наверное, не совсем по теме, но существует дополнение - Reload in address bar. И делает оно то, о чём Вы спрашиваете

Andrey_Krropotkin пишет

Цветная полоса загрузки в адресной строке при загрузке страниц

Отличная замена прогрессбара :) Объясните, если можно, подробнее - как поменять цвет заливки? Для определённости - основной цвет Hex #80ff80, rgb(128, 255, 128). Спасибо

Viatcheslav
1. Поменять цвет заливки можно в 5 строке background-image, меняйте значения rgba, эксперементируйте.
2. Дополнение ради одной кнопки - это несерьезно
3. Про аддон-бар - я в курсе про этот ресурс, но как я понял, там имитация, а не полноценная замена, т.е. нельзя переносить эту панель ничего, только вручную прописывать в стиле, что не очень хорошо. Если я не прав, то поправьте.

Нашел у alice0775 скрипт
Его смысл - создает в конце адресной строки дополнительную панель, на которую можно перемещать любые кнопки, в том числе и Feed-buton и  Stop-Reload-buton
Вот что получилось

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

Выделить код

Код:

/*Initialization Code*/

  var addToolbarInsideLocationBar = {
     init: function() {

            const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        Components.utils.import("resource:///modules/CustomizableUI.jsm");
    
        //создаем toolbar
        let toolbar = document.createElementNS(kNSXUL, "toolbar");
        toolbar.setAttribute("id", "ucjs-Locationbar-toolbar");
        toolbar.setAttribute("customizable", "true");
        toolbar.setAttribute("mode", "icons");
        toolbar.setAttribute("iconsize", "small");
        toolbar.setAttribute("context", "toolbar-context-menu");
        toolbar.setAttribute("class", "toolbar-primary chromeclass-toolbar customization-target");
        toolbar.setAttribute("fullscreentoolbar", "true");
        toolbar.setAttribute("toolbarname", "Панель в LocationBar");
        toolbar.setAttribute("toolboxid", "navigator-toolbox");
        toolbar.setAttribute("hidden", "true");
        setTimeout(function(){toolbar.removeAttribute("hidden");}, 0)
         // блокировать дублирование пункта при открытии настройки панелей
           if ( document.getElementById("ucjs-Locationbar-toolbar") ) return;
                
     //регистрируем toolbar.id
        if (CustomizableUI.getAreaType("ucjs-Locationbar-toolbar")) {
        } else
          try {
            CustomizableUI.registerArea("ucjs-Locationbar-toolbar", {
              type: CustomizableUI.TYPE_TOOLBAR,
               defaultPlacements: ["feed-button"]
            });
          } catch(e) {}
    
        let ref = this.getInsertPoint();
        ref.appendChild(toolbar);
        gURLBar.onDrop_addToolbarInsideLocationBar = gURLBar.onDrop;
        gURLBar.onDrop = function(event) {
          var toolbar = document.getElementById("ucjs-Locationbar-toolbar");
          var target = event.originalTarget;
          while(target) {
            if (target == toolbar) {
              return;
            }
            target = target.parentNode;
          }
          
          gURLBar.onDrop_addToolbarInsideLocationBar(event);
        };
        window.addEventListener("beforecustomization", this, true);
       // BookmarkingUI._updateCustomizationState();
      },
    
      getInsertPoint: function() {
        return (document.getElementById("urlbar-icons")
                || document.getElementById("page-action-buttons")
               );
      },
    
       handleEvent: function(event) {
        let toolbar = document.getElementById("ucjs-Locationbar-toolbar");
        switch(event.type) {
            case "beforecustomization":
            window.addEventListener("customizationending", this, false);
            this.placeholder = toolbar.parentNode.insertBefore(document.createElement("hbox"), toolbar);
            let ref = document.getElementById("nav-bar-customization-target");
            toolbar.setAttribute("tooltiptext", "Toolbar inside LocationBar");
            ref.parentNode.insertBefore(toolbar, ref);
            break;
            case "customizationending":
            window.removeEventListener("customizationending", this, false);
            this. placeholder.parentNode.replaceChild(toolbar, this. placeholder);
            toolbar.removeAttribute("tooltiptext");
            break;
        }
       }  
    };
  addToolbarInsideLocationBar.init();


Особенность в том, что кнопки надо добавлять в следующем порядке:
1. Открываем вкладку "Настройка Firefox" (где находятся все значки)
2. В левой части Nav-bara появляется эта панель и на нее перетаскиваем или удаляем нужные кнопки
Вот картинки
скрытый текст

Andrey_Krropotkin пишет

3. Про аддон-бар - я в курсе про этот ресурс, но как я понял, там имитация, а не полноценная замена, т.е. нельзя переносить эту панель ничего, только вручную прописывать в стиле, что не очень хорошо. Если я не прав, то поправьте.

Да, всё верно. Я пробовал эту панель включать, но после появления кнопки на неё обычным "перетаскиванием" не переносятся - чистейшая эмуляция

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

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

Выделить код

Код:

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, rgba(255,255,255,0) 0%, rgba(17,238,238,.7) 100%);
                background-size:0 0;


За цвет отвечает параметр rgba(17,238,238, .7) - тут разобрался. А вот как отключить анимацию справа-налево (возврат шкалы в исходное положение) или сделать её полностью прозрачной - не пойму :blush:

Andrey_Krropotkin пишет

3. Осталось найти, может кто поможет, средствами кнопок или стилями
- создание адонбара

Если я вас правильно понял, то посмотрите здесь: https://forum.mozilla-russia.org/viewto … 46#p748946

unter_officer пишет

то посмотрите здесь: https://forum.mozilla-russia.org/viewto … 46#p748946

Там такой же вариант эмуляции, а именно

Andrey_Krropotkin пишет

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

Viatcheslav Я сам пока не разбирался, но вот посмотрите на статью где расписано все про linear-gradient

Viatcheslav пишет

а именно

https://forum.mozilla-russia.org/viewtopic.php?pid=748946#p748946
Все переносится через персонализацию.

mssign пишет

https://forum.mozilla-russia.org/viewtopic.php?pid=748946#p748946
Все переносится через персонализацию

Да, прошу прощение :blush: Или свой какой-то стиль блокировал, или версия панели ещё до исправления была... Короче, на чистом userChrome.css из архива Vitaliy V. аддон-бар включается, кнопки переносятся :)

ViatcheslavПопробуй этот вариант

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

Выделить код

Код:

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;
                    }
            #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|.+$/,"");


где заливка #33FF66 0%- от какого цвета, #33FF66 100% - до какого

Andrey_Krropotkin пишет

ViatcheslavПопробуй этот вариант

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

Выделить код

Код:

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;
                    }
            #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|.+$/,"");

Вообще не работает - по краней мере, никакого прогресс-бара в адресной строке нет :(

Viatcheslav Я выложил кусок кода для замены в старом коде, а не для замены всего кода
Вот весь код кнопки

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

Выделить код

Код:

//Полоса загрузки в адресной строке
 
(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,
      };
    }

})();

Andrey_Krropotkin пишет

Я выложил кусок кода для замены в старом коде, а не для замены всего кода

Семён Семёныч, а я даже и не посмотрел :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,
      };
    }

})();

Ну так это совсем другое дело :) Благодарствую премного :beer:

UPDATE

Andrey_Krropotkin
, не сочтите за дерзость - а можно добавить отображение степени загрузки страницы в %, как здесь - https://www.w3schools.com/howto/tryit.a … r_label_js? Для удобства метка пропадает в конце загрузки страницы вместе с прогресс-баром. Это было бы близким к совершенству :blush:

Viatcheslav Не получается. Проценты накладываются на адрес и потом висят в адресной строке. Спросите у более опытных.

Andrey_Krropotkin пишет

Не получается. Проценты накладываются на адрес и потом висят в адресной строке. Спросите у более опытных

Спасибо за Ваши старания и труды, в существующем варианте прогресс-бар очень даже хорош ;) И с нюансами разберёмся :)

В таких расширениях, как OmniSidebar и All-in-One Sidebar есть удобный переключатель боковой панели - несколько пикселей по левому краю окна.
Причем, в OmniSidebar он реализован очень грамотно: голубая полоска переключателя становится видимой только после наведения курсора на область переключателя.
Не мог бы кто-нибудь сделать кнопку, чтоб был такой же переключатель боковой панели, как в OmniSidebar ?
А саму боковую панель можно было бы, наверное, реализовать стилем, как вот тут предложено: https://forum.mozilla-russia.org/viewto … 19#p721919
Или эти мои необузданные фантазии совсем мимо кассы? :)

Есть такое расширение ImageToolbar. Очень полезное для тех, кто часто и много сохраняет изображения. Естественно, оно не работает на квантуме. Замены нет. Есть ли возможность изобразить что-то подобное с СВ? То есть, появляющиеся кнопки при наведении на картинку. Хотя бы сохранить и копировать адрес. И сохранить с открытием диалога сохранения.

css
ты еще не пользуешься Imagus shok.gif  ненадатак...
ну и к нему Save In…   настроил путя и сохраняй полноразмерные картинки, не заходя на страницу. доп. фильтры Imagus от Rodny на руборде

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

css пишет

Очень полезное для тех, кто часто и много сохраняет изображения.

css пишет

но сохранение в заранее заданные папки – не вариант. Нужен именно диалог для сохранения каждой картинки.

- Ваш Porsche плохой, потому что не торохтит и нету прЫцепа
- но тебеж ведь в гонках учавствовать, тыж на трассе ?!
- нихачу, дайте мне мой жигулёнок

Л

mokujin пишет

- Ваш Porsche плохой, потому что не торохтит и нету прЫцепа
- но тебеж ведь в гонках учавствовать, тыж на трассе ?!
- нихачу, дайте мне мой жигулёнок

Смысл этого? Или Вы считаете, что то, как Вы пользуетесь браузером – единственный вариант? Ок. По Вашей же аналогии: мне нужен внедорожник для сложной местности. Порш сдохнет на первом же километре.

Нужна замена расширения Star-Button In Urlbar, оно показывает в строке адреса иконку-Звёздочку. При нажатии на иконку адрес добавляется в избранное и белая иконка станет жёлтой.

Искал по форуму, но для строки адреса есть только [CB]Zoom, может кто-то делал такую кнопку?

Dobrov пишет

Нужна замена расширения Star-Button In Urlbar, оно показывает в строке адреса иконку-Звёздочку. При нажатии на иконку адрес добавляется в избранное и белая иконка станет жёлтой.

Искал по форуму, но для строки адреса есть только [CB]Zoom, может кто-то делал такую кнопку?

Есть аддон Add Bookmark Here ² – Дополнения для Firefox, правда не для вебэкстенсион

difabor пишет

Есть аддон Add Bookmark Here ²

…Сабж… зачем мне расширение, как сделать [CB] кнопку - замену Star-Button In Urlbar?

Dobrov пишет
difabor пишет

Есть аддон Add Bookmark Here ²

…Сабж… зачем мне расширение, как сделать [CB] кнопку - замену Star-Button In Urlbar?

Ради бога, не надо - и на здоровье.
Тогда подождите, когда кто-то исполнит Ваш заказ.

https://forum.mozilla-russia.org/viewtopic.php?pid=632733#p632733
Перестала кнопка у меня кнопка работать в ESR52. Есть два профиля отличаются тем что один с Гизманки, второй с Тампреманки. В первом работает, во втором нет.