Cookies Permissions 0.2.0.1 (2013-05-14)
Совместимость: [firefox] Firefox, [seamonkey] SeaMonkey
Автор: Infocatcher
Описание: позволяет быстро открыть список исключений для куков, открыть список самих куков, в 1-2 клика добавить просматриваемый сайт в исключения, также по таймеру удаляет все незащищённые (то есть все, кроме разрешенных в списке исключений) куки.

cookiesPermissions-ru.png

Установить: cookiesPermissions.html

Исходный код, инициализация: cookiesPermissions.js

Тестовая версия, будьте осторожны!

Разрабатываемая версия

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

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

И тут я нашёл эту кнопку Cookies Permissions - это просто праздник какой-то!

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

Хотелось бы немного.

1. Отключить таймер и автоматическое удаление кукисов (подскажите где подправить?)

2. Картинка-статус кукисов имеет в данный момент четыре положения:

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

- если сайта нет в списке исключений, то показывается состояние Default.

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

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

Ещё раз спасибо за отличную кнопку! Надеюсь, автор посчитает моё предложение по изменению поведения кнопки разумным :)

Zhorik пишет

Насколько я понимаю, CB-кнопки не могут сохранять свои настройки (в файл или ещё куда-то)

Могут. Просто нет API для простого добавления настроек, так что или в about:config править придется, или нужно писать дополнительный код.
В общем, мне как-то лень. :)

Zhorik пишет

Но вот если поместить некие константы в начало программы и юзер смог бы их править ручками - возможно это было бы решением для индивидуальных настроек?

Такие настройки уже есть:

Выделить код

Код:

this.options = {
    removeUnprotectedCookiesInterval: 30*60*1000, // -1 for disable
    useBaseDomain: false // Use google.com instead of www.google.com
};

и в разрабатываемой версии:

Выделить код

Код:

var options = {
    removeUnprotectedCookiesInterval: 30*60*1000, // -1 to disable
    removeAllUnprotectedCookies: false,
    useBaseDomain: { // If set to true, will use short domain like google.com instead of www.google.com
        addPermission: false,
        openPermissions: false,
        showCookies: true,
        removeCurrentSiteCookies: true,
        preserveCurrentSiteCookies: true
    },
    prefillMode: 1, // 0 - move caret to start, 1 - select all, 2 - move caret to end
};

В частности,

Zhorik пишет

1. Отключить таймер и автоматическое удаление кукисов

– это

removeUnprotectedCookiesInterval: 30*60*1000, // -1 to disable

Zhorik пишет

Нельзя ли в качестве картинки показывать фактическое состояние кукисов для текущей страницы?

Это не реализовано, но сделать можно.

Infocatcher пишет

Такие настройки уже есть:

Выделить код

Код:

this.options = {
    removeUnprotectedCookiesInterval: 30*60*1000, // -1 for disable
    useBaseDomain: false // Use google.com instead of www.google.com
};

Вечный праздник! :)

Zhorik пишет

Нельзя ли в качестве картинки показывать фактическое состояние кукисов для текущей страницы?

Это не реализовано, но сделать можно.

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

Нельзя ли ещё сделать, чтобы при left-click мышью проходились по кругу все состояния Default->Session->Allow->Block? В настоящий момент сделано Default->Allow. Приходится лезть в меню по right-click и выбирать Session. Я думаю, это имело бы смысл, т.к. сценарий использования браузера "Block all cookies, but allow session cookies for selected sites" достаточно распространён.

Zhorik пишет

чтобы при left-click мышью проходились по кругу все состояния Default->Session->Allow->Block?

Есть же контекстное меню со всеми этими пунктами.

Zhorik пишет

В настоящий момент сделано Default->Allow.

Это задается в

Выделить код

Код:

this.onclick = function(e) {
    ...
    if(but == 0 && !hasModifier) {
        this.permissions.togglePermission(this.permissions.cp.ACCESS_ALLOW);

Там три варианта значений: ACCESS_DENY, ACCESS_SESSION и ACCESS_ALLOW.


Приделал нечто вроде: https://github.com/Infocatcher/Custom_B … b91cdf127e
Только вот рисование иконок не по моей части, так что тупо берутся старые с осветлением.
И еще там не очень очевидно с настройками по умолчанию:
network.cookie.cookieBehavior
network.cookie.lifetimePolicy
«The user is prompted for the cookie's lifetime» в результате считается за ACCESS_ALLOW.


Итого:
Cookies Permissions 0.2.0pre9 (2012-09-03)
[+] Добавлена возможность отображать политику по умолчанию (настройка "showDefaultPolicy").

Zhorik пишет

Нельзя ли ещё сделать, чтобы при left-click мышью проходились по кругу все состояния Default->Session->Allow->Block? В настоящий момент сделано Default->Allow. Приходится лезть в меню по right-click и выбирать Session. Я думаю, это имело бы смысл, т.к. сценарий использования браузера "Block all cookies, but allow session cookies for selected sites" достаточно распространён.

Не поддерживаю! Будет очень неудобно! Для этого используй контекстное меню.

Мне кажется или ссылки на тестовую версию и стабильную совпадают?

angryCat пишет

Мне кажется или ссылки на тестовую версию и стабильную совпадают?

Кажется
http://infocatcher.ucoz.net/js/cb/cookiesPermissions.js
http://infocatcher.ucoz.net/js/cb/cookiesPermissions-test.js

А что насчет DOM Storage куков? Я не знаю ни одного расширения которое позволяет управлять ими. На странице about:permissions есть пункт который можно ставить в спрашивать/разрешать/блокировать. И есть расширение которое позволяет просматривать/удалять/изменять их:

Foundstone HTML5 Local Storage Explorer — позволяет управлять содержимым локального хранилища HTML5 (HTML5 Local Storage, DOM Storage) — просматривать, удалять, изменять. Это не флэш куки (LSO), а аналог обычных куков с расширенными возможностями.

Можете взять оттуда код и обьединить с вызовом функций со страницы about:permissions?

Кстати, не плохо бы было, если с помощью кнопки можно изменять куки.

Кстати, не плохо бы было, если с помощью кнопки можно изменять куки.

Это уже не сюда. Обсуждаемая чудесная кнопка делает не более, чем может сам браузер (на самом деле чуть больше). Т.е. фактически стандартные функции браузера вынесены в отдельную удобную кнопку. И это есть гуд!

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

okkamas_knife пишет

поставить пару тройку точек в нём вообще без проблем.

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

angryCat пишет

А что насчет DOM Storage куков?

Во-первых, это нужно совсем другую кнопку делать – как-то я плохо представляю как отображать и удобно переключать сразу два вида разрешений. А во-вторых, там же «всегда спрашивать» по умолчанию. Так часто спрашивает?

angryCat пишет

Кстати, не плохо бы было, если с помощью кнопки можно изменять куки.

Это вряд ли. И приделывать полноценный редактор из кнопки не очень-то удобно.
Неужели нет ни одного расширения, улучшающего встроенный просмотровщик печенек?
А даже если свое окно используется, можно его же и вызывать вместо встроенного.

Только что опробовал последний вариант кнопки. Прозрачные значки для Default-состояний - это просто гениально! Поставил кнопку на постоянное использование. Спасибо!

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

Думаю, можно ещё немного улучшить несколько непринципиальных мелочей, если автор сочтёт это разумным.

1. Заменить слово Deny на Block. В настройках браузера используется именно термин Block Cookies.

2. Добавить комментарии к опциям в useBaseDomain. Сразу было трудно разобраться, что означает каждая переменная - пришлось просматривать программу :)

3. Внести опции для скрытия/показа пунктов контекстного меню. Например, для отключения пунктов Remove*.

4. Пункты Remove* назвать точнее (поначалу проходится долго ломать голову). В названии всех пунктов использовать уточнения вроде "for current site only", "all sites include current site", "all sites except current site".

Кстати, можно пояснить, что означает "protected cookies"? Методом тыка точно определить не удалось. Сначала думал, что это кукисы, внесённые в список исключений, но потом вроде бы оказалось, что нет.

P.S. Не надо больше точек! Прозрачные значки для Default-состояний - просто гениальное решение!

Zhorik пишет

1. Заменить слово Deny на Block. В настройках браузера используется именно термин Block Cookies.

Согласен.

Zhorik пишет

2. Добавить комментарии к опциям в useBaseDomain. Сразу было трудно разобраться, что означает каждая переменная - пришлось просматривать программу :)

Да, надо. Осталось только понятно сформулировать. :)

Zhorik пишет

3. Внести опции для скрытия/показа пунктов контекстного меню. Например, для отключения пунктов Remove*.

Можно их скрыть:

<menuitem\
                    cb_id="removeCurrentSiteCookies"\
                    collapsed="true"\
                    oncommand="this.parentNode.parentNode.permissions.removeCurrentSiteCookies();"\
                    label="' + _localize("removeCurrentSiteCookiesLabel") + '"\
                    accesskey="' + _localize("removeCurrentSiteCookiesAccesskey") + '" />\

Zhorik пишет

4. Пункты Remove* назвать точнее (поначалу проходится долго ломать голову). В названии всех пунктов использовать уточнения вроде "for current site only", "all sites include current site", "all sites except current site".

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

Zhorik пишет

что означает "protected cookies"? Методом тыка точно определить не удалось. Сначала думал, что это кукисы, внесённые в список исключений, но потом вроде бы оказалось, что нет.

Остаются только внесенные в список исключений как «разрешить».
Но при «removeAllUnprotectedCookies: false» не будут удалены cookies с открытых сайтов, при этом работает useBaseDomain.preserveCurrentSitesCookies.

Infocatcher
Google.ru внес в защищенные, при очистке всех незащищенных куков заставляет заново войти, уже добавил страницу авторизации и google.com, все равно логиниться по новой заставляет, не критично, но может я что не так делаю.

villa7 пишет

Google.ru внес в защищенные, при очистке всех незащищенных куков заставляет заново войти

У гугла выставляются cookies с доменом «.google.ru», так что в исключениях должен быть «google.ru», а не «www.google.ru».
С разрешением для «google.ru» у меня не воспроизводится.

04-09-2012 14:22:10
Пока вот так:
Add support for Cookies Manager+ extension
Correct English locale to match terminology of built-in exceptions dialog
Fix accesskey in English locale
Improve descriptions

Infocatcher

Происходит странное! Написал removeUnprotectedCookiesInterval: -1.

В стабильном релизе работает как надо. Т.е. никакие кукисы по таймеру не стираются. В последней версии, стираются время от времени все кукисы, кроме сайтов Allow в exception list!

Нельзя ли проверить?


P.S. Ну точно! Пришёл с обеда, кукисы потёрты, с форума выкинуло!

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

04-09-2012 15:47:53
Воспроизвести у меня не получается, но можно попробовать добавить распорку:
Ensure Application.storage available

Infocatcher

В общем, перестартовал браузер и всё стало нормально (кукисы больше не автоудаляются). Кстати, я бы по умолчанию эту фичу выключил. У непродвинутых пользователей могут возникнуть проблемы (особенно, если невнимательно прочитать описание кнопки и не узнать про наличие фичи автоудаления). А продвинутые пользователи сами включат :)

Вероятно, "баго-фича" была связана с:
* Удаление незащищенных cookies по таймеру теперь использует один глобальный таймер для всех окон.

Я действительно редактировал кнопку "по живому" и, видимо, таймер оставался после самого первого запуска.


Нельзя ли заодно пояснить на счёт самого Custom Buttons. Давно не заходил на addons.mozilla.org. А сегодня смотрю - есть какой то "Custom Buttons 2" - это плагиат, дериват или принципиально другое расширение?

