Infocatcher
При удалении DOM-узла из дерева сработает XBL-деструктор, а при добавлении – конструктор. В общем, это все особенности реализации.
А первоначальную инициализацию никто не отменял.
Извиняюсь, возможно я сейчас скажу глупость (в программировании под XUL я не в зуб ногой). А нельзя ли сделать статическую переменную-счётчик и вызывать инициализацию только один раз (самый самый первый)? Типа синглтона?
Протестировал сейчас кнопочку в статус-баре. Чтобы смотрелось хорошо, нужно стереть название кнопки (в CB-редакторе), иначе рядом с иконкой будет очень много букв. Выглядит и работает почти замечательно.
Два момента:
1. Когда наводишь на иконку, она "подсвечивается" прямоугольником, как пункт меню. Вероятно иконка добавляется как класс "панель" или что-то в этом роде.
2. Иконка в статус-бар добавляется с помощью appendChild(). Тут-то и порылась собака! Дело в том, что в статус-баре (это моя догадка, но вполне очевидно) присутствует прогресс-бар - ползущая шкала, которая появляется при загрузке страницы. В нормальном состоянии этот прогресс-бар либо невидим, либо имеет минимальные размеры. Иконка Cookie Permissions располагается после прогресс-бара (на экране - максимально влево).
В итоге, при загрузке новой страницы появляется прогресс-бар и иконка Cookie Permissions начинает сильно прыгать влево-вправо.
Решением я вижу использовать не addChild, а какой нибудь insertChildByIndex. Если по индексу вставлять дочерние элементы невозможно (нет такой функции), нужно сделать enumeration и загрузить в массив все чайлды из статус-бара, по-ходу дела удаляя их из статус-бара. Потом добавить все элементы обратно по addChild и в нужном месте втавить иконку Cookie Permissions. Причём уже можно по желанию засунуть Cookie Permissions на первое, второе, энное место.
Что скажете, возможно такое запрограммировать под XUL?
Отсутствует
Извиняюсь, возможно я сейчас скажу глупость (в программировании под XUL я не в зуб ногой). А нельзя ли сделать статическую переменную-счётчик и вызывать инициализацию только один раз (самый самый первый)? Типа синглтона?
Если что-то и править, то в Custom Buttons.
А у меня вызывают onDestroy(), и я не могу в общем случае гарантировать, будет ли после этого вызвана инициализация.
Еще в некоторых случаях XBL-деструктор может удалить добавленные дочерние узлы (в частности, контекстное меню). То есть всякие добавленные обработчики останутся, а состояние самой кнопки сбросится.
И не особо хочется привязываться к текущей реализации – сломается, если что-то все же будет доработано в Custom Buttons.
1. Когда наводишь на иконку, она "подсвечивается" прямоугольником, как пункт меню.
В общем случае от стилей для <toolbarbutton> никуда не деться.
Можно только переопределить стили (проще) или создать, например, <image> и спрятать кнопку (сложнее).
2. [...]
В итоге, при загрузке новой страницы появляется прогресс-бар и иконка Cookie Permissions начинает сильно прыгать влево-вправо.
Да, надо добавлять в другое место.
Add "moveToSeaMonkeyStatusBar" option
Добавлено 06-09-2012 10:37:39
Use pure CSS for button appearance with "moveToSeaMonkeyStatusBar" enabled
Отредактировано Infocatcher (06-09-2012 10:37:39)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
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 (06-09-2012 13:52:06)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
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 есть
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
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.
Отредактировано Infocatcher (05-12-2012 23:33:04)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Экспериментальное:
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 (24-03-2013 16:29:26)
Иногда мне кажется, что лучшие программисты мира и лучшие технические умы работают только над одним - как сделать так, чтоб на новом скоростном железе тормозило также, как на хламе 10 летней давности.
(с)
Отсутствует
1. Иконки состояния "по умолчанию" и "разрешено" были разными.
Они и сейчас разные, но дополнительно отображается состояние по умолчанию полупрозрачным значком.
Можно или перерисовать иконки, или отключить:
– сменить «true» на «false».
2. Раньше один раз кликнув по кнопке, состояние менялось на разрешено, второй раз - на заблокировано. В общем хотелось бы чтобы сейчас было так же.
Ммм... не было, вроде, такого.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Ммм... не было, вроде, такого.
Было!!! Я тысщю раз пользовался этой кнопкой! Хотя возможно это была не конкретно твоя, а чья-то модификация, этого уже не помню...
Во всяком случае, по-моему было весьма удобно.
Они и сейчас разные, но дополнительно отображается состояние по умолчанию полупрозрачным значком.
Хмм... Если честно, то на той картинке ссылку на которую дал, иконки "Разрешить" и "По умолчанию разрешить" практически идентичны.
Кстати, как задать чтобы по умолчанию куки были временно разрешены?
Отредактировано Raf-9600 (24-03-2013 17:19:56)
Иногда мне кажется, что лучшие программисты мира и лучшие технические умы работают только над одним - как сделать так, чтоб на новом скоростном железе тормозило также, как на хламе 10 летней давности.
(с)
Отсутствует
Хотя возможно это была не конкретно твоя, а чья-то модификация, этого уже не помню...
На такие случаи надо делать резервные копии.
Во всяком случае, по-моему было весьма удобно.
Да я не спорю.
Но там есть большое визуальное неудобство при переключении разрешений для www.example.com, если уже есть исключение для example.com.
Можно попробовать вот так:
Simplify options.useBaseDomain.* usage
Experimental: cycle switch between options.toggleMode
(результат)
(Что-то я не поспеваю за меняющимся текстом. Править лень. )
а перерисовать как?
Взять отсюда исходник или готовую картинку с иконками, отредактировать, сохранить в PNG, закодировать в base64 и вставить сюда:
Странно, но у меня вариант "По умолчанию" и "Разрешено" абсолютно одинаков. Т.е. даже на сайтах которые я не добавлял в белый/черный список.
Ну, не знаю. Или что-то все-таки не срабатывает, или монитор такой.
Кстати, как задать чтобы по умолчанию куки были временно разрешены?
Настройки – Приватность – Firefox: будет использовать ваши настройки хранения истории
А дальше должно быть понятно.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
(результат)
Скопипастил в "инициализацию", потом кликнул ПКМ по кнопке и браузер "испортился" - пришлось перезапускать =\
Настройки – Приватность – Firefox: будет использовать ваши настройки хранения истории
Но там есть только либо хранить, либо не хранить, либо хранить до закрытия, а пункта "хранить определённое время" - нет. Вот прошлая кнопка как рас по умолчанию временно хранила.
На такие случаи надо делать резервные копии.
Вот
// 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); };
Иногда мне кажется, что лучшие программисты мира и лучшие технические умы работают только над одним - как сделать так, чтоб на новом скоростном железе тормозило также, как на хламе 10 летней давности.
(с)
Отсутствует
Но там есть только либо хранить, либо не хранить, либо хранить до закрытия, а пункта "хранить определённое время" - нет. Вот прошлая кнопка как рас по умолчанию временно хранила.
Прошлая кнопка не могла ничего делать сверх настроек Firefox.
network.cookie.lifetimePolicy
Вот
Это оригинальная кнопка. И у меня она только переключает разрешить/по умолчанию.
Добавлено 24-03-2013 18:38:20
Скопипастил в "инициализацию", потом кликнул ПКМ по кнопке и браузер "испортился" - пришлось перезапускать =\
Странно. Копировать, кстати, лучше по ссылке «Raw» – там отступы не ломаются.
Отредактировано Infocatcher (24-03-2013 18:38:20)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Странно. Копировать, кстати, лучше по ссылке «Raw» – там отступы не ломаются.
Помогло.
Прошлая кнопка не могла ничего делать сверх настроек Firefox.
У меня галлюцинации походу
Иногда мне кажется, что лучшие программисты мира и лучшие технические умы работают только над одним - как сделать так, чтоб на новом скоростном железе тормозило также, как на хламе 10 летней давности.
(с)
Отсутствует
На 21 стал удалять защищенные куки при нажатии на "удалить незащищенные куки".
А так?
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Так работает, спасибо.
Это хорошо.
Cookies Permissions 0.2.0.1 (2013-05-14) (это версия 0.2.0 - 2013-03-02 + это исправление)
[x] Исправлена обработка «защищенных» cookies в Gecko 21+.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Замечательная кнопка, спасибо
Отсутствует
Лучше бы вы ее в дополнение переделали. И популярность и баг репорты.
Отсутствует
Где в коде выставить useBaseDomain в true чтобы убрать www. ?
Откуда убрать?
Видимо, где-то здесь:
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"
},
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует