Недавно меня попросили немного допилить расширение Panic Button. Суть доработки - при восстановлении окон после нажатия на эту Panic Button требовать от пользователя пароль, заданный в настройках расширения. Это проблем не вызвало. Но еще было высказано пожелание, чтобы после нажатия на Panic Button, и последующего закрытия браузера по нажатию кнопки выхода в панели, остающейся вместо окна браузера, т.е. при закрытии браузера в "паническом" состоянии, при последующем запуске браузера у него автоматически скрывались все окна, и надо было бы снова вводить пароль для восстановления сессии. Механизм скрытия/восстановления окон браузера у этого расширения таков: при скрытии состояние сессии, получаемое от nsISessionStore.getBrowserData(), запоминается в поле XPCOM-компонента, все окна принудительно закрываются, и остается только маленькая панелька, на которой есть две кнопки: восстановить сессию, и закрыть браузер. При восстановлении сессии промежуточно сохраненные в компоненте данные от nsISessionStore.getBrowserData() передаются в nsISessionStore.setBrowserState. Так вот, если попытаться методами, уже существующими в расширении, на этапе инициализации (onload) описанным выше способом закрыть все окна, а потом попытаться восстановить сессию, то вылетает ошибка. Как выяснилось - из-за того, что на onload данных сессии еще нет, и getBrowserState возвращает JSON-строку, описывающую фактически пустой объект. Из событий и топиков обсервера, которые как-то могли бы сигнализировать о наличии данных сессии, я нашел только sessionstore-state-write. В принципе, с этим топиком всё работает, как надо, но есть 2 "но": во-первых, описание топика говорит, что он sent immediately before the session store data is written to disk, и в общем случае это событие, как я думаю, не связано с моментом появления данных о сессии - сейчас оно возникает где-то при старте браузера, а в следующей версии может возникнуть минут через 5-10-15-20 - я думаю, что возникновение этого события недетерминировано. Во-вторых, есть расширения, использующие альтернативные менеджеры сессий, и переопределяющие на себя стандартную функциональность восстановления сессий - как тот же tabmix plus. В этом случае топика sessionstore-state-write не возникает вообще, но в nsISessionStore.getBrowserData() в какой-то момент все равно появляются данные о сессии - вот этот момент мне и хотелось бы поймать. |