Можно ли CB-кнопку засунуть вниз в статус-бар? Было бы очень полезно разместить Cookies Permissions рядом с иконкой NoScript в статус-баре. Нашёл расширение с подходящим названием Status-Bar Custom Buttons, но ещё не пробовал, будет ли оно работать с  CB-кнопками.

Zhorik пишет

Кстати, я бы по умолчанию эту фичу выключил.

Да, пожалуй.
Просто изначально, кажется, просили именно удаление по таймеру. :)

Zhorik пишет

Вероятно, "баго-фича" была связана с:
* Удаление незащищенных cookies по таймеру теперь использует один глобальный таймер для всех окон.

Да, вероятно. Но повторить у меня не получается.

Zhorik пишет

Можно ли CB-кнопку засунуть вниз в статус-бар?

Можно, но только в Firefox.

Zhorik пишет

Нашёл расширение с подходящим названием Status-Bar Custom Buttons, но ещё не пробовал, будет ли оно работать с  CB-кнопками.

Если там не реализован this.onDestroy = ... , могут быть утечки памяти. И после редактирования надо будет перезапускаться.
В этой конкретной кнопке будет еще ругаться на cbu.getPrefs().


Zhorik пишет

Нельзя ли заодно пояснить на счёт самого Custom Buttons. Давно не заходил на addons.mozilla.org. А сегодня смотрю - есть какой то "Custom Buttons 2" - это плагиат, дериват или принципиально другое расширение?

Custom Buttons 2 – это продолжение альфа-версии Custom Buttons.
Автор оригинального расширения прекратил разработку, потом другие авторы сделали Custom Buttons², а потом Anton взялся за разработку оригинальной версии.

okkamas_knife пишет

и в симанке тоже работает

Я про встроенную возможность размещать кнопки в строке состояния.

okkamas_knife пишет

navBar.insertBefore(appButton, navBar.lastChild);

Будет две инициализации, кстати. :)

[Custom Buttons: id: custombuttons-button7@init, line: 1, name: ]
init
----------
[Custom Buttons: id: custombuttons-button7@init, line: 4, name: ]
destroy
----------
[Custom Buttons: id: custombuttons-button7@init, line: 1, name: ]
init
----------
[Custom Buttons: id: custombuttons-button7@init, line: 4, name: ]
destroy

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

[Custom Buttons: id: custombuttons-button7@init, line: 4, name: ]
destroy

Хорошая кнопка! Готов принять участие в тестировании. Допинайте, плиз, чтобы была настройка, засовывать кнопку в статус-бар или стандартным для CB способом выносить на панель инструментов.

Infocatcher

Будет две инициализации, кстати.

Вот тут я вообще не понял. Способ включения иконки в статус-бар от okkamas_knife будет приводить к нежелательным последствиям?

Из треда не совсем понятно, что же самое актуальное на сегодняшний момент: CB или CB2?

Kaban
Допилить надо SeaMonkey до состояния Firefox. :)

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

05-09-2012 02:56:41
Вот так можно перенести:

Выделить код

Код:

this.classList.remove("toolbarbutton-1");
document.getElementById("statusbar-display").appendChild(this);

Хоть панель не распирает. :)

Infocatcher

Допилить надо SeaMonkey до состояния Firefox

Боюсь к этому и идёт :)     :(

Код инициализации выполнится два раза

Почему? Один раз за счёт того, что кнопка будет приписана к статус-бару, и один раз за счёт того, что CB инициализирует все CB-кнопки, находящиеся в браузере?

Вот так можно перенести

Ээээ.... Сорри, я тут уже потерял нить. А можно сделать ещё одну настройку "стартовать также в статус-баре" и нужный код инициализации запускать соответственно этой настройке? :)

Новую версию со всеми изменениями готов протестировать немедленно :)

Кстати, при left-click состояние меняется Default->Allow. Это можно также вынести в настройку, типа ToggleMode = ALLOW | SESSION | BLOCK

Zhorik пишет

Почему? Один раз за счёт того, что кнопка будет приписана к статус-бару, и один раз за счёт того, что CB инициализирует все CB-кнопки, находящиеся в браузере?

При удалении DOM-узла из дерева сработает XBL-деструктор, а при добавлении – конструктор. В общем, это все особенности реализации.
А первоначальную инициализацию никто не отменял.
А почему после перемещения ломается инициализация, мне разбираться лень. Видимо, там проверка есть – при настройке панелей кнопки тоже будут находиться «не там».

Zhorik пишет

А можно сделать ещё одну настройку "стартовать также в статус-баре" и нужный код инициализации запускать соответственно этой настройке? :)

«Также» сложно.
Add (commented) code to move button to Status Bar in SeaMonkey

Zhorik пишет

Кстати, при left-click состояние меняется Default->Allow. Это можно также вынести в настройку, типа ToggleMode = ALLOW | SESSION | BLOCK

Add "toggleMode" options, version 0.2.0pre10 - 2012-09-05


Cookies Permissions 0.2.0pre10 (2012-09-05)
[+] Добавлена поддержка расширения Cookies Manager+.
[*] Улучшен текст всплывающих подсказок и пунктов меню.
[-] Периодическое удаление незащищенных cookies теперь отключено по умолчанию.
[+] Добавлена настройка "toggleMode" для изменения переключаемого разрешения.

Infocatcher

При удалении DOM-узла из дерева сработает XBL-деструктор, а при добавлении – конструктор. В общем, это все особенности реализации.
А первоначальную инициализацию никто не отменял.

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

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

Два момента:

1. Когда наводишь на иконку, она "подсвечивается" прямоугольником, как пункт меню. Вероятно иконка добавляется как класс "панель" или что-то в этом роде.

2. Иконка в статус-бар добавляется с помощью appendChild(). Тут-то и порылась собака! Дело в том, что в статус-баре (это моя догадка, но вполне очевидно) присутствует прогресс-бар - ползущая шкала, которая появляется при загрузке страницы. В нормальном состоянии этот прогресс-бар либо невидим, либо имеет минимальные размеры. Иконка Cookie Permissions располагается после прогресс-бара (на экране - максимально влево).

В итоге, при загрузке новой страницы появляется прогресс-бар и иконка Cookie Permissions начинает сильно прыгать влево-вправо.

Решением я вижу использовать не addChild, а какой нибудь insertChildByIndex. Если по индексу вставлять дочерние элементы невозможно (нет такой функции), нужно сделать enumeration и загрузить в массив все чайлды из статус-бара, по-ходу дела удаляя их из статус-бара. Потом добавить все элементы обратно по addChild и в нужном месте втавить иконку Cookie Permissions. Причём уже можно по желанию засунуть Cookie Permissions на первое, второе, энное место.

Что скажете, возможно такое запрограммировать под XUL?

Kaban пишет

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

Если что-то и править, то в Custom Buttons.
А у меня вызывают onDestroy(), и я не могу в общем случае гарантировать, будет ли после этого вызвана инициализация.
Еще в некоторых случаях XBL-деструктор может удалить добавленные дочерние узлы (в частности, контекстное меню). То есть всякие добавленные обработчики останутся, а состояние самой кнопки сбросится.
И не особо хочется привязываться к текущей реализации – сломается, если что-то все же будет доработано в Custom Buttons.

Kaban пишет

1. Когда наводишь на иконку, она "подсвечивается" прямоугольником, как пункт меню.

В общем случае от стилей для <toolbarbutton> никуда не деться.
Можно только переопределить стили (проще) или создать, например, <image> и спрятать кнопку (сложнее).

Kaban пишет

2. [...]
В итоге, при загрузке новой страницы появляется прогресс-бар и иконка Cookie Permissions начинает сильно прыгать влево-вправо.

Да, надо добавлять в другое место.

Add "moveToSeaMonkeyStatusBar" option

06-09-2012 10:37:39
Use pure CSS for button appearance with "moveToSeaMonkeyStatusBar" enabled

Infocatcher

Да, надо добавлять в другое место.

Add "moveToSeaMonkeyStatusBar" option

Добавлено Сегодня 10:37:39
Use pure CSS for button appearance with "moveToSeaMonkeyStatusBar" enabled

Когда можно будет протестировать новую версию? :)

Zhorik
Да когда угодно.
Или
View file @ [буквоцифры] -> Raw
из патча, или текущая версия:
/Custom_Buttons/blob/master/Cookies_Permissions/cookiesPermissions.js -> Raw

06-09-2012 13:50:28
Просто пока это не «новая версия», а «в процессе». :)

Infocatcher

Ураааа!!! Работает супер! Засунул иконку точно туда, куда мне надо! На почётное место слева от NoScript :)

Вот, может кому-то пригодятся классы некоторых элементов:
insertAfter: "linkification-status,yesscript-panel,noscript-statusIcon,download-monitor,popupIcon,statusbar-progresspanel"

Сначала лазил по исходникам расширений в поисках названий классов иконок. Потом открыл для себя DOM-инспектор! Там можно сразу элементарно найти название нужного класса. Для insertAfter нужно указывать название класса statusbarpanel для соответствующей иконки.

Считаю, что можно оформлять 0.2.0pre11 :)

P.S. Ещё бы настроечку, чтобы при наведении курсора на иконку он превращался в палец, как у NoScript и некоторых других расширений :)

А у меня Attributes Inspector есть :P

Cookies Permissions 0.2.0pre11 (2012-09-08)
[x] Исправлена работа настройки "showDefaultPolicy" в Gecko < 13.
[+] Добавлена настройка "moveToStatusBar" для перемещения кнопки в строку состояния (SeaMonkey, Firefox <= 3.6).
[+] Добавлен запрос на подтверждение удаления cookies (настройка "confirmRemoval").
[x] Исправлено удаление незащищенных cookies по таймеру после закрытия первого окна с кнопкой в Firefox 3.6.

Cookies Permissions 0.2.0pre12 (2012-12-05)
[x] Некорректно обрабатывались открытые окна с настройками разрешений других типов.
[+] Добавлена настройка "reusePermissionsWindow", разрешающая использовать ранее открытое окно с настройками разрешений другого типа.
[*] Подкорректирована функция для закрытия окон нажатием на Escape.

Cookies Permissions 0.1.10.1 (2012-12-05)
[x] Исправлено удаление observer'а изменения разрешений.
[*] Подкорректирована функция для закрытия окон нажатием на Escape.

Экспериментальное:
Add support for temporary permissions
И две настройки: showTempPermissions (aka вернуть все как было :)) и tempExpire, описание в самом скрипте.

Используется только API, так что добавленные за время действия разрешения cookies никуда сами по себе не исчезнут.

