Полезная информация

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№125-10-2009 17:59:02

alkh
Участник
 
Группа: Members
Зарегистрирован: 16-10-2009
Сообщений: 10
UA: Firefox 3.5

Обсерверы, проблема с более чем одним запущеным FF

Есть код, который вызывает алерт с ссылкой, после того как скачается какой-либо файл:

Выделить код

Код:

window.addEventListener('load' , checker, true);

function checker()
{
  Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService)
  .addObserver(dlObserver, 'dl-done', false);
}

const dlObserver = {
  observe: function(subject, topic, state)
  {
    if (topic == 'dl-done')
    {
      try
      {
        var file = subject.QueryInterface(Components.interfaces.nsIDownload);
        alert( newfile.source.spec)
       
      } catch (e){}
    }
  }
}

Всё работает, но если запустить ещё одну копию браузера, и скачать какой-нибудь файл, вылетят два alerta(точнее на каждую копию браузера по алерту).

Как этого избежать? Если при данном способе не избежать, как можно по-другому реализовать нужный мне функционал.

Заранее спасибо.

Отсутствует

 

№225-10-2009 19:19:53

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Обсерверы, проблема с более чем одним запущеным FF

alkh
Самый простой способ - пусть алерт выдает отправитель сообщения. И, по-моему, самый верный.
Можно, конечно, "семафор" организовать, но это лишнее (опять же, по-моему):

Выделить код

Код:

var obj =
{
    sender: false,
    
    notify: function ()
    {
        this. sender = true;
        os. notify (...);
        this. sender = false;
    },
    
    observe: function ()
    {
        if (this. sender)
            return;
        ...
    }
};

ps. точнее, для заданного условием одного алерта

Выделить код

Код:

if (!this. sender)
    return;

(что ещё более подчеркивает ненужную "излишнесть" такого подхода)

Отредактировано Anton (25-10-2009 19:30:50)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№326-10-2009 03:20:28

alkh
Участник
 
Группа: Members
Зарегистрирован: 16-10-2009
Сообщений: 10
UA: Firefox 3.5

Re: Обсерверы, проблема с более чем одним запущеным FF

>> Пусть алерт вызывает отправитель.

Но отправителем является браузер, событие завершение закачки. Сейчас я слушаю это событие, но слушается каждой копией FF =(

Код что ты привёл либо не подходит, либо я неправильно его понял, вот что я понял:

Выделить код

Код:

window.addEventListener('load' , checker, true);
var os = null;

function checker()
{
  os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService)
  os.addObserver(dlObserver, 'dl-done', false);
}

const dlObserver = {
  sender: false,
    
  notify: function ()
  {
      this.sender = true;
      os.notifyObservers(os,'dl-done',null);
      this.sender = false;
  },

  observe: function(subject, topic, state)
  {
    if (topic == 'dl-done')
    {
      try
      {
        if (!this.sender)
        {
          var file = subject.QueryInterface(Components.interfaces.nsIDownload);
          alert(newfile.source.spec)
        }
      } catch (e){}
    }
  }
}

:/

Отсутствует

 

№426-10-2009 10:09:12

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Обсерверы, проблема с более чем одним запущеным FF

alkh

Но отправителем является браузер, событие завершение закачки.

Я этого сначала не заметил, прошу прощения. Теперь понятно.

Чтобы был один алерт, нужен один обработчик. Проще всего, я думаю, будет организовать модуль (https://developer.mozilla.org/en/Using_ … de_modules) в котором и будет находиться обработчик, выдающий алерт.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№526-10-2009 11:13:48

alkh
Участник
 
Группа: Members
Зарегистрирован: 16-10-2009
Сообщений: 10
UA: Foxware 0.0

Re: Обсерверы, проблема с более чем одним запущеным FF

Если вынести dlObserver в модуль, то где нужно регистрироваться на событие

Выделить код

Код:

window.addEventListener('load' , checker, true);

В модуле, или в мейн скрипте?

Отсутствует

 

№626-10-2009 14:29:31

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Обсерверы, проблема с более чем одним запущеным FF

alkh

В модуле, или в мейн скрипте?

В скрипте оверлея. В модуле сложнее.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№726-10-2009 17:33:43

alkh
Участник
 
Группа: Members
Зарегистрирован: 16-10-2009
Сообщений: 10
UA: Firefox 3.5

Re: Обсерверы, проблема с более чем одним запущеным FF

Дело ещё в том, что у меня там не просто алерт, а вполне себе функция :)
Как всё в модуль запихать не представляю.
Жесть, написал своё первое расширение, и встал в том месте, где меньше всего ожидал подвоха =(

Может что ещё, что подскажешь, или примерчик простой.

Пойду какой-нибудь давнлоад плагин поковыряю =\

Отсутствует

 

№826-10-2009 22:40:58

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Обсерверы, проблема с более чем одним запущеным FF

Дело ещё в том, что у меня там не просто алерт, а вполне себе функция

А это без разницы, просто алерт или что-то другое.
Как вариант, алерт может прыгать из модуля, а скрипты оверлеев по тому же уведомлению будут делать всё остальное.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№927-10-2009 02:21:05

alkh
Участник
 
Группа: Members
Зарегистрирован: 16-10-2009
Сообщений: 10
UA: Firefox 3.5

Re: Обсерверы, проблема с более чем одним запущеным FF

Anton пишет

а скрипты оверлеев по тому же уведомлению будут делать всё остальное.

Хотел меня ещё больше запутать? Удалось :)
Если в модуле(который один на все копии браузера), будет обсервер на событие окончания загрузки файла, то чтобы вызывать скрипты оверлея придётся в оверлее подписываться на события модуля, а модуль общий, и значит каждая копия браузера выполнит действие.

