Бывают случаи, когда Firefox приходится оставлять надолго без присмотра (например, в нём работает расширение, собирающее критические новости, или встроенный торрент-клиент, или даже мини-сервер). Не секрет, что со временем работы браузера растёт потребление памяти. Рано или поздно система может почувствовать дискомфорт. Поэтому хорошо бы иметь возможность задавать браузеру отложенные задания на перезапуск. Возможны как минимум три вида таких заданий.
Сначала устанавливаем расширение Custom Buttons. Оно позволяет создавать на панели инструментов кнопки для выполнения произвольного кода (причём код будет привилегированным, с правами расширения). По сути, это фреймворк для быстрого создания мини-расширений.
После установки создаём кнопку и в первую вкладку настроек этой кнопки вводим следующий код:
В диалоге, вызываемом нажатием кнопки, можно ввести количество минут до перезапуска. По умолчанию заданы сутки.
Если браузер предоставляется самому себе на особо длительный период, возможно, придётся прибегнуть к многократным периодическим перезапускам. Для этого во вторую вкладку настроек новосозданной кнопки (вкладка «Инициализация») нужно ввести следующий код:
После каждого запуска браузера будет начинаться отсчёт времени, заданного параметром
Если нужен перезапуск в указанное время, а не через указанный период, здесь есть подходящее решение.
К предыдущему способу мы можем добавить проверку одного из подходящих условий. Рассмотрим два: период простоя браузера и объём занимаемой памяти.
Функция каждую минуту будет проверять время неактивности, и, если оно превысит параметр
Тут всё немого сложнее. Поиск в MDC не дал документированных интерфейсов для получения подобной информации. Но в Firefox 3.6 появилась страница
Функция каждую минуту проверяет время простоя. Когда оно превысит лимит, функция каждую минуту начнёт проверять размер памяти. Когда и этот лимит будет превышен, браузер перезапустится.
Остаётся добавить, что перед заданием перезапусков стоит отключить проверку обновлений браузера и расширений (или по крайней мере сделать обновления автоматическими), иначе диалоги обновления могут блокировать работу Firefox после очередного перезапуска.
1. Единичный перезапуск по требованию пользователя
Сначала устанавливаем расширение Custom Buttons. Оно позволяет создавать на панели инструментов кнопки для выполнения произвольного кода (причём код будет привилегированным, с правами расширения). По сути, это фреймворк для быстрого создания мини-расширений.
После установки создаём кнопку и в первую вкладку настроек этой кнопки вводим следующий код:
var timeout = prompt("Введите количество минут до перезапуска:", "1440"); if (timeout) { window.setTimeout("Application.restart();", timeout * 60 * 1000); }
В диалоге, вызываемом нажатием кнопки, можно ввести количество минут до перезапуска. По умолчанию заданы сутки.
2. Безусловный периодический перезапуск без вмешательства пользователя
Если браузер предоставляется самому себе на особо длительный период, возможно, придётся прибегнуть к многократным периодическим перезапускам. Для этого во вторую вкладку настроек новосозданной кнопки (вкладка «Инициализация») нужно ввести следующий код:
var timeout = 1440; //minutes window.setTimeout("Application.restart();", timeout * 60 * 1000);
После каждого запуска браузера будет начинаться отсчёт времени, заданного параметром
timeout
. Опять-таки по умолчанию определён перезапуск раз в сутки, но пользователь может заменить число 1440 на любое другое (не введите случайно слишком маленький интервал (дробь), иначе придётся разбираться с последствиями в безопасном режиме).Если нужен перезапуск в указанное время, а не через указанный период, здесь есть подходящее решение.
3. Условный периодический перезапуск без вмешательства пользователя
К предыдущему способу мы можем добавить проверку одного из подходящих условий. Рассмотрим два: период простоя браузера и объём занимаемой памяти.
А. Проверяем время неактивности пользователя
Функция каждую минуту будет проверять время неактивности, и, если оно превысит параметр
idleLimit
(задаётся в минутах), браузер перезапустится.var idleLimit = 60; //minutes var idleService = Components.classes["@mozilla.org/widget/idleservice;1"] .getService(Components.interfaces.nsIIdleService); window.setInterval( function() { if (idleService.idleTime / 60000 > idleLimit) { Application.restart(); } }, 60000 );
Б. Проверяем объём памяти
Тут всё немого сложнее. Поиск в MDC не дал документированных интерфейсов для получения подобной информации. Но в Firefox 3.6 появилась страница
about:memory
. Анализ её кода приводит к файлу chrome://global/content/aboutMemory.js
, в котором используются несколько опять-таки недокументированных интерфейсов. При их помощи можно рискнуть на такой код (функция перебирает доступные типы памяти, и, если хотя бы один из них превысит установленный лимит (задаётся в мегабайтах), браузер перезапустится):var memoryLimit = 200; //megabytes var enumeratedReporters = Components.classes["@mozilla.org/memory-reporter-manager;1"] .getService(Components.interfaces.nsIMemoryReporterManager) .enumerateReporters(); while (enumeratedReporters.hasMoreElements()) { if ( enumeratedReporters.getNext() .QueryInterface(Components.interfaces.nsIMemoryReporter) .memoryUsed / 1000000 > memoryLimit ) { Application.restart(); } }
Однако неизвестно, как используемые интерфейсы зависят от операционных систем (в сети встречаются упоминания о том, чтоabout:memory
не работает в Linux). Также непонятно, в какой версии Firefox появились эти интерфейсы. Поэтому был бы благодарен читателям, если бы они смогли протестировать следующий код и в комментариях отписались бы о том, что он выдаёт на разных OC и в разных версиях Firefox (постарайтесь не повторять конфигурации, о которых уже отписались):
try { var enumeratedReporters = Components.classes["@mozilla.org/memory-reporter-manager;1"] .getService(Components.interfaces.nsIMemoryReporterManager) .enumerateReporters(); var report = ""; while (enumeratedReporters.hasMoreElements()) { var memoryReporter = enumeratedReporters.getNext() .QueryInterface(Components.interfaces.nsIMemoryReporter); report += memoryReporter.path + ":\t" + memoryReporter.memoryUsed / 1000000 + "\n"; } alert(report || "Memory information not available."); } catch(error) {alert(error)}
В. Объединяем обе проверки
Функция каждую минуту проверяет время простоя. Когда оно превысит лимит, функция каждую минуту начнёт проверять размер памяти. Когда и этот лимит будет превышен, браузер перезапустится.
var idleLimit = 60; //minutes var memoryLimit = 200; //megabytes var idleService = Components.classes["@mozilla.org/widget/idleservice;1"] .getService(Components.interfaces.nsIIdleService); var reporterManager = Components.classes["@mozilla.org/memory-reporter-manager;1"] .getService(Components.interfaces.nsIMemoryReporterManager); window.setInterval( function() { if (idleService.idleTime / 60000 > idleLimit) { var enumeratedReporters = reporterManager.enumerateReporters(); while (enumeratedReporters.hasMoreElements()) { if ( enumeratedReporters.getNext() .QueryInterface(Components.interfaces.nsIMemoryReporter) .memoryUsed / 1000000 > memoryLimit ) { Application.restart(); } } } }, 60000 );
Остаётся добавить, что перед заданием перезапусков стоит отключить проверку обновлений браузера и расширений (или по крайней мере сделать обновления автоматическими), иначе диалоги обновления могут блокировать работу Firefox после очередного перезапуска.