Cookies Permissions 0.2.0 (2013-03-02)
[*] Все иконки объединены в одну картинку, для смены иконок используются CSS.
[x] Исправлено выставление фильтра при открытии списка cookies в Firefox 14.0a1.
[+] Добавлены настройки для использования базового домена (site.com вместо www.site.com или some.thing.site.com) при открытии списка cookies и диалога настройки разрешений.
[*] Унифицировано заполнение текстовых полей при открытии встроенных диалогов.
[+] Добавлена настройка "prefillMode", задающая способ выделения текста при открытии списка cookies и диалога настройки разрешений.
[+] В контекстное меню кнопки добавлен пункт "Удалить все cookies текущего сайта".
[x] Исправлено применение стилей кнопки (в SeaMonkey стили применялись к кнопкам с тем же id в окнах почты).
[*] Рефакторинг кода.
[*] Убрано использование deprecated E4X.
[*] Удаление незащищенных cookies по таймеру теперь использует один глобальный таймер для всех окон.
[x] Исправлено удаление observer'а изменения разрешений.
[+] Добавлена возможность при удалении незащищенных cookies сохранять cookies с открытых в данный момент сайтов (настройки removeAllUnprotectedCookies и useBaseDomain.preserveCurrentSiteCookies).
[+] Пункт контекстного меню "Удалить незащищённые cookies" заменен на два: "Удалить все незащищённые cookies" (старое поведение) и "Удалить незащищённые cookies" (cookies с открытых в данный момент сайтов не удаляются).
[+] Добавлен хак для обновления встроенного списка исключений в Firefox (см. "observe: function (" в chrome://browser/content/preferences/permissions.js, cookies при удалении не обновляются по аналогичной причине, см. chrome://browser/content/preferences/cookies.js).
[+] Добавлен пункт контекстного меню "Удалить ВСЕ cookies".
[+] Добавлена возможность отображать политику по умолчанию (настройка "showDefaultPolicy").
[+] Добавлена поддержка расширения Cookies Manager+.
[*] Улучшен текст всплывающих подсказок и пунктов меню.
[-] Периодическое удаление незащищенных cookies теперь отключено по умолчанию.
[+] Добавлена настройка "toggleMode" для изменения переключаемого разрешения.
[+] Добавлена настройка "moveToStatusBar" для перемещения кнопки в строку состояния (SeaMonkey, Firefox <= 3.6).
[+] Добавлен запрос на подтверждение удаления cookies (настройка "confirmRemoval").
[x] Исправлено удаление незащищенных cookies по таймеру после закрытия первого окна с кнопкой в Firefox 3.6.
[x] Некорректно обрабатывались открытые окна с настройками разрешений других типов.
[+] Добавлена настройка "reusePermissionsWindow", разрешающая использовать ранее открытое окно с настройками разрешений другого типа.
[*] Подкорректирована функция для закрытия окон нажатием на Escape.
[+] Добавлена поддержка временных исключений.
[*] Улучшено обновление окна исключений при удалении исключений извне (в оригинальном менеджере исключений это не реализовано).
[*] Улучшена производительность при открытии окна: контекстное меню создается только после «запроса» пользователя.

Вот только что перешел на эту версию из древней, от 2011 года. Перечень того, что раньше больше нравилось:
1. Иконки состояния "по умолчанию" и "разрешено" были разными.
2. Раньше один раз кликнув по кнопке, состояние менялось на разрешено, второй раз - на заблокировано. В общем хотелось бы чтобы сейчас было так же.

Raf-9600 пишет

1. Иконки состояния "по умолчанию" и "разрешено" были разными.

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

Выделить код

Код:

showDefaultPolicy: true, // Show default cookies policy

– сменить «true» на «false».

Raf-9600 пишет

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

Ммм... не было, вроде, такого. :|

Infocatcher пишет

Ммм... не было, вроде, такого.

Было!!! Я тысщю раз пользовался этой кнопкой! Хотя возможно это была не конкретно твоя, а чья-то модификация, этого уже не помню...
Во всяком случае, по-моему было весьма удобно.

Infocatcher пишет

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

Хмм... Если честно, то на той картинке ссылку на которую дал, иконки "Разрешить" и "По умолчанию разрешить" практически идентичны.

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

Raf-9600 пишет

Хотя возможно это была не конкретно твоя, а чья-то модификация, этого уже не помню...

На такие случаи надо делать резервные копии. :)

Raf-9600 пишет

Во всяком случае, по-моему было весьма удобно.

Да я не спорю.
Но там есть большое визуальное неудобство при переключении разрешений для www.example.com, если уже есть исключение для example.com.
Можно попробовать вот так:
Simplify options.useBaseDomain.* usage
Experimental: cycle switch between options.toggleMode
(результат)

(Что-то я не поспеваю за меняющимся текстом. Править лень. :))

Raf-9600 пишет

а перерисовать как?

Взять отсюда исходник или готовую картинку с иконками, отредактировать, сохранить в PNG, закодировать в base64 и вставить сюда:

Выделить код

Код:

list-style-image: url("data:image/png;base64,...") !important;\n\
Raf-9600 пишет

Странно, но у меня вариант "По умолчанию" и "Разрешено" абсолютно одинаков. Т.е. даже на сайтах которые я не добавлял в белый/черный список.

Ну, не знаю. Или что-то все-таки не срабатывает, или монитор такой.


Raf-9600 пишет

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

Настройки – Приватность – Firefox: будет использовать ваши настройки хранения истории
А дальше должно быть понятно.

Infocatcher пишет

(результат)

Скопипастил в "инициализацию", потом кликнул ПКМ по кнопке и браузер "испортился" - пришлось перезапускать =\

Infocatcher пишет

Настройки – Приватность – Firefox: будет использовать ваши настройки хранения истории

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

Infocatcher пишет

На такие случаи надо делать резервные копии.

Вот

Выделить код

Код:

// http://infocatcher.ucoz.net/js/cb/cookiesPermissions.js

// Cookies Permissions button for Custom Buttons
// (code for "initialization" section)

// (c) Infocatcher 2010-2011
// version 0.1.10 - 2011-07-13

