Здравствуйте все,

есть у меня расширение, тихо сидящее в фоне и выполняющее некие действия. Но - мне нужно, чтобы на компе это расширение работало в единственном экземпляре.

Т.е. если пользователь запускает 2е окно файрфокса - то расширение в нём должно понимать, что одно окно браузера уже запущено и никаких действий выполнять не надо.

Можно это как-то провернуть? Заранее спасибо.

"2е окно файрфокса" требует пояснение. Это второе окно одного приложения, или это окно второго приложения (напр. другой версии).
Если второй вариант, то, скорее всего, файл/запись в реестр или собственная бинарная компонента, несложный сетевой сервис (можно на js). Если первый - то же самое, плюс preferences, компоненту можно на js.

Тоже думал о такой проблеме. Но вот в чём загвоздка: если браузер завершит работу аварийно, расширение не успеет снять блокировку - будь то с ключа в preferences или с файла (о реестре говорить не приходится, потому что это не кроссплатформенный инструмент). Тогда при всех следующих запусках расширение будет думать, что уже один экземпляр запущен, и ничего не делать. Если расширение написано для себя, это не так страшно -- можно снять блокировку вручную. Но другие пользователи, не посвящённые в механизм, будут сбиты с толку.

+1 за компоненту.

Может как-то через 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;
  ...
}

Что думаете?

Что думаете?

Пока тема "2-го окна фокса" не раскрыта в полной мере, думать особенно не над чем.

Если первый вариант, то см. здесь. Лучше всего 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 не вышел)

Если под винду и разные окна == разные профили - мб лучше всего написать сервис.
А вообще сделать прогу/скрипт, которая постоянно отслеживает поступающие события (хотя бы даже файлы с заданием, появляющиеся в папке), проблемы не составит.
В обоих случаях блокировка не нужна.

Версия с блокировкой будет нормально работать, если сделать её временной с периодическим подтверждением.