Страницы: 1
Здравствуйте все,
есть у меня расширение, тихо сидящее в фоне и выполняющее некие действия. Но - мне нужно, чтобы на компе это расширение работало в единственном экземпляре.
Т.е. если пользователь запускает 2е окно файрфокса - то расширение в нём должно понимать, что одно окно браузера уже запущено и никаких действий выполнять не надо.
Можно это как-то провернуть? Заранее спасибо.
Отсутствует
"2е окно файрфокса" требует пояснение. Это второе окно одного приложения, или это окно второго приложения (напр. другой версии).
Если второй вариант, то, скорее всего, файл/запись в реестр или собственная бинарная компонента, несложный сетевой сервис (можно на js). Если первый - то же самое, плюс preferences, компоненту можно на js.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Тоже думал о такой проблеме. Но вот в чём загвоздка: если браузер завершит работу аварийно, расширение не успеет снять блокировку - будь то с ключа в preferences или с файла (о реестре говорить не приходится, потому что это не кроссплатформенный инструмент). Тогда при всех следующих запусках расширение будет думать, что уже один экземпляр запущен, и ничего не делать. Если расширение написано для себя, это не так страшно -- можно снять блокировку вручную. Но другие пользователи, не посвящённые в механизм, будут сбиты с толку.
Отсутствует
Может как-то через nsIWindowMediator можно работать? Если же писать компоненту - тогда можно искать процессы firefox.exe...
Отсутствует
Как вариант. Пусть у нас есть расширение, и работа ведётся основным объектом 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; ... }
Что думаете?
Отредактировано AllSeeingI (08-01-2009 22:15:20)
Отсутствует
Что думаете?
Пока тема "2-го окна фокса" не раскрыта в полной мере, думать особенно не над чем.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Если первый вариант, то см. здесь. Лучше всего XPCOM-компонент на JavaScript, т.к. будет работать во всех версиях.
Если второй вариант, то, думаю, "несложный сетевой сервис" - самое надежное решение.
Отсутствует
Так а нельзя создать глобальную переменную вне настроек, чтобы ее видели в течение сеанса все окна?
В JS все переменные - на самом деле поля какого-то глобального объекта (обычно своего window). Поэтому надо найти (или создать) какой-нибудь такой объект.
По ссылке, которую я привел("здесь" == Working with windows in chrome code - Advanced data sharing), как раз написано, как это сделать:
1. Hidden window - уже готовое окно, но недокументированное, так что лучше не использовать.
2. [url=https://developer.mozilla.org/en/FUEL/SessionStorage]Application.storage[url]из FUEL. Самый простой способ, но только Firefox 3.0+
3. Пустой XPCOM-компонент, написанный на JS (с установленным wrappedJSObject). Использовать, если нужна совместимость с Fx 2.0 или Thunderbird (пока 3.0 не вышел)
Отсутствует
Если под винду и разные окна == разные профили - мб лучше всего написать сервис.
А вообще сделать прогу/скрипт, которая постоянно отслеживает поступающие события (хотя бы даже файлы с заданием, появляющиеся в папке), проблемы не составит.
В обоих случаях блокировка не нужна.
Версия с блокировкой будет нормально работать, если сделать её временной с периодическим подтверждением.
--- ---
Отсутствует
Страницы: 1