//= Settings begin
this.options = {
    removeUnprotectedCookiesInterval: 30*60*1000, // -1 for disable
    useBaseDomain: false // Use google.com instead of www.google.com
};
this._images = {
    // Used Fugue and Diagona icons (http://p.yusukekamiyamane.com/)
    default: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABTVBMVEW2XQONRwG6XwSJRQGEQwC+YQS8YAXbnVu2XQO+YQSlaCqJRQGxWwPIgTfTij+MRgGNRwG3XgStbCyTSgGEQwCHRAC/YgS7gEa6XwSDQgDruH6CQgCsVwO/YgSCQgClVALKlF6YTQKfUAK/YgTao2rPl1/zyJPMgDPltIC/YgTeq3a4XgSuZyLMlFyRSQHns3fbp3OCQgDZpnLir3visHxFIwFHJAH0ypfpuofwxJHqvInltYKATSTXlE/frXrTk1H40J3erHn2zZq8dzDisX7tvIPxxJH816Ten1rrt3rsv4yseVHgr3zrvInvw5Dzypd7TCb1zZrDoG3zx5PyyJX81qPcp27vwY3dqXZxOByAVivIhkPYnWHalkzXlVDyxpLmtoPdn13js4Dnt4KEXi/50p/hr3yka0jhp2q7kWP+26jbp3P3z5y5jWHuwY6VLnI4AAAAN3RSTlMAAAAAAAB0zgkJ2BhDurOcDHjRUQygPeIRWOOffoXAn/GOpW7o7fnz+gD6tPr60fT7APz8+wAAOKgm0AAAAOBJREFUeF5Fy8V2wzAUANHnJDWHmRnKXMl2mJlTZub/X1ayF13MZs65AKY1kuBLR6Npn2ACYwRYWyiXC9nYgDF4J4dWn/MV4pw8Heuyddx5Ri/Vztgq634zf9PtnSnKxywT0f3u4q71UCr20fdG/N+/3z6py70UUF/VfeV6gLNJiGRm9UuF+tOrUdnlhnjh53fSnxJ/3qj57Q5IHSEV4zZWl19boldiIJnF+ELTtAHe3gl6zAy4XeX7UbP5SP2+hQyH3V8bvr4NqWfoYCSvmDg4TFBvDLMnGI7FwsSTcXzyBxn2Ki7PT5A9AAAAAElFTkSuQmCC",

    deny: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABoVBMVEW2XQO6XwTMIgC+YQS/YgS6XwS3XgS2XQPbnVvIgTexWwPTij+8YAXzyJO/YgSDQgCCQgC/YgSEQwCTSgHao2qsVwOfUAKNRwGMRgGHRAClVAKNRwGYTQK/YgSCQgDruH6+YQTmek7bp3Peq3bns3fRVCTltIDuUi/isHzPl1+4XgTMgDOtbCz////rSynbNhS7gEbtTizzVjTVLgyJRQGlaCrKlF7ZpnLir3vNWy/QJwXQJwWJRQGvLwDLIwDMIgDMIgD0ypf/ZkTMIgDpuofwxJHdORfuTy3qSijhPhziPx340J350p/sv4z3z5zuwY71zZrpSSf816TqvIn5f1i5jWHvw5D81qPyyJX2Wjjrt3pxOBzltYKEXi/7YT+seVHDoG3vwY3alkz+26jfrXrmtoPrvInisX7dWjPzypfIhkP6a0jzx5PyxpLlYz3erHngr3zhr3y1VjPVLgzrVjTdqXbyn3LYMxG7kWPkYjv/d1XOUC2ATST6l234p3rQJwXbNRP2eU/wUzHXlE/2zZqAViv3pnntvIPdn13en1rcp271qEeUAAAAQXRSTlMAAAAJPRF4Cc66Q7N0+W5YwIUMUeh+pQycoJ8AjgCf4wD2+/r0jvq4++2089EAurXiuvxZGNjx/Pz4ggAAkri1WY/ZPZMAAAD5SURBVHhePYtTkwNBGAC/ZHdj2znaNmZmGTtH27aNX32bpOoe+qG7qgEUVTIUbbJaTTSlgEpgDPqw0RjWG5hKUKs0qLi2XEQalboUgjptIbOAYtFMQasr/y2tqz+zKxx3nXI4y3/d/sHX99t9HCVqff//4wvGuc8aF5T+KIo9vPKE8IvVAXA6Uu8f3KVwdfO7i/dm6sHXkE/uxO+kw8QFviVSI7iaUJZl01J2WnavlIZAM8vOzUfEJdnNNjEC9rb1jc2tbVF2e3uH2AluT9fR8cnp2TnxuLt7+F7w93n7BwaHhp8EjIXnkVHwj9nMIYslND5ByOSUUvkHLXQ4wgD5LHQAAAAASUVORK5CYII=",
    allowSession: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABlVBMVEW2XQO6XwSNRwG2XQO+YQS8YAXTij/bnVu6XwS/YgSxWwPIgTe3XgSYTQK/YgSCQgDao2qsVwO/YgTzyJPruH5mZmalVAK+YQSCQgCfUALMgDPns3eRdlvltIC4XgSwlnyKiYjisHzeq3bPl1+/YgSTSgGtbCx1dXWMRgG7gEZvb2+JRQGHRAClaCrKlF7ZpnLir3uYfmTbp3NqampqamqJRQGEQwCDQgBxWD5mZWRmZmZmZmaNRwH0ypdmZmb3+//l8v/x+P/r9f/wxJGZmZn8/f/puof81qO5jWHuwY7vw5C8xMzd7v+IjI/Q3uv1zZqtra3sv4yoqKn////50p/t7vCorbL816SEiIv40J2zvch8fHyDg4PY2NjP0dTalkyVhnjen1rrt3qlrLLg8P/Ky8yunYu7kWPerHngr3zhr3ySbFbtvIPdn13XlE+xo5TqvIn3z5yAVivvwY3UuZjOspFxOBz+26jTuJbltYLzx5PDoG3yxpLzypfGspmGeG3isX72zZqEXi/frXrmtoPrvImATSRVZpH6AAAAPXRSTlMAAAAJCXSzzhE9Q7p4jm7A6H6F+eMAnwCfpfP0jvq09rj7+u0AUdG1nOJZGKDY8fz8+PuCAAAMWJK4tVkMLKHsBAAAAPdJREFUeF49i+OPA1EcAH/tbm1ee7ZtvffWtc2zbRt/923b5CaZL5MMgKJJltaZ7XazjlZAI2hVaqfD4VSrtI1AGTXId/fkQxojVQu9ekMw94nShVzQoK//7c1rG5tXPL8Xs9rqf8vj8/HJ6W8CXXS7///rXUE4u5/2Qu0voPRrvJJKVeIdJrBZYx+X/E0yI+6IYibZCu42f+Al8VYlRCCEVDvB24XOJanMsqwgy5bB1CNJtw8ljuMwxlmuBH39X98/7+shZouRCQ3A6uDQ/sHhUSS6LRONDINyZHRsfGJyKl8Mh4v5mVlQzs0veCwWz+ISxssrLtcfnUo4lyXB664AAAAASUVORK5CYII=",
    allow: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABfVBMVEW2XQNVu1W6XwRbwVvIgTfbnVu/YgSNRwGxWwO3XgS6XwS8YAXTij++YQS2XQOCQgDKlF6/YgSsVwPzyJOlVALao2q+YQQRdxG/YgSCQgCDQgDruH64XgTMgDPns3fltICfUALeq3a/YgSYTQLPl18rkSuTSgGtbCyI7ogjiSONRwGMRgG7gEYbgRvisHyJRQGHRAClaCrZpnLir3vbp3NohyoVexWJRQGEQwD0ypfpuoeI7oj81qNv1G9kymTwxJErkSs6oDoymDJ533lEqkRApkDyyJVVu1UbgRvvw5D816QjiSPsv4z3z5z1zZrDoG3+26jYnWHrvInqvIn40J0VexURdxHfrXrzx5PyxpLTk1Halkzen1risX7rt3rvwY350p/zypeseVHdqXa8dzDerHngr3zhr3yka0jdn13XlE+ATSSC6ILIhkPnt4Lcp27bp3PXlVC7kWPhp2rltYLtvINbwVtxOBy5jWHuwY6EXi/mtoP2zZqAViuYtWjcX2nxAAAAOXRSTlMAAAAAus49AEN4EXSzCQnA8YV++Z/oAABun1jjtPP0+qX6AI7tAFHRAAAMnOIA+xig2Pz8+9IAAAzfXL77AAAA80lEQVR4XkXLVXODQBiF4Y8EEuLeRurubruLE3dP1d3d5bcXyEXPzLl5Zx4AU4d2lyXs84UtLhO0g93hjAUCMafD3g5uG4O4colDjM2thwGWzmQ/0X49m6FZw3d1b23v7oniYzHkN3zP+sbLxeVVHhX6g//+6eG2llxaBt3XDb9ZOcTxOPhDxe8f8VfzdzfVBElAsPf94yAvy6hwdCyTaxn6ZlANY4UoyXuFqKoCg0MYvz1LPJEkwvPSMIyMtr6qOzlBIEQQcmPjMDE5dXJ6dp5+1ZY2m6fBOjs3711Y9DZSqQZFUStgXV2LRjyeSLTZ7NT3B27ZNHT6lMZzAAAAAElFTkSuQmCC",

    notAvailable: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABL1BMVEVdXV1HR0dfX19FRUVhYWFCQkJgYGCbm5thYWFCQkJeXl5aWlqAgICAgIBCQkJdXV1oaGhERERfX19iYmJGRkaJiYlsbGxKSkpFRUVHR0diYmJQUFCXl5dBQUGUlJRiYmLExMRNTU2ioqJBQUG1tbVXV1dUVFSzs7Oqqqqvr6+np6doaGheXl6AgICUlJRJSUmwsLBBQUFiYmKmpqavr68jIyMkJCTGxsa6urq4uLjR0dG0tLTAwMCdnZ3BwcHExMSwsLDJycm9vb2tra21tbWsrKyysrLNzc2/v7/MzMyurq6mpqbCwsJ9fX2UlJR2dnZERERWVlaPj4+NjY2GhoZaWlqnp6eampqSkpJQUFC5ubmTk5Ovr690dHTV1dWzs7PDw8OlpaVRUVHLy8upqalgbY2aAAAAN3RSTlMAAAAAAAB0zgkMeEO64lgJ2KARPZyz0VEYDG6l7cDxhfmO6J/jfp/6+vv7+rTz+tH0AAD8/AAA+SwWFgAAANxJREFUeF5Fy0VyxDAUANHvmcQ4zMwcRklGGMYwM9z/DJHsRRa96aoHENiiiclCtVpIigHwR4JPt2q1VppP+CMqC0h9f1CRIEfZOFZCunqHpnNVDyme393bGB8z07x2Gm3PH1qfz8bLt4t+ep1/v9yMsDUoAvNzzz8aa1KqQ7vhOFcm81+3eJjJQqd7M0PuE/W/F+NwKg/FPsKErAi27ndi8RwH9RIhl5qmrcn+QUQKcpDNDEfYtifMH23TkU+Fx4vXtwXzHBtcLh6rnJxWmPdHUIo0y+Um9XScnf8BesYnYJJTobwAAAAASUVORK5CYII=",
    unknown: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABd1BMVEW2XQO6XwSNRwG/YgTbnVu2XQPIgTexWwO+YQS3XgTTij+6XwS8YAXzyJO/YgS/YgSsVwPruH6fUAK/YgSlVAKMRgGtbCzao2qNRwGYTQLPl1+TSgG+YQTeq3bisHzns3fCjQDHlAC4XgTMgDPAjQDltIC5hgC7gEaJRQGHRAClaCrKlF7ZpnLbp3OJRQGEQwCDQgCCQgCCQgCZYACqdwD0ypfMmQDpuofwxJEzMzPsv4z/2DX/0RbqzmSzgAD/4Vvjv0H/+sf1zZrVogD40J3ltYLcrxverHngr3z816T//93AjQD/86i/jADZpgDdqgD/6oLvw5D/zADOmwD81qP2zZquewBxOBzdn13Zpz3tvIPfqTXImTHmtoPrvInisX7Nmz/Yp0PyxpLyyCjMrzTzx5PvwY3zypd7TCbhr3yATSTfrXr3z5zjs0TXlE/rt3ren1ruwY7yyJX50p+EXi/qvInxxJHalky7kWO5jWH+26iAVivDoG1a7qJEAAAANXRSTlMAAAA9zgm6Qwl4sxF0+YVufuOlAJ+c0egMju1RAPr79IwAtPMA+oDiGKDY8fz7AAxYn8DggGfepWIAAADwSURBVHheRctjcwNhFIbhk+zGtmrbL9axrdq23R/fbNKZnpnnfLhnLgBNX2dGxmG3OxijBnrBYjW7bDaX2WrpBZ2JRc2vnyZiTTo1eAz6Wu4FPSdzNb2h60dG3x/uzyj9iAecXT94erS1cXfFo5t+77/frlRun+bdoPqk6sv5fJmEQ+AMxFvflNIdKRaTNv0R8I5/Pp7zF3yjiLliwxcE9wB6JeTtMFrFXDU6NAyhMCHrqVRBUTCnKIUxiPivd/f2D9KCcHwiCOkJCPomM9lLWRRFzHWeDNqp6ZnZuXb979qgXVhcWl5ZlUs4kcAlee0XlMM0PA1YpgYAAAAASUVORK5CYII="
};
this._strings = {
    en: { // First entry used as default
        defaultTooltiptext: "Cookies: Default",
        denyTooltiptext: "Cookies: Deny",
        allowSessionTooltiptext: "Cookies: Allow Session",
        allowTooltiptext: "Cookies: Allow",
        notAvailableTooltiptext: "Cookies: n/a",
        unknownTooltiptext: "Cookies: ???",

        defaultLabel: "Default",
        defaultAccesskey: "f",
        denyLabel: "Deny",
        denyAccesskey: "D",
        allowSessionLabel: "Allow Session",
        allowSessionAccesskey: "S",
        allowLabel: "Allow",
        allowAccesskey: "A",

        showPermissionsLabel: "Show Exceptions…",
        showPermissionsAccesskey: "x",
        showCookiesLabel: "Show Cookies…",
        showCookiesAccesskey: "h",
        removeUnprotectedCookiesLabel: "Remove Unprotected Cookies",
        removeUnprotectedCookiesAccesskey: "R",

        buttonMenu: "Button menu",
        buttonMenuAccesskey: "m"
    },
    ru: {
        defaultTooltiptext: "Cookies: По умолчанию",
        denyTooltiptext: "Cookies: Блокировать",
        allowSessionTooltiptext: "Cookies: Разрешить на сессию",
        allowTooltiptext: "Cookies: Разрешить",
        notAvailableTooltiptext: "Cookies: н/д",
        unknownTooltiptext: "Cookies: ???",

        defaultLabel: "По умолчанию",
        defaultAccesskey: "у",
        denyLabel: "Блокировать",
        denyAccesskey: "Б",
        allowSessionLabel: "Разрешить на сессию",
        allowSessionAccesskey: "с",
        allowLabel: "Разрешить",
        allowAccesskey: "Р",

        showPermissionsLabel: "Показать исключения…",
        showPermissionsAccesskey: "и",
        showCookiesLabel: "Показать cookies…",
        showCookiesAccesskey: "П",
        removeUnprotectedCookiesLabel: "Удалить незащищённые cookies",
        removeUnprotectedCookiesAccesskey: "д",

        buttonMenu: "Меню кнопки",
        buttonMenuAccesskey: "М"
    }
};
//= Settings end

this.hasModifier = function(e) {
    return e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
};

this.onclick = function(e) {
    if(e.target != this)
        return;
    var but = e.button;
    var hasModifier = this.hasModifier(e);
    if(but == 0 && !hasModifier) {
        this.togglePermission(this.cp.ACCESS_ALLOW);
        // Allow use "command" section only from hotkey:
        e.preventDefault();
        e.stopPropagation();
    }
    else if(but == 1 || but == 0 && hasModifier)
        this.openCookiesPermissions();
};
if(!this.hasOwnProperty("defaultContextId"))
    this.defaultContextId = this.getAttribute("context") || "custombuttons-contextpopup";
this.oncontextmenu = function(e) {
    if(e.target != this)
        return;
    this.setAttribute(
        "context",
        this.hasModifier(e)
            ? this.defaultContextId
            : this._mpId
    );
};

var s = this._strings;
for(var p in s) if(s.hasOwnProperty(p)) {
    this._defaultLocale = this._locale = p;
    break;
}
var currentLocale = Application.prefs.getValue("general.useragent.locale", "en");
if(s.hasOwnProperty(currentLocale))
    this._locale = currentLocale; // e.g. "ru-RU"
else if(/^([a-z]+)-/.test(currentLocale) && s.hasOwnProperty(RegExp.$1))
    this._locale = RegExp.$1; // e.g. "ru"
this._localeStrings  = s[this._locale];
this._defaultStrings = s[this._defaultLocale];
delete this._strings;
this._string = function(sid) {
    return this._localeStrings[sid] || this._defaultStrings[sid] || "(" + sid + ")";
};

this.permissionType = "cookie";
var cp = this.cp = Components.interfaces.nsICookiePermission;
this.PERMISSIONS_NOT_SUPPORTED = -1;

