Расширение Тандерберда. Добавить поле в messagePane. Как работать с экземплярами Windows?

Я разрабатываю расширение ТБ. Я добавил поле в messagePane чуть ниже полей «от, тема, кому». Поэтому мне нужно правильно обновить значение поля. Я получаю значение от msgHdr. Мой текущий подход заключается в прослушивании события загрузки документа messagePane. Он отлично работает, когда в ТБ открыто только одно сообщение. Но если есть несколько открытых сообщений, то каждое окно сообщения получает одно и то же значение поля, потому что каждое окно вызывает событие "загрузки" последнего загруженного сообщения. Это ошибка. Когда я получаю событие загрузки, как я могу определить msgHdr сообщения, открытого в окне? Он где-то хранится? Есть ли в окнах какая-либо идентификационная информация, такая как дескриптор, uri или что-то еще? Почему инспектор DOM показывает только один узел DOM моего поля, хотя он существует в каждой панели сообщений? Извините за мешок вопросов, никак не могу понять всей заварухи с ТБ виндами.

Спасибо.


person alehro    schedule 23.02.2011    source источник
comment
В отличие от браузера с вкладками Firefox, панель сообщений с вкладками на самом деле является только одним браузером, и когда вы переключаете вкладки, он просто перезагружает сообщение, которое было последним загружено на эту вкладку.   -  person Neil    schedule 23.02.2011
comment
Невероятный. Я сомневаюсь, что мой объектно-ориентированный разум смог бы обогатить это сам.   -  person alehro    schedule 24.02.2011


Ответы (1)


Окна сообщений имеют глобальную переменную gMessageDisplay со свойством displayMessage. displayMessage — это nsIMsgDBHdr отображаемого в данный момент сообщения.

Для получения уведомлений при отображении нового сообщения я предлагаю добавить прослушиватель в gMessageListeners:

gMessageListeners.push({
  onStartHeaders: function () {},
  onEndHeaders: function () {},
  onEndAttachments: function () {},
  onBeforeShowHeaderPane: function () {}
});

Примите меры в onStartHeaders или onEndHeaders.

person speedball2001    schedule 23.02.2011
comment
Я обнаружил, что document.getElementById(messagepane).contentDocument.URL содержит именно то, что мне нужно. Теперь я хочу слушать каждое изменение этого материала. Как это можно сделать? Я полагаю, что мог бы прослушать событие загрузки contentDocument. Но contentDocument сам по себе непостоянен, поэтому мне, вероятно, нужно прислушиваться к изменению contentDocunt. Как это можно сделать? - person alehro; 24.02.2011
comment
Или я мог бы просто прослушать изменение отображаемого сообщения. Но я до сих пор не знаю, как это сделать. - person alehro; 24.02.2011
comment
Я расширил свой ответ. Надеюсь, поможет. - person speedball2001; 24.02.2011
comment
Это круто. Я много раз встречал эти обратные вызовы в sgHeaderViewOverlay.js, но полностью пропустил gMessageListeners. Вы избавили меня от многих нервов. Спасибо. - person alehro; 25.02.2011