>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Расширение-Singleton? http://forum.mozilla-russia.org/viewtopic.php?id=29470 |
AllSeeingI > 07-01-2009 15:42:51 |
Здравствуйте все, есть у меня расширение, тихо сидящее в фоне и выполняющее некие действия. Но - мне нужно, чтобы на компе это расширение работало в единственном экземпляре. Т.е. если пользователь запускает 2е окно файрфокса - то расширение в нём должно понимать, что одно окно браузера уже запущено и никаких действий выполнять не надо. Можно это как-то провернуть? Заранее спасибо. |
Anton > 07-01-2009 16:06:07 |
"2е окно файрфокса" требует пояснение. Это второе окно одного приложения, или это окно второго приложения (напр. другой версии). |
homo_nudus > 07-01-2009 16:49:49 |
Тоже думал о такой проблеме. Но вот в чём загвоздка: если браузер завершит работу аварийно, расширение не успеет снять блокировку - будь то с ключа в preferences или с файла (о реестре говорить не приходится, потому что это не кроссплатформенный инструмент). Тогда при всех следующих запусках расширение будет думать, что уже один экземпляр запущен, и ничего не делать. Если расширение написано для себя, это не так страшно -- можно снять блокировку вручную. Но другие пользователи, не посвящённые в механизм, будут сбиты с толку. |
KML > 07-01-2009 20:50:27 |
+1 за компоненту. |
AllSeeingI > 07-01-2009 22:10:35 |
Может как-то через nsIWindowMediator можно работать? Если же писать компоненту - тогда можно искать процессы firefox.exe... |
AllSeeingI > 08-01-2009 22:12:37 |
Как вариант. Пусть у нас есть расширение, и работа ведётся основным объектом myExtensionObject. Рассмотрим ф-цию инициализации этого расширения: Выделить код Код:init: function() { //First - check if any instances of Firefox already running: var watcher = Components.classes["@mozilla.org/embedcomp/window-watcher;1"].getService(Components.interfaces.nsIWindowWatcher); var winenum = watcher.getWindowEnumerator(); var wncount = 0; while(winenum.hasMoreElements()) { var win = winenum.getNext(); if(win && win.myExtensionObject) wncount++; } // At least one instance is in place - stop all operations. if(wncount > 1) return; ... } Что думаете? |
Anton > 08-01-2009 22:19:07 |
Пока тема "2-го окна фокса" не раскрыта в полной мере, думать особенно не над чем. |
Crazy-EyE > 09-01-2009 05:34:54 |
Если первый вариант, то см. здесь. Лучше всего XPCOM-компонент на JavaScript, т.к. будет работать во всех версиях. Если второй вариант, то, думаю, "несложный сетевой сервис" - самое надежное решение. |
Al_H > 09-01-2009 16:37:47 |
Так а нельзя создать глобальную переменную вне настроек, чтобы ее видели в течение сеанса все окна? |
Crazy-EyE > 09-01-2009 22:30:10 |
В JS все переменные - на самом деле поля какого-то глобального объекта (обычно своего window). Поэтому надо найти (или создать) какой-нибудь такой объект. По ссылке, которую я привел("здесь" == Working with windows in chrome code - Advanced data sharing), как раз написано, как это сделать: |
Forest > 11-01-2009 11:18:26 |
Если под винду и разные окна == разные профили - мб лучше всего написать сервис. Версия с блокировкой будет нормально работать, если сделать её временной с периодическим подтверждением. |