var parseFromXML = function(xml) {
    var pp = XML.prettyPrinting;
    XML.prettyPrinting = false;
    var elt = new DOMParser().parseFromString(xml.toXMLString(), "application/xml").documentElement;
    XML.prettyPrinting = pp;
    return elt;
};
this._mpId = this.id + "-context";
var mp = this._mp = this.appendChild(parseFromXML(
    <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        id={this._mpId}
        onpopupshowing="
            if(event.target != this)
                return true;
            document.popupNode = this.parentNode;
            return this.parentNode.updMenu();"
        onpopuphidden="if(event.target == this) document.popupNode = null;">
        <menuitem type="radio" cb_permission={cp.ACCESS_DEFAULT}
            oncommand="this.parentNode.parentNode.removePermission();"
            label={this._string("defaultLabel")}
            accesskey={this._string("defaultAccesskey")} />
        <menuseparator />
        <menuitem type="radio" cb_permission={cp.ACCESS_DENY}
            oncommand="this.parentNode.parentNode.addPermission(Components.interfaces.nsICookiePermission.ACCESS_DENY);"
            label={this._string("denyLabel")}
            accesskey={this._string("denyAccesskey")} />
        <menuitem type="radio" cb_permission={cp.ACCESS_SESSION}
            oncommand="this.parentNode.parentNode.addPermission(Components.interfaces.nsICookiePermission.ACCESS_SESSION);"
            label={this._string("allowSessionLabel")}
            accesskey={this._string("allowSessionAccesskey")} />
        <menuitem type="radio" cb_permission={cp.ACCESS_ALLOW}
            oncommand="this.parentNode.parentNode.addPermission(Components.interfaces.nsICookiePermission.ACCESS_ALLOW);"
            label={this._string("allowLabel")}
            accesskey={this._string("allowAccesskey")} />
        <menuseparator />
        <menuitem
            oncommand="this.parentNode.parentNode.openCookiesPermissions();"
            label={this._string("showPermissionsLabel")}
            accesskey={this._string("showPermissionsAccesskey")} />
        <menuitem
            oncommand="this.parentNode.parentNode.showCookies();"
            label={this._string("showCookiesLabel")}
            accesskey={this._string("showCookiesAccesskey")} />
        <menuseparator />
        <menuitem
            oncommand="this.parentNode.parentNode.removeUnprotectedCookies();"
            label={this._string("removeUnprotectedCookiesLabel")}
            accesskey={this._string("removeUnprotectedCookiesAccesskey")} />
        <menuseparator />
        <menu
            label={this._string("buttonMenu")}
            accesskey={this._string("buttonMenuAccesskey")} />
    </menupopup>
));
var cbPopup = document.getElementById(this.defaultContextId);
if(!cbPopup)
    Components.utils.reportError("[Custom Buttons :: Cookies Permissions]: cb menu not found");
else {
    cbPopup = cbPopup.cloneNode(true);
    let id = "-" + this.id.match(/\d*$/)[0] + "-cloned";
    cbPopup.id += id;
    Array.slice(cbPopup.getElementsByAttribute("id", "*")).forEach(function(node) {
        node.id += id;
    });
    let menu = mp.lastChild;
    menu.appendChild(cbPopup);
}

this.__defineGetter__("pm", function() {
    delete this.pm;
    return this.pm = Components.classes["@mozilla.org/permissionmanager;1"]
        .getService(Components.interfaces.nsIPermissionManager);
});
this.__defineGetter__("io", function() {
    delete this.io;
    return this.io = Components.classes["@mozilla.org/network/io-service;1"]
        .getService(Components.interfaces.nsIIOService);
});
this.__defineGetter__("oSvc", function() {
    return Components.classes["@mozilla.org/observer-service;1"]
        .getService(Components.interfaces.nsIObserverService);
});
this.__defineGetter__("wm", function() {
    return Components.classes["@mozilla.org/appshell/window-mediator;1"]
        .getService(Components.interfaces.nsIWindowMediator);
});
this.__defineGetter__("tld", function() {
    delete this.tld;
    return this.tld = Components.classes["@mozilla.org/network/effective-tld-service;1"]
        .getService(Components.interfaces.nsIEffectiveTLDService);
});
this.__defineGetter__("currentHost", function() {
    var loc = content.location;
    if(["view-source:", "about:", "chrome:", "resource:", "javascript:", "data:"].indexOf(loc.protocol) == -1) try {
        return loc.hostname;
    }
    catch(e) {
    }
    return "";
});
this.__defineGetter__("currentBaseDomain", function() {
    var host = this.currentHost;
    if(host) try {
        return this.tld.getBaseDomainFromHost(host);
    }
    catch(e) {
    }
    return host;
});
this.__defineGetter__("isSeaMonkey", function() {
    return Components.classes["@mozilla.org/xre/app-info;1"]
        .getService(Components.interfaces.nsIXULAppInfo)
        .name == "SeaMonkey";
});
this.getURI = function(host) {
    if(host.indexOf(":") != -1 && /^[:\da-f.]+$/.test(host)) // IPv6
        host = "[" + host + "]";
    try {
        return this.io.newURI("http://" + host, null, null);
    }
    catch(e) {
        Components.utils.reportError("[Custom Buttons :: Cookies Permissions] Invalid host: \"" + host + "\"");
        throw e;
    }
};

this.showMenu = function(e, isContext, mp) {
    document.popupNode = this.ownerDocument.popupNode = this;
    if(!mp)
        mp = this._mp;
    if("openPopupAtScreen" in mp)
        mp.openPopupAtScreen(e.screenX, e.screenY, isContext);
    else
        mp.showPopup(this, e.screenX, e.screenY, isContext ? "context" : "popup", null, null);
};
this.updMenu = function() {
    var permission = this.getPermission();
    //if(permission == this.PERMISSIONS_NOT_SUPPORTED)
    //    return false;

    var noPermissions = permission == this.PERMISSIONS_NOT_SUPPORTED;
    Array.forEach(
        this._mp.getElementsByAttribute("cb_permission", "*"),
        function(mi) {
            mi.hidden = noPermissions;
            var ns = mi.nextSibling;
            if(ns && ns.localName == "menuseparator")
                ns.hidden = noPermissions;
        }
    );

    var mi = this._mp.getElementsByAttribute("cb_permission", permission);
    mi.length && mi[0].setAttribute("checked", "true");
    return true;
};

this.openCookiesPermissions = function() {
    if(this.isSeaMonkey) {
        this.openCookiesPermissionsSM();
        return;
    }

    // chrome://browser/content/preferences/privacy.js
    // gPrivacyPane.showCookieExceptions()
    var bundle = Components.classes["@mozilla.org/intl/stringbundle;1"]
        .getService(Components.interfaces.nsIStringBundleService)
        .createBundle("chrome://browser/locale/preferences/preferences.properties");
    var params = { blockVisible   : true,
                   sessionVisible : true,
                   allowVisible   : true,
                   prefilledHost  : this.currentHost,
                   permissionType : this.permissionType,
                   windowTitle    : bundle.GetStringFromName("cookiepermissionstitle"),
                   introText      : bundle.GetStringFromName("cookiepermissionstext") };
    var win = this.wm.getMostRecentWindow("Browser:Permissions");
    if(win)
        win.focus();
    else
        win = window.openDialog("chrome://browser/content/preferences/permissions.xul", "_blank", "", params);

    this.tweakWindow(win);
};
this.openCookiesPermissionsSM = function() {
    var host = this.currentHost;
    var win = this.wm.getMostRecentWindow("mozilla:cookieviewer");
    var select = function select(e) {
        win.removeEventListener("load", select, false);
        var doc = win.document;
        doc.getElementById("tabbox").selectedTab = doc.getElementById("permissionsTab");
        var tb = doc.getElementById("cookie-site");
        tb.value = host;
        win.buttonEnabling(tb);
    };
    if(win) {
        win.focus();
        select();
    }
    else {
        win = window.openDialog("chrome://communicator/content/permissions/cookieViewer.xul", "_blank", "");
        win.addEventListener("load", select, false);
    }
};
this.tweakWindow = function(win) {
    var keypressHandler = function(e) {
        if(e.keyCode == e.DOM_VK_ESCAPE)
            win.close();
    };
    win.addEventListener("keypress", keypressHandler, false);
    win.addEventListener("unload", function destroy(e) {
        var win = e.target.defaultView;
        if(win !== win.top || e.target.location.protocol != "chrome:")
            return;
        win.removeEventListener(e.type, destroy, false);
        win.removeEventListener("keydown", keypressHandler, false);
    }, false);
};

this.addPermission = function(capability) {
    // capability:
    //  this.cp.ACCESS_DENY
    //  this.cp.ACCESS_SESSION
    //  this.cp.ACCESS_ALLOW

    var host = this.options.useBaseDomain
        ? this.currentBaseDomain
        : this.currentHost;
    if(!host)
        return;

    var pm = this.pm;
    var enumerator = pm.enumerator;
    while(enumerator.hasMoreElements()) {
        var permission = enumerator.getNext()
            .QueryInterface(Components.interfaces.nsIPermission);
        if(permission.type == this.permissionType && permission.host == host && permission.capability == capability)
            return;
    }

    pm.add(this.getURI(host), this.permissionType, capability);
};
this.removePermission = function() {
    var host = this.currentHost;
    if(!host)
        return;
    var uri = this.getURI(host);
    var permission = this.pm.testPermission(uri, this.permissionType);
    this.pm.remove(host, this.permissionType);
    while(this.pm.testPermission(uri, this.permissionType) == permission) {
        var parentHost = host.replace(/^[^.]*\./, "");
        if(parentHost == host)
            break;
        host = parentHost;
        this.pm.remove(host, this.permissionType);
    }
};
this.togglePermission = function(capability) {
    var permission = this.getPermission();
    if(permission == this.PERMISSIONS_NOT_SUPPORTED)
        return;
    if(permission == capability)
        this.removePermission();
    else
        this.addPermission(capability);
};
this.getPermission = function() {
    var host = this.currentHost;
    return host
        ? this.pm.testPermission(this.getURI(host), this.permissionType)
        : this.PERMISSIONS_NOT_SUPPORTED;
};
this.showCookies = function() {
    if(this.isSeaMonkey) {
        this.showCookiesSM();
        return;
    }
    var win = this.wm.getMostRecentWindow("Browser:Cookies");
    var host = this.currentHost;
    var setFilter = function setFilter(e) {
        win.removeEventListener("load", setFilter, false);
        var doc = win.document;
        var tb = doc.getElementById("filter");
        if(!tb)
            return;
        tb.value = host;
        tb.doCommand();
    };
    if(win) {
        win.focus();
        host && setFilter();
    }
    else {
        win = window.openDialog("chrome://browser/content/preferences/cookies.xul", "_blank", "");
        host && win.addEventListener("load", setFilter, false);
    }
    this.tweakWindow(win);
};
this.showCookiesSM = function() {
    var host = this.currentHost;
    var win = this.wm.getMostRecentWindow("mozilla:cookieviewer");
    var setFilter = function setFilter(e) {
        win.removeEventListener("load", setFilter, false);
        var doc = win.document;
        doc.getElementById("tabbox").selectedTab = doc.getElementById("cookiesTab");
        var tb = doc.getElementById("filter");
        tb.value = host;
        tb.doCommand();
    };
    if(win) {
        win.focus();
        setFilter();
    }
    else {
        win = window.openDialog("chrome://communicator/content/permissions/cookieViewer.xul", "_blank", "");
        win.addEventListener("load", setFilter, false);
    }
};
this.removeUnprotectedCookies = function() {
    var cm = Components.classes["@mozilla.org/cookiemanager;1"]
        .getService(Components.interfaces.nsICookieManager);
    var cp = this.cp;
    var pm = this.pm;
    var remove = [
        cp.ACCESS_DEFAULT,
        /*cp.ACCESS_ALLOW,*/
        cp.ACCESS_DENY,
        cp.ACCESS_SESSION
    ];
    var cookies = cm.enumerator;
    while(cookies.hasMoreElements()) {
        var cookie = cookies.getNext()
            .QueryInterface(Components.interfaces.nsICookie);
        var host = cookie.host;
        var uri = this.getURI(host);
        if(remove.indexOf(pm.testPermission(uri, this.permissionType)) != -1)
            cm.remove(host, cookie.name, cookie.path, false);
    }
};