Давай по другому подойдём к вопросу, как бы ты реализовал на моём месте. Отслеживание события окончания загрузки файла.

Отсутствует

 

№1027-10-2009 08:58:02

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Обсерверы, проблема с более чем одним запущеным FF

alkh

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

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

как бы ты реализовал на моём месте

По уведомлению выдать один алерт и выполнить какие-то действия в каждом окне приложения ?

Поставил бы в модуле обсервер с алертом, а в оконных скриптах - обсерверы, выполняющие эти какие-то действия, но без алерта.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1127-10-2009 09:05:05

alkh
Участник
 
Группа: Members
Зарегистрирован: 16-10-2009
Сообщений: 10
UA: Foxware 0.0

Re: Обсерверы, проблема с более чем одним запущеным FF

okkamas_knife
А я программист, у меня нет проблем с написанием алгоритмов и т.п.
Просто область незнакомая, первый раз пишу расширение, а мануалы только по xul =(
Какой-то документации вида "для выполнение такой-то задачи, используются такие-то и такие-то классы интерфейсы" - у меня нет.

Что-то типа твоего варианта пробывал, типа если активно окно выполняем действие над скачены файлом, использовал window.onfocus и window.onblur, которыми как раз и управлял переменой А(как в твоём примере), но браузер вешался.

Да на форум полез-то думал мож кто подходящий адон посоветует, или пример.

Отсутствует

 

№1227-10-2009 09:53:36

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Обсерверы, проблема с более чем одним запущеным FF

okkamas_knife пишет

если А=1 и Окно активное то выполняем алерт в противном ничего не делаем

Кстати, можно попробовать так:

Выделить код

Код:

var wm = Components. classes ["@mozilla.org/appshell/window-mediator;1"].
     getService (Components. interfaces. nsIWindowMediator);
var win = wm. getMostRecentWindow ("navigator:browser"); 
if (win == window)
{
    ...
}

(без модуля)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1327-10-2009 09:53:53

alkh
Участник
 
Группа: Members
Зарегистрирован: 16-10-2009
Сообщений: 10
UA: Foxware 0.0

Re: Обсерверы, проблема с более чем одним запущеным FF

Anton пишет

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

Осталось, умножить это на то что никогда подобное не писал, и даже примерно где об этом почитать.
Те же модули 3-мя способами объявляются.
Зря вы так к алерту привязались, я его привёл в качестве примера, что это некоторая функция который выполняется при dl-done.

Отсутствует

 

№1427-10-2009 09:59:22

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Обсерверы, проблема с более чем одним запущеным FF

Anton пишет
okkamas_knife пишет

если А=1 и Окно активное то выполняем алерт в противном ничего не делаем

Кстати, можно попробовать так:

Выделить код

Код:

var wm = Components. classes ["@mozilla.org/appshell/window-mediator;1"].
     getService (Components. interfaces. nsIWindowMediator);
var win = wm. getMostRecentWindow ("navigator:browser"); 
if (win == window)
{
    ...
}

(без модуля)

Или лучше так:

Выделить код

Код:

var ww = Components. classes ["@mozilla.org/embedcomp/window-watcher;1"].
     getService (Components. interfaces. nsIWindowWatcher);
if (ww. activeWindow == window)
{
    ...
}

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1527-10-2009 11:11:13

alkh
Участник
 
Группа: Members
Зарегистрирован: 16-10-2009
Сообщений: 10
UA: Foxware 0.0

Re: Обсерверы, проблема с более чем одним запущеным FF

2 Anton, да такой способ помог :)

Но всё равно как время появится буду попробую добить компонент.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]