Pull to refresh

Ищем решение проблемы потери данных при падении Лисы

Reading time3 min
Views3K
Так получилось, что за несколько последних дней 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

Так что через полчаса я уже имел код:
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 и жму на кнопочку букмарклета, для которой сделал иконку image (загрузить).
Иконку поставил с помощью экстеншина Favicon Picker 3.

Замечено

Сохранение, при нажатии на такой букмарклет, происходит только, если что-то действительно менялось в настройках. В противном случае ничего не происходит, prefs.js не трогается, и ощутимой задержки при нажатии на кнопку тогда нет. Это очень хорошо для периодического сохранения в фоне, если такое как-то сделать.

Попутные мысли

По-хорошему, это экстеншини должны делать flush при закрытии окна своих настроек, а не пользователь. Так же и Firefox мог бы делать это периодически, а не только при закрытии и, как выяснилось про процессе исследований, при изменениях в настройках браузера (окно Options или вкладка about:config). Идти каждый раз что-то менять в настройках, или в таблице about:config поменять туда и обратно произвольный boolean-параметр — тоже вариант, но всё же не то…

Надеюсь, что вместе хабрасообщество может найти/придумать более хорошее решение, чем то, что получилось у меня.

Tags:
Hubs:
Total votes 29: ↑22 and ↓7+15
Comments50

Articles