this.updButtonState = function() {
    var cp = this.cp;
    var permission = this.getPermission();
    this.disabled = permission == this.PERMISSIONS_NOT_SUPPORTED;
    switch(permission) {
        case this.PERMISSIONS_NOT_SUPPORTED:
            this.image = this._images.notAvailable || this._images.default;
            this.tooltipText = this._string("notAvailableTooltiptext");
        break;
        case cp.ACCESS_DEFAULT:
            this.image = this._images.default;
            this.tooltipText = this._string("defaultTooltiptext");
        break;
        case cp.ACCESS_ALLOW:
            this.image = this._images.allow || this._images.default;
            this.tooltipText = this._string("allowTooltiptext");
        break;
        case cp.ACCESS_DENY:
            this.image = this._images.deny || this._images.default;
            this.tooltipText = this._string("denyTooltiptext");
        break;
        case cp.ACCESS_SESSION:
            this.image = this._images.allowSession || this._images.default;
            this.tooltipText = this._string("allowSessionTooltiptext");
        break;
        default:
            this.image = this._images.unknown || this._images.default;
            this.tooltipText = this._string("unknownTooltiptext");
    }
};

var dummy = function() {};
this.progressListener = {
    button: this,
    onStateChange: dummy,
    onProgressChange: dummy,
    onLocationChange: function(aWebProgress, aRequest, aLocation) {
        this.button.updButtonState();
    },
    onStatusChange: dummy,
    onSecurityChange: dummy
};
gBrowser.addProgressListener(this.progressListener/*, Components.interfaces.nsIWebProgress.NOTIFY_LOCATION*/);

this.permissionsObserver = {
    button: this,
    observe: function(subject, topic, data) {
        if(topic != "perm-changed")
            return;
        var permission = subject.QueryInterface(Components.interfaces.nsIPermission);
        if(permission.type == this.button.permissionType /*&& permission.host == this.button.currentHost*/)
            this.button.updButtonState();
    }
};
this.oSvc.addObserver(this.permissionsObserver, "perm-changed", false);

if(this.options.removeUnprotectedCookiesInterval > 0) {
    setInterval(function(_this) {
        _this.removeUnprotectedCookies();
    }, this.options.removeUnprotectedCookiesInterval, this);
}

this.updButtonState();

this.onDestroy = function() {
    gBrowser.removeProgressListener(this.progressListener);
    this.oSvc.removeObserver(this.permissionsObserver);
};
Raf-9600 пишет

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

Прошлая кнопка не могла ничего делать сверх настроек Firefox.
network.cookie.lifetimePolicy

Raf-9600 пишет

Вот

Это оригинальная кнопка. И у меня она только переключает разрешить/по умолчанию.

24-03-2013 18:38:20

Raf-9600 пишет

Скопипастил в "инициализацию", потом кликнул ПКМ по кнопке и браузер "испортился" - пришлось перезапускать =\

Странно. Копировать, кстати, лучше по ссылке «Raw» – там отступы не ломаются.

Infocatcher пишет

Странно. Копировать, кстати, лучше по ссылке «Raw» – там отступы не ломаются.

Помогло.

Infocatcher пишет

Прошлая кнопка не могла ничего делать сверх настроек Firefox.

У меня галлюцинации походу fc34dc50ea144827810c667a06591c2b.gif

На [firefox] 21 стал удалять защищенные куки при нажатии на "удалить незащищенные куки".

villa7 пишет

На [firefox] 21 стал удалять защищенные куки при нажатии на "удалить незащищенные куки".

А так?

Infocatcher пишет

А так?

Так работает, спасибо.

villa7 пишет

Так работает, спасибо.

Это хорошо. :)


Cookies Permissions 0.2.0.1 (2013-05-14) (это версия 0.2.0 - 2013-03-02 + это исправление)
[x] Исправлена обработка «защищенных» cookies в Gecko 21+.

Замечательная кнопка, спасибо

Лучше бы вы ее в дополнение переделали. И популярность и баг репорты.

Где в коде выставить useBaseDomain в true чтобы убрать www. ? :sick:

pohunohi пишет

Где в коде выставить useBaseDomain в true чтобы убрать www. ? :sick:

Откуда убрать?
Видимо, где-то здесь:

