Так получилось, что за несколько последних дней Firefox не закрывался нормально дважды. Первый раз он честно сдался (crash) после длительного периода интенсивной работы, неся на борту более 50 экстеншинов, а второй раз: пришел сегодня на работу — а комп выключен. Оказалось, электричество вырубали…
Еще в первый раз я заметил, что не сохранились настройки одного расширения, которым я как раз тогда пользовался. Пришлось заново настроить. Но когда сегодня пришлось во второй раз эти настройки восстанавливать, я подумал, что так быть не должно.
Поискав немного, я нашел, что Firefox делает сохранение настроек в файл prefs.js
(живет по адресу C:\Documents and Settings\User\Application Data\Mozilla\Firefox\Profiles\sDgUfwhg.default\prefs.js)
только при штатном закрытии (и еще при некоторых движениях, которые всплыли в ходе расследования).
Но браузер в наше время практически никогда не закрывается… Значит должно быть решение ;)
Имеется типичная ситуация:
Вот я только что внёс некоторые поправки в настройки экстеншина (например, добавил сайт в белый список BetterCache, или Stop Autoplay). Точно знаю, то эти настройки хранятся в prefs.js, то есть они будут реально сохранены на винт при закрытии браузера. И вот, чтобы не потерять проделанную работу, теперь возникает желание закрыть и открыть браузер (или сделать restart), но очень не хочется, так как открыто множество вкладок, и вообще браузер не должен закрываться. Получается, что если ничего не сделать и продолжить работать, то с большой вероятностью такие данные будут потеряны.
Похожая проблема существует и с приложениям под Windows, которые хранят данные в реестре: очень редко, но бывало, что я получал BSOD и после загрузки замечал, что настройки некоторых программ «забыли» все мои последние изменения. То есть изменения в реестре тоже далеко не сразу сохраняются на винт.
В данной ситуации с Firefox, я начал искать решение для сохранения настроек, а точнее, как сделать flush настроек в файл prefs.js, не закрывая браузер.
Подумал, что может уже есть какой-то экстеншн, но поиск на addons.mozilla.org не дал результатов (только ещё раз убедился, что поиск у них никакой).
Потом начал гуглить на тему «prefs.js» flush и нашел 2 толковые страницы:
www.softwarepunk.com/blog/firefox-preferences-flush.html
fixunix.com/mozilla/408327-savepreffile-doesnt-really-work.html
Так что через полчаса я уже имел код:
Но запустив его в консоли Firebug, я получал:
Error: Permission denied for <…> to get property XPCComponents.classes
Для любой страницы любого сайта.
Тогда я подумал, что нужно пробовать не на сайтах, а на внутренних станицах Firefox. Пробую на about:config — характерная задержка і никакого сообщения об ошибке. Смотрю на prefs.js — обновился.
Проверил поиском по тексту наличие доменов, которые я вносил в белый список, — присутствуют, значит сохранение недавних изменений точно происходит.
Теперь следующая задача: как сделать сохранение удобным?
Первая мысль — букмарклет. Создаю закладку, прописываю ей в Location:
Пробую при открытой странице about:config — работает, на всех других — Permission denied.
Вот на этом я и застрял.
Как сделать, чтобы кнопка срабатывала независимо от того, какой сайт открыт? (скриптом открывать about:config, запускать код там, и закрывать? Думаю не получится по той же причине, по которой мы получаем Permission denied — нарушение безопасности).
Как сделать, нормальную кнопку, или чтобы не нужно было кнопки вообще, а просто, чтобы код сохранения срабатывал периодически? (Написать екстеншн? У меня нет опита, если есть кто более опытен — помогите).
UPD. Хороший человек нашелся, смотрите первый комментарий.
Пока что я вручную открываю about:config и жму на кнопочку букмарклета, для которой сделал иконку (загрузить).
Иконку поставил с помощью экстеншина Favicon Picker 3.
Надеюсь, что вместе хабрасообщество может найти/придумать более хорошее решение, чем то, что получилось у меня.
Еще в первый раз я заметил, что не сохранились настройки одного расширения, которым я как раз тогда пользовался. Пришлось заново настроить. Но когда сегодня пришлось во второй раз эти настройки восстанавливать, я подумал, что так быть не должно.
Поискав немного, я нашел, что Firefox делает сохранение настроек в файл prefs.js
(живет по адресу C:\Documents and Settings\User\Application Data\Mozilla\Firefox\Profiles\sDgUfwhg.default\prefs.js)
только при штатном закрытии (и еще при некоторых движениях, которые всплыли в ходе расследования).
Но браузер в наше время практически никогда не закрывается… Значит должно быть решение ;)
Имеется типичная ситуация:
Вот я только что внёс некоторые поправки в настройки экстеншина (например, добавил сайт в белый список BetterCache, или Stop Autoplay). Точно знаю, то эти настройки хранятся в prefs.js, то есть они будут реально сохранены на винт при закрытии браузера. И вот, чтобы не потерять проделанную работу, теперь возникает желание закрыть и открыть браузер (или сделать restart), но очень не хочется, так как открыто множество вкладок, и вообще браузер не должен закрываться. Получается, что если ничего не сделать и продолжить работать, то с большой вероятностью такие данные будут потеряны.
Похожая проблема существует и с приложениям под Windows, которые хранят данные в реестре: очень редко, но бывало, что я получал BSOD и после загрузки замечал, что настройки некоторых программ «забыли» все мои последние изменения. То есть изменения в реестре тоже далеко не сразу сохраняются на винт.
В данной ситуации с Firefox, я начал искать решение для сохранения настроек, а точнее, как сделать flush настроек в файл prefs.js, не закрывая браузер.
Подумал, что может уже есть какой-то экстеншн, но поиск на addons.mozilla.org не дал результатов (только ещё раз убедился, что поиск у них никакой).
Потом начал гуглить на тему «prefs.js» flush и нашел 2 толковые страницы:
www.softwarepunk.com/blog/firefox-preferences-flush.html
fixunix.com/mozilla/408327-savepreffile-doesnt-really-work.html
Так что через полчаса я уже имел код:
Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).savePrefFile(null)
Но запустив его в консоли Firebug, я получал:
Error: Permission denied for <…> to get property XPCComponents.classes
Для любой страницы любого сайта.
Тогда я подумал, что нужно пробовать не на сайтах, а на внутренних станицах Firefox. Пробую на about:config — характерная задержка і никакого сообщения об ошибке. Смотрю на prefs.js — обновился.
Проверил поиском по тексту наличие доменов, которые я вносил в белый список, — присутствуют, значит сохранение недавних изменений точно происходит.
Теперь следующая задача: как сделать сохранение удобным?
Первая мысль — букмарклет. Создаю закладку, прописываю ей в Location:
javascript:Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).savePrefFile(null)
Пробую при открытой странице about:config — работает, на всех других — Permission denied.
Вот на этом я и застрял.
Как сделать, чтобы кнопка срабатывала независимо от того, какой сайт открыт? (скриптом открывать about:config, запускать код там, и закрывать? Думаю не получится по той же причине, по которой мы получаем Permission denied — нарушение безопасности).
Как сделать, нормальную кнопку, или чтобы не нужно было кнопки вообще, а просто, чтобы код сохранения срабатывал периодически? (Написать екстеншн? У меня нет опита, если есть кто более опытен — помогите).
UPD. Хороший человек нашелся, смотрите первый комментарий.
Пока что я вручную открываю about:config и жму на кнопочку букмарклета, для которой сделал иконку (загрузить).
Иконку поставил с помощью экстеншина Favicon Picker 3.
Замечено
Сохранение, при нажатии на такой букмарклет, происходит только, если что-то действительно менялось в настройках. В противном случае ничего не происходит, prefs.js не трогается, и ощутимой задержки при нажатии на кнопку тогда нет. Это очень хорошо для периодического сохранения в фоне, если такое как-то сделать.Попутные мысли
По-хорошему, это экстеншини должны делать flush при закрытии окна своих настроек, а не пользователь. Так же и Firefox мог бы делать это периодически, а не только при закрытии и, как выяснилось про процессе исследований, при изменениях в настройках браузера (окно Options или вкладка about:config). Идти каждый раз что-то менять в настройках, или в таблице about:config поменять туда и обратно произвольный boolean-параметр — тоже вариант, но всё же не то…Надеюсь, что вместе хабрасообщество может найти/придумать более хорошее решение, чем то, что получилось у меня.