var options = {
    ...
    useBaseDomain: { // If set to true, will use short domain like google.com instead of www.google.com
        addPermission: false, // Add (and toggle) permission action
        openPermissions: false,  // Filter in "Show Exceptions" window
        showCookies: true, // Filter in "Show Cookies" window
        removeCurrentSiteCookies: true, // For "Remove All Current Site Cookies" action
        preserveCurrentSitesCookies: true // For "removeAllUnprotectedCookies: false"
    },

Infocatcher пишет

Откуда убрать?

При добавлении в исключения. В исключения добавляется как www.site.com, а в куках отображается как site.com. И при removeAllUnprotectedCookies по таймеру они удаляются.

Infocatcher пишет

Видимо, где-то здесь:

Тогда в исключения добавляется только домен. А хочется чтобы просто убиралось www.

(осторожно, это тестовые версии!)

Cookies Permissions 0.2.1pre2 (2014-01-12)
[x] Исправлено определение локали браузера в Linux (#20).
[+] Расширены настройки useBaseDomain.*: добавлена возможность только удалять префикс «www.».
[*] Улучшена производительность при переключении вкладок: добавлена небольшая задержка перед обновлением состояния кнопки.

(и для истории)
Cookies Permissions 0.2.1pre (2013-05-14)
[+] Расширена настройка toggleMode: добавлена возможность циклического переключения между выбранными разрешениями/исключениями.
[x] Исправлено игнорирование защищенных cookies в Gecko 21+.

Infocatcher пишет

[+] Расширены настройки useBaseDomain.*: добавлена возможность только удалять префикс «www.».

Спасибо. :beer:

Infocatcher
А возможно ли добавить в кнопку функционал расширения Self-Destructing Cookies (то есть, чтобы через некоторое время после закрытия всех вкладок с определённого сайта cookies этого сайта автоматически удалялись)? Или это сложно реализовать?

MySh
Нечто подобное делает настройка removeUnprotectedCookiesInterval, но привязки конкретно к закрытию вкладок там нет, просто периодическая чистка.

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

Выделить код

Код:

var options = {
    removeUnprotectedCookiesInterval: -1,
    // Periodically remove unprotected cookies (leave only cookies with "Allow" permission)
    // Time in milliseconds like 30*60*1000 (30 minutes) or -1 to disable
    removeAllUnprotectedCookies: false,
    // true  - periodically ("removeUnprotectedCookiesInterval" option) remove all unprotected cookies
    // false - or exclude cookies from opened sites
    ...
    useBaseDomain: { // If set to true, will use short domain like google.com instead of www.google.com
        ...
        preserveCurrentSitesCookies: true // For "removeAllUnprotectedCookies: false"
    }

Infocatcher
То есть, я правильно понимаю, что если этот параметр поменять, то каждые n минут будет проверяться, не используется ли какой-либо адрес, которому приписана данная cookie, и если нет, и при этом она не входит в список исключений, она будет удалена? Так это именно то, что нужно!

Смущает только то, что эта настройка в коде прописана. Это значит, что при каждом обновлении кнопки придётся снова искать это место в коде и исправлять вручную?
Просто, насколько знаю, есть какой-то способ хранить данные в параметре about:config и вроде расширение custom buttons умеет это делать.

MySh пишет

То есть, я правильно понимаю, что если этот параметр поменять, то каждые n минут будет проверяться, не используется ли какой-либо адрес, которому приписана данная cookie, и если нет, и при этом она не входит в список исключений, она будет удалена? Так это именно то, что нужно!

Да, с заданной периодичностью перебираются вообще все cookies и незащищенные удаляются.
Не будут удаляться, если хост cookie входит в список исключений (должно быть выставлено «разрешить») и при «removeAllUnprotectedCookies: false» дополнительно проверяется, не открыт ли в данный момент сайт с таким хостом, точность сравнения зависит от useBaseDomain.preserveCurrentSitesCookies.

MySh пишет

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

Да, придется...

MySh пишет

Просто, насколько знаю, есть какой-то способ хранить данные в параметре about:config и вроде расширение custom buttons умеет это делать.

Я все надеюсь, что появится какой-нибудь простой API со стороны Custom Buttons. Иначе в каждой кнопке надо дублировать один и тот же код и обрабатывать изменения настроек. Или в самом простом варианте можно считывать настройки в текущем виде через JSON, но редактировать такое будет сомнительным удовольствием (вдобавок будут проблемы, если понадобится что-то поменять в настройках по умолчанию).

23-01-2014 00:55:25
И потом при реализации полноценных настроек получается, что удобнее сделать полноценное расширение – там только с добавлением кнопок без перезапуска сложности, а остальное или корректируется, или используется вообще как есть (только это будет не очень эффективно, если открывать больше одного окна браузера).

Infocatcher
Спасибо.

Да, придется...

ОК, ладно. В конце концов, поменять один параметр не так и сложно.

Пользуясь случаем, хочу ещё раз сказать спасибо за эту замечательную кнопку и отдельное спасибо за поддержку SeaMonkey!

MySh пишет

ОК, ладно. В конце концов, поменять один параметр не так и сложно.

Я на днях снова попробовал сделать с обработкой настроек из about:config... это где-то по 100 дополнительных строк на каждую кнопку.
Плюс еще для кнопок, которые могут быть в нескольких экземплярах (не в данном случае, но тем не менее), нужны еще дополнительные телодвижения.
В общем, делается это примерно так: prefs.js (и выходит, что кода много, а пользы и удобства что-то не очень).
Вдобавок на изменение из about:config реагирует тупо переинициализацией. :)

Опять же, если это все как-то частично встраивать в Custom Buttons, то нужно предусмотреть задание подписей для настроек и какие-нибудь ограничения на вводимые данные. Пояснения к данным, опять же, нужны. Это если выводить настройки отдельной вкладкой в редакторе кнопки. А если не выводить, то или пользоваться неудобно, или надо делать интерфейс настроек из самой кнопки...

MySh пишет

Пользуясь случаем, хочу ещё раз сказать спасибо за эту замечательную кнопку и отдельное спасибо за поддержку SeaMonkey!

Пожалуйста. :)

Сайт Tumblr добавляется в исключения, как www.tumblr.com, из-за этого при переходе, например, на http://intellicat.tumblr.com/ куки не сохраняются. Сайт следует добавлять в исключения, как tumblr.com
Такая же проблема с DeviantART и с @дневники.

Три рубля пишет

Сайт Tumblr добавляется в исключения, как www.tumblr.com, из-за этого при переходе, например, на http://intellicat.tumblr.com/ куки не сохраняются. Сайт следует добавлять в исключения, как tumblr.com
Такая же проблема с DeviantART и с @дневники.

Можно открыть список исключений из меню или кликом средней кнопкой мыши по кнопке и добавить нужное исключение вручную.
Или можно изменить настройку useBaseDomain.addPermission на true:

Выделить код

Код:

var options = {
    ...
    useBaseDomain: { // If set to true, will use short domain like google.com instead of www.google.com
        addPermission: false, // Add (and toggle) permission action

В разрабатываемой версии добавлена специальная обработка для www.site.com, но суть та же:

Выделить код

Код:

var options = {
    ...
    useBaseDomain: {
        // 0 - use full domain name: addons.mozilla.org, www.google.com
        // 1 - strip "www." prefix from full domain name: addons.mozilla.org, google.com
        // 2 - use top-level domains (TLDs): mozilla.org, google.com
        addPermission: 1, // Add (and toggle) permission action

А как установить разрабатываемую версию с гитхаба?

Три рубля
Как обычную кнопку.  ПКМ на панели "создать новую кнопку". Код в код, код для инициализации в инициализацию. Название в название. :blush:
О какой версии речь ? Если об этой "Cookies Permissions 0.2.1pre2 (2014-01-12)" тогда проще на странице
Cookies Permissions 0.2.1pre2 (2014-01-12) нажать сюды :

скрытый текст
4fa93712c5594463b15d967313180248.png

Вообще говоря, там три разных версии:

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

Спасибо!
Пришлось всё-таки включать настройку вручную. Она по умолчанию выключена?

Три рубля пишет

Пришлось всё-таки включать настройку вручную. Она по умолчанию выключена?

О какой настройке речь?

Infocatcher
В [nightly] кнопка перестала реагировать на ЛКМ. Можно подправить?

voqabuhe пишет

В [nightly] кнопка перестала реагировать на ЛКМ. Можно подправить?

https://bugzilla.mozilla.org/show_bug.cgi?id=1170200
https://bugzilla.mozilla.org/show_bug.cgi?id=1173523
Мило, мило.
Кто бы им поведал про обратную совместимость еще.
Я навтыкал распорок, но особо не проверял:
https://github.com/Infocatcher/Custom_B … 0ed456c3ff

Infocatcher пишет

Я навтыкал распорок, но особо не проверял:
https://github.com/Infocatcher/Custom_B … 0ed456c3ff

А где сама кнопка то, или чё с этим "распорками" делать? Куда их теперь все? :)

Кнопка пока что только в таком виде:
https://github.com/Infocatcher/Custom_B … issions.js
(это постоянная ссылка на самую свежую разрабатываемую версию)

А если прямо из предыдущей ссылки, то там у «Cookies_Permissions/cookiesPermissions.js» справа View, затем Raw.

Infocatcher
Спасибо. Работает.

Поскольку разрешения для http:// и https:// в Firefox 42+ теперь различаются, понадобилось еще немного распорок:
https://github.com/Infocatcher/Custom_B … issions.js
Работать должно для текущего протокола, так что если сайт доступен еще и по https, придется добавлять еще раз.
Честно говоря, я вообще пользы от разделения не вижу, но дублировать разрешения сложно: там можно вручную наворотить и поломать логику.

Баг в разрабатываемой версии кнопки: если включить удаление незащищенных печенек (removeUnprotectedCookiesInterval), то при добавлении в исключения правила  с одним протоколом, например https://forum.mozilla-russia.org, печеньки все равно удаляются. Если добавить в исключения оба протокола - https://forum.mozilla-russia.org и http://forum.mozilla-russia.org, то печеньки не удаляются. То бишь для каждого сайта надо добавлять оба правила, независимо от того по какому протоколу сайт доступен.
Аддон Self-Destructing Cookies, например, добавляет оба. Хотя вышеописанную ситуацию с одним протоколом обрабатывает нормально.

humnmind пишет

при добавлении в исключения правила  с одним протоколом ...

Вроде, подправил: https://github.com/Infocatcher/Custom_B … d1ed5f09ef
Там есть nsICookie.isSecure, но у меня он тупо false, хотя использовался https. Так что отработает любое исключение...

Infocatcher
Спасибо. Теперь работает как положено. :)

Infocatcher пишет

Вроде, подправил: https://github.com/Infocatcher/Custom_B … d1ed5f09ef

Infocatcher не могу поправить код инициализации с Вашей правкой. Заменить строки . Пожалуйста выставьте прописанный код с правкой

PetrN
Там по той ссылке -> View -> Raw
Или вот постоянная ссылка на самую последнюю версию: /Custom_Buttons/raw/master/Cookies_Permissions/cookiesPermissions.js

Infocatcher
Спасибо. Ждал ответа.  Разобрался.

Feature Request: добавить возможность временной приостановки удаления печенек как в расширении Self-Destructing Cookies (до ручного отключения приостановки или до перезапуска браузера).
И еще - какая судьба ждет эту кнопку? Как я понимаю расширение Custom Buttons в будущем не жилец. Не планируется оформлять кнопку в отдельное обычное расширение? Эта кнопка, имхо, лучше чем расширения Self-Destructing Cookies и Cookies Exterminator.

humnmind пишет

Feature Request: добавить возможность временной приостановки удаления печенек как в расширении Self-Destructing Cookies (до ручного отключения приостановки или до перезапуска браузера).

Приделал галочку «Автоматически удалять незащищённые cookies»:
https://github.com/Infocatcher/Custom_B … a5580b3115
Логика работы простейшая: таймер для очистки как работал, так и продолжает работать, но снятие галочки убирает флаг, разрешающий зачистку.

Вот версия 0.2.1pre4 - 2016-11-24: https://github.com/Infocatcher/Custom_B … ermissions

humnmind пишет

И еще - какая судьба ждет эту кнопку? Как я понимаю расширение Custom Buttons в будущем не жилец. Не планируется оформлять кнопку в отдельное обычное расширение?

Пока что Custom Buttons все еще можно оживить на Nightly, у меня пока работает.
А если выпилят XUL и XPCOM, то тут уже все заново с нуля переписывать...

Infocatcher

Приделал галочку «Автоматически удалять незащищённые cookies»:

Установил версию 0.2.1pre4 - 2016-11-24 пункт «Автоматически удалять незащищённые cookies» не появился, чистый профиль 50 [firefox] , правда ОС ХР, или не важно?

villa7
Появится только если включена автоматическая очистка, там в начале кода про

Выделить код

Код:

var options = {
    removeUnprotectedCookiesInterval: -1,
    // Periodically remove unprotected cookies (leave only cookies with "Allow" permission)
    // Time in milliseconds like 30*60*1000 (30 minutes) or -1 to disable

Infocatcher
Ага, включил, спасибо. Это он очищает незащищенные куки в течении сеанса, а как сделать чтобы при закрытии браузера автоматом очищал незащищенные куки.

Infocatcher пишет

Приделал галочку «Автоматически удалять незащищённые cookies»

Годнота. Спасибо.

Infocatcher пишет

А если выпилят XUL и XPCOM

А про сроки этого как раз новости свежие 1, 2.

24-11-2016 23:57:52
villa7
В настройках лисы -> Приватность -> Использовать кастомные настройки истории -> Хранить куки до закрытия Firefox (у меня английская локаль поэтому могу напутать с переводом). При этом куки открытых вкладок, для которых нет исключения, будут удалены. А если используешь автоматическое удаление незащищенных кук с помощью этой кнопки с коротким интервалом (например 30 сек), то можно и не париться.

Кому нетрудно, подскажите: какие должны быть настройки, чтобы кнопка копировала поведение по умолчанию Self-Destructing Cookies. Т.е. красная иконка для текущего сайта - удаление кукис после закрытия вкладки, если выбрана зелёная иконка никогда не удалять. Ридми читал, но уж очень лаконичное - не понял. Експериментировать опасаюсь.

lokiju
В последней версии кнопки на момент написания этого сообщения нужно изменить эти параметры
    removeUnprotectedCookiesEnabled: true,
    removeUnprotectedCookiesInterval: 60000,
Во втором параметре числовое значения интервала в миллисекундах, т.е. 60000 миллисекунд = 60 секунд, поэтому незащищенные куки (все куки кроме сайтов добавленных в разрешительное исключение и кроме открытых сайтов) будут удаляться каждую минуту. Можешь изменить это число по своему усмотрению. Для временной приостановки автоудаления можно убрать галочку с пункта "Автоматически удалять незащищенные cookies" в контекстном меню кнопки.

humnmind пишет

и кроме открытых сайтов

Удаляются открытые сайты, если они незащищённые :(

lokiju пишет

Удаляются открытые сайты, если они незащищённые :(

Не воспроизводится.
С каких-то конкретных сайтов удаляются или вообще все? Что при этом открыто во вкладках?
Для сохранения из открытых сайтов при автоматической очистке должно быть «removeAllUnprotectedCookies: false».

lokiju пишет

Удаляются открытые сайты, если они незащищённые :(

Смотри предыдущее сообщение от Infocatcher, и уточни еще - по таймеру удаляются или при закрытии браузера?

Как должно работать "Удалить все незащищённые cookies"? Например, у меня в исключениях десяток сайтов. Я открыл пять сайтов, куки которых появились в списке. Закрыл все вкладки, кроме домашней (FastDial). Нажал "Удалить все незащищённые cookies". Куки сайтов, которых нет в исключениях не удалились. ЧЯДНТ? FF 48, XP SP3. Настройки CP:

скрытый текст
var options = {
    removeUnprotectedCookiesEnabled: true,
    // true  - periodically remove unprotected cookies by default
    // false - don't remove by default
    removeUnprotectedCookiesInterval: 5000,
    // Periodically remove unprotected cookies (leave only cookies with "Allow" permission)
    // Time in milliseconds like 30*60*1000 (30 minutes) or -1 to disable
    removeAllUnprotectedCookies: true,
    // true  - periodically ("removeUnprotectedCookiesInterval" option) remove all unprotected cookies
    // false - or exclude cookies from opened sites
    showTempPermissions: true, // Show items about temporary permissions (only Gecko 2.0+)
    tempExpire: -1, // Type of temporary permissions
    // -1 - session, otherwise - expire after given time (in milliseconds)
    useBaseDomain: {
        // 0 - use full domain name: addons.mozilla.org, www.google.com
        // 1 - strip "www." prefix from full domain name: addons.mozilla.org, google.com
        // 2 - use top-level domains (TLDs): mozilla.org, google.com
        addPermission: 1, // Add (and toggle) permission action
        openPermissions: 0,  // Filter in "Show Exceptions" window
        showCookies: 2, // Filter in "Show Cookies" window
        removeCurrentSiteCookies: 2, // For "Remove All Current Site Cookies" action
        preserveCurrentSitesCookies: 2 // For "removeAllUnprotectedCookies: false"
    },

manuk
Проверил у себя - работает как и полагается, т.е. удаляет все кроме добавленных в исключения.
Окно с установленными куками после "Удаления всех незащищённых cookies" переоткрывал, если оно было открыто на момент удаления?
Еще у тебя установлено removeAllUnprotectedCookies: true, поэтому каждые 5 секунд должны удаляться все куки кроме исключений; даже для открытых сайтов если их нет в исключениях.

В том и дело, что не удаляются. Всего месяц, как вернулся на FF с PM. На PM кнопка работала. Может я чего в about:config наваял?

скрытый текст
12457091m.png

Infocatcher пишет

Для сохранения из открытых сайтов при автоматической очистке должно быть «removeAllUnprotectedCookies: false».

Спасибо, оно. Было true.

Есть пункт "Удалить все сookies", но нет "Показать все сookies"

Спасибо,humnmind,
посмотрел. По таймеру. См. выше.)

manuk пишет

Может я чего в about:config наваял?

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

lokiju пишет

Есть пункт "Удалить все сookies", но нет "Показать все сookies"

Хм, ну это же просто заполненный фильтр, который можно быстро очистить.
Насчет необходимости отдельного пункта меню я не уверен, пока что дополнил «Показать cookies…»: клик средней кнопкой или левой, но с Ctrl/Shift/Alt покажет все cookies: https://github.com/Infocatcher/Custom_B … 3915fb6da0

Подскажите пожалуйста, как установить самую крайнюю актуальную версию? По ссылке "Разрабатываемая версия" нет по отдельности "Кода" и "Инициализации", а так она не ставится.

Echotony пишет

Подскажите пожалуйста, как установить самую крайнюю актуальную версию? По ссылке "Разрабатываемая версия" нет по отдельности "Кода" и "Инициализации", а так она не ставится.

См. cookiesPermissions.js, далее там ссылка Raw – это код инициализации кнопки.

Infocatcher
Спасибо, я не то копировал. Спасибо большое за кнопку, очень удобно! :)

А с какой периодичностью происходит "Автоматическое удаление незащищённых кук"? Это изменяется только в коде или и в about:config? И как правильно поставить 12 и 24 часа?

Echotony пишет: А с какой периодичностью происходит "Автоматическое удаление незащищённых кук"? Это изменяется только в коде

в коде.

removeUnprotectedCookiesInterval: 10*60*1000, << сейчас стоит 10 минут
    // Periodically remove unprotected cookies (leave only cookies with "Allow" permission)
    // Time in milliseconds like 30*60*1000 (30 minutes) or -1 to disable

okkamas_knife
Да, я понял, только непонятно как вводить нужные параметры, например, 12 или 24 часа? :)

написано же ИНТЕРВАЛ
т.е. куки удаляются через каждые N миллисекунд
что там непонятного?
значок умножения * не знаком?

okkamas_knife
Я и спрашиваю, можно ли сделать более простой ввод? Для чего эти умножения и миллисекунды? Как ими получить 24 часа? :)

Echotony пишет

Для чего эти умножения и миллисекунды?

Для лучшего понимания и удобства изменения.

Echotony пишет

Как ими получить 24 часа?

Выделить код

Код:

removeUnprotectedCookiesInterval: 24*60*60*1000,

:)

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

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

vzli_izv пишет

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

Заменить

Выделить код

Код:

this.onclick = function(e) {
    if(e.target != this)
        return;
    var btn = e.button;
    if(btn == 1 || btn == 0 && this.permissions.hasModifier(e))
        this.permissions.openPermissions();
    else if(btn == 0) {
        this.permissions.togglePermission(this.permissions.options.toggleMode);
        // Prevent "command" event to use "command" section only from hotkey
        e.preventDefault();
        e.stopPropagation();
    }
};

на

Выделить код

Код:

this.onclick = function(e) {
    if(e.target != this)
        return;
    var btn = e.button;
    if(btn == 1 || btn == 0 && this.permissions.hasModifier(e))
        this.permissions.openPermissions();
    else if(btn == 0) {
        //this.permissions.togglePermission(this.permissions.options.toggleMode);
        this.permissions.initContextOnce();
        this.permissions.mp.openPopup(this, "after_start");
        // Prevent "command" event to use "command" section only from hotkey
        e.preventDefault();
        e.stopPropagation();
    }
};

Infocatcher
благодарю!

Ребята, а почему опция "Автоматически удалять незащищённые cookies" сбрасывается, при закрытии браузера?

Echotony пишет

почему опция "Автоматически удалять незащищённые cookies" сбрасывается, при закрытии браузера?

Это временное включение/выключение, для постоянного удаления нужно отредактировать код кнопки, вот так:

Выделить код

Код:

var options = {
    removeUnprotectedCookiesEnabled: true,
    // true  - periodically remove unprotected cookies by default
    // false - don't remove by default

Infocatcher
Спасибо, я редактировал параметр removeAllUnprotectedCookies и это не помогало, он должен в false оставаться?

Echotony пишет

я редактировал параметр removeAllUnprotectedCookies и это не помогало, он должен в false оставаться?

Параметр removeAllUnprotectedCookies отвечает только за разрешение автоматического удаления cookies, для которых не задано исключений, но при этом открыта вкладка с этим сайтом.
Для включенного по умолчанию автоматического удаления должно быть выставлено «removeUnprotectedCookiesEnabled: true».

Хорошо бы добавить импорт и экспорт

А где сохраняется список исключений, да и вообще все настройки этой кнопки ?

rubel пишет

А где сохраняется список исключений, да и вообще все настройки этой кнопки ?

Это надстройка над встроенным списком исключений, который хранится в файле permissions.sqlite в папке профиля.
Настройки собственно кнопки – после «var options = {» в самом начале кода.

Добрый день!
Хотелось бы как-то сохранять в фаил список исключенных чтоб обезопасить потерю :blush:

suz191 пишет: Хотелось бы как-то сохранять в фаил список исключенных чтоб обезопасить потерю :blush:

а прочитать предыдущее сообщение не судьба?

okkamas_knife пишет

suz191 пишет: Хотелось бы как-то сохранять в фаил список исключенных чтоб обезопасить потерю :blush:

а прочитать предыдущее сообщение не судьба?

Просто установил все настроил! очень понравилось и увидел новую версию.
Поставил новое и все слетело, расстроился и решил написать :)
Спасибо большое. Я не заметил :lol:

Добрый день...
Не знаю как даже правильно создать вопрос! Но, попробую...
По факту у меня не работает не одно дополнение по очистки cookie...
На пример Cookie AutoDelete требует чтоб я отключил privacy.firstparty.isolate
Но, делать я этого естественно не собираюсь отключил то что это требует :)
С кнопкой по моему получилось тоже самое...
По скольку все папки не понятных сайтов с cookie остаются на месте и я сейчас вообще с трудностью понимаю, что влияет и как их удалять!
Единственное расширение которое хоть что-то делает это Self Destroying Cookies и то не факт... Но, по крайней мере выскакивают окошки и пишет, что что-то удалил...
Может ли параметр  privacy.firstparty.isolate в данном случае блокировать действия кнопки?
Как-то так... Спасибо!!!

И ERS и RELEAS проявляется одинаково... Удаление просто игнорится...

Infocatcher
С Новым Годом Вас ! А нельзя ли поправить эту кнопку для FF 64 ?
Она как бы работает, но вот команда Показать Cookies показывает вот такое сообщение:

Выделить код

Код:

Firefox не может найти файл jar:file:///D:/64/browser/omni.ja!/chrome/browser/content/browser/preferences/cookies.xul. 
Проверьте правильность введённого имени файла, соответствие регистра и отсутствие других ошибок в имени файла.
Проверьте, не был ли файл переименован, удалён или перемещён.
rubel пишет

но вот команда Показать Cookies показывает вот такое сообщение

А разве встроенную возможность посмотреть сохраненные cookies еще не выпилили? Собирались же.
На «Информация о странице – Защита» уже только кнопка очистки.

Infocatcher пишет

посмотреть сохраненные cookies еще не выпилили?

Посмотреть можно через Настройки-Приватность и защита-Куки и данные сайтов-Управление данными. Канитель, короче....
Да, очень не хватает Вашей кнопочки.

rubel пишет

Посмотреть можно через Настройки-Приватность и защита-Куки и данные сайтов-Управление данными. Канитель, короче....

Добавил открытие странного окошка chrome://browser/content/preferences/siteDataSettings.xul.
Последняя версия: Custom_Buttons/blob/master/Cookies_Permissions/cookiesPermissions.js
Изменения: Custom_Buttons/commits/…/Cookies_Permissions/cookiesPermissions.js

Infocatcher пишет

Последняя версия: Custom_Buttons/blob/master/Cookies_Permissions/cookiesPermissions.js

В [firefox] esr 60 (64-бит) не работает. И как, если это возможно, сделать выпадающее меню кнопки на русском?

kokoss пишет

В [firefox] esr 60 (64-бит) не работает.

Ну я не знаю…
m1cKcsn.png

Или не так установлено, или конфликт какой.

kokoss пишет

И как, если это возможно, сделать выпадающее меню на русском?

Эмм, переключить интерфейс браузера на русский язык?
В Firefox 60 вызывается Services.locale.getRequestedLocales(), читающий настройку intl.locale.requested.

Infocatcher
Я имел в виду (64-бит) а не (32-бит).

Infocatcher пишет

Эмм, переключить интерфейс браузера на русский язык?

Он у меня и так на русском!

Infocatcher пишет

Добавил открытие странного окошка chrome://browser/content/preferences/siteDataSettings.xul.

По-моему, как не работало без SiteDataManager.updateSites(),
так и не работает, если ни разу не посещалась страница about:preferences

Вроде так чуть получше

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

Выделить код

Код:

//if(this.app.name == "Firefox" && parseFloat(this.app.version) >= 62) { //~ todo: check versions
        //    this.showSiteDate(host);
        if(this.app.name == "Firefox" && parseFloat(this.app.version) >= 61) {
            this.showSiteData(host);
            return;
        }
...
    //showSiteDate: function(host) {
    //    var win = this.wm.getMostRecentWindow("Browser:Cookies");
    showSiteData: function(host) {
        var win = this.wm.getMostRecentWindow("Browser:SiteDataSettings");
        var _this = this;
        var setFilter = function setFilter(e) {
            e && win.removeEventListener("load", setFilter, false);
            _this.setTextboxValue(win.document.getElementById("searchBox"), host);
        };
        if(win) {
            win.focus();
            host && setFilter();
        }
        else {
            //win = window.openDialog("chrome://browser/content/preferences/siteDataSettings.xul", "_blank", "");
            //host && win.addEventListener("load", setFilter, false);
            Cu.import("resource:///modules/SiteDataManager.jsm", {}).SiteDataManager.updateSites().then(function() {
                win = window.openDialog("chrome://browser/content/preferences/siteDataSettings.xul", "_blank", "");
                host && win.addEventListener("load", setFilter, false);
            }, Cu.reportError);
        }
    },

Dumby
О! Спасибо. Обновил: https://github.com/Infocatcher/Custom_B … 5785526ead

Странно, я, вроде, менял на "Browser:SiteDataSettings", но, видимо, отвлекли в процессе.

Dumby пишет

если ни разу не посещалась страница about:preferences

Задорные нынче пошли API...
Что характерно, время последнего использования тоже никто не обновляет, пока окошко открыто – надо передергивать фильтр.

del

Infocatcher
Заменить бы надо siteDataSettings.xul и permissions.xul на siteDataSettings.xhtml, permissions.xhtml соответственно. А то ошибку выдаёт при открытие Показать исключения... и Показать cookies...

voqabuhe пишет

Заменить бы надо siteDataSettings.xul и permissions.xul на siteDataSettings.xhtml, permissions.xhtml соответственно. А то ошибку выдаёт при открытие Показать исключения... и Показать cookies...

Добавил, спасибо. На удивление безболезненно починилось.
Тестовая: Cookies Permissions 0.2.1pre7 (2020-02-17)

Infocatcher
Снова поменяли адреса.

Dumby пишет

Снова поменяли адреса.

Я наконец-то добрался…
Спасибо! Обновил:
https://github.com/Infocatcher/Custom_B … 1db8c1cf3f
https://github.com/Infocatcher/Custom_B … c62198b602

Скажите как подружить скрипт с Waterfox G3 (FF78)? При нажатии на Show Cookies... выводит 3 стандартные кнопки - свернуть, развернуть, закрыть. Самого окна нет. Нажимаю Развернуть окно, открывается такое

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

Выделить код

Код:

File not found

can’t find the file at jar:file:///J:/WFG31/core/browser/omni.ja!/chrome/browser/content/browser/preferences/cookies.xul.

    Check the file name for capitalization or other typing errors.
    Check to see if the file was moved, renamed or deleted.


Ни в FF, ни в WF в omni.ja по указанному пути файла cookies.xul нет. Но FF открывает окно Manage Cookies and Site Data, а WF - нет.

harryk пишет

Скажите как подружить скрипт с Waterfox G3 (FF78)? При нажатии на Show Cookies...

Мне не поставить Waterfox, но, предположительно, вот так:

Выделить код

Код:

…
	showCookies: function(showAll) {
		…
		//if(this.app.name == "Firefox" && parseFloat(this.app.version) >= 61) {
		if(
			(this.app.name == "Firefox" || this.app.name == "Waterfox")
			&& parseFloat(this.app.version) >= 61
		) {
			this.showSiteData(host);
			return;
		}

Infocatcher
Спасибо. Сработало, и не только в WF